[PATCH openbmc] Squashed 'yocto-poky/' changes from 7b86c77..c8a4ed9
OpenBMC Patches
openbmc-patches at stwcx.xyz
Fri Apr 1 08:20:35 AEDT 2016
From: Patrick Williams <patrick at stwcx.xyz>
b1f23d1 build-appliance-image: Update to jethro head revision
7fe17a2 qemu: Security fix CVE-2016-2198
50700a7 qemu: Security fix CVE-2016-2197
1f0e615 libgcrypt: Security fix CVE-2015-7511
dc5f155 uclibc: Security fix CVE-2016-2225
ef13511 uclibc: Security fix CVE-2016-2224
ae57ea0 libbsd: Security fix CVE-2016-2090
eb9666a glibc: Security fix CVE-2015-7547
5b12268 build-appliance-image: Update to jethro head revision
a3a374a curl: Secuirty fix CVE-2016-0755
f4341a9 curl: Security fix CVE-2016-0754
35f4306 nettle: Security fix CVE-2015-8804
3e8a07b nettle: Security fix CVE-2015-8803 and CVE-2015-8805
5ffc326 socat: Security fix CVE-2016-2217
5cc5f99 libpng: Security fix CVE-2015-8472
21a816c libpng: Security fix CVE-2015-8126
6a0fbfa foomatic-filters: Security fixes CVE-2015-8327
d57aaf7 foomatic-filters: Security fix CVE-2015-8560
941874a build-appliance-image: Update to jethro head revision
d74a3cb cross-localedef-native: add ABI breaking glibc patch
12fae23 build-appliance-image: Update to jethro head revision
67ac9d6 e2fsprogs: Ensure we use the right mke2fs.conf when restoring from sstate
5812fc9 build-appliance-image: Update to jethro head revision
3de2492 ref-manual: Updated host package install requirements CentOS
79de8cf toaster-manual: Updated the "Installation" to have TOASTER_DIR information
a23d262 toaster-manual: Updated instructions for production setup.
b6def81 linux-yocto: Update SRCREV for genericx86* for 4.1, fixes CVE-2016-0728
db0f8ac linux-yocto: Update SRCREV for genericx86* for 3.19, fixes CVE-2016-0728
c8122a0 linux-yocto: Update SRCREV for genericx86* for 3.14, fixes CVE-2016-0728
cdeb241 meta-yocto-bsp: Remove uvesafb (v86d) from generic x86 features
52cd219 yocto-bsp: Set SRCREV meta/machine revisions to AUTOREV
a88d6cb yocto-bsp: Set KTYPE to user selected base branch
4e74b36 yocto-bsp: Avoid duplication of user patches ({{=machine}}-user-patches.scc)
6680773 yocto-bsp: Default kernel version to 4.1 on x86_64
4c075e7 piglit: don't use /tmp to write generated sources to
ee52ac6 gen-lockedsig-cache: fix bad destination path joining
e9f95df linux-yocto: Update SRCREV for qemux86* for 4.1, fixes CVE-2016-0728
e63bab1 linux-yocto: Update SRCREV for qemux86* for 3.19, fixes CVE-2016-0728
64a4920 linux-yocto: Update SRCREV for qemux86* for 3.14, fixes CVE-2016-0728
5b043da libpng12: update URL that no longer exists
655c8a5 libpng: update URL that no longer exists
96fda8c busybox: fix build of last applet
ae037d9 ghostscript: add dependency for pnglibconf.h
26eb877 gcr: Require x11 DISTRO_FEATURE
e632cdb uClibc: enable utmp for shadow compatibility
e8c9613 git: Security fix CVE-2015-7545
108ea6d glibc-locale: fix QA warning
9a88c1d grub: Security fix CVE-2015-8370
443b09a gdk-pixbuf: Security fix CVE-2015-7674
6c91068 librsvg: Security fix CVE-2015-7558
9fd2349 bind: Security fix CVE-2015-8461
5a40d9f bind: Security fix CVE-2015-8000
1bbf183 libxml2: Security fix CVE-2015-8710
2ec6d1d libxml2: Security fix CVE-2015-8241
55aafb5 dpkg: Security fix CVE-2015-0860
029948b tzdata: update to 2016a
2bcf141 tzcode: update to 2016a
cc3a391 kernel-yocto: fix checkout bare-cloned kernel repositories
049be17 libpcre: bug fixes include security
5e94ac7 qemu: Security fix CVE-2015-7295
7ee1828 qemu: Security fix CVE-2016-1568
ca6ec2e qemu: Security fix CVE-2015-8345
b55a677 qemu: Security fix CVE-2015-7512
4922f47 qemu: Security fix CVE-2015-7504
3ec0e95 qemu: Security fix CVE-2015-8504
942ce53 openssl: Security fix CVE-2016-0701
ce8ae1c openssl: Security fix CVE-2015-3197
080e027 tiff: Security fix CVE-2015-8784
c6ae9c1 tiff: Security fix CVE-2015-8781
049b7db bind: CVE-2015-8704 and CVE-2015-8705
d632a92 rpmresolve.c: Fix unfreed pointers that keep DB opened
5b993ed openssh: CVE-2016-1907
27ee5b4 glibc: CVE-2015-8776
a4134af glibc: CVE-2015-9761
e10ec6f glibc: CVE-2015-8779
a5a965d glibc: CVE-2015-8777.patch
2fb7ee2 bitbake: toaster: make runbuilds loop
b9ad87b nativesdk-buildtools-perl-dummy: Bump PR
0a1c63a nativesdk-buildtools-perl-dummy: properly set PACKAGE_ARCH
d4b400e nativesdk-buildtools-perl-dummy: fix rebuilding when SDKMACHINE changes
8c8c4ed Revert "gstreamer1.0-plugins-good.inc: add gudev back to PACKAGECONFIG"
b832202 Revert "gstreamer: Deal with merge conflict which breaks systemd builds"
dd0ba9e build-appliance-image: Update to jethro head revision
325d205 gstreamer: Deal with merge conflict which breaks systemd builds
53b114b build-appliance-image: Update to jethro head revision
02be35d poky.conf: Bump version for 2.0.1 jethro release
f5551f8 ref-manual: Updated the list of supported image types.
aa179ae dev-manual: Added three new wic option descriptions.
20007c8 dev-manual: Added the --overhead-factor wic option description.
2dd7f46 dev-manual: Added the --extra-space wic option description.
81cc737 dev-manual: Added wic --notable option description.
2b1dce5 dev-manual:
a6f5293 kernel/kernel-arch: Explicitly mapping between i386/x86_64 and x86 for kernel ARCH
e79a538 openssh: update to 7.1p2
b171076 devtool: reset: do clean for multiple recipes at once with -a
255115f devtool: sdk-update: fix error checking
3f69105 devtool: sdk-update: fix metadata update step
5ba94af devtool: sdk-update: fix not using updateserver config file option
d03d145 classes/populate_sdk_ext: disable signature warnings
00ff950 classes/populate_sdk_ext: fix cascading from preparation failure
22446c6 scripts/oe-publish-sdk: add missing call to git update-server-info
8597a61 devtool: use cp instead of shutil.copytree
95cc641 buildhistory: fix not recording SDK information
84d48ac recipetool: create: fix error when extracting source to a specified directory
4369329 recipetool: create: detect when specified URL returns a web page
4c3191f recipetool: create: prevent attempting to unpack entire DL_DIR
caca77e recipetool: create: fix do_install handling for makefile-only software
383159e recipetool: create: avoid traceback on fetch error
be40baa recipetool: create: handle https://....git URLs
a897bfd devtool: sdk-update: fix traceback without update server set
9c4b61e classes/populate_sdk_ext: error out of install if buildtools install fails
4c07dd2 gstreamer1.0-plugins-good.inc: add gudev back to PACKAGECONFIG
83b72d8 linux-yocto: Update Genericx86* BSP to 4.1.15 kernel
44639bd libaio: don't disable linking to the system libraries
a0be9bd linux-yocto/4.1: update to v4.1.15
53f0290 libxml2: security fix CVE-2015-5312
f4b0c49 libxml2: security fix CVE-2015-8242
fb409c9 libxml2: security fix CVE-2015-7500
55d097a libxml2: security fix CVE-2015-7499
8e6b2d6 libxml2: security fix CVE-2015-7497
332eb1d libxml2: security fix CVE-2015-7498
cbc4e83 libxml2: security fix CVE-2015-8035
c4b71e1 libxml2: security fix CVE-2015-7942
fdea03d libxml2: security fix CVE-2015-8317
6fc1109 libxml2: security fix CVE-2015-7941
9eb4ce0 openssl: fix for CVE-2015-3195
6880f82 openssl: fix for CVE-2015-3194
7dcaa84 openssl: fix for CVE-2015-3193
435139b logrotate: do not move binary logrotate to /usr/bin
5f49c0a cairo: fix license for cairo-script-interpreter
a29ec81 glibc: Fix ld.so / prelink interface for ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA
b1e980f gcc: Update default Power GCC settings to use secure-plt
ed82690 prelink: Fix various prelink issues on IA32, ARM, and MIPS.
9a620da autotools: Allow recipe-individual configure scripts
f828071 toolchain-scripts.bbclass: unset command_not_found_handle
49858bd devtool: upgrade: fetch remote repository before checking out new revision
d213452 devtool: upgrade: remove erroneous error when not renaming recipe
fec97f6 devtool: upgrade: fix updating PV and SRCREV
3b4f659 devtool: upgrade: fix removing other recipes from workspace on reset
61a7de0 devtool: include do_patch in SRCTREECOVEREDTASKS
82c0072 toolchain-shar-extract.sh: do not allow $ in paths for ext SDK
f181e72 scripts/gen-lockedsig-cache: improve output
4b5d4ca toolchain-shar-extract.sh: proper fix for additional env setup scripts
d2ea8f1 toolchain-shar-relocate: don't assume last state of env_setup_script is good
02ef437 populate_sdk_ext.bbclass: Be more permissive on the name of the buildtools
3653b17 classes/populate_sdk_ext: fail if SDK_ARCH != BUILD_ARCH
8879571 classes/populate_sdk_ext: tweak reporting of workspace exclusion
eeda3c6 classes/populate_sdk_ext: make it clear when SDK installation has failed
dee9fbe classes/populate_sdk_ext: tidy up preparation log file writing
d001d46 classes/license: fix intermittent license collection warning
777451c classes/metadata_scm: fix git errors showing up on non-git repositories
cb0ca72 oeqa/selftest/layerappend: fix test if build directory is not inside COREBASE
8970ad6 oeqa/selftest/devtool: fix test if build directory is not inside COREBASE
4f7fdd0 classes/distrodata: split SRC_URI properly before determining type
3b7df55 uninative.bbclass: Choose the correct loader based on BUILD_ARCH
f3d7c3f openssl: sanity check that the bignum module is present
96b1b5c glibc: Backported a patch to fix glibc's bug(18589)
7aecb57 directfb.inc: force bfd linker for armv7a
75ca2c8 texinfo: don't create dependency on INHERIT variable
02c7b3f package_manager.py: define info_dir and status_file when OPKGLIBDIR isn't the default
003c94f libsdl2: require GLES when building Wayland support
ad6db01 gst-plugins-bad: add PACKAGECONFIGs for voamrwbenc, voaacenc, resindvd
f0d87fe gstreamer1.0-plugins-good: fix PACKAGECONFIG for gudev and add one for v4l2 and libv4l2
35f34a6 gstreamer1.0-plugins-bad: fix dependencies for uvch264 PACKAGECONFIG
3b77e20 gstreamer1.0-plugins-{base,good}: update PACKAGECONFIGs
e2d4412 libunwind: fix build for qemuarm
ef69078 guile, mailx, gcc, opensp, gstreamer1.0-libav, libunwind: disable thumb where it fails for qemuarm
4700e40 icu: force arm mode
743ee04 libxcb: Add a workaround for gcc5 bug on mips
8a3deca bitbake: fetch: use orig localpath when calling orig method
0073b23 yocto-bsp: Typo on the file extension
71dbbcd bsp-guide: Updated the license statement.
41f1026 dev-manual: Correction to the KVM stuff in the runqemu commands.
38e3c6e mega-manual: Added four new figures for GUI example.
b99ec28 poky.ent: Fixed POKYVERSION variable.
c670dc7 yocto-project-qs, ref-manual, poky.ent: CentOS Package updates
b968190 dev-manual: Updated runqemu command options list
1278753 toaster-manual: Removed SDKMACHINE from the json file example.
7b25b70 ref-manual: Updated list of supported distros.
d9423fb ref-manual: Updated the GCC 5 migration section for 2.0
347347a bitbake: lib/bb/utils: improve edit_bblayers_conf() handling of bblayers.conf formatting
5935783 bitbake: lib/bb/utils: fix error in edit_metadata() when deleting first line
7fdad70 rpcbind: Security Advisory - rpcbind - CVE-2015-7236
0cb2fa5 subversion: fix CVE-2015-3187
5b52e9b subversion: fix CVE-2015-3184
59bdde4 linux-firmware: rtl8192cx: Add latest available firmware
8ad2bcc init-install-efi: fix script for gummiboot loader
c3087bd init-install-efi: fix script for eMMC installation
d2bf9fb pulseaudio: Fix HDMI profile selection
0556c58 allarch: Force TARGET_*FLAGS variable values
e683dac libsndfile: fix CVE-2014-9756
092757e libxslt: CVE-2015-7995
dab5555 unzip: rename patch to reflect CVE fix
1753d4a readline: rename patch to contain CVE reference
9dd3422 libarchive: rename patch to reflect CVE
1401976 binutils: Fix octeon3 disassembly patch
a54a0db opkg: add cache filename length fixes
fc45dea build-appliance-image: Update to jethro head revision
e14498b meta-yocto/distro: Updated SANITY_TESTED_DISTROS.
01bba74 meta-yocto/distro: Updated SANITY_TESTED_DISTROS.
e1aa897 build-appliance-image: Update to jethro head revision
96cab33 unzip: CVE-2015-7696, CVE-2015-7697
1b2a942 vte: fix DoS from malicious escape sequence (CVE-2012-2738)
370a291 build-appliance-image: Update to jethro head revision
00911c9 linux-yocto_4.1: Update SRCREV for genericx86*
c86957a glibc: Allow 64 bit atomics for x86
b02c5f6 local.conf.sample: Disable image-prelink by default
1630dbb ref-manual: Applied a correction to the GCC 5 migration 2.0 section.
37677d6 ref-manual: Updated ADT Installer Extras
a79e303 kernel-dev: Added cross-reference to .config information
e03b19b ref-manual: Applied review updates to 2.0 migration section.
a0791c1 bitbake: toasterui: Create per-build logs
290534d bitbake: build/utils: Add BB_TASK_IONICE_LEVEL support
3ebf761 bitbake: cooker: Ensure BB_CONSOLE remains correct over server resets
5b19b71 bitbake: bb/ui: Use getSetVariable command for BB_CONSOLELOG
acc7b4d bitbake: command: Add getSetVariable command
c8051c5 bitbake: bitbake-user-manual: Added new description for BB_TASK_IONICE_LEVEL
183290a bitbake: bitbake-user-manual: Added BBTARGETS variable description.
66d3c35 bitbake: toaster: templates Add meaningful title tags
5724b2a perl: Remove errornous extra path-specs for Module::Build based modules
884cf7a perl: Correct path for vendorlib, vendorarch, sitelib and sitearch
2d0c499 perl: fix Perl5 module builds
24cfcc4 runqemu-export-rootfs: update location of unfsd binary
da386d3 gtk-icon-cache: pass the native libdir to the intercept
63a0311 connman: Move wired-setup to ${datadir}
1c3c76d useradd-staticids.bbclass: Do not require trailing colons
8a0d8ee toaster manual: Updated the set up and use chapter
f19b52c ref-manual: Updates to the 1.8 to 2.0 Migration section.
b73da6b toaster-manual: Added new Toaster functionality descriptions.
947e156 ref-manual: Updated the rootfs*.bbclass description.
62e200e bitbake: toaster: orm Fix restrictive LogMessage message length
78f935d bitbake: toaster: Remove all navigation when not in build mode
c5f147b bitbake: toaster: Run tests in build mode
1d17109 bitbake: toaster: Hide builds for non-cli projects in analysis mode
a580479 bitbake: toaster: Hide top bar buttons in analysis mode
1ec2ec3 bitbake: toaster: Show mode-appropriate landing page
bbac0f0 bitbake: toaster: Add BUILD_MODE flag to context
851f0d8 bitbake: toaster: add get_or_create_targets API
dcd9cd0 bitbake: fetcher: svn: Add support for checkout to a custom path
4ab7202 bitbake: cooker: preserve pre and post configs
fdfdfc8 oeqa/utils/decorators: fix missing keyword arguments on decorators
a2d5b7a classes/gtk-icon-cache: don't pass STAGING_LIBDIR_NATIVE to intercepts
5171329 intercepts/update_icon_cache: use STAGING_DIR_NATIVE from environment
d18d902 lib/oe/rootfs: tell intercepts where the native sysroot is
9336e1f subversion: add explicit dependency on file-replacement-native for native builds
19358d0 rpm: add explicit dependency on file-replacement-native for native builds
698c3de file: don't replace host file when built natively
83a2bde sanity: check that the host has file installed
43c46e9 bitbake: add file-native to ASSUME_PROVIDED
2925cd9 Revert "runqemu-export-rootfs: update location of unfsd binary"
d023d99 populate_sdk_base: Ensure PKGDATA_DIR exists
9b956c4 Perl: Use CC version not $Config(gccversion)
0f75740 wic/utils/oe/misc.py: Preserve PATH when running native tools
273bcb4 mtools_4.0.18.bb: Use create_wrapper() for mcopy
031d464 scripts/oe-pkgdata-util: Fix variable name in error handling
d8d4ce7 Add 850 codepage to uninative-tarball
c1d5e89 e2fsprogs: backport a patch to fix filetype for hardlink
426a9b7 oeqa/selftest: Added testcase decorators.
835525c runqemu-ifup: Check if the tap interface is set up correctly
b13c0be qemurunner: Show the output of runqemu script
9846275 runqemu-internal: Enable support for use virtio devices.
304c956 linux-yocto{, -rt}: Enable support for virtio drivers in qemu machines.
eebcbe1 runqemu: Enable support for kvm without vhost in x86 and x86_64
135d094 prserv.bbclass: remove it since it is null
c509c78 initscripts/sysfs.sh: Mount devtmpfs on /dev/ if needed
022f8cc image-mklibs.bbclass: update i586 TARGET_ARCH test to i*86
d492a70 base.bbclass: considering multilib when setting LICENSE_EXCLUSION
54b7471 gcc-target.inc: Add support for executable thats may have a suffix
0d69a171 cairo: backport fix for compatibility with OpenGL ES 2.0
64b5e3e mesa-demos: fix deadlock in sharedtex_mt
dc8495f bzip2: fix bunzip2 -qt returns 0 for corrupt archives
5bf1430 gnome-desktop: add xkeyboard-config dependency
48443cc gtk+3: Do not try to initialize GL without libgl
59fdbae classes/insane: rename invalid-pkgconfig QA check to invalid-packageconfig
73e1d33 uclibc: Implement syncfs and AT_EMPTY_PATH for all and O_PATH for arm
2e4575d systemd: Fix build with uclibc
40911f4 libtirpc: Fix a bug exposed by uclibc
d90d3e8 libpam: Fix build with uclibc
32c8625 coreutils: Do not use host paths in getloadavg.m4
20b7d87 coreutils-6.9: Add missing dependency on virtual/libiconv
8bb6436 uclibc: Fix build with gcc5
e5e8fce libtirpc: Refresh uclibc patches
fd66dd1 rpcbind: Fix build with uclibc
369c536 scripts/oe-publish-sdk: create directory before making git repo
8a555fe rootfs.py: add more info to the warning message
787253f package signing: automatically export public keys
579e254 package_manager: fail if signed feeds are enabled for ipk or dpkg
835e755 Add new bbclass for package feed signing
822844d sign_rpm.bbclass: make RPM_GPG_NAME a mandatory setting
48d60fc sign_rpm.bbclass: be more verbose in case of error
dbb9af6 package_manager: support GPG_PATH variable
b682fca sign_rpm.bbclass: introduce GPG_PATH variable
8ccbc26 apr: remove conflict with ccache
5e42593 linux-yocto: nf_tables: Add nf_tables feature
1c2fdd9 linux-yocto/3.19: fix ARM boot with gcc5.x
3bab714 linux-yocto: skip kernel meta data branches when finding machine branch
1561d0d kern-tools: avoid duplicate .scc file processing
47dcee2 linux-yocto/4.1: drm/i915: Fix the VBT child device parsing for BSW
380f2c6 linux-yocto: axxia configuration updates
505a826 build-appliance-image: Update to jethro head revision
7d30d67 ref-manual: Updated the allarch class description.
a8674ae ref-manual: Updated the MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS variable
e7c8c79 ref-manual: Added the 1.8 to 2.0 migration section.
cd48ccc dev-manual: Added notes to clarify use of pkg-config
dc9e4cb ref-manual: Added correct class name as part of pkgconfig description
5bc8fa6 ref-manual: Fixed typo in 1.6 migration section for BitBake
2fe3809 ref-manual, dev-manual: Applied feedback to edit several classes
359b7fb ref-manual: Added three PACKAGE_FEED_* variable descriptions
2f4e90c toaster-manual: Updated the json file example bits to be current
66653cb ref-manual: Updated the image-swab.bbclass description
d66cf20 toaster-manual: New section on PREFERRED_VERSION
4b9daa8 ref-manual: Added many new class descriptions.
ae0d508 toaster-manual: Added note for creating virtual environment
98d7d24 toaster-manual: Updates to example toasterconf.json file
b263a3e dev-manual: Added CentOS packages to enable runtime tests on QEMU
9abc72c adt-manual: Fixed PMS typo
2e7d650 ref-manual: Updates to clarify Fetcher URL directory parameters
7facee6 toaster-manual: Updated the section for setting up virtual env.
10970a6 dev-manual: Added package requirements for runtime QEMU testing
acacf6b ref-manual: Added linuxloader.bbclass reference description.
8fc90a7 Makefile: Updated the make file to not create toaster-manual pdf
0889848 dev-manual: Updated devtool build --help example
1944d28 documentation: Updated files to support 2.0 release.
8d2a6f0 toaster-manual: Removed "dizzy" and replaced with "jethro"
3bff581 ref-manual: Added descriptions for 5 new variables and 2 tasks.
a87268e dev-manual: Updated the Marking Packages information.
1c7f462 ref-manual: Added oe-seltest package requirements sections.
3d82046 adt-manual: Updated the build toolchain section with more detail.
54b4aff adt-manual: Updated some hard-coded distro values
196210f dev-manual: Updated the multilib example.
3930f04 ref-manual: Updated the EXCLUDE_FROM_SHLIBS description
0d1c86b ref-manual: Updated EXCLUDE_FROM_SHLIBS description.
eea7521 ref-manual: Updated distrodata.bbclass example
2eaf843 ref-manual: Added new description for PACKAGE_EXCLUDE_COMPLEMENTARY
97298fb dev-manual: Fixed typo in path for wic plugins
05d8101 ref-manual: Added new EXCLUDE_FROM_SHLIB variable
316d432 ref-manual: Added new variable description for SKIP_FILEDEPS
a1b25e6 yocto-project-qs, ref-manual: Replaced "yum" with "dnf"
d284fba ref-manual: Added cross-reference phrase to some variables
5a226f7 dev-manual: Changed multilib example
6ca549f dev-manual: Added note about building out Autotools projects
92b26ad archiver.bbclass: Fixes and improves archiver class for kernel and gcc packages
2d00803 oeqa/selftest: improve config writing and cleanup
1881564 oeqa/selftest/wic: remove numbers from test names
2ac34d2 oeqa/selftest: clean up selftest.inc in teardown
a66ed33 oeqa/selftest/wic: fix cleaning
b67b1a4 oeqa/selftest/wic: corrected testcase decorator for test18_iso_image
e191120 oeqa/selftest: verify that devtool can use plugins in other layers
b8a9728 oeqa/selftest/buildoptions: Use the correct script for cleaning the workdir
94decbc oeqa/selftest/bbtests: Updated bitbake TCs
322c324 oeqa/selftest/bbtests: clean up local DL_DIR/SSTATE_DIR safely
cf311a7 oeqa/utils/ftools: From functions that expect data, check if None
900639c oeqa/utils/ftools: Ignore the exception if file does not exist
2e91cbd oeqa/selftest/manifest.py: Test support for manifests
c9bef34 useradd_base.bbclass: Do not warn without a reason
accb59e qemu: disable Valgrind
ac1bc7d i2c-tools: fix inverted RDEPENDS
35c043b rpm: remove spurious build dependencies
41cbfd7 gcc-5.2: Fix various _FOR_BUILD and related variables
a27da70 sudo: fix file permission for /etc/pam.d/sudo
abeaed9 openssh: fix file permission for /etc/pam.d/sshd
96a5cfd sanity.bbclass: expand warning when chmod fails
409e6e0 populate SDK: prepare calling of bb.utils for exceptions
db55d31 devtool: handle virtual providers
8578bc1 libc-package: Fix localedef multilib dependency issues
0942aff toolchain-shar-extract.sh: print full-length title underline
9630fc1 classes/populate_sdk_ext: detect and warn if running in OE environment
254ff38 classes/populate_sdk_ext: add note to env setup script
9a81ba7 classes/populate_sdk_ext: prevent image construction from executing on install
ec5ec35 classes/populate_sdk_ext: consistent indentation
b8f7042 oeqa/runtime: Fix setUp and tearDown methods
3327401 oetest: Add tearDownLocal class
3b7853a test-empty-image: rename from core-image-empty
5febb1d scripts/gen-lockedsig-cache: fix race with temp file creation
3b5d6ff image-live: make SYSLINUX_ROOT changable in image recipes
5009966 toolchain-shar-extract.sh: provide proper path for env_setup_script
ae7703f classes/base: provide hints on PACKAGECONFIG error
5a02ec2 devtool: extract: fix error handling
3aac110 metadata_scm: rewrite git hash logic
59668f2 linux-yocto-custom: fix typo in Upstream-Status tag
c52dcb0 grub-efi, gummiboot: Emit correct path in startup.nsh
f9d29ab coreutils: fix for native and nativesdk
b1a7405 gcc-4.x: fix wrong warning when using the universal zero initializer {0}
402723e tzdata: reinstate changes reverted in 2014c upgrade
3770461 build-compare: drop PATCHTOOL setting
4846260 common-licenses: use correct GFDL-1.1 license text
a9053ac bitbake: toaster: Add tests for error message display on the build dashboard
2517987 bitbake: toaster: Modify "New build" button behaviour for cli builds project
56d4c84 bitbake: toaster: Clean up template code
d96cedf bitbake: toaster: More linting of tests
7c8877e bitbake: toaster: Show tooltip next to cli builds project name in all builds
7670234 bitbake: toaster: Hide tabs and add info popups for command line builds
da4c614 bitbake: toaster: Make the builds view the project page for "command line builds"
ef6fc2b bitbake: toaster: Replace "Run again" button with help text for cli builds
7467b68 bitbake: toaster: Exclude "command line builds" project from projects typeahead
b5624c7 bitbake: toaster: Show 'not applicable' for default project machine and release
3c4c984 bitbake: toaster: Reorganise and lint tests
3ba43f2 bitbake: fetch2/hg: Include missing errno import
6fa3fec bitbake: cooker: normalize build targets
5effe8f bitbake: toaster: Allow any text input to machine configuration variable
320d05e bitbake: toaster: exit or return depending on the mode
2e2e40c bitbake: toaster: set TOASTER_MANAGED variable
a73895e bitbake: toaster: get rid of SRCFILE
779539c bitbake: toaster: use path to the script to guess config path
eb8b2b9 bitbake: toaster: Guard against builds with no targets
65e8bde bitbake: toaster: Remove Toaster exceptions section of build dashboard
93f0b61 bitbake: toaster: Record critical errors
069a611 bitbake: toaster: Test that exception isn't thrown by project page
026e981 bitbake: toaster: Check whether buildrequest exists before using it
1feeb8e bitbake: toaster: Always run bldcontrol migrations
ae82d77 bitbake: toaster: buildinfohelper Detect command line builds
596c219 bitbake: toaster: Disable add layer button when input is empty
24e5a17 bitbake: toaster: Have 'Version' next to recipe name
c895838 bitbake: toaster: Improve directory structure layout
2f52ef4 bitbake: toaster: importlayer Update property names for importlayer api calls
556c0ea lib/oe/image.py: Fix dependency handling for compressed types
d302c98 bitbake: toaster: Fix missing tooltips from layers on project configuration page
7e5464b bitbake: toaster: Fix broken test case
2e375e6 bitbake: toaster: exclude recipes with empty names
fa3e82d bitbake: toaster: delete recipe if it can't be saved
82675fc bitbake: toaster: Remove project name from latest project builds
6aeaca1 bitbake: toaster: test get_alldeps API
0fb6be0 bitbake: toaster: fix orm tests
dea679a bitbake: toaster: fix NameError
6e0c0fd bitbake: toaster: use get_alldeps in layerdetails renderer
bd2ec77 bitbake: toaster: implement API to get full list of deps
05594f8 bash: Disable custom memory allocator
adbbab7 icu: fix install race
b1d0aab webkitgtk, gcr, libsecret: force ARM mode
67d6500 gtk+3: gtk3-demo needs libgl
f385ed1 lib/oe/distro_check: Remove '_proxy' on dict values used by urllib.open
4bf7b7d cups: fix non-deterministic xinetd behaviour
32dbf71 cronie: clean up bugtracker info
6396d6a irda-utils: clean up bugtracker info
8d5878b screen: fix CVE-2015-6806
acdc2db kbd: provide a workaround for build failures
67959b9 machine/qemu: Fix OpenGL/GLX support with xserver-xorg.
fedff4f busybox.inc: remove redundant @DATADIR@ replacement
78b9d2d insane.bbclass: remove misleading path in warning
8995a30 iptables: only check libnetfilter-conntrack when libnfnetlink is enabled
e35c404 bitbake: toaster: Don't descend into directories for cached_layers
d9528d9 toasterconf: update meta-yocto to jethro and drop dizzy
2d6701f bitbake: toaster: Update JS unit tests
ab896df bitbake: toaster: Fix stale layer state buttons
41a5f82 bitbake: toaster: tables Add the recipe filter back into the Recipe table
2bebcd4 bitbake: toaster: Fix typo in returning pk list of layer versions in current project
d6d680d bitbake: toaster: layerdetails update build recipe button class name
7794b57 bitbake: toaster: Hide "Download build log" button if log doesn't exist
8c69539 bitbake: toaster: fix naming for clone directory
41286f4 bitbake: toaster: buildinfohelper Skip packages we have no build info about
97d0006 bitbake: toaster: buildinfohelper associate build data with built_recipe
0dcc963 bitbake: toaster: remove bashisms so script works in dash as well
8068aa3 bitbake: toaster: get rid of interactivity in bldcontrol
7d7823e bitbake: toaster: check for configuration file and exit if not found
315989c bitbake: toaster: remove layer and build dir interactive questions
489d5ff bitbake: toaster: removed superuser question from startup
c7d1dab bitbake: toaster: orm Machines filter don't pass self in as parameter
dd957fe bitbake: toaster: Rationalise mimetype guessing to fix artifact downloads
ce9011a bitbake: toaster: Use Python's mimetypes module
466bbec bitbake: toaster: display warnings for bad "IMAGE_FSTYPES" values
8b7d846 bitbake: toaster: Set default columns in recipes tables
9daf6ef bitbake: toaster: Comment out broken sorting and filters
b661f53 bitbake: toaster: Don't HTTP cache ToasterTable responses
a3742a0 bitbake: toaster: Don't add new history entries when table data loads
fa68ae0 bitbake: toaster: use meaningful logging levels
bd8b27b bitbake: toaster: ignore ReachableStamps event
ceeb52a linux-yocto: Update SRCREV for genericx86* BSPs
7766265 os-release: fix do_compile() when RPM signing is enabled
9a02df0 readline: actually apply readline63-003 (aka CVE-2014-2524)
a856580 rpm: fix return without value in patch
49bf4b1 Revert "qemu-native: Enable temporary debug info as default."
ad8c021 linux-yocto/4.1: drm/i915 backports
48e5579 oeqa/utils/qemurunner: Add support for Unicode from qemu
1f99452 report-error.bbclass: Support Unicode reports
b25af33 udev: add PROVIDES = "libgudev"
a0d9d2d lib/oe/image.py: Add image generation for companion debug filesystem
8ee9a93 package_manager.py: sort output of OpkgPkgsList().list
37c54af ThunderX: Add initial tune file
a0e7311 tzdata: update to 2015g
931dda4 tzcode: update to 2015g
8cacd22 recipetool: create: fix change in path structure if --extract-to path exists
e961688 devtool: update-recipe: avoid updating patches that have not changed
07fc8c2 oe-selftest: wic: fix LocalSetup
eac61f3 build-appliance-image: Update to jethro head revision
c9bdcf5 oeqa/runexported: Replaced optionparser with argparse.
038ae3f systemd: remove glib-2.0 build dependency
0516cd2 webkitgtk: Add some PACKAGECONFIG options.
dff30d2 fontcache: allow to pass extra parameters and environment to fc-cache
d5ce2f5 webkitgtk: Use ON/OFF for cmake switches.
ebd5035 testimage: Added IO commands to dumps
b73a35e distro-alias.inc: Updated for jethro 2.0 release
b7f9cde build-appliance-image: Update to jethro head revision
cf8ad8d toaster: Special case the openembedded-core layer to avoid duplicates
20b888b build-appliance-image: Update to jethro head revision
8fb5a5a bitbake: bitbake/lib: Update version to 1.28.0
0eca7ff build-appliance-image: Update to jethro head revision
34fede6 poky.conf: Bump version for 2.0 jethro release
a7329e1 Revert "oeqa/runtime: Added one runtime testcase in connman."
c2e78e3 qemu: Drop BROKEN usage
e788961 smart:cache.py: getPackages() matches name + arch
f3e57ba devtool: modify: use correct local files directory name
7cb0765 xuser-account: Take over xuser specific D-Bus policy
cdaa8fd bluez5: Use upstream D-Bus policy
e4a4961 ptest: run-ptest not required to run do_install_ptest
12cd705 distrodata: Take account proxies on distrodata tasks
f047ee8 devtool: update-recipe: enable var history tracking
979de77 lib/oeqa/selftest/yoctobsp: Basic tests for yocto-bsp script
e20d8b8 scripts/lib/bsp/engine: Indent the karch properties when stored into a file
f2933cc yocto-bsp: Update templates to 4.1 kernel
8283a57 scrips/lib/bsp/engine: List properties to stdout when output parameter is omitted
b355a5e scripts/yocto-bsp: Exit successfully when asking for help
ad9ee3d meta-yocto-bsp: bump to linux-yocto 4.1 for the non-x86 BSPs
cdc57f6 bitbake: siggen: Make it clear why nostamp tasks signatures don't match
1630f0a bitbake: runqueue: Add handling of virtual/xxx provider mappings
0b96e6f bitbake: taskdata: Add a function to return the virtual/ mapping data
40fae32 bitbake: cookerdata: Rename BBPKGS -> BBTARGETS
1e467b3 bitbake: bitbake-worker: Guard against multiprocessing corruption of event data
e5b9c2a oeqa/selftest/wic: Use SetupLocal instead of Setup
4266cc9 kernel.bbclass: fix the bug of checking the existing sections in do_strip()
ec1146e linux-yocto_{3.14,3.19,4.1}: qemuarm enable virtio drivers
2ea0e4c runqemu-internal: qemuarm enable usage of virtio devices
a23239a gnome-doc-utils: xslt - don't install Makefiles
f671163 apr-utils: cleanup buildpaths for target stuffs
f68d739 apr: cleanup buildpaths from target stuffs
a7ac905 curl: cleanup buildpaths from curl-config
833bfd3 dropbear: fix key generation when systemd is in use and rootfs is readonly
d592abd image.bbclass: tweak the key location for dropbear when rootfs is readonly
299806d openssh: fix sshd key generation when systemd is in use and rootfs is readonly
006497e image.bbclass: when building a readonly rootfs, tweak ssh settings regardless of init system in use
f1e2515 lttng-tools: Drop KERNELDIR reference
381a7bd meta-ide-support: No need to mark as nostamp anymore
ab9d2bb adt-installer: No need to mark as nostamp
d8ab563 distutils3: Avoid MACHINE specific checksums
a0d6322 gstreamer-omx: Improve variable expansion of ${S}
c71bd57 bitbake.conf: Exclude sstate-outputdirs flag from checksums
f02cbc6 deploy: Mark deploy tasks as MACHINE specific
a0435bf layer.conf: Add SIGGEN exclusion for oprofile kernel dependency
f4a8917 layer.conf: Improve siggen exclusion to handle virtual/libc
6fe4fd2 multilib_global: Add handling of SIGGEN variables for multilib
2c19695 lib/oe/sstate: Add tasks_resolved handler for virtual/xxx mappings
ff17f14 oeqa/selftest/sstatetests: Add test that MACHINE doesn't change target sigs
d822764 meta-selftest: Add qemux86copy machine
6cfc7c0 oeqa/selftest/sstatetests: Add check for same sigs for SDKMACHINE
5dbd061 multilib.conf: Ensure MACHINE doesn't change target sigs
71fdb36 gcc-multilib-config: Ensure SDK_ARCH doesn't change target sigs
c9ea0c6 lib/oe/package_manager: Handle empty package list in opkg case
ec504e0 oeqa/utils/decorators: Append the testname without the full path
8fe5b48 kern-tools: fix multi-layer patch application
b054506 linux-yocto/4.1: braswell bug fixes
c6c093b linux-yocto/4.1: update to 4.1.8 -stable
a502a2d linux-yocto-rt/4.1: integrate axxia BSP
38f0ffa meta: fix build with gettext 0.16.1
56c0fdf hostap-utils: Use C99 stddefs in defining local typedefs
34707c2 linux-yocto-custom: Update for newer kernel
df09a6f oetest: Change logic of a failed test
7a6cb2e cwautomacros: cleanup buildpath in autogen.sh
1222eb1 oeqa/runexported: Fix a problem with ssh_target_log existing in folder.
cb93670 qemurunner: Sanitize output from qemu and qemu pid
ba0f6ca oeqa/testimage: Add ability to run single test from suite.
3e40688 recipes-extended: remove duplicate recipe and .wks
6f2047a runqemu-internal: Make sure two serial ports always exist
385a5e8 cross-canadian.bbclass: big-endian ARM is also gnueabi.
7c96fcf openssl: fix ptest failures
d9ce095 python-async: inherit setuptools
adb6987 util-linux: add runuser PAM config files to fix runuser error
9549f57 oeqa/decorators: Fixed a problem with decorator logs link.
790b6c7 oeqa/selftest/wic: Added testcase decorator to all testcases + fixed minor typos.
ffd4bd6 toolchain-shar-extract: Correct environment-setup script names for multilib
249b810 lsb: add lsbinitscripts and util-linux rdepends
c7548b5 systemd: add PACKAGECONFIG for qrencode
3b04553 opkg: create opkg.lock in /run instead of /var/run
c275627 toolchain-shar-relocate.sh: make it faster
434665d populate_sdk_base: Simplify postprocess commands
5bfcd13 classes/meta: Add DISTRO_FEATURES check for gtk+/gtk3+
5b629a9 devtool: modify: make bitbake use local files from srctree
e9bae50 devtool: better support for local source files
a74fa38 devtool: file mover function that creates target dir
109c09b devtool: update_recipe: refactor patch generation
c976028 devtool: update-recipe: add new patches in correct order
2f8440b oe-selftest: devtool: add method for checking repo status
0a9f59e oe-selftest: devtool: add method for checking srctree repo
afb0142 oe-selftest: devtool: add setup() method
31c3078 oe.patch.GitApplyTree: add paths argument to extractPatches
d5e2dd4 recipeutils: implement get_recipe_local_files()
4bc3f09 bitbake: toaster: move clones into subdirectory
9e1516d bitbake: toaster: make clone directory name unique
552fd83 bitbake: toaster: fix reimporting module
55dc927 bitbake: toaster: fix bug in resetting git repository
6939340 bitbake: toaster: use git reset --hard instead of rebase
3d73dfa bitbake: toaster: don't use --single-branch when cloning
226e7da bitbake: utils: only add layer once in edit_bblayers_conf()
d48b7ef bitbake: toaster: display most recent builds for projects
f902dc6 bitbake: toaster: orm remove the complicated querying on the ORM
fe29297 bitbake: Revert "bitbake: toaster: don't re-create Target objects"
e6d967d bitbake: toaster: buildinfohelper Create a copy of the built layer and recipe
17fe16b bitbake: toaster: tables show all recipes in the layerdetails even duplicates
aed6d2e bitbake: toaster: Prioroitise the layer more generic vcs reference over the sha
922503f bitbake: toaster: Create a relationship between build information and toaster layers
0bc0a44 bitbake: toaster: Special case the openembedded-core layer to avoid duplicates
e68f63a bitbake: toaster: Add test cases for new Image customisation features
d98c771 bitbake: toaster: Add Image customisation frontend feature
37948cc bitbake: toaster: Add ToasterTables for Image customisation feature
a3ff4b2 bitbake: toaster: Add new ReST API for Image Customisation feature
28153ac bitbake: toaster: Fix indentation of jsunittests view
60f3ddb bitbake: toaster: implement decorator for REST responses
a7f43bd bitbake: toaster: add toggle for enabling image customisation feeature
3ff6401 bitbake: toaster: Add CustomImageRecipe model
8948d04 bitbake: toaster: ToasterTable remove unused class definition
c1157cf bitbake: toaster: add nocache option to the ToasterTable widget
1cafc39 bitbake: toaster: widgets ToasterTable Add more info to search field exception
c71bbad bitbake: toaster: widgets ToasterTable add logger to notify when cache hit
934f8d7 bitbake: toaster: create custom layer and recipes for Image customisation
340b398 bitbake: toaster: tables Move the title and name into the widget
e1851fe bitbake: toaster: make a workaround for old style index
f78f902 bitbake: prserv/serv.py: Better messaging when starting/stopping the server with port=0
134b267 bitbake: prserv/serv: Close the DB connection out of class destructor
caf422c multilib: Add TARGET_VENDOR to saved variables list
3af9f06 oeqa/sdk/gcc: Fix makefile test
00f0d2b gdk-pixbuf: Only apply native cleaning in normal task, not setscene
452237b runqemu-export-rootfs: update location of unfsd binary
aa1253f runqemu: don't complain about conflicting machines if they are equal
994915b oeqa/testimage: Remove absolute path to oeqa from json
f8da3b6 iproute2: fix the configure process
218d9f4 gcc-multilib-config: Expand ccargs variable
be13cdb Empty image: core-image-empty recipe
2bbec56 Empty image:rootfs.py:handle empty PACKAGE_INSTALL
4562f3f gstreamer1.0-plugins-bad: change glimagesink rank to marginal
677a463 linux-yocto/4.1: rt update to 4.1.x-rt8
cdd9c4c linux-yocto/4.1: common-pc-drivers: add CONFIG_PATA_SCH
9028d93 ltp: replace 'inline' with 'static inline' for gcc 5.x
5942dfe waffle: Fix build with musl
cfa3ed0 cups: fix pam configuration file's permission
8227d49 busybox: Use CC instead of bare LD to be the Linker
a3c4817 busybox: Use UTMPX instead of legacy UTMP
ea031f0 distrodata: handle recipes with empty or absent SRC_URI in checkpkg()
5cc44fe recipeutils.py: don't hardcode the upstream version as 1.0 when SRC_URI is empty or absent
320500e oeqa/parselogs: Updated log parser whitelist.
adeba9a connman: Don't use a blanket "allow" D-Bus policy
907c8a7 connman: Depend on xuser-account unconditionally
1b146c5 byacc: add missing patch header
5fd3089 sstate: run recipe-provided hooks outside of ${B}
3fb464f oeqa/decorators: Add timestamp to decorator logs.
5f371e5 image types: add hdddirect
ca52ca0 packagegroup-core-standalone-sdk-target: ensure libatomic is in SDK
6d68ba9 glibc/mmc-utils: Rename 'BRANCH' variable to 'SRCBRANCH' for clearness
c5aab3f sanity.bbclass: show warning when chmod fails
5702a19 systemd: apply persistent storage udev rules also for /dev/hd*
cb24cbb rpm: search for gpg if gpg2 is not found
217cccd openssl: Add mapping for nios2
3408d0d qemurunner: Handle qemu start failure correctly
79e3418 gcc-runtime: Add multilib C++ header mapping
09af262 oeqa/oetest: Fix SDK command execution
5d4f39f mulitlib: Ensure SDKTARGETSYSROOT is set correctly
c356961 gtk-icon-cache/pixbufcache: don't set GDK_PIXBUF_MODULEDIR
4a36842 librsvg: tell configure where gdk-pixbuf-query-loaders is
8a12632 gdk-pixbuf: move gdk-pixbuf-query-loaders to $libdir for multilib safety
b070778 gdk-pixbuf: move gdk-pixbuf-pixdata to gdk-pixbuf-dev
7fb583a multilib: Drop populate_sdk variable manipulation
eb7b1a5 package_manager.py: make rpm install mutilib pkgs corectly
5a51fb2 bitbake: prserv/serv: Start/Stop daemon using ip instead of host
2687b24 gdk-pixbuf: Avoid rebuild failures
94184a0 systemd: fix tmpfiles location when multilib in use
179ee77 p11-kit: configure without trust-paths
c7624b4 oe-pkgdata-util: avoid returning skipped packages
dd11f5c toolchain-shar-extract.sh: remove checkbashism
99fc786 archiver: stamp-base is dead, remove it
ce7bc12 gcc-shared-source: Set empty SRC_URI
47ef201 libgcc.inc: package baremetal multilib libraries
aff7e72 meta-selftest: add error recipe and error-image
261e68c libksba: fix pkgconfig patch
3235a64 systemd: disable problematic GCC 5.2 optimizations
6e7ed5e Revert "systemd: disable problematic GCC 5.2 optimizations"
9673278 oeqa/selftest/archiver: Test that archiver filters on recipe name
6807327 oeqa/utils/dump: Add default commands and directory
5d31e94 webkitgtk: add REQUIRED_DISTRO_FEATURES
8733b53 oeqa/runexported: Removed DEPLOY_DIR as mandatory.
f1e7fb0 oeqa/oetest: Remove bb as requirement for oetest.
d70c5cb gcc-5.2: disable isl
66dca4b kmod: Change SRCREV to fix return code in error path
61e77c7 oeqa/runtime/parselogs.py: Fix dmesg log retrieve in sato
dd26efb insane.bbclass: make package_qa_clean_path return a relative path
bdbd8b4 devtool: upgrade: use shutil.move instead of os.rename
346784b devtool: runqemu: avoid recipe parse
85d8b4a devtool: second fix for running from a different directory
6363a95 guile: cleanup buildpaths and add RDEPENDS on pkgconfig
6d1447b gmp: Use __gnu_inline__ attribute in 4.2.1
42dc902 pseudo_1.7.4.bb: fix f*open()
9f66aa1 bitbake: toaster: start script warning text formatting small improvement
c6eaef0 bitbake: tinfoil: remove logging handler at shutdown
fb26ea3 bitbake: toaster: remove time from builds in progress
15b482b bitbake: toaster: Add fake entry to Target_File for filesystem root
767fe69 bitbake: toaster: layerdetails Fix back button tab behaviour
4c0320f bitbake: toaster: UI test improvements
4c5af77 bitbake: toaster: support selenium testing from mac OS X
e6c4970 bitbake: toaster: add 2 UI tests
f6a70ad bitbake: toaster: change UI to show tasks
08000eb bitbake: toaster: don't re-create Target objects
ea37358 bitbake: toaster: store task name in Target objects
524ddd8 oeqa/utils/qemurunner.py: Remove duplicate message on LoggingThread start
376ce71 oeqa/utils/qemurunner.py: Fix HIGH CPU usage on LoggingThread
6c0066c devtool: add search command
0613301 devtool: add basic means of running runqemu within the extensible SDK
c4181c6 devtool / recipetool: add handling for binary-only packages
76084cd devtool: build-image: delete bbappend at end of build
ef197f9 devtool: build-image: improve image recipe handling
8f67bb7 devtool: build-image: tell user where to find output files
afb9340 devtool: build-image: fix recipe/package terminology
d736518 devtool: add: move important "recipe created" message to the end
3bd0f33 devtool: add: set up fetched source as a git repository by default
e759b0b devtool: better handling for recipes that don't unpack source
a34f733 devtool: fix extracting source for work-shared recipes
5bc437b devtool: show proper error when extracting source for recipes with disabled unpack task
210d959 recipetool: create: fix handling of URIs containing #
a35ad72 recipetool: create: fix creating empty shell functions
30c7e7a devtool: add: properly handle separate build directory
99fc284 devtool / lib/oe/recipeutils: ensure we can parse without bbappends
5d1a117 devtool: add: ensure --color=never turns off recipetool colour output
ae788fb devtool: check that source tree still exists
99cd79d scripts/contrib: add devtool stress tester
e0b9a96 lib/oe/patch: fix for git am not cleaning up after itself
8fb70c6 classes/externalsrc: fix setting of deps varflag as a string
586291f classes/externalsrc: scale back warning to a plain note
72810f9 toolchain-shar-extract.sh: show progress when extracting SDK
0dc9299 classes/populate_sdk_ext: drop work-config.inc
3a08728 classes/populate_sdk_ext: allow custom configuration for extensible SDK
b853dde classes/populate_sdk_ext: fix missing environment settings if running installer with sh
374e1fe lib/oe/recipeutils: properly split unexpanded variable values
7fb3fb9 linux-yocto/4.1: hid, bluetooth, aufs and yaffs2 updates
9241ec5 image_types.bbclass: Don't try to create ubi symlink twice
266e417 oeqa/selftest: buildoptions.py Removed unused imports
329d09f systemd: disable problematic GCC 5.2 optimizations
554c817 libgpg-error: Add support for nios2
84e1100 pixman: Fix missing FE_DIVBYZERO on nios2
9baffc1 libtool: Fix nios2 support
ba1e0ee linux-yocto: depend on libgcc for nios2
8efff24 kernel-arch: Add nios2 to valid archs
4d9af35 siteinfo: Add nios2-linux
76a8c74 insane: Add nios2 support
6adffd0 autotools: fix traversal bug in aclocal copying
6a02bbd python3-debugger: Adds pkgutils dependency to pdb
a7dd758 python3-debugger: fix importlib dependency
0e5a911 libsdl: depends on libglu when both x11 and opengl
d762ea1 lttng-tools: sessiond: disable: match app event by name
c8a7d76 testimage.bbclass: Fix break introduced with SIGTERM handling
7d166a6 sysstat: Include needed headers explicitly
d36384e connman: Fix build with musl
0df9b98 quota: Replace using -I= with STAGING_INCDIR
433a7a0 opkg: Include stdio.h for FILE definition
5aadabf syslinux: Dont bypass gcc driver for dependency generation options
05b9a0c gnu-efi, syslinux: Support gcc < 4.7
cdfd96e gummiboot: Fix build warnings seen with gcc5
0141652 qt4: Fix kmap2qmap build with clang
6b73a05 xz: Correctly specify GPL-3.0 with autoconf exception
a96069d insane.bbclass: drop extra line-feed in pkgname check
10fb575 insane.bbclass: show PN and relative path in package_qa_check_host_user
5624889 package.bbclass: add summary line to installed-vs-shipped QA check
d6e40e8 initramfs-framework: better error reporting for invalid root boot parameter
288a9ff initramfs-framework: fix "support dropping into shell on failure"
5ff7e8d qt4: remove already merged patch
9578b09 gdk-pixbuf: remove redundant libx11 DEPENDS line
fe70aa4 runqemu-internal: For qemumicroblaze use the QEMU provided device tree
9aaf7e3 runqemu-internal: Fix qemu networking for qemuzynq an qemumicroblaze
be493ba libpcre: Allow building 16 and 32bit libpcre versions
f32a6e1 oe-git-proxy: Allow socks4 as protocol in $ALL_PROXY
18309f0 oe-git-proxy: Correct the parsing of a port in $ALL_PROXY
c035f35 oe-git-proxy: Allow explicit IP addresses in $NO_PROXY
bbe06b4 oeqa/testimage: Enhance -v switch in testimage
e0b38f2 wic-image-minimal: add dependency to .wks
dd7726f wic: fix partition size calculation
219d73a wic: use ext4 in wic-image-minimal.wks
ce2cb45 wic: add dependencies to wic-image-minimal recipe
a66f586 testimage.bbclass: Don't require an image manifest
39c11d8 gstreamer1.0: Fix basesink drop buffer error
5f13793 grep: fix install if bindir == base_bindir
b17c02f gzip: fix install if bindir == base_bindir
b6f8ea1 cpio: fix install if bindir == base_bindir
fe0cdab tar: fix install if bindir == base_bindir
c6b52f3 bind: fix too long error from gen
81d65df ccache: fix file name too long
cdbe5c9 bitbake.conf: update APACHE_MIRROR
12772c8 linux-yocto/4.1: hid-core: Avoid uninitialized buffer access
88b11e6 kern-tools: optimize patching peformance
0864782 linux-yocto/4.1: aufs, yaffs2 and driver fixes
git-subtree-dir: yocto-poky
git-subtree-split: c8a4ed9a63de6124c8a3cceb80c7db48f12f7aea
---
bitbake/bin/bitbake | 2 +-
bitbake/bin/bitbake-worker | 9 +
bitbake/bin/toaster | 102 +-
.../bitbake-user-manual-ref-variables.xml | 59 +
bitbake/lib/bb/__init__.py | 2 +-
bitbake/lib/bb/build.py | 7 +
bitbake/lib/bb/command.py | 10 +
bitbake/lib/bb/cooker.py | 32 +-
bitbake/lib/bb/cookerdata.py | 6 +-
bitbake/lib/bb/fetch2/__init__.py | 2 +-
bitbake/lib/bb/fetch2/hg.py | 1 +
bitbake/lib/bb/fetch2/svn.py | 9 +-
bitbake/lib/bb/main.py | 7 +
bitbake/lib/bb/runqueue.py | 9 +
bitbake/lib/bb/siggen.py | 10 +-
bitbake/lib/bb/taskdata.py | 12 +
bitbake/lib/bb/tests/utils.py | 203 ++
bitbake/lib/bb/tinfoil.py | 9 +-
bitbake/lib/bb/ui/buildinfohelper.py | 229 ++-
bitbake/lib/bb/ui/knotty.py | 2 +-
bitbake/lib/bb/ui/toasterui.py | 127 +-
bitbake/lib/bb/utils.py | 105 +-
bitbake/lib/prserv/db.py | 2 +-
bitbake/lib/prserv/serv.py | 38 +-
.../toaster/bldcontrol/localhostbecontroller.py | 97 +-
.../management/commands/checksettings.py | 138 +-
.../bldcontrol/management/commands/runbuilds.py | 15 +-
.../0009_auto__add_field_brlayer_layer_version.py | 180 ++
bitbake/lib/toaster/bldcontrol/models.py | 37 +-
.../tts/toasteruitest/toaster_automation_test.py | 275 ++-
.../contrib/tts/toasteruitest/toaster_test.cfg | 6 +-
...e__add_unique_customimagerecipe_name_project.py | 375 ++++
.../0028_auto__chg_field_logmessage_message.py | 345 ++++
bitbake/lib/toaster/orm/models.py | 155 +-
bitbake/lib/toaster/orm/tests.py | 53 +-
.../lib/toaster/toastergui/static/css/default.css | 9 +
bitbake/lib/toaster/toastergui/static/js/base.js | 18 +-
.../toaster/toastergui/static/js/customrecipe.js | 50 +
.../toaster/toastergui/static/js/importlayer.js | 13 +-
.../toastergui/static/js/jquery.treetable.js | 2 +-
.../lib/toaster/toastergui/static/js/layerBtn.js | 18 +-
.../toaster/toastergui/static/js/layerdetails.js | 32 +-
.../toaster/toastergui/static/js/newcustomimage.js | 49 +
.../toaster/toastergui/static/js/projectpage.js | 31 +-
bitbake/lib/toaster/toastergui/static/js/table.js | 16 +-
.../lib/toaster/toastergui/static/js/tests/test.js | 34 +-
bitbake/lib/toaster/toastergui/tables.py | 247 ++-
bitbake/lib/toaster/toastergui/templates/base.html | 118 +-
.../toastergui/templates/baseprojectpage.html | 10 +-
.../lib/toaster/toastergui/templates/bpackage.html | 1 +
.../toastergui/templates/builddashboard.html | 52 +-
.../lib/toaster/toastergui/templates/builds.html | 32 +-
.../toastergui/templates/configuration.html | 1 +
.../toaster/toastergui/templates/configvars.html | 1 +
.../toastergui/templates/customise_btn.html | 9 +
.../toaster/toastergui/templates/customrecipe.html | 142 ++
.../lib/toaster/toastergui/templates/dirinfo.html | 19 +-
.../toaster/toastergui/templates/importlayer.html | 1 +
.../toastergui/templates/js-unit-tests.html | 16 +-
.../lib/toaster/toastergui/templates/landing.html | 104 +-
.../toastergui/templates/landing_not_managed.html | 2 +
.../toaster/toastergui/templates/layer_btn.html | 12 +-
.../toaster/toastergui/templates/layerdetails.html | 1 +
.../toaster/toastergui/templates/mrb_section.html | 105 +-
.../toastergui/templates/newcustomimage.html | 54 +
.../toaster/toastergui/templates/newproject.html | 3 +
.../toastergui/templates/package_detail_base.html | 11 +-
.../templates/package_included_dependencies.html | 4 +-
.../templates/package_included_detail.html | 4 +-
.../package_included_reverse_dependencies.html | 4 +-
.../toastergui/templates/pkg_add_rm_btn.html | 16 +
.../lib/toaster/toastergui/templates/project.html | 3 +-
.../toastergui/templates/projectbuilds.html | 24 +-
.../toaster/toastergui/templates/projectconf.html | 23 +-
.../lib/toaster/toastergui/templates/projects.html | 25 +-
.../toastergui/templates/projecttopbar.html | 75 +-
.../lib/toaster/toastergui/templates/recipe.html | 1 +
.../toaster/toastergui/templates/recipe_btn.html | 12 +-
.../lib/toaster/toastergui/templates/recipes.html | 1 +
.../lib/toaster/toastergui/templates/target.html | 1 +
bitbake/lib/toaster/toastergui/templates/task.html | 1 +
.../lib/toaster/toastergui/templates/tasks.html | 15 +-
.../toaster/toastergui/templates/toastertable.html | 1 -
.../toastergui/templates/unavailable_artifact.html | 2 +
.../toastergui/templatetags/project_url_tag.py | 34 +
bitbake/lib/toaster/toastergui/tests.py | 614 +++++-
bitbake/lib/toaster/toastergui/typeaheads.py | 9 +-
bitbake/lib/toaster/toastergui/urls.py | 49 +-
bitbake/lib/toaster/toastergui/views.py | 327 ++-
bitbake/lib/toaster/toastergui/widgets.py | 56 +-
bitbake/lib/toaster/toastermain/settings.py | 11 +-
bitbake/lib/toaster/toastermain/urls.py | 2 +-
bitbake/toaster-requirements.txt | 1 -
documentation/Makefile | 2 +-
documentation/adt-manual/adt-manual.xml | 4 +-
documentation/adt-manual/adt-package.xml | 2 +-
documentation/adt-manual/adt-prepare.xml | 15 +
documentation/bsp-guide/bsp-guide.xml | 6 +-
.../dev-manual/dev-manual-common-tasks.xml | 139 +-
documentation/dev-manual/dev-manual-model.xml | 44 +-
documentation/dev-manual/dev-manual-qemu.xml | 24 +-
documentation/dev-manual/dev-manual.xml | 6 +-
documentation/kernel-dev/kernel-dev-common.xml | 4 +
documentation/kernel-dev/kernel-dev.xml | 4 +-
documentation/mega-manual/figures/add-variable.png | Bin 0 -> 110712 bytes
documentation/mega-manual/figures/bash-oecore.png | Bin 0 -> 138198 bytes
documentation/mega-manual/figures/set-variable.png | Bin 0 -> 111430 bytes
.../mega-manual/figures/variable-added.png | Bin 0 -> 112163 bytes
documentation/mega-manual/mega-manual.xml | 6 +-
documentation/poky.ent | 11 +-
documentation/profile-manual/profile-manual.xml | 4 +-
documentation/ref-manual/closer-look.xml | 2 +-
documentation/ref-manual/introduction.xml | 71 +-
documentation/ref-manual/migration.xml | 435 +++-
documentation/ref-manual/ref-classes.xml | 378 +++-
documentation/ref-manual/ref-manual.xml | 4 +-
documentation/ref-manual/ref-tasks.xml | 17 +
documentation/ref-manual/ref-variables.xml | 429 +++-
.../toaster-manual/figures/add-variable.png | Bin 0 -> 110712 bytes
.../toaster-manual/figures/bash-oecore.png | Bin 0 -> 138198 bytes
.../toaster-manual/figures/set-variable.png | Bin 0 -> 111430 bytes
.../toaster-manual/figures/variable-added.png | Bin 0 -> 112163 bytes
.../toaster-manual/toaster-manual-intro.xml | 4 +-
.../toaster-manual/toaster-manual-reference.xml | 211 +-
.../toaster-manual-setup-and-use.xml | 649 +++++-
.../toaster-manual/toaster-manual-start.xml | 36 +-
documentation/toaster-manual/toaster-manual.xml | 6 +-
documentation/tools/mega-manual.sed | 40 +-
.../yocto-project-qs/yocto-project-qs.xml | 2 +-
meta-selftest/conf/machine/qemux86copy.conf | 3 +
meta-selftest/lib/devtool/__init__.py | 0
meta-selftest/lib/devtool/test.py | 11 +
meta-selftest/recipes-test/error/error.bb | 11 +
meta-selftest/recipes-test/images/error-image.bb | 8 +
.../recipes-test/images/test-empty-image.bb | 6 +
.../recipes-test/images/wic-image-minimal.bb | 4 +
.../recipes-test/images/wic-image-minimal.wks | 6 +-
.../recipes-kernel/linux/linux-yocto-custom.bb | 15 +-
.../0001-linux-version-tweak.patch | 21 +-
meta-yocto-bsp/conf/machine/beaglebone.conf | 2 +-
meta-yocto-bsp/conf/machine/edgerouter.conf | 2 +-
.../conf/machine/include/genericx86-common.inc | 2 +-
meta-yocto-bsp/conf/machine/mpc8315e-rdb.conf | 2 +-
meta-yocto-bsp/lib/oeqa/yoctobsp.py | 39 +
.../recipes-kernel/linux/linux-yocto_3.14.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_3.19.bbappend | 4 +-
.../recipes-kernel/linux/linux-yocto_4.1.bbappend | 16 +-
meta-yocto/conf/distro/poky.conf | 7 +-
meta-yocto/conf/local.conf.sample | 4 +-
meta-yocto/conf/local.conf.sample.extended | 9 +
meta-yocto/conf/toasterconf.json | 32 +-
meta/classes/allarch.bbclass | 4 +
meta/classes/archiver.bbclass | 62 +-
meta/classes/autotools.bbclass | 45 +-
meta/classes/base.bbclass | 6 +-
meta/classes/buildhistory.bbclass | 2 +-
meta/classes/cpan-base.bbclass | 4 +
meta/classes/cpan.bbclass | 2 +-
meta/classes/cpan_build.bbclass | 23 +-
meta/classes/cross-canadian.bbclass | 2 +-
meta/classes/deploy.bbclass | 1 +
meta/classes/distrodata.bbclass | 20 +-
meta/classes/distutils3.bbclass | 4 +
meta/classes/externalsrc.bbclass | 5 +-
meta/classes/fontcache.bbclass | 19 +-
meta/classes/grub-efi.bbclass | 3 +-
meta/classes/gtk-icon-cache.bbclass | 12 +-
meta/classes/gummiboot.bbclass | 3 +-
meta/classes/image-live.bbclass | 2 +-
meta/classes/image-mklibs.bbclass | 2 +-
meta/classes/image-vm.bbclass | 3 +-
meta/classes/image.bbclass | 37 +-
meta/classes/image_types.bbclass | 27 +-
meta/classes/insane.bbclass | 17 +-
meta/classes/kernel-arch.bbclass | 7 +-
meta/classes/kernel-yocto.bbclass | 17 +-
meta/classes/kernel.bbclass | 17 +-
meta/classes/libc-package.bbclass | 4 +-
meta/classes/license.bbclass | 1 +
meta/classes/metadata_scm.bbclass | 23 +-
meta/classes/multilib.bbclass | 5 +-
meta/classes/multilib_global.bbclass | 28 +-
meta/classes/package.bbclass | 4 +-
meta/classes/pixbufcache.bbclass | 4 +-
meta/classes/populate_sdk_base.bbclass | 12 +-
meta/classes/populate_sdk_ext.bbclass | 54 +-
meta/classes/prserv.bbclass | 2 -
meta/classes/ptest.bbclass | 10 +-
meta/classes/report-error.bbclass | 11 +-
meta/classes/sanity.bbclass | 11 +-
meta/classes/sign_package_feed.bbclass | 31 +
meta/classes/sign_rpm.bbclass | 48 +-
meta/classes/sstate.bbclass | 30 +-
meta/classes/testimage.bbclass | 56 +-
meta/classes/toolchain-scripts.bbclass | 1 +
meta/classes/uninative.bbclass | 2 +-
meta/classes/useradd-staticids.bbclass | 16 +-
meta/classes/useradd_base.bbclass | 6 +-
meta/conf/bitbake.conf | 5 +-
meta/conf/distro/include/default-distrovars.inc | 3 +
meta/conf/distro/include/distro_alias.inc | 10 +
meta/conf/documentation.conf | 2 +
meta/conf/layer.conf | 5 +-
meta/conf/machine/include/qemu.inc | 2 +-
meta/conf/machine/include/tune-thunderx.inc | 19 +
meta/conf/machine/qemux86-64.conf | 2 +-
meta/conf/machine/qemux86.conf | 2 +-
meta/conf/multilib.conf | 3 +-
meta/files/common-licenses/GFDL-1.1 | 206 +-
meta/files/ext-sdk-prepare.sh | 20 +
meta/files/toolchain-shar-extract.sh | 30 +-
meta/files/toolchain-shar-relocate.sh | 24 +-
meta/lib/oe/copy_buildsystem.py | 5 +-
meta/lib/oe/distro_check.py | 108 +-
meta/lib/oe/image.py | 62 +-
meta/lib/oe/package_manager.py | 137 +-
meta/lib/oe/patch.py | 12 +-
meta/lib/oe/recipeutils.py | 94 +-
meta/lib/oe/rootfs.py | 8 +-
meta/lib/oe/sdk.py | 76 +-
meta/lib/oe/sstatesig.py | 20 +
meta/lib/oeqa/oetest.py | 70 +-
meta/lib/oeqa/runexported.py | 42 +-
meta/lib/oeqa/runtime/_ptest.py | 2 +-
meta/lib/oeqa/runtime/connman.py | 23 -
meta/lib/oeqa/runtime/date.py | 4 +-
meta/lib/oeqa/runtime/files/testsdkmakefile | 5 +
meta/lib/oeqa/runtime/kernelmodule.py | 4 +-
meta/lib/oeqa/runtime/parselogs.py | 13 +-
meta/lib/oeqa/runtime/scanelf.py | 2 +-
meta/lib/oeqa/sdk/gcc.py | 6 +-
meta/lib/oeqa/selftest/archiver.py | 50 +
meta/lib/oeqa/selftest/base.py | 2 +-
meta/lib/oeqa/selftest/bbtests.py | 60 +-
meta/lib/oeqa/selftest/buildoptions.py | 11 +-
meta/lib/oeqa/selftest/devtool.py | 405 ++--
meta/lib/oeqa/selftest/imagefeatures.py | 16 +-
meta/lib/oeqa/selftest/layerappend.py | 9 +-
meta/lib/oeqa/selftest/manifest.py | 165 ++
meta/lib/oeqa/selftest/recipetool.py | 11 +
meta/lib/oeqa/selftest/sstatetests.py | 73 +-
meta/lib/oeqa/selftest/wic.py | 94 +-
meta/lib/oeqa/utils/decorators.py | 35 +-
meta/lib/oeqa/utils/dump.py | 15 +-
meta/lib/oeqa/utils/ftools.py | 20 +-
meta/lib/oeqa/utils/qemurunner.py | 28 +-
.../gnu-efi/gnu-efi/gcc46-compatibility.patch | 21 +
meta/recipes-bsp/gnu-efi/gnu-efi_3.0.3.bb | 1 +
meta/recipes-bsp/grub/files/CVE-2015-8370.patch | 59 +
meta/recipes-bsp/grub/grub2.inc | 1 +
...-C-syntax-errors-for-function-declaration.patch | 74 +
meta/recipes-bsp/gummiboot/gummiboot_git.bb | 3 +
...-__s32-__u16-__s16-__u8-in-terms-of-c99-t.patch | 36 +
meta/recipes-bsp/hostap/hostap-utils.inc | 4 +-
meta/recipes-connectivity/avahi/avahi-ui_0.6.31.bb | 3 +-
.../0001-lib-dns-gen.c-fix-too-long-error.patch | 34 +
.../bind/bind/CVE-2015-8000.patch | 278 +++
.../bind/bind/CVE-2015-8461.patch | 44 +
.../bind/bind/CVE-2015-8704.patch | 28 +
.../bind/bind/CVE-2015-8705.patch | 44 +
meta/recipes-connectivity/bind/bind_9.10.2-P4.bb | 5 +
meta/recipes-connectivity/bluez5/bluez5.inc | 5 +-
.../bluez5/bluez5/bluetooth.conf | 17 -
meta/recipes-connectivity/connman/connman-conf.bb | 6 +-
.../connman/connman-gnome_0.7.bb | 5 +-
meta/recipes-connectivity/connman/connman.inc | 12 +-
...acktrace-API-availability-before-using-it.patch | 55 +
...resolve-musl-does-not-implement-res_ninit.patch | 77 +
.../0003-Fix-header-inclusions-for-musl.patch | 85 +
.../connman/add_xuser_dbus_permission.patch | 21 -
meta/recipes-connectivity/connman/connman/connman | 4 +-
meta/recipes-connectivity/connman/connman_1.30.bb | 4 +-
meta/recipes-connectivity/iproute2/iproute2.inc | 6 +
.../irda-utils/irda-utils_0.9.18.bb | 2 +-
.../openssh/openssh/CVE-2016-1907_2.patch | 65 +
.../openssh/openssh/CVE-2016-1907_3.patch | 329 +++
.../openssh/CVE-2016-1907_upstream_commit.patch | 33 +
.../openssh/openssh/sshd at .service | 4 +-
.../openssh/openssh/sshdgenkeys.service | 21 +-
meta/recipes-connectivity/openssh/openssh_7.1p1.bb | 154 --
meta/recipes-connectivity/openssh/openssh_7.1p2.bb | 157 ++
meta/recipes-connectivity/openssl/openssl.inc | 2 +-
.../openssl/0001-Add-test-for-CVE-2015-3194.patch | 66 +
...64-mont5.pl-fix-carry-propagating-bug-CVE.patch | 101 +
.../CVE-2015-3194-1-Add-PSS-parameter-check.patch | 45 +
...CVE-2015-3195-Fix-leak-with-ASN.1-combine.patch | 66 +
.../openssl/openssl/CVE-2015-3197.patch | 63 +
.../openssl/openssl/CVE-2016-0701_1.patch | 102 +
.../openssl/openssl/CVE-2016-0701_2.patch | 156 ++
.../openssl/openssl/ptest_makefile_deps.patch | 248 +++
.../recipes-connectivity/openssl/openssl_1.0.2d.bb | 18 +
.../socat/socat/CVE-2016-2217.patch | 372 ++++
meta/recipes-connectivity/socat/socat_1.7.3.0.bb | 1 +
meta/recipes-core/busybox/busybox.inc | 3 +-
.../busybox/0001-Switch-to-POSIX-utmpx-API.patch | 388 ++++
...-linking-instead-of-LD-and-use-CFLAGS-and.patch | 114 ++
.../busybox/busybox/0001-randconfig-fix.patch | 33 +
.../busybox/0002-Passthrough-r-to-linker.patch | 32 +
meta/recipes-core/busybox/busybox_1.23.2.bb | 4 +
.../coreutils/coreutils-6.9/loadavg.patch | 18 +
meta/recipes-core/coreutils/coreutils_6.9.bb | 2 +
meta/recipes-core/coreutils/coreutils_8.24.bb | 2 +-
.../dropbear/dropbear/dropbear at .service | 3 +-
.../dropbear/dropbear/dropbearkey.service | 9 +-
.../glibc/cross-localedef-native_2.22.bb | 5 +-
meta/recipes-core/glibc/glibc-locale.inc | 2 +-
...TYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch | 84 +
meta/recipes-core/glibc/glibc/CVE-2015-7547.patch | 642 ++++++
meta/recipes-core/glibc/glibc/CVE-2015-8776.patch | 155 ++
meta/recipes-core/glibc/glibc/CVE-2015-8777.patch | 123 ++
meta/recipes-core/glibc/glibc/CVE-2015-8779.patch | 262 +++
.../recipes-core/glibc/glibc/CVE-2015-9761_1.patch | 1039 ++++++++++
.../recipes-core/glibc/glibc/CVE-2015-9761_2.patch | 385 ++++
...ove-incorrect-STRDIFF-based-optimization-.patch | 323 +++
.../glibc/glibc/use_64bit_atomics.patch | 24 +
meta/recipes-core/glibc/glibc_2.22.bb | 13 +-
.../images/build-appliance-image_12.0.1.bb | 4 +-
.../initrdscripts/files/init-install-efi.sh | 9 +-
.../initrdscripts/initramfs-framework/finish | 2 +-
.../initrdscripts/initramfs-framework/init | 2 +-
.../initscripts/initscripts-1.0/sysfs.sh | 4 +
meta/recipes-core/kbd/kbd_2.0.2.bb | 1 +
meta/recipes-core/libxml/libxml2.inc | 16 +
...-2015-5312-Another-entity-expansion-issue.patch | 39 +
...97-Avoid-an-heap-buffer-overflow-in-xmlDi.patch | 40 +
...00-Fix-memory-access-error-due-to-incorre.patch | 131 ++
...2015-8035-Fix-XZ-compression-support-loop.patch | 38 +
...42-Buffer-overead-with-HTML-parser-in-pus.patch | 49 +
...n-name-parsing-at-the-end-of-current-inpu.patch | 138 ++
...ssing-entities-after-encoding-conversion-.patch | 89 +
...99-1-Add-xmlHaltParser-to-stop-the-parser.patch | 88 +
...VE-2015-7499-2-Detect-incoherency-on-GROW.patch | 43 +
...top-parsing-on-entities-boundaries-errors.patch | 39 +
...leanup-conditional-section-error-handling.patch | 56 +
...ror-in-previous-Conditional-section-patch.patch | 35 +
...iation-of-overflow-in-Conditional-section.patch | 39 +
.../libxml/libxml2/CVE-2015-8241.patch | 40 +
...ng-early-on-if-encoding-conversion-failed.patch | 42 +
.../libxml/libxml2/CVE-2015-8710.patch | 71 +
meta/recipes-core/meta/meta-ide-support.bb | 1 -
.../meta/nativesdk-buildtools-perl-dummy.bb | 13 +-
meta/recipes-core/meta/signing-keys.bb | 45 +
meta/recipes-core/meta/uninative-tarball.bb | 1 +
meta/recipes-core/os-release/os-release.bb | 5 +-
.../packagegroup-core-standalone-sdk-target.bb | 2 +
.../readline-6.3/readline-cve-2014-2524.patch | 43 +
.../readline/readline-6.3/readline63-003 | 43 -
meta/recipes-core/readline/readline_6.3.bb | 2 +-
.../systemd/0001-fix-build-on-uClibc-exp10.patch | 22 +
...nv-when-secure-versions-are-not-available.patch | 39 +
.../systemd/rules-whitelist-hd-devices.patch | 32 +
meta/recipes-core/systemd/systemd_225.bb | 13 +-
meta/recipes-core/uclibc/uclibc-git.inc | 5 +
...-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch | 42 +
...zes-away-the-write-only-static-functions-.patch | 51 +
.../uclibc/uclibc-git/0001-wire-in-syncfs.patch | 49 +
.../uclibc/uclibc-git/CVE-2016-2224.patch | 49 +
.../uclibc/uclibc-git/CVE-2016-2225.patch | 32 +
meta/recipes-core/uclibc/uclibc-git/uClibc.distro | 2 +
meta/recipes-core/udev/udev.inc | 2 +
meta/recipes-core/util-linux/util-linux.inc | 6 +
.../util-linux/util-linux/runuser-l.pamd | 3 +
.../util-linux/util-linux/runuser.pamd | 4 +
meta/recipes-core/util-linux/util-linux_2.26.2.bb | 2 +
.../binutils/binutils/binutils-octeon3.patch | 2 +-
.../build-compare/build-compare_git.bb | 1 -
meta/recipes-devtools/ccache/ccache_3.2.3.bb | 4 +-
.../0002-dev.mk.in-fix-file-name-too-long.patch | 32 +
.../recipes-devtools/dpkg/dpkg/CVE-2015-0860.patch | 52 +
meta/recipes-devtools/dpkg/dpkg_1.18.2.bb | 1 +
...ate-hardlinks-with-the-correct-directory-.patch | 81 +
.../recipes-devtools/e2fsprogs/e2fsprogs_1.42.9.bb | 16 +
meta/recipes-devtools/file/file/host-file.patch | 32 +
meta/recipes-devtools/file/file_5.24.bb | 10 +-
meta/recipes-devtools/gcc/gcc-4.8.inc | 1 +
...-gcc-483-universal-initializer-no-warning.patch | 107 +
meta/recipes-devtools/gcc/gcc-4.9.inc | 1 +
...-gcc-483-universal-initializer-no-warning.patch | 107 +
meta/recipes-devtools/gcc/gcc-5.2.inc | 3 +
.../gcc/gcc-5.2/0042-cxxflags-for-build.patch | 123 ++
meta/recipes-devtools/gcc/gcc-common.inc | 5 +
meta/recipes-devtools/gcc/gcc-configure-common.inc | 1 +
meta/recipes-devtools/gcc/gcc-cross-initial.inc | 1 +
meta/recipes-devtools/gcc/gcc-multilib-config.inc | 3 +-
meta/recipes-devtools/gcc/gcc-runtime.inc | 3 +
meta/recipes-devtools/gcc/gcc-shared-source.inc | 2 +
meta/recipes-devtools/gcc/gcc-target.inc | 12 +-
meta/recipes-devtools/gcc/gcc_4.9.bb | 5 +-
meta/recipes-devtools/gcc/libgcc.inc | 9 +-
.../git/git-2.5.0/0008-CVE-2015-7545-1.patch | 446 +++++
.../git/git-2.5.0/0009-CVE-2015-7545-2.patch | 112 ++
.../git/git-2.5.0/0010-CVE-2015-7545-3.patch | 112 ++
.../git/git-2.5.0/0011-CVE-2015-7545-4.patch | 150 ++
.../git/git-2.5.0/0012-CVE-2015-7545-5.patch | 69 +
meta/recipes-devtools/git/git_2.5.0.bb | 8 +
meta/recipes-devtools/guile/guile_2.0.11.bb | 16 +-
meta/recipes-devtools/i2c-tools/i2c-tools_3.1.2.bb | 3 +-
.../installer/adt-installer_1.0.bb | 1 -
meta/recipes-devtools/libtool/libtool-2.4.6.inc | 1 +
...1-libtool-Fix-support-for-NIOS2-processor.patch | 68 +
meta/recipes-devtools/mmc/mmc-utils_git.bb | 4 +-
meta/recipes-devtools/mtools/mtools_4.0.18.bb | 5 +
meta/recipes-devtools/opensp/opensp_1.5.2.bb | 4 +
...-include-stdio.h-for-getting-FILE-defined.patch | 45 +
...reate-opkg.lock-in-run-instead-of-var-run.patch | 34 +
...ng_util-New-file-with-bin_to_hex-function.patch | 122 ++
.../opkg/0002-md5-Add-md5_to_string-function.patch | 110 +
...0003-sha256-Add-sha256_to_string-function.patch | 110 +
...4-opkg_download-Use-short-cache-file-name.patch | 85 +
meta/recipes-devtools/opkg/opkg_0.3.0.bb | 6 +
meta/recipes-devtools/perl/perl-native_5.22.0.bb | 16 +-
.../perl/perl/perl-errno-generation-gcc5.patch | 23 +
meta/recipes-devtools/perl/perl_5.22.0.bb | 3 +-
meta/recipes-devtools/prelink/prelink_git.bb | 4 +-
meta/recipes-devtools/pseudo/pseudo_1.7.3.bb | 19 -
meta/recipes-devtools/pseudo/pseudo_1.7.4.bb | 19 +
meta/recipes-devtools/pseudo/pseudo_git.bb | 4 +-
.../python/python-3.4-manifest.inc | 2 +-
meta/recipes-devtools/python/python-async_0.6.2.bb | 2 +-
.../recipes-devtools/python/python-pygtk_2.24.0.bb | 4 +-
...cache.py-getPackages-matches-name-version.patch | 43 +
meta/recipes-devtools/python/python-smartpm_git.bb | 1 +
meta/recipes-devtools/qemu/qemu.inc | 8 -
.../qemu/qemu/CVE-2015-7295_1.patch | 63 +
.../qemu/qemu/CVE-2015-7295_2.patch | 58 +
.../qemu/qemu/CVE-2015-7295_3.patch | 52 +
.../recipes-devtools/qemu/qemu/CVE-2015-7504.patch | 56 +
.../recipes-devtools/qemu/qemu/CVE-2015-7512.patch | 44 +
.../recipes-devtools/qemu/qemu/CVE-2015-8345.patch | 73 +
.../recipes-devtools/qemu/qemu/CVE-2015-8504.patch | 51 +
.../recipes-devtools/qemu/qemu/CVE-2016-1568.patch | 46 +
.../recipes-devtools/qemu/qemu/CVE-2016-2197.patch | 59 +
.../recipes-devtools/qemu/qemu/CVE-2016-2198.patch | 45 +
meta/recipes-devtools/qemu/qemu/no-valgrind.patch | 19 +
meta/recipes-devtools/qemu/qemu_2.4.0.bb | 11 +
.../configure.ac-check-for-both-gpg2-and-gpg.patch | 29 +
.../rpm/rpm-check-rootpath-reasonableness.patch | 2 +-
meta/recipes-devtools/rpm/rpm_4.11.2.bb | 3 +-
meta/recipes-devtools/rpm/rpm_5.4+cvs.bb | 1 +
meta/recipes-devtools/rpm/rpm_5.4.14.bb | 2 +
meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c | 10 +-
.../subversion-CVE-2015-3184.patch | 2094 ++++++++++++++++++++
.../subversion-CVE-2015-3187.patch | 346 ++++
.../subversion/subversion_1.8.13.bb | 3 +
.../syslinux/0010-gcc46-compatibility.patch | 37 +
.../0011-mk-MMD-does-not-take-any-arguments.patch | 33 +
meta/recipes-devtools/syslinux/syslinux_6.03.bb | 2 +
meta/recipes-devtools/unfs3/unfs3_0.9.22.r490.bb | 1 +
meta/recipes-extended/bash/bash.inc | 2 +-
meta/recipes-extended/byacc/byacc/byacc-open.patch | 12 +
...bunzip2-qt-returns-0-for-corrupt-archives.patch | 55 +
meta/recipes-extended/bzip2/bzip2_1.0.6.bb | 1 +
meta/recipes-extended/cpio/cpio_v2.inc | 8 +-
meta/recipes-extended/cronie/cronie_1.5.0.bb | 2 +-
meta/recipes-extended/cups/cups.inc | 6 +
.../cwautomacros/cwautomacros_20110201.bb | 3 +
.../foomatic-filters-4.0.17/CVE-2015-8327.patch | 23 +
.../foomatic-filters-4.0.17/CVE-2015-8560.patch | 23 +
.../foomatic/foomatic-filters_4.0.17.bb | 4 +
.../ghostscript/ghostscript/png_mak.patch | 21 +
.../ghostscript/ghostscript_9.16.bb | 1 +
meta/recipes-extended/grep/grep_2.21.bb | 12 +-
meta/recipes-extended/gzip/gzip.inc | 14 +-
meta/recipes-extended/images/wic-image-minimal.bb | 14 -
meta/recipes-extended/images/wic-image-minimal.wks | 10 -
...check-conntrack-when-libnfnetlink-enabled.patch | 34 +
meta/recipes-extended/iptables/iptables_1.4.21.bb | 3 +-
.../libaio/libaio/system-linkage.patch | 37 +
meta/recipes-extended/libaio/libaio_0.3.110.bb | 9 +-
...IVE_EXTRACT_SECURE_NOABSOLUTEPATHS-option.patch | 151 --
.../libarchive/libarchive-CVE-2015-2304.patch | 151 ++
.../libarchive/libarchive_3.1.2.bb | 2 +-
.../libtirpc/libtirpc/remove-des-uclibc.patch | 22 +-
.../libtirpc/libtirpc/va_list.patch | 18 +
meta/recipes-extended/libtirpc/libtirpc_0.2.5.bb | 4 +-
meta/recipes-extended/logrotate/logrotate_3.9.1.bb | 2 +-
meta/recipes-extended/lsb/lsb_4.1.bb | 4 +-
meta/recipes-extended/lsb/lsbinitscripts_9.64.bb | 2 +
...ace-inline-with-static-inline-for-gcc-5.x.patch | 69 +
meta/recipes-extended/ltp/ltp_20150420.bb | 1 +
meta/recipes-extended/mailx/mailx_12.5-5.bb | 5 +
meta/recipes-extended/pam/libpam/use-utmpx.patch | 233 +++
meta/recipes-extended/pam/libpam_1.2.1.bb | 4 +-
.../quota/quota/remove_non_posix_types.patch | 13 +
meta/recipes-extended/quota/quota_4.02.bb | 2 +-
.../rpcbind/rpcbind/0001-uclibc-nss.patch | 30 -
.../rpcbind/rpcbind/cve-2015-7236.patch | 83 +
meta/recipes-extended/rpcbind/rpcbind_0.2.3.bb | 3 +-
...-stack-overflow-due-to-too-deep-recursion.patch | 57 +
meta/recipes-extended/screen/screen_4.3.1.bb | 1 +
meta/recipes-extended/sudo/sudo_1.8.14p3.bb | 2 +-
.../0001-Include-needed-headers-explicitly.patch | 62 +
meta/recipes-extended/sysstat/sysstat_11.1.5.bb | 2 +
meta/recipes-extended/tar/tar.inc | 10 +-
meta/recipes-extended/texinfo/texinfo_6.0.bb | 2 +-
.../recipes-extended/tzcode/tzcode-native_2015f.bb | 25 -
.../recipes-extended/tzcode/tzcode-native_2016a.bb | 25 +
meta/recipes-extended/tzdata/tzdata_2015f.bb | 207 --
meta/recipes-extended/tzdata/tzdata_2016a.bb | 208 ++
.../unzip/unzip/CVE-2015-7696.patch | 38 +
.../unzip/unzip/CVE-2015-7697.patch | 31 +
.../unzip/unzip/cve-2014-9636.patch | 45 +
.../unzip/unzip/unzip-6.0_overflow3.diff | 45 -
meta/recipes-extended/unzip/unzip_6.0.bb | 4 +-
meta/recipes-extended/xz/xz_5.2.1.bb | 2 +-
meta/recipes-gnome/epiphany/epiphany_3.16.3.bb | 5 +-
meta/recipes-gnome/gcr/gcr_3.16.0.bb | 7 +-
.../gdk-pixbuf/gdk-pixbuf/CVE-2015-7674.patch | 39 +
meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf_2.30.8.bb | 26 +-
.../gnome-desktop/gnome-desktop3_3.16.2.bb | 5 +-
meta/recipes-gnome/gnome/gnome-doc-utils.inc | 3 -
meta/recipes-gnome/gtk+/gtk+.inc | 2 +-
meta/recipes-gnome/gtk+/gtk+3.inc | 5 +-
...Do-not-try-to-initialize-GL-without-libGL.patch | 60 +
meta/recipes-gnome/gtk+/gtk+3_3.16.6.bb | 1 +
.../gtk-engines/gtk-engines_2.20.2.bb | 5 +-
.../gtk-theme-torturer/gtk-theme-torturer_git.bb | 3 +
meta/recipes-gnome/libglade/libglade_2.6.4.bb | 3 +-
.../librsvg/librsvg/CVE-2015-7558_1.patch | 139 ++
.../librsvg/librsvg/CVE-2015-7558_2.patch | 230 +++
.../librsvg/librsvg/CVE-2015-7558_3.patch | 223 +++
meta/recipes-gnome/librsvg/librsvg_2.40.10.bb | 8 +-
meta/recipes-gnome/libsecret/libsecret_0.18.2.bb | 5 +-
meta/recipes-gnome/libwnck/libwnck3_3.14.0.bb | 5 +
meta/recipes-graphics/cairo/cairo.inc | 3 +
...anspose-the-matrix-in-_cairo_gl_shader_bi.patch | 49 +
meta/recipes-graphics/cairo/cairo_1.14.2.bb | 1 +
meta/recipes-graphics/directfb/directfb.inc | 3 +
meta/recipes-graphics/libsdl/libsdl_1.2.15.bb | 3 +-
meta/recipes-graphics/libsdl2/libsdl2_2.0.3.bb | 2 +-
...10-sharedtex_mt-fix-rendering-thread-hang.patch | 43 +
meta/recipes-graphics/mesa/mesa-demos_8.2.0.bb | 1 +
meta/recipes-graphics/piglit/piglit_git.bb | 6 +
...-threads-Use-PTHREAD_MUTEX_RECURSIVE-by-d.patch | 54 +
meta/recipes-graphics/waffle/waffle_1.5.1.bb | 4 +-
meta/recipes-graphics/xorg-app/xwininfo_1.1.3.bb | 2 +-
meta/recipes-graphics/xorg-lib/libxcb.inc | 4 +-
.../libxcb/gcc-mips-pr68302-mips-workaround.patch | 22 +
...0001-v3-test-add-a-check-for-FE_DIVBYZERO.patch | 65 +
meta/recipes-graphics/xorg-lib/pixman_0.32.6.bb | 1 +
.../recipes-graphics/xorg-xserver/xserver-xorg.inc | 3 +
.../kern-tools/kern-tools-native_git.bb | 2 +-
meta/recipes-kernel/kmod/kmod.inc | 2 +-
.../linux-firmware/linux-firmware_git.bb | 4 +-
meta/recipes-kernel/linux/linux-yocto-rt_3.14.bb | 3 +-
meta/recipes-kernel/linux/linux-yocto-rt_4.1.bb | 9 +-
meta/recipes-kernel/linux/linux-yocto-tiny_3.14.bb | 2 +-
meta/recipes-kernel/linux/linux-yocto-tiny_4.1.bb | 6 +-
meta/recipes-kernel/linux/linux-yocto.inc | 4 +
meta/recipes-kernel/linux/linux-yocto_3.14.bb | 9 +-
meta/recipes-kernel/linux/linux-yocto_3.19.bb | 9 +-
meta/recipes-kernel/linux/linux-yocto_4.1.bb | 23 +-
...-sessiond-disable-match-app-event-by-name.patch | 58 +
meta/recipes-kernel/lttng/lttng-tools_2.6.0.bb | 3 +-
.../oprofile/oprofileui-server_git.bb | 2 +-
meta/recipes-kernel/oprofile/oprofileui_git.bb | 5 +-
meta/recipes-kernel/sysprof/sysprof_git.bb | 3 +-
meta/recipes-kernel/trace-cmd/kernelshark_git.bb | 3 +
meta/recipes-lsb4/libpng/libpng12_1.2.53.bb | 2 +-
.../recipes-multimedia/gstreamer/gst-player_git.bb | 4 +-
.../gstreamer/gstreamer1.0-libav_1.4.5.bb | 3 +
.../gstreamer/gstreamer1.0-omx.inc | 3 +-
.../gstreamer/gstreamer1.0-plugins-bad.inc | 15 +-
.../0001-glimagesink-Downrank-to-marginal.patch | 32 +
.../gstreamer/gstreamer1.0-plugins-bad_1.4.5.bb | 4 +-
.../gstreamer/gstreamer1.0-plugins-base.inc | 7 +-
.../gstreamer/gstreamer1.0-plugins-good.inc | 14 +-
...ink-Shouldn-t-drop-buffer-when-sync-false.patch | 30 +
.../gstreamer/gstreamer1.0_1.4.5.bb | 1 +
.../libpng/libpng-1.6.17/CVE-2015-8126_1.patch | 91 +
.../libpng/libpng-1.6.17/CVE-2015-8126_2.patch | 134 ++
.../libpng/libpng-1.6.17/CVE-2015-8126_3.patch | 79 +
.../libpng/libpng-1.6.17/CVE-2015-8126_4.patch | 48 +
.../libpng/libpng-1.6.17/CVE-2015-8472.patch | 29 +
meta/recipes-multimedia/libpng/libpng_1.6.17.bb | 10 +-
.../files/libsndfile-fix-CVE-2014-9756.patch | 24 +
.../libsndfile/libsndfile1_1.0.25.bb | 1 +
.../libtiff/files/CVE-2015-8781.patch | 196 ++
.../libtiff/files/CVE-2015-8784.patch | 73 +
meta/recipes-multimedia/libtiff/tiff_4.0.4.bb | 2 +
.../0001-card-add-pa_card_profile.ports.patch | 245 +++
...oth-fail-if-user-requested-profile-doesn-.patch | 60 +
...-move-profile-selection-after-pa_card_new.patch | 363 ++++
...vailability-for-some-unavailable-profiles.patch | 75 +
.../pulseaudio/pulseaudio_6.0.bb | 4 +
meta/recipes-qt/qt4/qt4-4.8.7.inc | 2 +-
.../0028-Don-t-crash-on-broken-GIF-images.patch | 47 -
.../0034-Fix-kmap2qmap-build-with-clang.patch | 34 +
meta/recipes-sato/gtk-engines/gtk-sato-engine.inc | 3 +
meta/recipes-sato/leafpad/leafpad_0.8.18.1.bb | 2 +-
.../matchbox-terminal/matchbox-terminal_git.bb | 4 +-
meta/recipes-sato/pcmanfm/pcmanfm_1.2.3.bb | 2 +-
meta/recipes-sato/puzzles/oh-puzzles_git.bb | 2 +-
meta/recipes-sato/webkit/webkitgtk_2.8.5.bb | 40 +-
meta/recipes-support/apr/apr-util_1.5.4.bb | 6 +
meta/recipes-support/apr/apr_1.5.2.bb | 14 +-
meta/recipes-support/atk/at-spi2-core_2.16.0.bb | 2 +-
meta/recipes-support/curl/curl/CVE-2016-0754.patch | 417 ++++
meta/recipes-support/curl/curl/CVE-2016-0755.patch | 138 ++
meta/recipes-support/curl/curl_7.44.0.bb | 9 +-
.../gmp-4.2.1/Use-__gnu_inline__-attribute.patch | 36 +
.../gmp/gmp-4.2.1/disable-stdc.patch | 39 -
meta/recipes-support/gmp/gmp_4.2.1.bb | 2 +-
.../recipes-support/icu/icu/fix-install-manx.patch | 48 +
meta/recipes-support/icu/icu_55.1.bb | 5 +
.../libbsd/files/CVE-2016-2090.patch | 50 +
meta/recipes-support/libbsd/libbsd_0.7.0.bb | 4 +-
meta/recipes-support/libfm/libfm-extra_1.2.3.bb | 2 +-
meta/recipes-support/libfm/libfm_1.2.3.bb | 5 +-
.../libgcrypt/files/CVE-2015-7511_1.patch | 245 +++
.../libgcrypt/files/CVE-2015-7511_2.patch | 55 +
meta/recipes-support/libgcrypt/libgcrypt_1.6.3.bb | 4 +
.../0001-libgpg-error-Add-nios2-support.patch | 46 +
.../libgpg-error/libgpg-error_1.19.bb | 4 +-
.../libksba/ksba-add-pkgconfig-support.patch | 2 +-
meta/recipes-support/libpcre/libpcre_8.37.bb | 73 -
meta/recipes-support/libpcre/libpcre_8.38.bb | 78 +
...Add-AO_REQUIRE_CAS-to-fix-build-on-ARM-v6.patch | 61 +
meta/recipes-support/libunwind/libunwind_1.1.bb | 5 +
.../libxslt/libxslt/CVE-2015-7995.patch | 33 +
meta/recipes-support/libxslt/libxslt_1.1.28.bb | 3 +-
.../nettle/nettle-3.1.1/CVE-2015-8803_8805.patch | 71 +
.../nettle/nettle-3.1.1/CVE-2015-8804.patch | 281 +++
meta/recipes-support/nettle/nettle_3.1.1.bb | 5 +
meta/recipes-support/p11-kit/p11-kit_0.22.1.bb | 2 +
meta/recipes-support/pinentry/pinentry_0.9.2.bb | 2 +
.../user-creation/files/system-xuser.conf | 11 +
.../user-creation/xuser-account_0.1.bb | 6 +-
.../vte/vte-0.28.2/cve-2012-2738.patch | 135 ++
meta/recipes-support/vte/vte.inc | 3 +-
meta/recipes-support/vte/vte_0.28.2.bb | 3 +-
meta/site/nios2-linux | 395 ++++
scripts/contrib/devtool-stress.py | 241 +++
scripts/contrib/python/generate-manifest-3.4.py | 2 +-
scripts/devtool | 5 +-
scripts/gen-lockedsig-cache | 19 +-
scripts/lib/bsp/engine.py | 6 +-
.../linux/files/machine-preempt-rt.scc | 3 +-
.../linux/files/machine-standard.scc | 3 +-
.../recipes-kernel/linux/files/machine-tiny.scc | 3 +-
.../arm/recipes-kernel/linux/kernel-list.noinstall | 4 +-
.../recipes-kernel/linux/linux-yocto-dev.bbappend | 1 -
.../linux/linux-yocto-rt_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.19.bbappend | 6 +-
.../linux/linux-yocto-tiny_4.1.bbappend | 33 +
.../recipes-kernel/linux/linux-yocto_3.14.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_3.19.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_4.1.bbappend | 32 +
.../target/arch/i386/conf/machine/machine.conf | 4 +-
.../linux/files/machine-preempt-rt.scc | 3 +-
.../linux/files/machine-standard.scc | 3 +-
.../recipes-kernel/linux/files/machine-tiny.scc | 3 +-
.../recipes-kernel/linux/kernel-list.noinstall | 4 +-
.../recipes-kernel/linux/linux-yocto-dev.bbappend | 1 -
.../linux/linux-yocto-rt_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.19.bbappend | 6 +-
.../linux/linux-yocto-tiny_4.1.bbappend | 33 +
.../recipes-kernel/linux/linux-yocto_3.14.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_3.19.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_4.1.bbappend | 32 +
.../linux/files/machine-preempt-rt.scc | 3 +-
.../linux/files/machine-standard.scc | 3 +-
.../recipes-kernel/linux/files/machine-tiny.scc | 3 +-
.../recipes-kernel/linux/kernel-list.noinstall | 4 +-
.../recipes-kernel/linux/linux-yocto-dev.bbappend | 1 -
.../linux/linux-yocto-rt_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.19.bbappend | 6 +-
.../linux/linux-yocto-tiny_4.1.bbappend | 33 +
.../recipes-kernel/linux/linux-yocto_3.14.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_3.19.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_4.1.bbappend | 32 +
.../linux/files/machine-preempt-rt.scc | 3 +-
.../linux/files/machine-standard.scc | 3 +-
.../recipes-kernel/linux/files/machine-tiny.scc | 3 +-
.../recipes-kernel/linux/kernel-list.noinstall | 4 +-
.../recipes-kernel/linux/linux-yocto-dev.bbappend | 1 -
.../linux/linux-yocto-rt_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.19.bbappend | 6 +-
.../linux/linux-yocto-tiny_4.1.bbappend | 33 +
.../recipes-kernel/linux/linux-yocto_3.14.bbappend | 5 +-
.../recipes-kernel/linux/linux-yocto_3.19.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_4.1.bbappend | 32 +
.../target/arch/powerpc/conf/machine/machine.conf | 2 +-
.../linux/files/machine-preempt-rt.scc | 3 +-
.../linux/files/machine-standard.scc | 3 +-
.../recipes-kernel/linux/files/machine-tiny.scc | 3 +-
.../recipes-kernel/linux/kernel-list.noinstall | 4 +-
.../recipes-kernel/linux/linux-yocto-dev.bbappend | 1 -
.../linux/linux-yocto-rt_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.19.bbappend | 6 +-
.../linux/linux-yocto-tiny_4.1.bbappend | 33 +
.../recipes-kernel/linux/linux-yocto_3.14.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_3.19.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_4.1.bbappend | 32 +
.../linux/files/machine-preempt-rt.scc | 3 +-
.../linux/files/machine-standard.scc | 3 +-
.../recipes-kernel/linux/files/machine-tiny.scc | 3 +-
.../recipes-kernel/linux/kernel-list.noinstall | 4 +-
.../recipes-kernel/linux/linux-yocto-dev.bbappend | 1 -
.../linux/linux-yocto-rt_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.19.bbappend | 6 +-
.../linux/linux-yocto-tiny_4.1.bbappend | 62 +
.../recipes-kernel/linux/linux-yocto_3.14.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_3.19.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_4.1.bbappend | 61 +
.../linux/files/machine-preempt-rt.scc | 3 +-
.../linux/files/machine-standard.scc | 3 +-
.../recipes-kernel/linux/files/machine-tiny.scc | 3 +-
.../recipes-kernel/linux/kernel-list.noinstall | 2 +-
.../recipes-kernel/linux/linux-yocto-dev.bbappend | 1 -
.../linux/linux-yocto-rt_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.14.bbappend | 6 +-
.../linux/linux-yocto-tiny_3.19.bbappend | 6 +-
.../linux/linux-yocto-tiny_4.1.bbappend | 33 +
.../recipes-kernel/linux/linux-yocto_3.14.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_3.19.bbappend | 7 +-
.../recipes-kernel/linux/linux-yocto_4.1.bbappend | 32 +
scripts/lib/devtool/__init__.py | 65 +-
scripts/lib/devtool/build-image.py | 94 +-
scripts/lib/devtool/build.py | 6 +-
scripts/lib/devtool/deploy.py | 9 +-
scripts/lib/devtool/package.py | 8 +-
scripts/lib/devtool/runqemu.py | 64 +
scripts/lib/devtool/sdk.py | 56 +-
scripts/lib/devtool/search.py | 80 +
scripts/lib/devtool/standard.py | 590 ++++--
scripts/lib/devtool/upgrade.py | 70 +-
scripts/lib/recipetool/create.py | 74 +-
scripts/lib/recipetool/create_buildsys.py | 2 +-
scripts/lib/scriptutils.py | 4 +
scripts/lib/wic/imager/direct.py | 3 +-
scripts/lib/wic/utils/oe/misc.py | 20 +-
scripts/oe-git-proxy | 12 +-
scripts/oe-pkgdata-util | 7 +-
scripts/oe-publish-sdk | 4 +-
scripts/postinst-intercepts/update_font_cache | 4 +-
scripts/postinst-intercepts/update_icon_cache | 3 +-
scripts/postinst-intercepts/update_pixbuf_cache | 4 +-
scripts/runqemu | 33 +-
scripts/runqemu-export-rootfs | 8 +-
scripts/runqemu-ifup | 15 +
scripts/runqemu-internal | 89 +-
scripts/yocto-bsp | 2 +-
749 files changed, 29611 insertions(+), 4083 deletions(-)
create mode 100644 bitbake/lib/toaster/bldcontrol/migrations/0009_auto__add_field_brlayer_layer_version.py
create mode 100644 bitbake/lib/toaster/orm/migrations/0027_auto__add_customimagerecipe__add_unique_customimagerecipe_name_project.py
create mode 100644 bitbake/lib/toaster/orm/migrations/0028_auto__chg_field_logmessage_message.py
create mode 100644 bitbake/lib/toaster/toastergui/static/js/customrecipe.js
create mode 100644 bitbake/lib/toaster/toastergui/static/js/newcustomimage.js
create mode 100644 bitbake/lib/toaster/toastergui/templates/customise_btn.html
create mode 100644 bitbake/lib/toaster/toastergui/templates/customrecipe.html
create mode 100644 bitbake/lib/toaster/toastergui/templates/newcustomimage.html
create mode 100644 bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
create mode 100644 bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py
create mode 100644 documentation/mega-manual/figures/add-variable.png
create mode 100644 documentation/mega-manual/figures/bash-oecore.png
create mode 100644 documentation/mega-manual/figures/set-variable.png
create mode 100644 documentation/mega-manual/figures/variable-added.png
create mode 100644 documentation/toaster-manual/figures/add-variable.png
create mode 100644 documentation/toaster-manual/figures/bash-oecore.png
create mode 100644 documentation/toaster-manual/figures/set-variable.png
create mode 100644 documentation/toaster-manual/figures/variable-added.png
create mode 100644 meta-selftest/conf/machine/qemux86copy.conf
create mode 100644 meta-selftest/lib/devtool/__init__.py
create mode 100644 meta-selftest/lib/devtool/test.py
create mode 100644 meta-selftest/recipes-test/error/error.bb
create mode 100644 meta-selftest/recipes-test/images/error-image.bb
create mode 100644 meta-selftest/recipes-test/images/test-empty-image.bb
create mode 100644 meta-yocto-bsp/lib/oeqa/yoctobsp.py
delete mode 100644 meta/classes/prserv.bbclass
create mode 100644 meta/classes/sign_package_feed.bbclass
create mode 100644 meta/conf/machine/include/tune-thunderx.inc
create mode 100644 meta/files/ext-sdk-prepare.sh
create mode 100644 meta/lib/oeqa/runtime/files/testsdkmakefile
create mode 100644 meta/lib/oeqa/selftest/archiver.py
create mode 100644 meta/lib/oeqa/selftest/manifest.py
create mode 100644 meta/recipes-bsp/gnu-efi/gnu-efi/gcc46-compatibility.patch
create mode 100644 meta/recipes-bsp/grub/files/CVE-2015-8370.patch
create mode 100644 meta/recipes-bsp/gummiboot/gummiboot/0001-console-Fix-C-syntax-errors-for-function-declaration.patch
create mode 100644 meta/recipes-bsp/hostap/hostap-utils-0.4.7/0001-Define-_u32-__s32-__u16-__s16-__u8-in-terms-of-c99-t.patch
create mode 100644 meta/recipes-connectivity/bind/bind/0001-lib-dns-gen.c-fix-too-long-error.patch
create mode 100644 meta/recipes-connectivity/bind/bind/CVE-2015-8000.patch
create mode 100644 meta/recipes-connectivity/bind/bind/CVE-2015-8461.patch
create mode 100644 meta/recipes-connectivity/bind/bind/CVE-2015-8704.patch
create mode 100644 meta/recipes-connectivity/bind/bind/CVE-2015-8705.patch
delete mode 100644 meta/recipes-connectivity/bluez5/bluez5/bluetooth.conf
create mode 100644 meta/recipes-connectivity/connman/connman/0001-Detect-backtrace-API-availability-before-using-it.patch
create mode 100644 meta/recipes-connectivity/connman/connman/0002-resolve-musl-does-not-implement-res_ninit.patch
create mode 100644 meta/recipes-connectivity/connman/connman/0003-Fix-header-inclusions-for-musl.patch
delete mode 100644 meta/recipes-connectivity/connman/connman/add_xuser_dbus_permission.patch
create mode 100644 meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_2.patch
create mode 100644 meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_3.patch
create mode 100644 meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_upstream_commit.patch
delete mode 100644 meta/recipes-connectivity/openssh/openssh_7.1p1.bb
create mode 100644 meta/recipes-connectivity/openssh/openssh_7.1p2.bb
create mode 100644 meta/recipes-connectivity/openssl/openssl/0001-Add-test-for-CVE-2015-3194.patch
create mode 100644 meta/recipes-connectivity/openssl/openssl/CVE-2015-3193-bn-asm-x86_64-mont5.pl-fix-carry-propagating-bug-CVE.patch
create mode 100644 meta/recipes-connectivity/openssl/openssl/CVE-2015-3194-1-Add-PSS-parameter-check.patch
create mode 100644 meta/recipes-connectivity/openssl/openssl/CVE-2015-3195-Fix-leak-with-ASN.1-combine.patch
create mode 100644 meta/recipes-connectivity/openssl/openssl/CVE-2015-3197.patch
create mode 100644 meta/recipes-connectivity/openssl/openssl/CVE-2016-0701_1.patch
create mode 100644 meta/recipes-connectivity/openssl/openssl/CVE-2016-0701_2.patch
create mode 100644 meta/recipes-connectivity/openssl/openssl/ptest_makefile_deps.patch
create mode 100644 meta/recipes-connectivity/socat/socat/CVE-2016-2217.patch
create mode 100644 meta/recipes-core/busybox/busybox/0001-Switch-to-POSIX-utmpx-API.patch
create mode 100644 meta/recipes-core/busybox/busybox/0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch
create mode 100644 meta/recipes-core/busybox/busybox/0001-randconfig-fix.patch
create mode 100644 meta/recipes-core/busybox/busybox/0002-Passthrough-r-to-linker.patch
create mode 100644 meta/recipes-core/coreutils/coreutils-6.9/loadavg.patch
create mode 100644 meta/recipes-core/glibc/glibc/0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch
create mode 100644 meta/recipes-core/glibc/glibc/CVE-2015-7547.patch
create mode 100644 meta/recipes-core/glibc/glibc/CVE-2015-8776.patch
create mode 100644 meta/recipes-core/glibc/glibc/CVE-2015-8777.patch
create mode 100644 meta/recipes-core/glibc/glibc/CVE-2015-8779.patch
create mode 100644 meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch
create mode 100644 meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch
create mode 100644 meta/recipes-core/glibc/glibc/strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch
create mode 100644 meta/recipes-core/glibc/glibc/use_64bit_atomics.patch
create mode 100644 meta/recipes-core/libxml/libxml2/0001-CVE-2015-5312-Another-entity-expansion-issue.patch
create mode 100644 meta/recipes-core/libxml/libxml2/0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch
create mode 100644 meta/recipes-core/libxml/libxml2/0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch
create mode 100644 meta/recipes-core/libxml/libxml2/0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch
create mode 100644 meta/recipes-core/libxml/libxml2/0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch
create mode 100644 meta/recipes-core/libxml/libxml2/0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-7499-2-Detect-incoherency-on-GROW.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-8241.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch
create mode 100644 meta/recipes-core/libxml/libxml2/CVE-2015-8710.patch
create mode 100644 meta/recipes-core/meta/signing-keys.bb
create mode 100644 meta/recipes-core/readline/readline-6.3/readline-cve-2014-2524.patch
delete mode 100644 meta/recipes-core/readline/readline-6.3/readline63-003
create mode 100644 meta/recipes-core/systemd/systemd/0001-fix-build-on-uClibc-exp10.patch
create mode 100644 meta/recipes-core/systemd/systemd/0022-Use-getenv-when-secure-versions-are-not-available.patch
create mode 100644 meta/recipes-core/systemd/systemd/rules-whitelist-hd-devices.patch
create mode 100644 meta/recipes-core/uclibc/uclibc-git/0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch
create mode 100644 meta/recipes-core/uclibc/uclibc-git/0001-gcc5-optimizes-away-the-write-only-static-functions-.patch
create mode 100644 meta/recipes-core/uclibc/uclibc-git/0001-wire-in-syncfs.patch
create mode 100644 meta/recipes-core/uclibc/uclibc-git/CVE-2016-2224.patch
create mode 100644 meta/recipes-core/uclibc/uclibc-git/CVE-2016-2225.patch
create mode 100644 meta/recipes-core/util-linux/util-linux/runuser-l.pamd
create mode 100644 meta/recipes-core/util-linux/util-linux/runuser.pamd
create mode 100644 meta/recipes-devtools/ccache/files/0002-dev.mk.in-fix-file-name-too-long.patch
create mode 100644 meta/recipes-devtools/dpkg/dpkg/CVE-2015-0860.patch
create mode 100644 meta/recipes-devtools/e2fsprogs/e2fsprogs/copy-in-create-hardlinks-with-the-correct-directory-.patch
create mode 100644 meta/recipes-devtools/file/file/host-file.patch
create mode 100644 meta/recipes-devtools/gcc/gcc-4.8/0051-gcc-483-universal-initializer-no-warning.patch
create mode 100644 meta/recipes-devtools/gcc/gcc-4.9/0065-gcc-483-universal-initializer-no-warning.patch
create mode 100644 meta/recipes-devtools/gcc/gcc-5.2/0042-cxxflags-for-build.patch
create mode 100644 meta/recipes-devtools/git/git-2.5.0/0008-CVE-2015-7545-1.patch
create mode 100644 meta/recipes-devtools/git/git-2.5.0/0009-CVE-2015-7545-2.patch
create mode 100644 meta/recipes-devtools/git/git-2.5.0/0010-CVE-2015-7545-3.patch
create mode 100644 meta/recipes-devtools/git/git-2.5.0/0011-CVE-2015-7545-4.patch
create mode 100644 meta/recipes-devtools/git/git-2.5.0/0012-CVE-2015-7545-5.patch
create mode 100644 meta/recipes-devtools/libtool/libtool/0001-libtool-Fix-support-for-NIOS2-processor.patch
create mode 100644 meta/recipes-devtools/opkg/opkg/0001-libopkg-include-stdio.h-for-getting-FILE-defined.patch
create mode 100644 meta/recipes-devtools/opkg/opkg/0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch
create mode 100644 meta/recipes-devtools/opkg/opkg/0001-string_util-New-file-with-bin_to_hex-function.patch
create mode 100644 meta/recipes-devtools/opkg/opkg/0002-md5-Add-md5_to_string-function.patch
create mode 100644 meta/recipes-devtools/opkg/opkg/0003-sha256-Add-sha256_to_string-function.patch
create mode 100644 meta/recipes-devtools/opkg/opkg/0004-opkg_download-Use-short-cache-file-name.patch
create mode 100644 meta/recipes-devtools/perl/perl/perl-errno-generation-gcc5.patch
delete mode 100644 meta/recipes-devtools/pseudo/pseudo_1.7.3.bb
create mode 100644 meta/recipes-devtools/pseudo/pseudo_1.7.4.bb
create mode 100644 meta/recipes-devtools/python/python-smartpm/smart-cache.py-getPackages-matches-name-version.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2015-7295_1.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2015-7295_2.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2015-7295_3.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2015-7504.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2015-7512.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2015-8345.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2015-8504.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2016-1568.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2016-2197.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/CVE-2016-2198.patch
create mode 100644 meta/recipes-devtools/qemu/qemu/no-valgrind.patch
create mode 100644 meta/recipes-devtools/rpm/rpm/configure.ac-check-for-both-gpg2-and-gpg.patch
create mode 100644 meta/recipes-devtools/subversion/subversion-1.8.13/subversion-CVE-2015-3184.patch
create mode 100644 meta/recipes-devtools/subversion/subversion-1.8.13/subversion-CVE-2015-3187.patch
create mode 100644 meta/recipes-devtools/syslinux/syslinux/0010-gcc46-compatibility.patch
create mode 100644 meta/recipes-devtools/syslinux/syslinux/0011-mk-MMD-does-not-take-any-arguments.patch
create mode 100644 meta/recipes-extended/bzip2/bzip2-1.0.6/fix-bunzip2-qt-returns-0-for-corrupt-archives.patch
create mode 100644 meta/recipes-extended/foomatic/foomatic-filters-4.0.17/CVE-2015-8327.patch
create mode 100644 meta/recipes-extended/foomatic/foomatic-filters-4.0.17/CVE-2015-8560.patch
create mode 100644 meta/recipes-extended/ghostscript/ghostscript/png_mak.patch
delete mode 100644 meta/recipes-extended/images/wic-image-minimal.bb
delete mode 100644 meta/recipes-extended/images/wic-image-minimal.wks
create mode 100644 meta/recipes-extended/iptables/iptables/0002-configure.ac-only-check-conntrack-when-libnfnetlink-enabled.patch
create mode 100644 meta/recipes-extended/libaio/libaio/system-linkage.patch
delete mode 100644 meta/recipes-extended/libarchive/libarchive/0001-Add-ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS-option.patch
create mode 100644 meta/recipes-extended/libarchive/libarchive/libarchive-CVE-2015-2304.patch
create mode 100644 meta/recipes-extended/libtirpc/libtirpc/va_list.patch
create mode 100644 meta/recipes-extended/ltp/ltp/0001-replace-inline-with-static-inline-for-gcc-5.x.patch
create mode 100644 meta/recipes-extended/pam/libpam/use-utmpx.patch
delete mode 100644 meta/recipes-extended/rpcbind/rpcbind/0001-uclibc-nss.patch
create mode 100644 meta/recipes-extended/rpcbind/rpcbind/cve-2015-7236.patch
create mode 100644 meta/recipes-extended/screen/screen/0001-Fix-stack-overflow-due-to-too-deep-recursion.patch
create mode 100644 meta/recipes-extended/sysstat/sysstat/0001-Include-needed-headers-explicitly.patch
delete mode 100644 meta/recipes-extended/tzcode/tzcode-native_2015f.bb
create mode 100644 meta/recipes-extended/tzcode/tzcode-native_2016a.bb
delete mode 100644 meta/recipes-extended/tzdata/tzdata_2015f.bb
create mode 100644 meta/recipes-extended/tzdata/tzdata_2016a.bb
create mode 100644 meta/recipes-extended/unzip/unzip/CVE-2015-7696.patch
create mode 100644 meta/recipes-extended/unzip/unzip/CVE-2015-7697.patch
create mode 100644 meta/recipes-extended/unzip/unzip/cve-2014-9636.patch
delete mode 100644 meta/recipes-extended/unzip/unzip/unzip-6.0_overflow3.diff
create mode 100644 meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf/CVE-2015-7674.patch
create mode 100644 meta/recipes-gnome/gtk+/gtk+3/Do-not-try-to-initialize-GL-without-libGL.patch
create mode 100644 meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_1.patch
create mode 100644 meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_2.patch
create mode 100644 meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_3.patch
create mode 100644 meta/recipes-graphics/cairo/cairo/Manually-transpose-the-matrix-in-_cairo_gl_shader_bi.patch
create mode 100644 meta/recipes-graphics/mesa/mesa-demos/0010-sharedtex_mt-fix-rendering-thread-hang.patch
create mode 100644 meta/recipes-graphics/waffle/waffle/0001-third_party-threads-Use-PTHREAD_MUTEX_RECURSIVE-by-d.patch
create mode 100644 meta/recipes-graphics/xorg-lib/libxcb/gcc-mips-pr68302-mips-workaround.patch
create mode 100644 meta/recipes-graphics/xorg-lib/pixman/0001-v3-test-add-a-check-for-FE_DIVBYZERO.patch
create mode 100644 meta/recipes-kernel/lttng/lttng-tools/0001-Fix-sessiond-disable-match-app-event-by-name.patch
create mode 100644 meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-glimagesink-Downrank-to-marginal.patch
create mode 100755 meta/recipes-multimedia/gstreamer/gstreamer1.0/0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch
create mode 100644 meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_1.patch
create mode 100644 meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_2.patch
create mode 100644 meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_3.patch
create mode 100644 meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_4.patch
create mode 100644 meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8472.patch
create mode 100644 meta/recipes-multimedia/libsndfile/files/libsndfile-fix-CVE-2014-9756.patch
create mode 100644 meta/recipes-multimedia/libtiff/files/CVE-2015-8781.patch
create mode 100644 meta/recipes-multimedia/libtiff/files/CVE-2015-8784.patch
create mode 100644 meta/recipes-multimedia/pulseaudio/pulseaudio/0001-card-add-pa_card_profile.ports.patch
create mode 100644 meta/recipes-multimedia/pulseaudio/pulseaudio/0002-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch
create mode 100644 meta/recipes-multimedia/pulseaudio/pulseaudio/0003-card-move-profile-selection-after-pa_card_new.patch
create mode 100644 meta/recipes-multimedia/pulseaudio/pulseaudio/0004-alsa-set-availability-for-some-unavailable-profiles.patch
delete mode 100644 meta/recipes-qt/qt4/qt4-4.8.7/0028-Don-t-crash-on-broken-GIF-images.patch
create mode 100644 meta/recipes-qt/qt4/qt4-4.8.7/0034-Fix-kmap2qmap-build-with-clang.patch
create mode 100644 meta/recipes-support/curl/curl/CVE-2016-0754.patch
create mode 100644 meta/recipes-support/curl/curl/CVE-2016-0755.patch
create mode 100644 meta/recipes-support/gmp/gmp-4.2.1/Use-__gnu_inline__-attribute.patch
delete mode 100644 meta/recipes-support/gmp/gmp-4.2.1/disable-stdc.patch
create mode 100644 meta/recipes-support/icu/icu/fix-install-manx.patch
create mode 100644 meta/recipes-support/libbsd/files/CVE-2016-2090.patch
create mode 100644 meta/recipes-support/libgcrypt/files/CVE-2015-7511_1.patch
create mode 100644 meta/recipes-support/libgcrypt/files/CVE-2015-7511_2.patch
create mode 100644 meta/recipes-support/libgpg-error/libgpg-error/0001-libgpg-error-Add-nios2-support.patch
delete mode 100644 meta/recipes-support/libpcre/libpcre_8.37.bb
create mode 100644 meta/recipes-support/libpcre/libpcre_8.38.bb
create mode 100644 meta/recipes-support/libunwind/libunwind-1.1/Add-AO_REQUIRE_CAS-to-fix-build-on-ARM-v6.patch
create mode 100644 meta/recipes-support/libxslt/libxslt/CVE-2015-7995.patch
create mode 100644 meta/recipes-support/nettle/nettle-3.1.1/CVE-2015-8803_8805.patch
create mode 100644 meta/recipes-support/nettle/nettle-3.1.1/CVE-2015-8804.patch
create mode 100644 meta/recipes-support/user-creation/files/system-xuser.conf
create mode 100644 meta/recipes-support/vte/vte-0.28.2/cve-2012-2738.patch
create mode 100644 meta/site/nios2-linux
create mode 100755 scripts/contrib/devtool-stress.py
create mode 100644 scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
create mode 100644 scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_4.1.bbappend
create mode 100644 scripts/lib/devtool/runqemu.py
create mode 100644 scripts/lib/devtool/search.py
diff --git a/bitbake/bin/bitbake b/bitbake/bin/bitbake
index e3d138b..981b2c0 100755
--- a/bitbake/bin/bitbake
+++ b/bitbake/bin/bitbake
@@ -35,7 +35,7 @@ except RuntimeError as exc:
from bb import cookerdata
from bb.main import bitbake_main, BitBakeConfigParameters, BBMainException
-__version__ = "1.27.1"
+__version__ = "1.28.0"
if __name__ == "__main__":
if __version__ != bb.__version__:
diff --git a/bitbake/bin/bitbake-worker b/bitbake/bin/bitbake-worker
index af17b87..3390f63 100755
--- a/bitbake/bin/bitbake-worker
+++ b/bitbake/bin/bitbake-worker
@@ -10,6 +10,7 @@ import bb
import select
import errno
import signal
+from multiprocessing import Lock
# Users shouldn't be running this code directly
if len(sys.argv) != 2 or not sys.argv[1].startswith("decafbad"):
@@ -44,6 +45,9 @@ except ImportError:
worker_pipe = sys.stdout.fileno()
bb.utils.nonblockingfd(worker_pipe)
+# Need to guard against multiprocessing being used in child processes
+# and multiple processes trying to write to the parent at the same time
+worker_pipe_lock = None
handler = bb.event.LogHandler()
logger.addHandler(handler)
@@ -85,10 +89,13 @@ def worker_flush():
def worker_child_fire(event, d):
global worker_pipe
+ global worker_pipe_lock
data = "<event>" + pickle.dumps(event) + "</event>"
try:
+ worker_pipe_lock.acquire()
worker_pipe.write(data)
+ worker_pipe_lock.release()
except IOError:
sigterm_handler(None, None)
raise
@@ -157,6 +164,7 @@ def fork_off_task(cfg, data, workerdata, fn, task, taskname, appends, taskdepdat
if pid == 0:
def child():
global worker_pipe
+ global worker_pipe_lock
pipein.close()
signal.signal(signal.SIGTERM, sigterm_handler)
@@ -169,6 +177,7 @@ def fork_off_task(cfg, data, workerdata, fn, task, taskname, appends, taskdepdat
bb.event.worker_pid = os.getpid()
bb.event.worker_fire = worker_child_fire
worker_pipe = pipeout
+ worker_pipe_lock = Lock()
# Make the child the process group leader and ensure no
# child process will be controlled by the current terminal
diff --git a/bitbake/bin/toaster b/bitbake/bin/toaster
index 411ce2c..2c3432c 100755
--- a/bitbake/bin/toaster
+++ b/bitbake/bin/toaster
@@ -54,35 +54,55 @@ webserverStartAll()
fi
retval=0
- if [ "$TOASTER_MANAGED" '=' '1' ]; then
- python $BBBASEDIR/lib/toaster/manage.py syncdb || retval=1
- else
- python $BBBASEDIR/lib/toaster/manage.py syncdb --noinput || retval=1
- fi
+ # you can always add a superuser later via
+ # python bitbake/lib/toaster/manage.py python manage.py createsuperuser --username=<ME>
+ python $BBBASEDIR/lib/toaster/manage.py syncdb --noinput || retval=1
+
python $BBBASEDIR/lib/toaster/manage.py migrate orm || retval=2
+
if [ $retval -eq 1 ]; then
- echo "Failed db sync, stopping system start" 1>&2
- elif [ $retval -eq 2 ]; then
- printf "\nError on migration, trying to recover... \n"
+ echo "Failed db sync, aborting system start" 1>&2
+ return $retval
+ fi
+
+ python $BBBASEDIR/lib/toaster/manage.py migrate orm || retval=1
+
+ if [ $retval -eq 1 ]; then
+ printf "\nError on orm migration, rolling back...\n"
python $BBBASEDIR/lib/toaster/manage.py migrate orm 0001_initial --fake
- retval=0
- python $BBBASEDIR/lib/toaster/manage.py migrate orm || retval=1
+ return $retval
fi
+
+ python $BBBASEDIR/lib/toaster/manage.py migrate bldcontrol || retval=1
+
+ if [ $retval -eq 1 ]; then
+ printf "\nError on bldcontrol migration, rolling back...\n"
+ python $BBBASEDIR/lib/toaster/manage.py migrate bldcontrol 0001_initial --fake
+ return $retval
+ fi
+
if [ "$TOASTER_MANAGED" = '1' ]; then
- python $BBBASEDIR/lib/toaster/manage.py migrate bldcontrol || retval=1
- python $BBBASEDIR/lib/toaster/manage.py checksettings --traceback || retval=1
+ python $BBBASEDIR/lib/toaster/manage.py checksettings --traceback || retval=1
fi
- if [ $retval -eq 0 ]; then
- echo "Starting webserver..."
- python $BBBASEDIR/lib/toaster/manage.py runserver "0.0.0.0:$WEB_PORT" </dev/null >>${BUILDDIR}/toaster_web.log 2>&1 & echo $! >${BUILDDIR}/.toastermain.pid
- sleep 1
- if ! cat "${BUILDDIR}/.toastermain.pid" | xargs -I{} kill -0 {} ; then
- retval=1
- rm "${BUILDDIR}/.toastermain.pid"
- else
- echo "Webserver address: http://0.0.0.0:$WEB_PORT/"
- fi
+
+ if [ $retval -eq 1 ]; then
+ printf "\nError while checking settings; aborting\n"
+ return $retval
+ fi
+
+ echo "Starting webserver..."
+
+ python $BBBASEDIR/lib/toaster/manage.py runserver "0.0.0.0:$WEB_PORT" </dev/null >>${BUILDDIR}/toaster_web.log 2>&1 & echo $! >${BUILDDIR}/.toastermain.pid
+
+ sleep 1
+
+ if ! cat "${BUILDDIR}/.toastermain.pid" | xargs -I{} kill -0 {} ; then
+ retval=1
+ rm "${BUILDDIR}/.toastermain.pid"
+ else
+ echo "Webserver address: http://0.0.0.0:$WEB_PORT/"
fi
+
return $retval
}
@@ -156,6 +176,8 @@ else
TOASTER=$0
fi
+[ `basename \"$0\"` = `basename \"${TOASTER}\"` ] && TOASTER_MANAGED=1
+
BBBASEDIR=`dirname $TOASTER`/..
RUNNING=0
@@ -163,7 +185,34 @@ RUNNING=0
NOTOASTERUI=0
WEBSERVER=1
TOASTER_BRBE=""
-WEB_PORT="8000"
+if [ "$WEB_PORT" = "" ]; then
+ WEB_PORT="8000"
+fi
+# this is the configuraton file we are using for toaster
+# note default is assuming yocto. Override this if you are
+# running in a pure OE environment and use the toasterconf.json
+# in meta/conf/toasterconf.json
+# note: for future there are a number of relative path assumptions
+# in the local layers that currently prevent using an arbitrary
+# toasterconf.json
+if [ "$TOASTER_CONF" = "" ]; then
+ TOASTER_CONF="$(dirname $TOASTER)/../../meta-yocto/conf/toasterconf.json"
+ export TOASTER_CONF=$(python -c "import os; print os.path.realpath('$TOASTER_CONF')")
+fi
+if [ ! -f $TOASTER_CONF ]; then
+ echo "$TOASTER_CONF configuration file not found. set TOASTER_CONF to specify a path"
+ [ "$TOASTER_MANAGED" = '1' ] && exit 1 || return 1
+fi
+# this defines the dir toaster will use for
+# 1) clones of layers (in _toaster_clones )
+# 2) the build dir (in build)
+# 3) the sqlite db if that is being used.
+# 4) pid's we need to clean up on exit/shutdown
+# note: for future. in order to make this an arbitrary directory, we need to
+# make sure that the toaster.sqlite file doesn't default to `pwd` like it currently does.
+export TOASTER_DIR=`pwd`
+
+
NOBROWSER=0
for param in $*; do
@@ -185,9 +234,7 @@ for param in $*; do
esac
done
-[ -n "${BASH_SOURCE}" ] && SRCFILE=${BASH_SOURCE} || SRCFILE=$_
-
-if [ `basename \"$0\"` = `basename \"${SRCFILE}\"` ]; then
+if [ "$TOASTER_MANAGED" = '1' ]; then
# We are called as standalone. We refuse to run in a build environment - we need the interactive mode for that.
# Start just the web server, point the web browser to the interface, and start any Django services.
@@ -197,7 +244,7 @@ if [ `basename \"$0\"` = `basename \"${SRCFILE}\"` ]; then
fi
if [ -n "$BUILDDIR" ]; then
- printf "Error: It looks like you sourced oe-init-build-env. Toaster cannot start in build mode from an oe-core build environment.\n You should be starting Toaster from a new terminal window." 1>&2
+ printf "Error: It looks like you sourced oe-init-build-env. Toaster cannot start in build mode from an oe-core build environment.\n You should be starting Toaster from a new terminal window.\n" 1>&2
exit 1
fi
@@ -234,7 +281,6 @@ if [ `basename \"$0\"` = `basename \"${SRCFILE}\"` ]; then
do_cleanup
fi
}
- TOASTER_MANAGED=1
export TOASTER_MANAGED=1
if [ $WEBSERVER -gt 0 ] && ! webserverStartAll; then
echo "Failed to start the web server, stopping" 1>&2
diff --git a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml
index 05e1b95..e5aeffc 100644
--- a/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml
+++ b/bitbake/doc/bitbake-user-manual/bitbake-user-manual-ref-variables.xml
@@ -856,6 +856,56 @@
</glossdef>
</glossentry>
+ <glossentry id='var-BB_TASK_IONICE_LEVEL'><glossterm>BB_TASK_IONICE_LEVEL</glossterm>
+ <glossdef>
+ <para>
+ Allows adjustment of a task's Input/Output priority.
+ During Autobuilder testing, random failures can occur
+ for tasks due to I/O starvation.
+ These failures occur during various QEMU runtime timeouts.
+ You can use the <filename>BB_TASK_IONICE_LEVEL</filename>
+ variable to adjust the I/O priority of these tasks.
+ <note>
+ This variable works similarly to the
+ <link linkend='var-BB_TASK_NICE_LEVEL'><filename>BB_TASK_NICE_LEVEL</filename></link>
+ variable except with a task's I/O priorities.
+ </note>
+ </para>
+
+ <para>
+ Set the variable as follows:
+ <literallayout class='monospaced'>
+ BB_TASK_IONICE_LEVEL = "<replaceable>class</replaceable>.<replaceable>prio</replaceable>"
+ </literallayout>
+ For <replaceable>class</replaceable>, the default value is
+ "2", which is a best effort.
+ You can use "1" for realtime and "3" for idle.
+ If you want to use realtime, you must have superuser
+ privileges.
+ </para>
+
+ <para>
+ For <replaceable>prio</replaceable>, you can use any
+ value from "0", which is the highest priority, to "7",
+ which is the lowest.
+ The default value is "4".
+ You do not need any special privileges to use this range
+ of priority values.
+ <note>
+ In order for your I/O priority settings to take effect,
+ you need the Completely Fair Queuing (CFQ) Scheduler
+ selected for the backing block device.
+ To select the scheduler, use the following command form
+ where <replaceable>device</replaceable> is the device
+ (e.g. sda, sdb, and so forth):
+ <literallayout class='monospaced'>
+ $ sudo sh -c “echo cfq > /sys/block/<replaceable>device</replaceable>/queu/scheduler
+ </literallayout>
+ </note>
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-BB_TASK_NICE_LEVEL'><glossterm>BB_TASK_NICE_LEVEL</glossterm>
<glossdef>
<para>
@@ -1173,6 +1223,15 @@
</glossdef>
</glossentry>
+ <glossentry id='var-BBTARGETS'><glossterm>BBTARGETS</glossterm>
+ <glossdef>
+ <para>
+ Allows you to use a configuration file to add to the list
+ of command-line target recipes you want to build.
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-BBVERSIONS'><glossterm>BBVERSIONS</glossterm>
<glossdef>
<para>
diff --git a/bitbake/lib/bb/__init__.py b/bitbake/lib/bb/__init__.py
index 1f7946e..ac62d26 100644
--- a/bitbake/lib/bb/__init__.py
+++ b/bitbake/lib/bb/__init__.py
@@ -21,7 +21,7 @@
# with this program; if not, write to the Free Software Foundation, Inc.,
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
-__version__ = "1.27.1"
+__version__ = "1.28.0"
import sys
if sys.version_info < (2, 7, 3):
diff --git a/bitbake/lib/bb/build.py b/bitbake/lib/bb/build.py
index 948c395..22428a6 100644
--- a/bitbake/lib/bb/build.py
+++ b/bitbake/lib/bb/build.py
@@ -413,6 +413,13 @@ def _exec_task(fn, task, d, quieterr):
nice = int(nice) - curnice
newnice = os.nice(nice)
logger.debug(1, "Renice to %s " % newnice)
+ ionice = localdata.getVar("BB_TASK_IONICE_LEVEL", True)
+ if ionice:
+ try:
+ cls, prio = ionice.split(".", 1)
+ bb.utils.ioprio_set(os.getpid(), int(cls), int(prio))
+ except:
+ bb.warn("Invalid ionice level %s" % ionice)
bb.utils.mkdirhier(tempdir)
diff --git a/bitbake/lib/bb/command.py b/bitbake/lib/bb/command.py
index 398c1d6..74106d1 100644
--- a/bitbake/lib/bb/command.py
+++ b/bitbake/lib/bb/command.py
@@ -181,6 +181,16 @@ class CommandsSync:
value = str(params[1])
command.cooker.data.setVar(varname, value)
+ def getSetVariable(self, command, params):
+ """
+ Read the value of a variable from data and set it into the datastore
+ which effectively expands and locks the value.
+ """
+ varname = params[0]
+ result = self.getVariable(command, params)
+ command.cooker.data.setVar(varname, result)
+ return result
+
def setConfig(self, command, params):
"""
Set the value of variable in configuration
diff --git a/bitbake/lib/bb/cooker.py b/bitbake/lib/bb/cooker.py
index a0d7d59..4df8881 100644
--- a/bitbake/lib/bb/cooker.py
+++ b/bitbake/lib/bb/cooker.py
@@ -255,6 +255,11 @@ class BBCooker:
self.state = state.initial
self.caches_array = []
+ # Need to preserve BB_CONSOLELOG over resets
+ consolelog = None
+ if hasattr(self, "data"):
+ consolelog = self.data.getVar("BB_CONSOLELOG", True)
+
if CookerFeatures.BASEDATASTORE_TRACKING in self.featureset:
self.enableDataTracking()
@@ -281,6 +286,8 @@ class BBCooker:
self.data = self.databuilder.data
self.data_hash = self.databuilder.data_hash
+ if consolelog:
+ self.data.setVar("BB_CONSOLELOG", consolelog)
# we log all events to a file if so directed
if self.configuration.writeeventlog:
@@ -531,6 +538,11 @@ class BBCooker:
for o in options:
if o in ['prefile', 'postfile']:
clean = False
+ server_val = getattr(self.configuration, "%s_server" % o)
+ if not options[o] and server_val:
+ # restore value provided on server start
+ setattr(self.configuration, o, server_val)
+ continue
setattr(self.configuration, o, options[o])
for k in bb.utils.approved_variables():
if k in environment and k not in self.configuration.env:
@@ -1391,10 +1403,28 @@ class BBCooker:
build.reset_cache()
self.buildSetVars()
+ # If we are told to do the None task then query the default task
+ if (task == None):
+ task = self.configuration.cmd
+
+ if not task.startswith("do_"):
+ task = "do_%s" % task
+
taskdata, runlist, fulltargetlist = self.buildTaskData(targets, task, self.configuration.abort)
buildname = self.data.getVar("BUILDNAME", False)
- bb.event.fire(bb.event.BuildStarted(buildname, fulltargetlist), self.data)
+
+ # make targets to always look as <target>:do_<task>
+ ntargets = []
+ for target in fulltargetlist:
+ if ":" in target:
+ if ":do_" not in target:
+ target = "%s:do_%s" % tuple(target.split(":", 1))
+ else:
+ target = "%s:%s" % (target, task)
+ ntargets.append(target)
+
+ bb.event.fire(bb.event.BuildStarted(buildname, ntargets), self.data)
rq = bb.runqueue.RunQueue(self, self.data, self.recipecache, taskdata, runlist)
if 'universe' in targets:
diff --git a/bitbake/lib/bb/cookerdata.py b/bitbake/lib/bb/cookerdata.py
index f19c283..671c0cb 100644
--- a/bitbake/lib/bb/cookerdata.py
+++ b/bitbake/lib/bb/cookerdata.py
@@ -63,9 +63,9 @@ class ConfigParameters(object):
raise Exception("Unable to set configuration option 'cmd' on the server: %s" % error)
if not self.options.pkgs_to_build:
- bbpkgs, error = server.runCommand(["getVariable", "BBPKGS"])
+ bbpkgs, error = server.runCommand(["getVariable", "BBTARGETS"])
if error:
- raise Exception("Unable to get the value of BBPKGS from the server: %s" % error)
+ raise Exception("Unable to get the value of BBTARGETS from the server: %s" % error)
if bbpkgs:
self.options.pkgs_to_build.extend(bbpkgs.split())
@@ -129,6 +129,8 @@ class CookerConfiguration(object):
self.extra_assume_provided = []
self.prefile = []
self.postfile = []
+ self.prefile_server = []
+ self.postfile_server = []
self.debug = 0
self.cmd = None
self.abort = True
diff --git a/bitbake/lib/bb/fetch2/__init__.py b/bitbake/lib/bb/fetch2/__init__.py
index 288a1c8..a9c044b 100644
--- a/bitbake/lib/bb/fetch2/__init__.py
+++ b/bitbake/lib/bb/fetch2/__init__.py
@@ -955,7 +955,7 @@ def try_mirror_url(fetch, origud, ud, ld, check = False):
origud.method.download(origud, ld)
if hasattr(origud.method,"build_mirror_data"):
origud.method.build_mirror_data(origud, ld)
- return ud.localpath
+ return origud.localpath
# Otherwise the result is a local file:// and we symlink to it
if not os.path.exists(origud.localpath):
if os.path.islink(origud.localpath):
diff --git a/bitbake/lib/bb/fetch2/hg.py b/bitbake/lib/bb/fetch2/hg.py
index bbb4ed9..3b743ff 100644
--- a/bitbake/lib/bb/fetch2/hg.py
+++ b/bitbake/lib/bb/fetch2/hg.py
@@ -28,6 +28,7 @@ import os
import sys
import logging
import bb
+import errno
from bb import data
from bb.fetch2 import FetchMethod
from bb.fetch2 import FetchError
diff --git a/bitbake/lib/bb/fetch2/svn.py b/bitbake/lib/bb/fetch2/svn.py
index 1733c2b..8a29193 100644
--- a/bitbake/lib/bb/fetch2/svn.py
+++ b/bitbake/lib/bb/fetch2/svn.py
@@ -54,6 +54,11 @@ class Svn(FetchMethod):
ud.module = ud.parm["module"]
+ if not "path_spec" in ud.parm:
+ ud.path_spec = ud.module
+ else:
+ ud.path_spec = ud.parm["path_spec"]
+
# Create paths to svn checkouts
relpath = self._strip_leading_slashes(ud.path)
ud.pkgdir = os.path.join(data.expand('${SVNDIR}', d), ud.host, relpath)
@@ -102,7 +107,7 @@ class Svn(FetchMethod):
if command == "fetch":
transportuser = ud.parm.get("transportuser", "")
- svncmd = "%s co %s %s://%s%s/%s%s %s" % (ud.basecmd, " ".join(options), proto, transportuser, svnroot, ud.module, suffix, ud.module)
+ svncmd = "%s co %s %s://%s%s/%s%s %s" % (ud.basecmd, " ".join(options), proto, transportuser, svnroot, ud.module, suffix, ud.path_spec)
elif command == "update":
svncmd = "%s update %s" % (ud.basecmd, " ".join(options))
else:
@@ -149,7 +154,7 @@ class Svn(FetchMethod):
os.chdir(ud.pkgdir)
# tar them up to a defined filename
- runfetchcmd("tar %s -czf %s %s" % (tar_flags, ud.localpath, ud.module), d, cleanup = [ud.localpath])
+ runfetchcmd("tar %s -czf %s %s" % (tar_flags, ud.localpath, ud.path_spec), d, cleanup = [ud.localpath])
def clean(self, ud, d):
""" Clean SVN specific files and dirs """
diff --git a/bitbake/lib/bb/main.py b/bitbake/lib/bb/main.py
index 8762f72..c8530fc 100755
--- a/bitbake/lib/bb/main.py
+++ b/bitbake/lib/bb/main.py
@@ -383,6 +383,13 @@ def bitbake_main(configParams, configuration):
# Collect the feature set for the UI
featureset = getattr(ui_module, "featureSet", [])
+ if configParams.server_only:
+ for param in ('prefile', 'postfile'):
+ value = getattr(configParams, param)
+ if value:
+ setattr(configuration, "%s_server" % param, value)
+ param = "%s_server" % param
+
if not configParams.remote_server:
# we start a server with a given configuration
server = start_server(servermodule, configParams, configuration, featureset)
diff --git a/bitbake/lib/bb/runqueue.py b/bitbake/lib/bb/runqueue.py
index 2b71eed..878028a 100644
--- a/bitbake/lib/bb/runqueue.py
+++ b/bitbake/lib/bb/runqueue.py
@@ -797,6 +797,15 @@ class RunQueueData:
st = "do_%s" % st
invalidate_task(fn, st, True)
+ # Create and print to the logs a virtual/xxxx -> PN (fn) table
+ virtmap = taskData.get_providermap()
+ virtpnmap = {}
+ for v in virtmap:
+ virtpnmap[v] = self.dataCache.pkg_fn[virtmap[v]]
+ bb.debug(2, "%s resolved to: %s (%s)" % (v, virtpnmap[v], virtmap[v]))
+ if hasattr(bb.parse.siggen, "tasks_resolved"):
+ bb.parse.siggen.tasks_resolved(virtmap, virtpnmap, self.dataCache)
+
# Iterate over the task list and call into the siggen code
dealtwith = set()
todeal = set(range(len(self.runq_fnid)))
diff --git a/bitbake/lib/bb/siggen.py b/bitbake/lib/bb/siggen.py
index 2985272..0352e45 100644
--- a/bitbake/lib/bb/siggen.py
+++ b/bitbake/lib/bb/siggen.py
@@ -80,6 +80,7 @@ class SignatureGeneratorBasic(SignatureGenerator):
self.taskdeps = {}
self.runtaskdeps = {}
self.file_checksum_values = {}
+ self.taints = {}
self.gendeps = {}
self.lookupcache = {}
self.pkgnameextract = re.compile("(?P<fn>.*)\..*")
@@ -199,11 +200,14 @@ class SignatureGeneratorBasic(SignatureGenerator):
if 'nostamp' in taskdep and task in taskdep['nostamp']:
# Nostamp tasks need an implicit taint so that they force any dependent tasks to run
import uuid
- data = data + str(uuid.uuid4())
+ taint = str(uuid.uuid4())
+ data = data + taint
+ self.taints[k] = "nostamp:" + taint
taint = self.read_taint(fn, task, dataCache.stamp[fn])
if taint:
data = data + taint
+ self.taints[k] = taint
logger.warn("%s is tainted from a forced run" % k)
h = hashlib.md5(data).hexdigest()
@@ -247,6 +251,10 @@ class SignatureGeneratorBasic(SignatureGenerator):
if taint:
data['taint'] = taint
+ if runtime and k in self.taints:
+ if 'nostamp:' in self.taints[k]:
+ data['taint'] = self.taints[k]
+
fd, tmpfile = tempfile.mkstemp(dir=os.path.dirname(sigfile), prefix="sigtask.")
try:
with os.fdopen(fd, "wb") as stream:
diff --git a/bitbake/lib/bb/taskdata.py b/bitbake/lib/bb/taskdata.py
index 5fab704..4d12b33 100644
--- a/bitbake/lib/bb/taskdata.py
+++ b/bitbake/lib/bb/taskdata.py
@@ -612,6 +612,18 @@ class TaskData:
break
# self.dump_data()
+ def get_providermap(self):
+ virts = []
+ virtmap = {}
+
+ for name in self.build_names_index:
+ if name.startswith("virtual/"):
+ virts.append(name)
+ for v in virts:
+ if self.have_build_target(v):
+ virtmap[v] = self.fn_index[self.get_provider(v)[0]]
+ return virtmap
+
def dump_data(self):
"""
Dump some debug information on the internal data structures
diff --git a/bitbake/lib/bb/tests/utils.py b/bitbake/lib/bb/tests/utils.py
index 9171509..a035ccf 100644
--- a/bitbake/lib/bb/tests/utils.py
+++ b/bitbake/lib/bb/tests/utils.py
@@ -376,3 +376,206 @@ do_functionname() {
(updated, newlines) = bb.utils.edit_metadata(self._origfile.splitlines(True), varlist, handle_var)
self.assertTrue(updated, 'List should be updated but isn\'t')
self.assertEqual(newlines, newfile5.splitlines(True))
+
+
+class EditBbLayersConf(unittest.TestCase):
+
+ def _test_bblayers_edit(self, before, after, add, remove, notadded, notremoved):
+ with tempfile.NamedTemporaryFile('w', delete=False) as tf:
+ tf.write(before)
+ tf.close()
+ try:
+ actual_notadded, actual_notremoved = bb.utils.edit_bblayers_conf(tf.name, add, remove)
+ with open(tf.name) as f:
+ actual_after = f.readlines()
+ self.assertEqual(after.splitlines(True), actual_after)
+ self.assertEqual(notadded, actual_notadded)
+ self.assertEqual(notremoved, actual_notremoved)
+ finally:
+ os.remove(tf.name)
+
+
+ def test_bblayers_remove(self):
+ before = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS = " \
+ /home/user/path/layer1 \
+ /home/user/path/layer2 \
+ /home/user/path/subpath/layer3 \
+ /home/user/path/layer4 \
+ "
+"""
+ after = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS = " \
+ /home/user/path/layer1 \
+ /home/user/path/subpath/layer3 \
+ /home/user/path/layer4 \
+ "
+"""
+ self._test_bblayers_edit(before, after,
+ None,
+ '/home/user/path/layer2',
+ [],
+ [])
+
+
+ def test_bblayers_add(self):
+ before = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS = " \
+ /home/user/path/layer1 \
+ /home/user/path/layer2 \
+ /home/user/path/subpath/layer3 \
+ /home/user/path/layer4 \
+ "
+"""
+ after = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS = " \
+ /home/user/path/layer1 \
+ /home/user/path/layer2 \
+ /home/user/path/subpath/layer3 \
+ /home/user/path/layer4 \
+ /other/path/to/layer5 \
+ "
+"""
+ self._test_bblayers_edit(before, after,
+ '/other/path/to/layer5/',
+ None,
+ [],
+ [])
+
+
+ def test_bblayers_add_remove(self):
+ before = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS = " \
+ /home/user/path/layer1 \
+ /home/user/path/layer2 \
+ /home/user/path/subpath/layer3 \
+ /home/user/path/layer4 \
+ "
+"""
+ after = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS = " \
+ /home/user/path/layer1 \
+ /home/user/path/layer2 \
+ /home/user/path/layer4 \
+ /other/path/to/layer5 \
+ "
+"""
+ self._test_bblayers_edit(before, after,
+ ['/other/path/to/layer5', '/home/user/path/layer2/'], '/home/user/path/subpath/layer3/',
+ ['/home/user/path/layer2'],
+ [])
+
+
+ def test_bblayers_add_remove_home(self):
+ before = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS = " \
+ ~/path/layer1 \
+ ~/path/layer2 \
+ ~/otherpath/layer3 \
+ ~/path/layer4 \
+ "
+"""
+ after = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS = " \
+ ~/path/layer2 \
+ ~/path/layer4 \
+ ~/path2/layer5 \
+ "
+"""
+ self._test_bblayers_edit(before, after,
+ [os.environ['HOME'] + '/path/layer4', '~/path2/layer5'],
+ [os.environ['HOME'] + '/otherpath/layer3', '~/path/layer1', '~/path/notinlist'],
+ [os.environ['HOME'] + '/path/layer4'],
+ ['~/path/notinlist'])
+
+
+ def test_bblayers_add_remove_plusequals(self):
+ before = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS += " \
+ /home/user/path/layer1 \
+ /home/user/path/layer2 \
+ "
+"""
+ after = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS += " \
+ /home/user/path/layer2 \
+ /home/user/path/layer3 \
+ "
+"""
+ self._test_bblayers_edit(before, after,
+ '/home/user/path/layer3',
+ '/home/user/path/layer1',
+ [],
+ [])
+
+
+ def test_bblayers_add_remove_plusequals2(self):
+ before = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS += " \
+ /home/user/path/layer1 \
+ /home/user/path/layer2 \
+ /home/user/path/layer3 \
+ "
+BBLAYERS += "/home/user/path/layer4"
+BBLAYERS += "/home/user/path/layer5"
+"""
+ after = r"""
+# A comment
+
+BBPATH = "${TOPDIR}"
+BBFILES ?= ""
+BBLAYERS += " \
+ /home/user/path/layer2 \
+ /home/user/path/layer3 \
+ "
+BBLAYERS += "/home/user/path/layer5"
+BBLAYERS += "/home/user/otherpath/layer6"
+"""
+ self._test_bblayers_edit(before, after,
+ ['/home/user/otherpath/layer6', '/home/user/path/layer3'], ['/home/user/path/layer1', '/home/user/path/layer4', '/home/user/path/layer7'],
+ ['/home/user/path/layer3'],
+ ['/home/user/path/layer7'])
diff --git a/bitbake/lib/bb/tinfoil.py b/bitbake/lib/bb/tinfoil.py
index 1ea46d8..7aa653f 100644
--- a/bitbake/lib/bb/tinfoil.py
+++ b/bitbake/lib/bb/tinfoil.py
@@ -36,13 +36,13 @@ class Tinfoil:
# Set up logging
self.logger = logging.getLogger('BitBake')
- console = logging.StreamHandler(output)
- bb.msg.addDefaultlogFilter(console)
+ self._log_hdlr = logging.StreamHandler(output)
+ bb.msg.addDefaultlogFilter(self._log_hdlr)
format = bb.msg.BBLogFormatter("%(levelname)s: %(message)s")
if output.isatty():
format.enable_color()
- console.setFormatter(format)
- self.logger.addHandler(console)
+ self._log_hdlr.setFormatter(format)
+ self.logger.addHandler(self._log_hdlr)
self.config = CookerConfiguration()
configparams = TinfoilConfigParameters(parse_only=True)
@@ -88,6 +88,7 @@ class Tinfoil:
self.cooker.shutdown(force=True)
self.cooker.post_serve()
self.cooker.unlockBitbake()
+ self.logger.removeHandler(self._log_hdlr)
class TinfoilConfigParameters(ConfigParameters):
diff --git a/bitbake/lib/bb/ui/buildinfohelper.py b/bitbake/lib/bb/ui/buildinfohelper.py
index 6e313fe..78f1e92 100644
--- a/bitbake/lib/bb/ui/buildinfohelper.py
+++ b/bitbake/lib/bb/ui/buildinfohelper.py
@@ -66,6 +66,7 @@ class ORMWrapper(object):
def __init__(self):
self.layer_version_objects = []
+ self.layer_version_built = []
self.task_objects = {}
self.recipe_objects = {}
@@ -94,8 +95,8 @@ class ORMWrapper(object):
created = False
if not key in vars(self)[dictname].keys():
- vars(self)[dictname][key] = clazz.objects.create(**kwargs)
- created = True
+ vars(self)[dictname][key], created = \
+ clazz.objects.get_or_create(**kwargs)
return (vars(self)[dictname][key], created)
@@ -161,8 +162,6 @@ class ORMWrapper(object):
build.bitbake_version=build_info['bitbake_version']
build.save()
- Target.objects.filter(build = build).delete()
-
else:
build = Build.objects.create(
project = prj,
@@ -183,18 +182,26 @@ class ORMWrapper(object):
return build
- def create_target_objects(self, target_info):
- assert 'build' in target_info
- assert 'targets' in target_info
-
- targets = []
- for tgt_name in target_info['targets']:
- tgt_object = Target.objects.create( build = target_info['build'],
- target = tgt_name,
- is_image = False,
- )
- targets.append(tgt_object)
- return targets
+ @staticmethod
+ def get_or_create_targets(target_info):
+ result = []
+ for target in target_info['targets']:
+ task = ''
+ if ':' in target:
+ target, task = target.split(':', 1)
+ if task.startswith('do_'):
+ task = task[3:]
+ if task == 'build':
+ task = ''
+ obj, created = Target.objects.get_or_create(build=target_info['build'],
+ target=target)
+ if created:
+ obj.is_image = False
+ if task:
+ obj.task = task
+ obj.save()
+ result.append(obj)
+ return result
def update_build_object(self, build, errors, warnings, taskfailures):
assert isinstance(build,Build)
@@ -269,23 +276,66 @@ class ORMWrapper(object):
assert not recipe_information['file_path'].startswith("/") # we should have layer-relative paths at all times
- recipe_object, created = self._cached_get_or_create(Recipe, layer_version=recipe_information['layer_version'],
+
+ def update_recipe_obj(recipe_object):
+ object_changed = False
+ for v in vars(recipe_object):
+ if v in recipe_information.keys():
+ object_changed = True
+ vars(recipe_object)[v] = recipe_information[v]
+
+ if object_changed:
+ recipe_object.save()
+
+ recipe, created = self._cached_get_or_create(Recipe, layer_version=recipe_information['layer_version'],
file_path=recipe_information['file_path'], pathflags = recipe_information['pathflags'])
- if created and must_exist:
- raise NotExisting("Recipe object created when expected to exist", recipe_information)
- object_changed = False
- for v in vars(recipe_object):
- if v in recipe_information.keys():
- object_changed = True
- vars(recipe_object)[v] = recipe_information[v]
+ update_recipe_obj(recipe)
- if object_changed:
- recipe_object.save()
+ built_recipe = None
+ # Create a copy of the recipe for historical puposes and update it
+ for built_layer in self.layer_version_built:
+ if built_layer.layer == recipe_information['layer_version'].layer:
+ built_recipe, c = self._cached_get_or_create(Recipe,
+ layer_version=built_layer,
+ file_path=recipe_information['file_path'],
+ pathflags = recipe_information['pathflags'])
+ update_recipe_obj(built_recipe)
+ break
- return recipe_object
+
+ # If we're in analysis mode then we are wholly responsible for the data
+ # and therefore we return the 'real' recipe rather than the build
+ # history copy of the recipe.
+ if recipe_information['layer_version'].build is not None and \
+ recipe_information['layer_version'].build.project == \
+ Project.objects.get_default_project():
+ return recipe
+
+ return built_recipe
def get_update_layer_version_object(self, build_obj, layer_obj, layer_version_information):
+ if isinstance(layer_obj, Layer_Version):
+ # We already found our layer version for this build so just
+ # update it with the new build information
+ logger.debug("We found our layer from toaster")
+ layer_obj.local_path = layer_version_information['local_path']
+ layer_obj.save()
+ self.layer_version_objects.append(layer_obj)
+
+ # create a new copy of this layer version as a snapshot for
+ # historical purposes
+ layer_copy, c = Layer_Version.objects.get_or_create(build=build_obj,
+ layer=layer_obj.layer,
+ commit=layer_version_information['commit'],
+ local_path = layer_version_information['local_path'],
+ )
+ logger.info("created new historical layer version %d", layer_copy.pk)
+
+ self.layer_version_built.append(layer_copy)
+
+ return layer_obj
+
assert isinstance(build_obj, Build)
assert isinstance(layer_obj, Layer)
assert 'branch' in layer_version_information
@@ -293,14 +343,20 @@ class ORMWrapper(object):
assert 'priority' in layer_version_information
assert 'local_path' in layer_version_information
+ # If we're doing a command line build then associate this new layer with the
+ # project to avoid it 'contaminating' toaster data
+ project = None
+ if build_obj.project == Project.objects.get_default_project():
+ project = build_obj.project
+
layer_version_object, _ = Layer_Version.objects.get_or_create(
- build = build_obj,
- layer = layer_obj,
- branch = layer_version_information['branch'],
- commit = layer_version_information['commit'],
- priority = layer_version_information['priority'],
- local_path = layer_version_information['local_path'],
- )
+ build = build_obj,
+ layer = layer_obj,
+ branch = layer_version_information['branch'],
+ commit = layer_version_information['commit'],
+ priority = layer_version_information['priority'],
+ local_path = layer_version_information['local_path'],
+ project=project)
self.layer_version_objects.append(layer_version_object)
@@ -335,8 +391,15 @@ class ORMWrapper(object):
localdirname = os.path.join(bc.be.sourcedir, localdirname)
#logger.debug(1, "Localdirname %s lcal_path %s" % (localdirname, layer_information['local_path']))
if localdirname.startswith(layer_information['local_path']):
+ # If the build request came from toaster this field
+ # should contain the information from the layer_version
+ # That created this build request.
+ if brl.layer_version:
+ return brl.layer_version
+
# we matched the BRLayer, but we need the layer_version that generated this BR; reverse of the Project.schedule_build()
#logger.debug(1, "Matched %s to BRlayer %s" % (pformat(layer_information["local_path"]), localdirname))
+
for pl in buildrequest.project.projectlayer_set.filter(layercommit__layer__name = brl.name):
if pl.layercommit.layer.vcs_url == brl.giturl :
layer = pl.layercommit.layer
@@ -353,26 +416,29 @@ class ORMWrapper(object):
files = filedata['files']
syms = filedata['syms']
- # we insert directories, ordered by name depth
+ # always create the root directory as a special case;
+ # note that this is never displayed, so the owner, group,
+ # size, permission are irrelevant
+ tf_obj = Target_File.objects.create(target = target_obj,
+ path = '/',
+ size = 0,
+ owner = '',
+ group = '',
+ permission = '',
+ inodetype = Target_File.ITYPE_DIRECTORY)
+ tf_obj.save()
+
+ # insert directories, ordered by name depth
for d in sorted(dirs, key=lambda x:len(x[-1].split("/"))):
(user, group, size) = d[1:4]
permission = d[0][1:]
path = d[4].lstrip(".")
+
+ # we already created the root directory, so ignore any
+ # entry for it
if len(path) == 0:
- # we create the root directory as a special case
- path = "/"
- tf_obj = Target_File.objects.create(
- target = target_obj,
- path = path,
- size = size,
- inodetype = Target_File.ITYPE_DIRECTORY,
- permission = permission,
- owner = user,
- group = group,
- )
- tf_obj.directory = tf_obj
- tf_obj.save()
continue
+
parent_path = "/".join(path.split("/")[:len(path.split("/")) - 1])
if len(parent_path) == 0:
parent_path = "/"
@@ -461,6 +527,12 @@ class ORMWrapper(object):
errormsg = ""
for p in packagedict:
searchname = p
+ if p not in pkgpnmap:
+ logger.warning("Image packages list contains %p, but is"
+ " missing from all packages list where the"
+ " metadata comes from. Skipping...", p)
+ continue
+
if 'OPKGN' in pkgpnmap[p].keys():
searchname = pkgpnmap[p]['OPKGN']
@@ -504,13 +576,20 @@ class ORMWrapper(object):
elif deptype == 'recommends':
tdeptype = Package_Dependency.TYPE_TRECOMMENDS
- packagedeps_objs.append(Package_Dependency( package = packagedict[p]['object'],
- depends_on = packagedict[px]['object'],
- dep_type = tdeptype,
- target = target_obj))
+ try:
+ packagedeps_objs.append(Package_Dependency(
+ package = packagedict[p]['object'],
+ depends_on = packagedict[px]['object'],
+ dep_type = tdeptype,
+ target = target_obj))
+ except KeyError as e:
+ logger.warn("Could not add dependency to the package %s "
+ "because %s is an unknown package", p, px)
if len(packagedeps_objs) > 0:
Package_Dependency.objects.bulk_create(packagedeps_objs)
+ else:
+ logger.info("No package dependencies created")
if len(errormsg) > 0:
logger.warn("buildinfohelper: target_package_info could not identify recipes: \n%s", errormsg)
@@ -686,6 +765,7 @@ class BuildInfoHelper(object):
def __init__(self, server, has_build_history = False):
self.internal_state = {}
self.internal_state['taskdata'] = {}
+ self.internal_state['targets'] = []
self.task_order = 0
self.autocommit_step = 1
self.server = server
@@ -704,7 +784,7 @@ class BuildInfoHelper(object):
## methods to convert event/external info into objects that the ORM layer uses
- def _get_build_information(self, consolelogfile):
+ def _get_build_information(self, build_log_path):
build_info = {}
# Generate an identifier for each new build
@@ -713,7 +793,7 @@ class BuildInfoHelper(object):
build_info['distro_version'] = self.server.runCommand(["getVariable", "DISTRO_VERSION"])[0]
build_info['started_on'] = timezone.now()
build_info['completed_on'] = timezone.now()
- build_info['cooker_log_path'] = consolelogfile
+ build_info['cooker_log_path'] = build_log_path
build_info['build_name'] = self.server.runCommand(["getVariable", "BUILDNAME"])[0]
build_info['bitbake_version'] = self.server.runCommand(["getVariable", "BB_VERSION"])[0]
@@ -764,8 +844,15 @@ class BuildInfoHelper(object):
if not localdirname.startswith("/"):
localdirname = os.path.join(bc.be.sourcedir, localdirname)
if path.startswith(localdirname):
+ # If the build request came from toaster this field
+ # should contain the information from the layer_version
+ # That created this build request.
+ if brl.layer_version:
+ return brl.layer_version
+
#logger.warn("-- managed: matched path %s with layer %s " % (path, localdirname))
# we matched the BRLayer, but we need the layer_version that generated this br
+
for lvo in self.orm_wrapper.layer_version_objects:
if brl.name == lvo.layer.name:
return lvo
@@ -774,7 +861,7 @@ class BuildInfoHelper(object):
logger.warn("Could not match layer version for recipe path %s : %s", path, self.orm_wrapper.layer_version_objects)
#mockup the new layer
- unknown_layer, _ = Layer.objects.get_or_create(name="__FIXME__unidentified_layer", layer_index_url="")
+ unknown_layer, _ = Layer.objects.get_or_create(name="Unidentified layer", layer_index_url="")
unknown_layer_version_obj, _ = Layer_Version.objects.get_or_create(layer = unknown_layer, build = self.internal_state['build'])
# append it so we don't run into this error again and again
@@ -847,9 +934,9 @@ class BuildInfoHelper(object):
logger.warn("buildinfohelper: cannot identify layer exception:%s ", nee)
- def store_started_build(self, event, consolelogfile):
+ def store_started_build(self, event, build_log_path):
assert '_pkgs' in vars(event)
- build_information = self._get_build_information(consolelogfile)
+ build_information = self._get_build_information(build_log_path)
build_obj = self.orm_wrapper.create_build_object(build_information, self.brbe, self.project)
@@ -869,7 +956,7 @@ class BuildInfoHelper(object):
target_information['targets'] = event._pkgs
target_information['build'] = build_obj
- self.internal_state['targets'] = self.orm_wrapper.create_target_objects(target_information)
+ self.internal_state['targets'] = self.orm_wrapper.get_or_create_targets(target_information)
# Save build configuration
data = self.server.runCommand(["getAllKeysWithFlags", ["doc", "func"]])[0]
@@ -996,7 +1083,7 @@ class BuildInfoHelper(object):
task_information['disk_io'] = taskstats['disk_io']
if 'elapsed_time' in taskstats:
task_information['elapsed_time'] = taskstats['elapsed_time']
- self.orm_wrapper.get_update_task_object(task_information, True) # must exist
+ self.orm_wrapper.get_update_task_object(task_information)
def update_and_store_task(self, event):
assert 'taskfile' in vars(event)
@@ -1097,15 +1184,22 @@ class BuildInfoHelper(object):
# for all image targets
for target in self.internal_state['targets']:
if target.is_image:
+ pkgdata = BuildInfoHelper._get_data_from_event(event)['pkgdata']
+ imgdata = BuildInfoHelper._get_data_from_event(event)['imgdata'][target.target]
+ filedata = BuildInfoHelper._get_data_from_event(event)['filedata'][target.target]
+
try:
- pkgdata = BuildInfoHelper._get_data_from_event(event)['pkgdata']
- imgdata = BuildInfoHelper._get_data_from_event(event)['imgdata'][target.target]
self.orm_wrapper.save_target_package_information(self.internal_state['build'], target, imgdata, pkgdata, self.internal_state['recipes'])
- filedata = BuildInfoHelper._get_data_from_event(event)['filedata'][target.target]
+ except KeyError as e:
+ logger.warn("KeyError in save_target_package_information"
+ "%s ", e)
+
+ try:
self.orm_wrapper.save_target_file_information(self.internal_state['build'], target, filedata)
- except KeyError:
- # we must have not got the data for this image, nothing to save
- pass
+ except KeyError as e:
+ logger.warn("KeyError in save_target_file_information"
+ "%s ", e)
+
@@ -1306,7 +1400,9 @@ class BuildInfoHelper(object):
log_information = {}
log_information['build'] = self.internal_state['build']
- if event.levelno == formatter.ERROR:
+ if event.levelno == formatter.CRITICAL:
+ log_information['level'] = LogMessage.CRITICAL
+ elif event.levelno == formatter.ERROR:
log_information['level'] = LogMessage.ERROR
elif event.levelno == formatter.WARNING:
log_information['level'] = LogMessage.WARNING
@@ -1319,6 +1415,7 @@ class BuildInfoHelper(object):
log_information['pathname'] = event.pathname
log_information['lineno'] = event.lineno
logger.info("Logging error 2: %s", log_information)
+
self.orm_wrapper.create_logmessage(log_information)
def close(self, errorcode):
diff --git a/bitbake/lib/bb/ui/knotty.py b/bitbake/lib/bb/ui/knotty.py
index 2bee242..90c3183 100644
--- a/bitbake/lib/bb/ui/knotty.py
+++ b/bitbake/lib/bb/ui/knotty.py
@@ -230,7 +230,7 @@ def _log_settings_from_server(server):
if error:
logger.error("Unable to get the value of BBINCLUDELOGS_LINES variable: %s" % error)
raise BaseException(error)
- consolelogfile, error = server.runCommand(["getVariable", "BB_CONSOLELOG"])
+ consolelogfile, error = server.runCommand(["getSetVariable", "BB_CONSOLELOG"])
if error:
logger.error("Unable to get the value of BB_CONSOLELOG variable: %s" % error)
raise BaseException(error)
diff --git a/bitbake/lib/bb/ui/toasterui.py b/bitbake/lib/bb/ui/toasterui.py
index e0c278b..3d26150 100644
--- a/bitbake/lib/bb/ui/toasterui.py
+++ b/bitbake/lib/bb/ui/toasterui.py
@@ -21,6 +21,7 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from __future__ import division
+import time
import sys
try:
import bb
@@ -43,8 +44,6 @@ featureSet = [bb.cooker.CookerFeatures.HOB_EXTRA_CACHES, bb.cooker.CookerFeature
logger = logging.getLogger("ToasterLogger")
interactive = sys.stdout.isatty()
-
-
def _log_settings_from_server(server):
# Get values of variables which control our output
includelogs, error = server.runCommand(["getVariable", "BBINCLUDELOGS"])
@@ -59,12 +58,56 @@ def _log_settings_from_server(server):
if error:
logger.error("Unable to get the value of BB_CONSOLELOG variable: %s", error)
raise BaseException(error)
- return includelogs, loglines, consolelogfile
+ return consolelogfile
+
+# create a log file for a single build and direct the logger at it;
+# log file name is timestamped to the millisecond (depending
+# on system clock accuracy) to ensure it doesn't overlap with
+# other log file names
+#
+# returns (log file, path to log file) for a build
+def _open_build_log(log_dir):
+ format_str = "%(levelname)s: %(message)s"
+
+ now = time.time()
+ now_ms = int((now - int(now)) * 1000)
+ time_str = time.strftime('build_%Y%m%d_%H%M%S', time.localtime(now))
+ log_file_name = time_str + ('.%d.log' % now_ms)
+ build_log_file_path = os.path.join(log_dir, log_file_name)
+
+ build_log = logging.FileHandler(build_log_file_path)
+
+ logformat = bb.msg.BBLogFormatter(format_str)
+ build_log.setFormatter(logformat)
+ bb.msg.addDefaultlogFilter(build_log)
+ logger.addHandler(build_log)
+
+ return (build_log, build_log_file_path)
+
+# stop logging to the build log if it exists
+def _close_build_log(build_log):
+ if build_log:
+ build_log.flush()
+ build_log.close()
+ logger.removeHandler(build_log)
+
+def main(server, eventHandler, params):
+ # set to a logging.FileHandler instance when a build starts;
+ # see _open_build_log()
+ build_log = None
+
+ # set to the log path when a build starts
+ build_log_file_path = None
-def main(server, eventHandler, params ):
helper = uihelper.BBUIHelper()
+ # TODO don't use log output to determine when bitbake has started
+ #
+ # WARNING: this log handler cannot be removed, as localhostbecontroller
+ # relies on output in the toaster_ui.log file to determine whether
+ # the bitbake server has started, which only happens if
+ # this logger is setup here (see the TODO in the loop below)
console = logging.StreamHandler(sys.stdout)
format_str = "%(levelname)s: %(message)s"
formatter = bb.msg.BBLogFormatter(format_str)
@@ -73,8 +116,6 @@ def main(server, eventHandler, params ):
logger.addHandler(console)
logger.setLevel(logging.INFO)
- _, _, consolelogfile = _log_settings_from_server(server)
-
# verify and warn
build_history_enabled = True
inheritlist, _ = server.runCommand(["getVariable", "INHERIT"])
@@ -87,8 +128,9 @@ def main(server, eventHandler, params ):
logger.error("ToasterUI can only work in observer mode")
return 1
-
+ # set to 1 when toasterui needs to shut down
main.shutdown = 0
+
interrupted = False
return_value = 0
errors = 0
@@ -98,25 +140,31 @@ def main(server, eventHandler, params ):
buildinfohelper = BuildInfoHelper(server, build_history_enabled)
- if buildinfohelper.brbe is not None and consolelogfile:
- # if we are under managed mode we have no other UI and we need to write our own file
- bb.utils.mkdirhier(os.path.dirname(consolelogfile))
- conlogformat = bb.msg.BBLogFormatter(format_str)
- consolelog = logging.FileHandler(consolelogfile)
- bb.msg.addDefaultlogFilter(consolelog)
- consolelog.setFormatter(conlogformat)
- logger.addHandler(consolelog)
-
+ # write our own log files into bitbake's log directory;
+ # we're only interested in the path to the parent directory of
+ # this file, as we're writing our own logs into the same directory
+ consolelogfile = _log_settings_from_server(server)
+ log_dir = os.path.dirname(consolelogfile)
+ bb.utils.mkdirhier(log_dir)
while True:
try:
event = eventHandler.waitEvent(0.25)
if first:
first = False
+
+ # TODO don't use log output to determine when bitbake has started
+ #
+ # this is the line localhostbecontroller needs to
+ # see in toaster_ui.log which it uses to decide whether
+ # the bitbake server has started...
logger.info("ToasterUI waiting for events")
if event is None:
if main.shutdown > 0:
+ # if shutting down, close any open build log first
+ _close_build_log(build_log)
+
break
continue
@@ -125,19 +173,32 @@ def main(server, eventHandler, params ):
# pylint: disable=protected-access
# the code will look into the protected variables of the event; no easy way around this
+ # we treat ParseStarted as the first event of toaster-triggered
+ # builds; that way we get the Build Configuration included in the log
+ # and any errors that occur before BuildStarted is fired
+ if isinstance(event, bb.event.ParseStarted):
+ if not (build_log and build_log_file_path):
+ build_log, build_log_file_path = _open_build_log(log_dir)
+ continue
+
if isinstance(event, bb.event.BuildStarted):
- buildinfohelper.store_started_build(event, consolelogfile)
+ # command-line builds don't fire a ParseStarted event,
+ # so we have to start the log file for those on BuildStarted instead
+ if not (build_log and build_log_file_path):
+ build_log, build_log_file_path = _open_build_log(log_dir)
+
+ buildinfohelper.store_started_build(event, build_log_file_path)
if isinstance(event, (bb.build.TaskStarted, bb.build.TaskSucceeded, bb.build.TaskFailedSilent)):
buildinfohelper.update_and_store_task(event)
- logger.warn("Logfile for task %s", event.logfile)
+ logger.info("Logfile for task %s", event.logfile)
continue
if isinstance(event, bb.build.TaskBase):
logger.info(event._message)
if isinstance(event, bb.event.LogExecTTY):
- logger.warn(event.msg)
+ logger.info(event.msg)
continue
if isinstance(event, logging.LogRecord):
@@ -145,10 +206,12 @@ def main(server, eventHandler, params ):
event.levelno = formatter.ERROR
buildinfohelper.store_log_event(event)
+
if event.levelno >= formatter.ERROR:
errors = errors + 1
elif event.levelno == formatter.WARNING:
warnings = warnings + 1
+
# For "normal" logging conditions, don't show note logs from tasks
# but do show them if the user has changed the default log level to
# include verbose/debug messages
@@ -169,8 +232,6 @@ def main(server, eventHandler, params ):
# timing and error informations from the parsing phase in Toaster
if isinstance(event, (bb.event.SanityCheckPassed, bb.event.SanityCheck)):
continue
- if isinstance(event, bb.event.ParseStarted):
- continue
if isinstance(event, bb.event.ParseProgress):
continue
if isinstance(event, bb.event.ParseCompleted):
@@ -246,6 +307,12 @@ def main(server, eventHandler, params ):
errorcode = 1
logger.error("Command execution failed: %s", event.error)
+ # turn off logging to the current build log
+ _close_build_log(build_log)
+
+ # reset ready for next BuildStarted
+ build_log = None
+
# update the build info helper on BuildCompleted, not on CommandXXX
buildinfohelper.update_build_information(event, errors, warnings, taskfailures)
buildinfohelper.close(errorcode)
@@ -254,7 +321,6 @@ def main(server, eventHandler, params ):
# we start a new build info
if buildinfohelper.brbe is not None:
-
logger.debug("ToasterUI under BuildEnvironment management - exiting after the build")
server.terminateServer()
else:
@@ -296,8 +362,9 @@ def main(server, eventHandler, params ):
continue
if isinstance(event, bb.cooker.CookerExit):
- # exit when the server exits
- break
+ # shutdown when bitbake server shuts down
+ main.shutdown = 1
+ continue
# ignore
if isinstance(event, (bb.event.BuildBase,
@@ -308,14 +375,15 @@ def main(server, eventHandler, params ):
bb.event.OperationProgress,
bb.command.CommandFailed,
bb.command.CommandExit,
- bb.command.CommandCompleted)):
+ bb.command.CommandCompleted,
+ bb.event.ReachableStamps)):
continue
if isinstance(event, bb.event.DepTreeGenerated):
buildinfohelper.store_dependency_information(event)
continue
- logger.error("Unknown event: %s", event)
+ logger.warn("Unknown event: %s", event)
return_value += 1
except EnvironmentError as ioerror:
@@ -335,7 +403,7 @@ def main(server, eventHandler, params ):
if tb is not None:
curr = tb
while curr is not None:
- logger.warn("Error data dump %s\n%s\n" , traceback.format_tb(curr,1), pformat(curr.tb_frame.f_locals))
+ logger.error("Error data dump %s\n%s\n" , traceback.format_tb(curr,1), pformat(curr.tb_frame.f_locals))
curr = curr.tb_next
# save them to database, if possible; if it fails, we already logged to console.
@@ -347,9 +415,8 @@ def main(server, eventHandler, params ):
# make sure we return with an error
return_value += 1
- if interrupted:
- if return_value == 0:
- return_value += 1
+ if interrupted and return_value == 0:
+ return_value += 1
logger.warn("Return value is %d", return_value)
return return_value
diff --git a/bitbake/lib/bb/utils.py b/bitbake/lib/bb/utils.py
index 91faa49..31ec2b7 100644
--- a/bitbake/lib/bb/utils.py
+++ b/bitbake/lib/bb/utils.py
@@ -1177,7 +1177,7 @@ def edit_metadata(meta_lines, variables, varfunc, match_overrides=False):
if not skip:
if checkspc:
checkspc = False
- if newlines[-1] == '\n' and line == '\n':
+ if newlines and newlines[-1] == '\n' and line == '\n':
# Squash blank line if there are two consecutive blanks after a removal
continue
newlines.append(line)
@@ -1201,7 +1201,19 @@ def edit_metadata_file(meta_file, variables, varfunc):
def edit_bblayers_conf(bblayers_conf, add, remove):
- """Edit bblayers.conf, adding and/or removing layers"""
+ """Edit bblayers.conf, adding and/or removing layers
+ Parameters:
+ bblayers_conf: path to bblayers.conf file to edit
+ add: layer path (or list of layer paths) to add; None or empty
+ list to add nothing
+ remove: layer path (or list of layer paths) to remove; None or
+ empty list to remove nothing
+ Returns a tuple:
+ notadded: list of layers specified to be added but weren't
+ (because they were already in the list)
+ notremoved: list of layers that were specified to be removed
+ but weren't (because they weren't in the list)
+ """
import fnmatch
@@ -1210,6 +1222,13 @@ def edit_bblayers_conf(bblayers_conf, add, remove):
pth = pth[:-1]
return pth
+ approved = bb.utils.approved_variables()
+ def canonicalise_path(pth):
+ pth = remove_trailing_sep(pth)
+ if 'HOME' in approved and '~' in pth:
+ pth = os.path.expanduser(pth)
+ return pth
+
def layerlist_param(value):
if not value:
return []
@@ -1218,48 +1237,80 @@ def edit_bblayers_conf(bblayers_conf, add, remove):
else:
return [remove_trailing_sep(value)]
- notadded = []
- notremoved = []
-
addlayers = layerlist_param(add)
removelayers = layerlist_param(remove)
# Need to use a list here because we can't set non-local variables from a callback in python 2.x
bblayercalls = []
+ removed = []
+ plusequals = False
+ orig_bblayers = []
+
+ def handle_bblayers_firstpass(varname, origvalue, op, newlines):
+ bblayercalls.append(op)
+ if op == '=':
+ del orig_bblayers[:]
+ orig_bblayers.extend([canonicalise_path(x) for x in origvalue.split()])
+ return (origvalue, None, 2, False)
def handle_bblayers(varname, origvalue, op, newlines):
- bblayercalls.append(varname)
updated = False
bblayers = [remove_trailing_sep(x) for x in origvalue.split()]
if removelayers:
for removelayer in removelayers:
- matched = False
for layer in bblayers:
- if fnmatch.fnmatch(layer, removelayer):
+ if fnmatch.fnmatch(canonicalise_path(layer), canonicalise_path(removelayer)):
updated = True
- matched = True
bblayers.remove(layer)
+ removed.append(removelayer)
break
- if not matched:
- notremoved.append(removelayer)
- if addlayers:
+ if addlayers and not plusequals:
for addlayer in addlayers:
if addlayer not in bblayers:
updated = True
bblayers.append(addlayer)
- else:
- notadded.append(addlayer)
+ del addlayers[:]
if updated:
+ if op == '+=' and not bblayers:
+ bblayers = None
return (bblayers, None, 2, False)
else:
return (origvalue, None, 2, False)
- edit_metadata_file(bblayers_conf, ['BBLAYERS'], handle_bblayers)
+ with open(bblayers_conf, 'r') as f:
+ (_, newlines) = edit_metadata(f, ['BBLAYERS'], handle_bblayers_firstpass)
if not bblayercalls:
raise Exception('Unable to find BBLAYERS in %s' % bblayers_conf)
+ # Try to do the "smart" thing depending on how the user has laid out
+ # their bblayers.conf file
+ if bblayercalls.count('+=') > 1:
+ plusequals = True
+
+ removelayers_canon = [canonicalise_path(layer) for layer in removelayers]
+ notadded = []
+ for layer in addlayers:
+ layer_canon = canonicalise_path(layer)
+ if layer_canon in orig_bblayers and not layer_canon in removelayers_canon:
+ notadded.append(layer)
+ notadded_canon = [canonicalise_path(layer) for layer in notadded]
+ addlayers[:] = [layer for layer in addlayers if canonicalise_path(layer) not in notadded_canon]
+
+ (updated, newlines) = edit_metadata(newlines, ['BBLAYERS'], handle_bblayers)
+ if addlayers:
+ # Still need to add these
+ for addlayer in addlayers:
+ newlines.append('BBLAYERS += "%s"\n' % addlayer)
+ updated = True
+
+ if updated:
+ with open(bblayers_conf, 'w') as f:
+ f.writelines(newlines)
+
+ notremoved = list(set(removelayers) - set(removed))
+
return (notadded, notremoved)
@@ -1310,3 +1361,27 @@ def signal_on_parent_exit(signame):
result = cdll['libc.so.6'].prctl(PR_SET_PDEATHSIG, signum)
if result != 0:
raise PrCtlError('prctl failed with error code %s' % result)
+
+#
+# Manually call the ioprio syscall. We could depend on other libs like psutil
+# however this gets us enough of what we need to bitbake for now without the
+# dependency
+#
+_unamearch = os.uname()[4]
+IOPRIO_WHO_PROCESS = 1
+IOPRIO_CLASS_SHIFT = 13
+
+def ioprio_set(who, cls, value):
+ NR_ioprio_set = None
+ if _unamearch == "x86_64":
+ NR_ioprio_set = 251
+ elif _unamearch[0] == "i" and _unamearch[2:3] == "86":
+ NR_ioprio_set = 289
+
+ if NR_ioprio_set:
+ ioprio = value | (cls << IOPRIO_CLASS_SHIFT)
+ rc = cdll['libc.so.6'].syscall(NR_ioprio_set, IOPRIO_WHO_PROCESS, who, ioprio)
+ if rc != 0:
+ raise ValueError("Unable to set ioprio, syscall returned %s" % rc)
+ else:
+ bb.warn("Unable to set IO Prio for arch %s" % _unamearch)
diff --git a/bitbake/lib/prserv/db.py b/bitbake/lib/prserv/db.py
index 4379580..36c9f7b 100644
--- a/bitbake/lib/prserv/db.py
+++ b/bitbake/lib/prserv/db.py
@@ -248,7 +248,7 @@ class PRData(object):
self.connection.execute("PRAGMA journal_mode = WAL;")
self._tables={}
- def __del__(self):
+ def disconnect(self):
self.connection.close()
def __getitem__(self,tblname):
diff --git a/bitbake/lib/prserv/serv.py b/bitbake/lib/prserv/serv.py
index 5c0ffb9..eafc3aa 100644
--- a/bitbake/lib/prserv/serv.py
+++ b/bitbake/lib/prserv/serv.py
@@ -3,6 +3,7 @@ import signal, time
from SimpleXMLRPCServer import SimpleXMLRPCServer, SimpleXMLRPCRequestHandler
import threading
import Queue
+import socket
try:
import sqlite3
@@ -37,7 +38,6 @@ singleton = None
class PRServer(SimpleXMLRPCServer):
def __init__(self, dbfile, logfile, interface, daemon=True):
''' constructor '''
- import socket
try:
SimpleXMLRPCServer.__init__(self, interface,
logRequests=False, allow_none=True)
@@ -148,7 +148,7 @@ class PRServer(SimpleXMLRPCServer):
while not self.quit:
self.handle_request()
self.handlerthread.join()
- self.table.sync()
+ self.db.disconnect()
logger.info("PRServer: stopping...")
self.server_close()
return
@@ -289,7 +289,8 @@ class PRServerConnection(object):
return self.host, self.port
def start_daemon(dbfile, host, port, logfile):
- pidfile = PIDPREFIX % (host, port)
+ ip = socket.gethostbyname(host)
+ pidfile = PIDPREFIX % (ip, port)
try:
pf = file(pidfile,'r')
pid = int(pf.readline().strip())
@@ -302,12 +303,21 @@ def start_daemon(dbfile, host, port, logfile):
% pidfile)
return 1
- server = PRServer(os.path.abspath(dbfile), os.path.abspath(logfile), (host,port))
+ server = PRServer(os.path.abspath(dbfile), os.path.abspath(logfile), (ip,port))
server.start()
+
+ # Sometimes, the port (i.e. localhost:0) indicated by the user does not match with
+ # the one the server actually is listening, so at least warn the user about it
+ _,rport = server.getinfo()
+ if port != rport:
+ sys.stdout.write("Server is listening at port %s instead of %s\n"
+ % (rport,port))
return 0
def stop_daemon(host, port):
- pidfile = PIDPREFIX % (host, port)
+ import glob
+ ip = socket.gethostbyname(host)
+ pidfile = PIDPREFIX % (ip, port)
try:
pf = file(pidfile,'r')
pid = int(pf.readline().strip())
@@ -316,11 +326,23 @@ def stop_daemon(host, port):
pid = None
if not pid:
- sys.stderr.write("pidfile %s does not exist. Daemon not running?\n"
- % pidfile)
+ # when server starts at port=0 (i.e. localhost:0), server actually takes another port,
+ # so at least advise the user which ports the corresponding server is listening
+ ports = []
+ portstr = ""
+ for pf in glob.glob(PIDPREFIX % (ip,'*')):
+ bn = os.path.basename(pf)
+ root, _ = os.path.splitext(bn)
+ ports.append(root.split('_')[-1])
+ if len(ports):
+ portstr = "Wrong port? Other ports listening at %s: %s" % (host, ' '.join(ports))
+
+ sys.stderr.write("pidfile %s does not exist. Daemon not running? %s\n"
+ % (pidfile,portstr))
+ return 1
try:
- PRServerConnection(host, port).terminate()
+ PRServerConnection(ip, port).terminate()
except:
logger.critical("Stop PRService %s:%d failed" % (host,port))
diff --git a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
index a9909b8..b5cf559 100644
--- a/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
+++ b/bitbake/lib/toaster/bldcontrol/localhostbecontroller.py
@@ -23,9 +23,11 @@
import os
import sys
import re
+import shutil
from django.db import transaction
from django.db.models import Q
from bldcontrol.models import BuildEnvironment, BRLayer, BRVariable, BRTarget, BRBitbake
+from orm.models import CustomImageRecipe, Layer, Layer_Version, ProjectLayer
import subprocess
from toastermain import settings
@@ -179,15 +181,9 @@ class LocalhostBEController(BuildEnvironmentController):
logger.debug("localhostbecontroller: Stopped bitbake server")
def getGitCloneDirectory(self, url, branch):
- """ Utility that returns the last component of a git path as directory
- """
- import re
- components = re.split(r'[:\.\/]', url)
- base = components[-2] if components[-1] == "git" else components[-1]
-
+ """Construct unique clone directory name out of url and branch."""
if branch != "HEAD":
- return "_%s_%s.toaster_cloned" % (base, branch)
-
+ return "_toaster_clones/_%s_%s" % (re.sub('[:/@%]', '_', url), branch)
# word of attention; this is a localhost-specific issue; only on the localhost we expect to have "HEAD" releases
# which _ALWAYS_ means the current poky checkout
@@ -197,7 +193,7 @@ class LocalhostBEController(BuildEnvironmentController):
return local_checkout_path
- def setLayers(self, bitbakes, layers):
+ def setLayers(self, bitbakes, layers, targets):
""" a word of attention: by convention, the first layer for any build will be poky! """
assert self.be.sourcedir is not None
@@ -222,23 +218,26 @@ class LocalhostBEController(BuildEnvironmentController):
logger.debug("localhostbecontroller, our git repos are %s" % pformat(gitrepos))
- # 2. find checked-out git repos in the sourcedir directory that may help faster cloning
+ # 2. Note for future use if the current source directory is a
+ # checked-out git repos that could match a layer's vcs_url and therefore
+ # be used to speed up cloning (rather than fetching it again).
cached_layers = {}
- for ldir in os.listdir(self.be.sourcedir):
- fldir = os.path.join(self.be.sourcedir, ldir)
- if os.path.isdir(fldir):
+
+ try:
+ for remotes in self._shellcmd("git remote -v", self.be.sourcedir).split("\n"):
try:
- for line in self._shellcmd("git remote -v", fldir).split("\n"):
- try:
- remote = line.split("\t")[1].split(" ")[0]
- if remote not in cached_layers:
- cached_layers[remote] = fldir
- except IndexError:
- pass
- except ShellCmdException:
- # ignore any errors in collecting git remotes
+ remote = remotes.split("\t")[1].split(" ")[0]
+ if remote not in cached_layers:
+ cached_layers[remote] = self.be.sourcedir
+ except IndexError:
pass
+ except ShellCmdException:
+ # ignore any errors in collecting git remotes this is an optional
+ # step
+ pass
+
+ logger.info("Using pre-checked out source for layer %s", cached_layers)
layerlist = []
@@ -260,13 +259,14 @@ class LocalhostBEController(BuildEnvironmentController):
self._shellcmd("git remote remove origin", localdirname)
self._shellcmd("git remote add origin \"%s\"" % giturl, localdirname)
else:
- logger.debug("localhostbecontroller: cloning %s:%s in %s" % (giturl, commit, localdirname))
- self._shellcmd("git clone \"%s\" --single-branch --branch \"%s\" \"%s\"" % (giturl, commit, localdirname))
+ logger.debug("localhostbecontroller: cloning %s in %s" % (giturl, localdirname))
+ self._shellcmd('git clone "%s" "%s"' % (giturl, localdirname))
# branch magic name "HEAD" will inhibit checkout
if commit != "HEAD":
logger.debug("localhostbecontroller: checking out commit %s to %s " % (commit, localdirname))
- self._shellcmd("git fetch --all && git checkout \"%s\" && git rebase \"origin/%s\"" % (commit, commit) , localdirname)
+ ref = commit if re.match('^[a-fA-F0-9]+$', commit) else 'origin/%s' % commit
+ self._shellcmd('git fetch --all && git reset --hard "%s"' % ref, localdirname)
# take the localdirname as poky dir if we can find the oe-init-build-env
if self.pokydirname is None and os.path.exists(os.path.join(localdirname, "oe-init-build-env")):
@@ -299,6 +299,51 @@ class LocalhostBEController(BuildEnvironmentController):
if not os.path.exists(bblayerconf):
raise BuildSetupException("BE is not consistent: bblayers.conf file missing at %s" % bblayerconf)
+ # 6. create custom layer and add custom recipes to it
+ layerpath = os.path.join(self.be.sourcedir, "_meta-toaster-custom")
+ if os.path.isdir(layerpath):
+ shutil.rmtree(layerpath) # remove leftovers from previous builds
+ for target in targets:
+ try:
+ customrecipe = CustomImageRecipe.objects.get(name=target.target,
+ project=bitbakes[0].req.project)
+ except CustomImageRecipe.DoesNotExist:
+ continue # not a custom recipe, skip
+
+ # create directory structure
+ for name in ("conf", "recipes"):
+ path = os.path.join(layerpath, name)
+ if not os.path.isdir(path):
+ os.makedirs(path)
+
+ # create layer.oonf
+ config = os.path.join(layerpath, "conf", "layer.conf")
+ if not os.path.isfile(config):
+ with open(config, "w") as conf:
+ conf.write('BBPATH .= ":${LAYERDIR}"\nBBFILES += "${LAYERDIR}/recipes/*.bb"\n')
+
+ # create recipe
+ recipe = os.path.join(layerpath, "recipes", "%s.bb" % target.target)
+ with open(recipe, "w") as recipef:
+ recipef.write("require %s\n" % customrecipe.base_recipe.recipe.file_path)
+ packages = [pkg.name for pkg in customrecipe.packages.all()]
+ if packages:
+ recipef.write('IMAGE_INSTALL = "%s"\n' % ' '.join(packages))
+
+ # create *Layer* objects needed for build machinery to work
+ layer = Layer.objects.get_or_create(name="Toaster Custom layer",
+ summary="Layer for custom recipes",
+ vcs_url="file://%s" % layerpath)[0]
+ breq = target.req
+ lver = Layer_Version.objects.get_or_create(project=breq.project, layer=layer,
+ dirpath=layerpath, build=breq.build)[0]
+ ProjectLayer.objects.get_or_create(project=breq.project, layercommit=lver,
+ optional=False)
+ BRLayer.objects.get_or_create(req=breq, name=layer.name, dirpath=layerpath,
+ giturl="file://%s" % layerpath)
+ if os.path.isdir(layerpath):
+ layerlist.append(layerpath)
+
BuildEnvironmentController._updateBBLayers(bblayerconf, layerlist)
self.islayerset = True
@@ -316,7 +361,7 @@ class LocalhostBEController(BuildEnvironmentController):
def triggerBuild(self, bitbake, layers, variables, targets):
# set up the buid environment with the needed layers
- self.setLayers(bitbake, layers)
+ self.setLayers(bitbake, layers, targets)
self.writeConfFile("conf/toaster-pre.conf", variables)
self.writeConfFile("conf/toaster.conf", raw = "INHERIT+=\"toaster buildhistory\"")
diff --git a/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py b/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py
index b2c573c..5e70437 100644
--- a/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py
+++ b/bitbake/lib/toaster/bldcontrol/management/commands/checksettings.py
@@ -4,7 +4,7 @@ from bldcontrol.bbcontroller import getBuildEnvironmentController, ShellCmdExcep
from bldcontrol.models import BuildRequest, BuildEnvironment, BRError
from orm.models import ToasterSetting, Build
import os
-import sys, traceback
+import traceback
def DN(path):
if path is None:
@@ -21,7 +21,7 @@ class Command(NoArgsCommand):
super(Command, self).__init__(*args, **kwargs)
self.guesspath = DN(DN(DN(DN(DN(DN(DN(__file__)))))))
- def _find_first_path_for_file(self, startdirectory, filename, level = 0):
+ def _find_first_path_for_file(self, startdirectory, filename, level=0):
if level < 0:
return None
dirs = []
@@ -38,7 +38,7 @@ class Command(NoArgsCommand):
return ret
return None
- def _recursive_list_directories(self, startdirectory, level = 0):
+ def _recursive_list_directories(self, startdirectory, level=0):
if level < 0:
return []
dirs = []
@@ -50,49 +50,23 @@ class Command(NoArgsCommand):
except OSError:
pass
for j in dirs:
- dirs = dirs + self._recursive_list_directories(j, level - 1)
+ dirs = dirs + self._recursive_list_directories(j, level - 1)
return dirs
- def _get_suggested_sourcedir(self, be):
- if be.betype != BuildEnvironment.TYPE_LOCAL:
- return ""
- return DN(DN(DN(self._find_first_path_for_file(self.guesspath, "toasterconf.json", 4))))
-
- def _get_suggested_builddir(self, be):
- if be.betype != BuildEnvironment.TYPE_LOCAL:
- return ""
- return DN(self._find_first_path_for_file(DN(self.guesspath), "bblayers.conf", 4))
-
def _verify_build_environment(self):
- # refuse to start if we have no build environments
- while BuildEnvironment.objects.count() == 0:
- print(" !! No build environments found. Toaster needs at least one build environment in order to be able to run builds.\n" +
- "You can manually define build environments in the database table bldcontrol_buildenvironment.\n" +
- "Or Toaster can define a simple localhost-based build environment for you.")
-
- i = raw_input(" -- Do you want to create a basic localhost build environment ? (Y/n) ");
- if not len(i) or i.startswith("y") or i.startswith("Y"):
- BuildEnvironment.objects.create(pk = 1, betype = 0)
- else:
- raise Exception("Toaster cannot start without build environments. Aborting.")
-
+ # provide a local build env. This will be extended later to include non local
+ if BuildEnvironment.objects.count() == 0:
+ BuildEnvironment.objects.create(betype=BuildEnvironment.TYPE_LOCAL)
# we make sure we have builddir and sourcedir for all defined build envionments
for be in BuildEnvironment.objects.all():
be.needs_import = False
def _verify_be():
is_changed = False
- print("\nVerifying the build environment. If the local build environment is not properly configured, you will be asked to configure it.")
def _update_sourcedir():
- suggesteddir = self._get_suggested_sourcedir(be)
- if len(suggesteddir) > 0:
- be.sourcedir = raw_input("This is the directory Toaster uses to check out the source code of the layers you will build. Toaster will create new clones of the layers, so existing content in the chosen directory will not be changed.\nToaster suggests you use \"%s\" as your layers checkout directory. If you select this directory, a layer like \"meta-intel\" will end up in \"%s/meta-intel\".\nPress Enter to select \"%s\" or type the full path to a different directory. If you provide your own directory, it must be a parent of the cloned directory for the sources you are using to run Toaster: " % (suggesteddir, suggesteddir, suggesteddir))
- else:
- be.sourcedir = raw_input("Toaster needs to know in which directory it should check out the source code of the layers you will build. The directory should be a parent of the cloned directory for the sources you are using to run Toaster. Toaster will create new clones of the layers, so existing content in the chosen directory will not be changed.\nType the full path to the directory (for example: \"%s\": " % os.environ.get('HOME', '/tmp/'))
- if len(be.sourcedir) == 0 and len(suggesteddir) > 0:
- be.sourcedir = suggesteddir
+ be.sourcedir = os.environ.get('TOASTER_DIR')
return True
if len(be.sourcedir) == 0:
@@ -103,23 +77,13 @@ class Command(NoArgsCommand):
print "\n -- Validation: The layers checkout directory must be set to an absolute path."
is_changed = _update_sourcedir()
- if not be.sourcedir in DN(__file__):
- print "\n -- Validation: The layers checkout directory must be a parent of the current checkout."
- is_changed = _update_sourcedir()
-
if is_changed:
if be.betype == BuildEnvironment.TYPE_LOCAL:
be.needs_import = True
return True
def _update_builddir():
- suggesteddir = self._get_suggested_builddir(be)
- if len(suggesteddir) > 0:
- be.builddir = raw_input("Toaster needs to know where your build directory is located.\nThe build directory is where all the artifacts created by your builds will be stored. Toaster suggests \"%s\".\nPress Enter to select \"%s\" or type the full path to a different directory: " % (suggesteddir, suggesteddir))
- else:
- be.builddir = raw_input("Toaster needs to know where is your build directory.\nThe build directory is where all the artifacts created by your builds will be stored. Type the full path to the directory (for example: \" %s/build\")" % os.environ.get('HOME','/tmp/'))
- if len(be.builddir) == 0 and len(suggesteddir) > 0:
- be.builddir = suggesteddir
+ be.builddir = os.environ.get('TOASTER_DIR')+"/build"
return True
if len(be.builddir) == 0:
@@ -138,79 +102,51 @@ class Command(NoArgsCommand):
if be.needs_import:
- print "\nToaster can use a SINGLE predefined configuration file to set up default project settings and layer information sources.\n"
-
- # find configuration files
- config_files = []
- for dirname in self._recursive_list_directories(be.sourcedir,2):
- if os.path.exists(os.path.join(dirname, ".templateconf")):
- import subprocess
- proc = subprocess.Popen('bash -c ". '+os.path.join(dirname, ".templateconf")+'; echo \"\$TEMPLATECONF\""', shell=True, stdout=subprocess.PIPE)
- conffilepath, stderroroutput = proc.communicate()
- proc.wait()
- if proc.returncode != 0:
- raise Exception("Failed to source TEMPLATECONF: %s" % stderroroutput)
-
- conffilepath = os.path.join(conffilepath.strip(), "toasterconf.json")
- candidatefilepath = os.path.join(dirname, conffilepath)
- if "toaster_cloned" in candidatefilepath:
- continue
- if os.path.exists(candidatefilepath):
- config_files.append(candidatefilepath)
-
- if len(config_files) > 0:
- print "Toaster will list now the configuration files that it found. Select the number to use the desired configuration file."
- for cf in config_files:
- print " [%d] - %s" % (config_files.index(cf) + 1, cf)
- print "\n [0] - Exit without importing any file"
- try:
- i = raw_input("\nEnter your option: ")
- if len(i) and (int(i) - 1 >= 0 and int(i) - 1 < len(config_files)):
- print "\nImporting file: %s" % config_files[int(i)-1]
- from loadconf import Command as LoadConfigCommand
-
- LoadConfigCommand()._import_layer_config(config_files[int(i)-1])
- # we run lsupdates after config update
- print "\nLayer configuration imported. Updating information from the layer sources, please wait.\nYou can re-update any time later by running bitbake/lib/toaster/manage.py lsupdates"
- from django.core.management import call_command
- call_command("lsupdates")
-
- # we don't look for any other config files
- return is_changed
- except Exception as e:
- print "Failure while trying to import the toaster config file: %s" % e
- traceback.print_exc(e)
- else:
- print "\nToaster could not find a configuration file. You need to configure Toaster manually using the web interface, or create a configuration file and use\n bitbake/lib/toaster/managepy.py loadconf [filename]\n command to load it. You can use https://wiki.yoctoproject.org/wiki/File:Toasterconf.json.txt.patch as a starting point."
-
-
-
+ try:
+ config_file = os.environ.get('TOASTER_CONF')
+ print "\nImporting file: %s" % config_file
+ from loadconf import Command as LoadConfigCommand
+
+ LoadConfigCommand()._import_layer_config(config_file)
+ # we run lsupdates after config update
+ print "\nLayer configuration imported. Updating information from the layer sources, please wait.\nYou can re-update any time later by running bitbake/lib/toaster/manage.py lsupdates"
+ from django.core.management import call_command
+ call_command("lsupdates")
+
+ # we don't look for any other config files
+ return is_changed
+ except Exception as e:
+ print "Failure while trying to import the toaster config file %s: %s" %\
+ (config_file, e)
+ traceback.print_exc(e)
return is_changed
- while (_verify_be()):
+ while _verify_be():
pass
return 0
def _verify_default_settings(self):
# verify that default settings are there
- if ToasterSetting.objects.filter(name = 'DEFAULT_RELEASE').count() != 1:
- ToasterSetting.objects.filter(name = 'DEFAULT_RELEASE').delete()
- ToasterSetting.objects.get_or_create(name = 'DEFAULT_RELEASE', value = '')
+ if ToasterSetting.objects.filter(name='DEFAULT_RELEASE').count() != 1:
+ ToasterSetting.objects.filter(name='DEFAULT_RELEASE').delete()
+ ToasterSetting.objects.get_or_create(name='DEFAULT_RELEASE', value='')
return 0
def _verify_builds_in_progress(self):
# we are just starting up. we must not have any builds in progress, or build environments taken
- for b in BuildRequest.objects.filter(state = BuildRequest.REQ_INPROGRESS):
- BRError.objects.create(req = b, errtype = "toaster", errmsg = "Toaster found this build IN PROGRESS while Toaster started up. This is an inconsistent state, and the build was marked as failed")
+ for b in BuildRequest.objects.filter(state=BuildRequest.REQ_INPROGRESS):
+ BRError.objects.create(req=b, errtype="toaster",
+ errmsg=
+ "Toaster found this build IN PROGRESS while Toaster started up. This is an inconsistent state, and the build was marked as failed")
- BuildRequest.objects.filter(state = BuildRequest.REQ_INPROGRESS).update(state = BuildRequest.REQ_FAILED)
+ BuildRequest.objects.filter(state=BuildRequest.REQ_INPROGRESS).update(state=BuildRequest.REQ_FAILED)
- BuildEnvironment.objects.update(lock = BuildEnvironment.LOCK_FREE)
+ BuildEnvironment.objects.update(lock=BuildEnvironment.LOCK_FREE)
# also mark "In Progress builds as failures"
from django.utils import timezone
- Build.objects.filter(outcome = Build.IN_PROGRESS).update(outcome = Build.FAILED, completed_on = timezone.now())
+ Build.objects.filter(outcome=Build.IN_PROGRESS).update(outcome=Build.FAILED, completed_on=timezone.now())
return 0
diff --git a/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py b/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py
index 718e144..48dc618 100644
--- a/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py
+++ b/bitbake/lib/toaster/bldcontrol/management/commands/runbuilds.py
@@ -5,6 +5,7 @@ from bldcontrol.bbcontroller import getBuildEnvironmentController, ShellCmdExcep
from bldcontrol.models import BuildRequest, BuildEnvironment, BRError, BRVariable
import os
import logging
+import time
logger = logging.getLogger("ToasterScheduler")
@@ -118,7 +119,7 @@ class Command(NoArgsCommand):
br.save()
# transpose target information
for brtarget in br.brtarget_set.all():
- Target.objects.create(build = br.build, target= brtarget.target)
+ Target.objects.create(build=br.build, target=brtarget.target, task=brtarget.task)
# transpose the launch errors in ToasterExceptions
for brerror in br.brerror_set.all():
LogMessage.objects.create(build = br.build, level = LogMessage.EXCEPTION, message = brerror.errmsg)
@@ -128,6 +129,12 @@ class Command(NoArgsCommand):
def handle_noargs(self, **options):
- self.cleanup()
- self.archive()
- self.schedule()
+ while True:
+ try:
+ self.cleanup()
+ self.archive()
+ self.schedule()
+ except:
+ pass
+
+ time.sleep(1)
diff --git a/bitbake/lib/toaster/bldcontrol/migrations/0009_auto__add_field_brlayer_layer_version.py b/bitbake/lib/toaster/bldcontrol/migrations/0009_auto__add_field_brlayer_layer_version.py
new file mode 100644
index 0000000..9b50bc1
--- /dev/null
+++ b/bitbake/lib/toaster/bldcontrol/migrations/0009_auto__add_field_brlayer_layer_version.py
@@ -0,0 +1,180 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding field 'BRLayer.layer_version'
+ db.add_column(u'bldcontrol_brlayer', 'layer_version',
+ self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Layer_Version'], null=True),
+ keep_default=False)
+
+
+ def backwards(self, orm):
+ # Deleting field 'BRLayer.layer_version'
+ db.delete_column(u'bldcontrol_brlayer', 'layer_version_id')
+
+
+ models = {
+ u'bldcontrol.brbitbake': {
+ 'Meta': {'object_name': 'BRBitbake'},
+ 'commit': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
+ 'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
+ 'giturl': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']", 'unique': 'True'})
+ },
+ u'bldcontrol.brerror': {
+ 'Meta': {'object_name': 'BRError'},
+ 'errmsg': ('django.db.models.fields.TextField', [], {}),
+ 'errtype': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']"}),
+ 'traceback': ('django.db.models.fields.TextField', [], {})
+ },
+ u'bldcontrol.brlayer': {
+ 'Meta': {'object_name': 'BRLayer'},
+ 'commit': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
+ 'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
+ 'giturl': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']", 'null': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']"})
+ },
+ u'bldcontrol.brtarget': {
+ 'Meta': {'object_name': 'BRTarget'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']"}),
+ 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'task': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
+ },
+ u'bldcontrol.brvariable': {
+ 'Meta': {'object_name': 'BRVariable'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'req': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildRequest']"}),
+ 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+ },
+ u'bldcontrol.buildenvironment': {
+ 'Meta': {'object_name': 'BuildEnvironment'},
+ 'address': ('django.db.models.fields.CharField', [], {'max_length': '254'}),
+ 'bbaddress': ('django.db.models.fields.CharField', [], {'max_length': '254', 'blank': 'True'}),
+ 'bbport': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
+ 'bbstate': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'bbtoken': ('django.db.models.fields.CharField', [], {'max_length': '126', 'blank': 'True'}),
+ 'betype': ('django.db.models.fields.IntegerField', [], {}),
+ 'builddir': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'lock': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'sourcedir': ('django.db.models.fields.CharField', [], {'max_length': '512', 'blank': 'True'}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+ },
+ u'bldcontrol.buildrequest': {
+ 'Meta': {'object_name': 'BuildRequest'},
+ 'build': ('django.db.models.fields.related.OneToOneField', [], {'to': u"orm['orm.Build']", 'unique': 'True', 'null': 'True'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ 'environment': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['bldcontrol.BuildEnvironment']", 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
+ 'state': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'})
+ },
+ u'orm.bitbakeversion': {
+ 'Meta': {'object_name': 'BitbakeVersion'},
+ 'branch': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+ 'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'giturl': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
+ },
+ u'orm.branch': {
+ 'Meta': {'unique_together': "(('layer_source', 'name'), ('layer_source', 'up_id'))", 'object_name': 'Branch'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'True', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.build': {
+ 'Meta': {'object_name': 'Build'},
+ 'bitbake_version': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'build_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'completed_on': ('django.db.models.fields.DateTimeField', [], {}),
+ 'cooker_log_path': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
+ 'distro': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'distro_version': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'machine': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
+ 'started_on': ('django.db.models.fields.DateTimeField', [], {})
+ },
+ u'orm.layer': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'), ('layer_source', 'name'))", 'object_name': 'Layer'},
+ 'description': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_index_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'summary': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}),
+ 'vcs_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_file_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_tree_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'})
+ },
+ u'orm.layer_version': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Layer_Version'},
+ 'branch': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'layer_version_build'", 'null': 'True', 'to': u"orm['orm.Build']"}),
+ 'commit': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'dirpath': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_layer'", 'to': u"orm['orm.Layer']"}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'local_path': ('django.db.models.fields.FilePathField', [], {'default': "'/'", 'max_length': '1024'}),
+ 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Project']", 'null': 'True'}),
+ 'up_branch': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Branch']", 'null': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.layersource': {
+ 'Meta': {'unique_together': "(('sourcetype', 'apiurl'),)", 'object_name': 'LayerSource'},
+ 'apiurl': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '63'}),
+ 'sourcetype': ('django.db.models.fields.IntegerField', [], {})
+ },
+ u'orm.project': {
+ 'Meta': {'object_name': 'Project'},
+ 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']", 'null': 'True'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']", 'null': 'True'}),
+ 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'user_id': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
+ },
+ u'orm.release': {
+ 'Meta': {'object_name': 'Release'},
+ 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']"}),
+ 'branch_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50'}),
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'helptext': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
+ }
+ }
+
+ complete_apps = ['bldcontrol']
\ No newline at end of file
diff --git a/bitbake/lib/toaster/bldcontrol/models.py b/bitbake/lib/toaster/bldcontrol/models.py
index b61de58..ab41105 100644
--- a/bitbake/lib/toaster/bldcontrol/models.py
+++ b/bitbake/lib/toaster/bldcontrol/models.py
@@ -1,6 +1,6 @@
from django.db import models
from django.core.validators import MaxValueValidator, MinValueValidator
-from orm.models import Project, ProjectLayer, ProjectVariable, ProjectTarget, Build
+from orm.models import Project, ProjectLayer, ProjectVariable, ProjectTarget, Build, Layer_Version
# a BuildEnvironment is the equivalent of the "build/" directory on the localhost
class BuildEnvironment(models.Model):
@@ -39,40 +39,6 @@ class BuildEnvironment(models.Model):
created = models.DateTimeField(auto_now_add = True)
updated = models.DateTimeField(auto_now = True)
-
- def get_artifact_type(self, path):
- if self.betype == BuildEnvironment.TYPE_LOCAL:
- try:
- import magic
-
- # fair warning: this is a mess; there are multiple competeing and incompatible
- # magic modules floating around, so we try some of the most common combinations
-
- try: # we try ubuntu's python-magic 5.4
- m = magic.open(magic.MAGIC_MIME_TYPE)
- m.load()
- return m.file(path)
- except AttributeError:
- pass
-
- try: # we try python-magic 0.4.6
- m = magic.Magic(magic.MAGIC_MIME)
- return m.from_file(path)
- except AttributeError:
- pass
-
- try: # we try pip filemagic 1.6
- m = magic.Magic(flags=magic.MAGIC_MIME_TYPE)
- return m.id_filename(path)
- except AttributeError:
- pass
-
- return "binary/octet-stream"
- except ImportError:
- return "binary/octet-stream"
- raise Exception("FIXME: artifact type not implemented for build environment type %s" % self.get_betype_display())
-
-
def get_artifact(self, path):
if self.betype == BuildEnvironment.TYPE_LOCAL:
return open(path, "r")
@@ -137,6 +103,7 @@ class BRLayer(models.Model):
giturl = models.CharField(max_length = 254)
commit = models.CharField(max_length = 254)
dirpath = models.CharField(max_length = 254)
+ layer_version = models.ForeignKey(Layer_Version, null=True)
class BRBitbake(models.Model):
req = models.ForeignKey(BuildRequest, unique = True) # only one bitbake for a request
diff --git a/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py b/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py
index 2a2078f..eac167b 100755
--- a/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py
+++ b/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_automation_test.py
@@ -221,6 +221,68 @@ def extract_number_from_string(s):
"""
return re.findall(r'([0-9]+)', s)
+# Below is decorator derived from toaster backend test code
+class NoParsingFilter(logging.Filter):
+ def filter(self, record):
+ return record.levelno == 100
+
+def LogResults(original_class):
+ orig_method = original_class.run
+
+ #rewrite the run method of unittest.TestCase to add testcase logging
+ def run(self, result, *args, **kws):
+ orig_method(self, result, *args, **kws)
+ passed = True
+ testMethod = getattr(self, self._testMethodName)
+
+ #if test case is decorated then use it's number, else use it's name
+ try:
+ test_case = testMethod.test_case
+ except AttributeError:
+ test_case = self._testMethodName
+
+ #create custom logging level for filtering.
+ custom_log_level = 100
+ logging.addLevelName(custom_log_level, 'RESULTS')
+ caller = os.path.basename(sys.argv[0])
+
+ def results(self, message, *args, **kws):
+ if self.isEnabledFor(custom_log_level):
+ self.log(custom_log_level, message, *args, **kws)
+ logging.Logger.results = results
+
+ logging.basicConfig(filename=os.path.join(os.getcwd(),'results-'+caller+'.log'),
+ filemode='w',
+ format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
+ datefmt='%H:%M:%S',
+ level=custom_log_level)
+ for handler in logging.root.handlers:
+ handler.addFilter(NoParsingFilter())
+# local_log = logging.getLogger(caller)
+ local_log = logging.getLogger()
+
+ #check status of tests and record it
+ for (name, msg) in result.errors:
+ if self._testMethodName == str(name).split(' ')[0]:
+ local_log.results("Testcase "+str(test_case)+": ERROR")
+ local_log.results("Testcase "+str(test_case)+":\n"+msg+"\n\n\n")
+ passed = False
+ for (name, msg) in result.failures:
+ if self._testMethodName == str(name).split(' ')[0]:
+ local_log.results("Testcase "+str(test_case)+": FAILED")
+ local_log.results("Testcase "+str(test_case)+":\n"+msg+"\n\n\n")
+ passed = False
+ for (name, msg) in result.skipped:
+ if self._testMethodName == str(name).split(' ')[0]:
+ local_log.results("Testcase "+str(test_case)+": SKIPPED"+"\n\n\n")
+ passed = False
+ if passed:
+ local_log.results("Testcase "+str(test_case)+": PASSED"+"\n\n\n")
+
+ original_class.run = run
+ return original_class
+
+
###########################################
@@ -321,7 +383,10 @@ class toaster_cases_base(unittest.TestCase):
log_path = log_dir + os.sep + self.browser + '-' +\
item + '-' + add_name + '-' + str(self.screenshot_sequence) + '.png'
if item == 'native':
- os.system("scrot " + log_path)
+ if self.host_os == "linux":
+ os.system("scrot " + log_path)
+ elif self.host_os=="darwin":
+ os.system("screencapture -x " + log_path)
elif item == 'selenium':
self.driver.get_screenshot_as_file(log_path)
self.screenshot_sequence += 1
@@ -531,6 +596,7 @@ class toaster_cases_base(unittest.TestCase):
def is_text_present (self, patterns):
for pattern in patterns:
if str(pattern) not in self.driver.page_source:
+ print pattern
return False
return True
@@ -592,7 +658,7 @@ class toaster_cases_base(unittest.TestCase):
# Note: to comply with the unittest framework, we call these test_xxx functions
# from run_toastercases.py to avoid calling setUp() and tearDown() multiple times
-
+ at LogResults
class toaster_cases(toaster_cases_base):
##############
# CASE 901 #
@@ -627,12 +693,12 @@ class toaster_cases(toaster_cases_base):
if is_list_inverted(column_list):
self.driver.find_element_by_link_text(key).click()
column_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_sequenced(column_list))
+ self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
else:
- self.failUnless(is_list_sequenced(column_list))
+ self.assertTrue(is_list_sequenced(column_list), msg=("%s column not sequenced" % key))
self.driver.find_element_by_link_text(key).click()
column_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_inverted(column_list))
+ self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
self.log.info("case passed")
@@ -656,10 +722,10 @@ class toaster_cases(toaster_cases_base):
# if nothing found, we still count it as "pass"
if new_target_column_texts:
for text in new_target_column_texts:
- self.failUnless(text.find(pattern))
+ self.assertTrue(text.find(pattern), msg=("%s item doesn't exist " % pattern))
self.driver.find_element_by_css_selector("i.icon-remove").click()
target_column_texts = self.get_table_column_text("class", "target")
- self.failUnless(ori_target_column_texts == target_column_texts)
+ self.assertTrue(ori_target_column_texts == target_column_texts, msg=("builds changed after operations"))
##############
@@ -682,10 +748,9 @@ class toaster_cases(toaster_cases_base):
try:
temp_element = self.find_element_by_text_in_table('otable', item)
# this is how we find "filter icon" in the same level as temp_element(where "a" means clickable, "i" means icon)
- self.failUnless(temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']"))
+ self.assertTrue(temp_element.find_element_by_xpath("..//*/a/i[@class='icon-filter filtered']"))
except Exception,e:
- self.log.error(" %s cannot be found! %s" % (item, e))
- self.failIf(True)
+ self.assertFalse(True, msg=(" %s cannot be found! %s" % (item, e)))
raise
# step 5-6
temp_element = self.find_element_by_link_text_in_table('otable', 'Outcome')
@@ -728,10 +793,12 @@ class toaster_cases(toaster_cases_base):
# This is how we find the "default" rows-number!
rows_displayed = int(Select(self.driver.find_element_by_css_selector("select.pagesize")).first_selected_option.text)
print rows_displayed
- self.failUnless(self.get_table_element(self.table_name, rows_displayed))
- self.failIf(self.get_table_element(self.table_name, rows_displayed + 1))
+ self.assertTrue(self.get_table_element(self.table_name, rows_displayed), msg=("not enough rows displayed"))
+ self.assertFalse(self.get_table_element(self.table_name, rows_displayed + 1), \
+ msg=("more rows displayed than expected"))
# Search text box background text is "Search tasks"
- self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search tasks']"))
+ self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search tasks']"),\
+ msg=("background text doesn't exist"))
self.driver.find_element_by_id("search").clear()
self.driver.find_element_by_id("search").send_keys("busybox")
@@ -760,22 +827,23 @@ class toaster_cases(toaster_cases_base):
column_list = self.get_table_column_text("class", table_head_dict[key])
# after 1st click, the list should be either sequenced or inverted, but we don't have a "default order" here
# the point is, after another click, it should be another order
-# the fist case is special:this means every item in column_list is the same, so
+# the first case is special:this means every item in column_list is the same, so
# after one click, either sequenced or inverted will be fine
if (is_list_inverted(column_list) and is_list_sequenced(column_list)) \
or (not column_list) :
self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list))
+ self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list), \
+ msg=("%s column not in any order" % key))
elif is_list_inverted(column_list):
self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_sequenced(column_list))
+ self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
else:
- self.failUnless(is_list_sequenced(column_list))
+ self.assertTrue(is_list_sequenced(column_list), msg=("%s column not in order" % key))
self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_inverted(column_list))
+ self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
# step 8-10
# filter dict: {link text name : filter table name in xpath}
filter_dict = {'Executed':'filter_executed', 'Outcome':'filter_outcome', 'Cache attempt':'filter_cache_attempt'}
@@ -834,9 +902,9 @@ class toaster_cases(toaster_cases_base):
self.find_element_by_link_text_in_table('nav', key).click()
head_list = self.get_table_head_text('otable')
for item in test_dict[key]['check_head_list']:
- self.failUnless(item in head_list)
+ self.assertTrue(item in head_list, msg=("%s not in head row" % item))
column_list = self.get_table_column_text('class', test_dict[key]['class'])
- self.failUnless(is_list_inverted(column_list))
+ self.assertTrue(is_list_inverted(column_list), msg=("%s column not inverted" % key))
self.driver.find_element_by_id("edit-columns-button").click()
for item2 in test_dict[key]['check_column_list']:
@@ -862,21 +930,24 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_partial_link_text("Generated files").click()
head_list = self.get_table_head_text('otable')
for item in ['File', 'Size']:
- self.failUnless(item in head_list)
+ self.assertTrue(item in head_list, msg=("%s not in head row" % item))
c_list = self.get_table_column_text('class', 'path')
- self.failUnless(is_list_sequenced(c_list))
+ self.assertTrue(is_list_sequenced(c_list), msg=("column not in order"))
# step 7
self.driver.find_element_by_partial_link_text("Runtime dependencies").click()
# save sceen here to observe...
# note that here table name is not 'otable'
head_list = self.get_table_head_text('dependencies')
for item in ['Package', 'Version', 'Size']:
- self.failUnless(item in head_list)
+ self.assertTrue(item in head_list, msg=("%s not in head row" % item))
c_list = self.get_table_column_text_by_column_number('dependencies', 1)
- self.failUnless(is_list_sequenced(c_list))
+ self.assertTrue(is_list_sequenced(c_list), msg=("list not in order"))
texts = ['Size', 'License', 'Recipe', 'Recipe version', 'Layer', \
- 'Layer branch', 'Layer commit', 'Layer directory']
- self.failUnless(self.is_text_present(texts))
+ 'Layer branch', 'Layer commit']
+ time.sleep(1)
+# for text in texts:
+# self.assertTrue(self.is_text_present(text), msg=("text %s not in page" % text))
+ self.assertTrue(self.is_text_present(texts), msg=("text not in page"))
##############
@@ -898,8 +969,8 @@ class toaster_cases(toaster_cases_base):
# This is how we find the "default" rows-number!
rows_displayed = int(Select(self.driver.find_element_by_css_selector("select.pagesize")).first_selected_option.text)
print rows_displayed
- self.failUnless(self.get_table_element(self.table_name, rows_displayed))
- self.failIf(self.get_table_element(self.table_name, rows_displayed + 1))
+ self.assertTrue(self.get_table_element(self.table_name, rows_displayed))
+ self.assertFalse(self.get_table_element(self.table_name, rows_displayed + 1))
# Check the default table is sorted by Recipe
tasks_column_count = len(self.driver.find_elements_by_xpath("/html/body/div[2]/div/div[2]/div[2]/table/tbody/tr/td[1]"))
@@ -907,10 +978,10 @@ class toaster_cases(toaster_cases_base):
default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1)
#print default_column_list
- self.failUnless(is_list_sequenced(default_column_list))
+ self.assertTrue(is_list_sequenced(default_column_list))
# Search text box background text is "Search recipes"
- self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
+ self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
self.driver.find_element_by_id("search").clear()
self.driver.find_element_by_id("search").send_keys(test_package1)
@@ -937,7 +1008,7 @@ class toaster_cases(toaster_cases_base):
#self.driver.find_element_by_partial_link_text("zlib").click()
#self.driver.back()
- #self.failUnless(is_list_inverted(inverted_column_list))
+ #self.assertTrue(is_list_inverted(inverted_column_list))
#self.find_element_by_link_text_in_table(self.table_name, 'Recipe').click()
table_head_dict = {'Recipe':'recipe__name', 'Recipe file':'recipe_file', 'Section':'recipe_section', \
@@ -950,52 +1021,52 @@ class toaster_cases(toaster_cases_base):
or (not column_list) :
self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list))
+ self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list))
self.driver.find_element_by_partial_link_text("acl").click()
self.driver.back()
- self.failUnless(is_list_sequenced(column_list) or is_list_inverted(column_list))
+ self.assertTrue(is_list_sequenced(column_list) or is_list_inverted(column_list))
# Search text box background text is "Search recipes"
- self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
+ self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
self.driver.find_element_by_id("search").clear()
self.driver.find_element_by_id("search").send_keys(test_package2)
self.driver.find_element_by_id("search-button").click()
column_search_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_sequenced(column_search_list) or is_list_inverted(column_search_list))
+ self.assertTrue(is_list_sequenced(column_search_list) or is_list_inverted(column_search_list))
self.driver.find_element_by_css_selector("i.icon-remove").click()
elif is_list_inverted(column_list):
self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_sequenced(column_list))
+ self.assertTrue(is_list_sequenced(column_list))
self.driver.find_element_by_partial_link_text("acl").click()
self.driver.back()
- self.failUnless(is_list_sequenced(column_list))
+ self.assertTrue(is_list_sequenced(column_list))
# Search text box background text is "Search recipes"
- self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
+ self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
self.driver.find_element_by_id("search").clear()
self.driver.find_element_by_id("search").send_keys(test_package2)
self.driver.find_element_by_id("search-button").click()
column_search_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_sequenced(column_search_list))
+ self.assertTrue(is_list_sequenced(column_search_list))
self.driver.find_element_by_css_selector("i.icon-remove").click()
else:
- self.failUnless(is_list_sequenced(column_list))
+ self.assertTrue(is_list_sequenced(column_list))
self.find_element_by_link_text_in_table(self.table_name, key).click()
column_list = self.get_table_column_text("class", table_head_dict[key])
- self.failUnless(is_list_inverted(column_list))
+ self.assertTrue(is_list_inverted(column_list))
try:
self.driver.find_element_by_partial_link_text("acl").click()
except:
self.driver.find_element_by_partial_link_text("zlib").click()
self.driver.back()
- self.failUnless(is_list_inverted(column_list))
+ self.assertTrue(is_list_inverted(column_list))
# Search text box background text is "Search recipes"
- self.failUnless(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
+ self.assertTrue(self.driver.find_element_by_xpath("//*[@id='searchform']/*[@placeholder='Search recipes']"))
self.driver.find_element_by_id("search").clear()
self.driver.find_element_by_id("search").send_keys(test_package2)
self.driver.find_element_by_id("search-button").click()
column_search_list = self.get_table_column_text("class", table_head_dict[key])
#print column_search_list
- self.failUnless(is_list_inverted(column_search_list))
+ self.assertTrue(is_list_inverted(column_search_list))
self.driver.find_element_by_css_selector("i.icon-remove").click()
# Bug 5919
@@ -1011,7 +1082,7 @@ class toaster_cases(toaster_cases_base):
#print tasks_column_count
default_column_list = self.get_table_column_text_by_column_number(self.table_name, 1)
#print default_column_list
- self.failUnless(is_list_sequenced(default_column_list))
+ self.assertTrue(is_list_sequenced(default_column_list))
self.driver.find_element_by_id("edit-columns-button").click()
self.driver.find_element_by_id("recipe_file").click()
@@ -1061,31 +1132,31 @@ class toaster_cases(toaster_cases_base):
# step 3
head_list = self.get_table_head_text('otable')
for item in ['Recipe', 'Recipe version', 'Recipe file', 'Section', 'License', 'Layer']:
- self.failUnless(item in head_list)
- self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click()
+ self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
+ self.driver.find_element_by_id("edit-columns-button").click()
self.driver.find_element_by_id("depends_on").click()
self.driver.find_element_by_id("layer_version__branch").click()
self.driver.find_element_by_id("layer_version__layer__commit").click()
self.driver.find_element_by_id("depends_by").click()
- self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
# check if columns selected above is shown
- check_list = ['Dependencies', 'Layer branch', 'Layer commit', 'Layer directory', 'Reverse dependencies']
+ check_list = ['Dependencies', 'Layer branch', 'Layer commit', 'Reverse dependencies']
head_list = self.get_table_head_text('otable')
time.sleep(2)
print head_list
for item in check_list:
- self.failUnless(item in head_list)
+ self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
# un-check 'em all
- self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
self.driver.find_element_by_id("depends_on").click()
self.driver.find_element_by_id("layer_version__branch").click()
self.driver.find_element_by_id("layer_version__layer__commit").click()
self.driver.find_element_by_id("depends_by").click()
- self.driver.find_element_by_css_selector("button.btn.dropdown-toggle").click()
+ self.driver.find_element_by_id("edit-columns-button").click()
# don't exist any more
head_list = self.get_table_head_text('otable')
for item in check_list:
- self.failIf(item in head_list)
+ self.assertFalse(item in head_list, msg=("item %s should not be in head row" % item))
##############
@@ -1101,7 +1172,7 @@ class toaster_cases(toaster_cases_base):
# step 3
head_list = self.get_table_head_text('otable')
for item in ['Recipe', 'Recipe version', 'Recipe file', 'Section', 'License', 'Layer']:
- self.failUnless(item in head_list)
+ self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
# step 4
self.driver.find_element_by_id("edit-columns-button").click()
# save screen
@@ -1315,7 +1386,8 @@ class toaster_cases(toaster_cases_base):
head_list = self.get_table_head_text('otable')
print head_list
print len(head_list)
- self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description'])
+ self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \
+ msg=("head row contents wrong"))
# step 8
# search other string. and click "Variable" to re-sort, check if table
# head is still the same
@@ -1324,10 +1396,12 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("search-button").click()
self.find_element_by_link_text_in_table('otable', 'Variable').click()
head_list = self.get_table_head_text('otable')
- self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description'])
+ self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \
+ msg=("head row contents wrong"))
self.find_element_by_link_text_in_table('otable', 'Variable').click()
head_list = self.get_table_head_text('otable')
- self.failUnless(head_list == ['Variable', 'Value', 'Set in file', 'Description'])
+ self.assertTrue(head_list == ['Variable', 'Value', 'Set in file', 'Description'], \
+ msg=("head row contents wrong"))
##############
@@ -1343,11 +1417,11 @@ class toaster_cases(toaster_cases_base):
self.find_element_by_link_text_in_table('nav', 'Configuration').click()
self.driver.find_element_by_link_text("BitBake variables").click()
variable_list = self.get_table_column_text('class', 'variable_name')
- self.failUnless(is_list_sequenced(variable_list))
+ self.assertTrue(is_list_sequenced(variable_list), msg=("list not in order"))
# step 4
self.find_element_by_link_text_in_table('otable', 'Variable').click()
variable_list = self.get_table_column_text('class', 'variable_name')
- self.failUnless(is_list_inverted(variable_list))
+ self.assertTrue(is_list_inverted(variable_list), msg=("list not inverted"))
self.find_element_by_link_text_in_table('otable', 'Variable').click()
# step 5
# searching won't change the sequentiality
@@ -1355,7 +1429,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("search").send_keys("lib")
self.driver.find_element_by_id("search-button").click()
variable_list = self.get_table_column_text('class', 'variable_name')
- self.failUnless(is_list_sequenced(variable_list))
+ self.assertTrue(is_list_sequenced(variable_list), msg=("list not in order"))
##############
@@ -1369,7 +1443,7 @@ class toaster_cases(toaster_cases_base):
# Step 2
# default sequence in "Completed on" column is inverted
c_list = self.get_table_column_text('class', 'completed_on')
- self.failUnless(is_list_inverted(c_list))
+ self.assertTrue(is_list_inverted(c_list), msg=("list not inverted"))
# step 3
self.driver.find_element_by_id("edit-columns-button").click()
self.driver.find_element_by_id("started_on").click()
@@ -1377,8 +1451,8 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("time").click()
self.driver.find_element_by_id("edit-columns-button").click()
head_list = self.get_table_head_text('otable')
- for item in ['Outcome', 'Target', 'Machine', 'Started on', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', 'Warnings', 'Time']:
- self.failUnless(item in head_list)
+ for item in ['Outcome', 'Recipe', 'Machine', 'Started on', 'Completed on', 'Failed tasks', 'Errors', 'Warnings', 'Warnings', 'Time']:
+ self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
##############
@@ -1392,7 +1466,7 @@ class toaster_cases(toaster_cases_base):
# Please refer to case 924 requirement
# default sequence in "Completed on" column is inverted
c_list = self.get_table_column_text('class', 'completed_on')
- self.failUnless(is_list_inverted(c_list))
+ self.assertTrue(is_list_inverted(c_list), msg=("list not inverted"))
# Step 4
# click Errors , order in "Completed on" should be disturbed. Then hide
# error column to check if order in "Completed on" can be restored
@@ -1403,7 +1477,7 @@ class toaster_cases(toaster_cases_base):
# Note: without time.sleep here, there'll be unpredictable error..TBD
time.sleep(1)
c_list = self.get_table_column_text('class', 'completed_on')
- self.failUnless(is_list_inverted(c_list))
+ self.assertTrue(is_list_inverted(c_list), msg=("list not inverted"))
##############
@@ -1419,7 +1493,7 @@ class toaster_cases(toaster_cases_base):
self.find_element_by_link_text_in_table('nav', 'Packages').click()
check_head_list = ['Package', 'Package version', 'Size', 'Recipe']
head_list = self.get_table_head_text('otable')
- self.failUnless(head_list == check_head_list)
+ self.assertTrue(head_list == check_head_list, msg=("head row not as expected"))
# Step 4
# pulldown menu
option_ids = ['recipe__layer_version__layer__name', 'recipe__layer_version__branch', \
@@ -1448,7 +1522,7 @@ class toaster_cases(toaster_cases_base):
self.find_element_by_link_text_in_table('nav', 'Packages').click()
# column -- Package
column_list = self.get_table_column_text_by_column_number('otable', 1)
- self.failUnless(is_list_sequenced(column_list))
+ self.assertTrue(is_list_sequenced(column_list), msg=("list not in order"))
self.find_element_by_link_text_in_table('otable', 'Size').click()
@@ -1470,7 +1544,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("edit-columns-button").click()
#get modified table header
new_head = self.get_table_head_text('otable')
- self.failUnless(head_list > new_head)
+ self.assertTrue(head_list > new_head)
##############
# CASE 943 #
@@ -1487,7 +1561,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("search").send_keys("bash")
self.driver.find_element_by_id("search-button").click()
#check for the search result message "XX packages found"
- self.failUnless(self.is_text_present("packages found"))
+ self.assertTrue(self.is_text_present("packages found"), msg=("no packages found text"))
##############
@@ -1508,11 +1582,12 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("edit-columns-button").click()
# otable is the recipes table here
otable_head_text = self.get_table_head_text('otable')
- for item in ["Layer", "Layer branch", "Layer commit", "Layer directory"]:
- self.failIf(item not in otable_head_text)
+ for item in ["Layer", "Layer branch", "Layer commit"]:
+ self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item))
# click the fist recipe, whatever it is
self.get_table_element("otable", 1, 1).click()
- self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit", "Recipe file"]))
+ self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit", "Recipe file"]), \
+ msg=("text not in web page"))
# step 2: test Packages page stuff. almost same as above
self.driver.back()
@@ -1525,10 +1600,11 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("edit-columns-button").click()
otable_head_text = self.get_table_head_text("otable")
for item in ["Layer", "Layer branch", "Layer commit"]:
- self.failIf(item not in otable_head_text)
+ self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item))
# click the fist recipe, whatever it is
self.get_table_element("otable", 1, 1).click()
- self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit"]))
+ self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \
+ msg=("text not in web page"))
# step 3: test Packages core-image-minimal(images) stuff. almost same as above. Note when future element-id changes...
self.driver.back()
@@ -1540,17 +1616,18 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("edit-columns-button").click()
otable_head_text = self.get_table_head_text("otable")
for item in ["Layer", "Layer branch", "Layer commit"]:
- self.failIf(item not in otable_head_text)
+ self.assertFalse(item not in otable_head_text, msg=("item %s should be in head row" % item))
# click the fist recipe, whatever it is
self.get_table_element("otable", 1, 1).click()
- self.failUnless(self.is_text_present(["Layer", "Layer branch", "Layer commit"]))
+ self.assertTrue(self.is_text_present(["Layer", "Layer branch", "Layer commit"]), \
+ msg=("text not in web page"))
# step 4: check Configuration page
self.driver.back()
self.driver.find_element_by_link_text("Configuration").click()
otable_head_text = self.get_table_head_text()
for item in ["Layer", "Layer branch", "Layer commit"]:
- self.failIf(item not in otable_head_text)
+ self.assertTrue(item not in otable_head_text, msg=("item %s should not be in head row" % item))
##############
@@ -1575,14 +1652,14 @@ class toaster_cases(toaster_cases_base):
# Sure we can use driver.get(url) to refresh page, but since page will vary, we use click link text here
self.driver.find_element_by_link_text(items).click()
Select(self.driver.find_element_by_css_selector("select.pagesize")).select_by_visible_text(str(rows_displayed))
- self.failUnless(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]"))
- self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]"))
+ self.assertTrue(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]"))
+ self.assertFalse(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]"))
# click 1st package, then go back to check if it's still those rows shown.
self.driver.find_element_by_xpath(xpath_table + "/tr[1]/td[1]").click()
self.driver.find_element_by_link_text(items).click()
- self.failUnless(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]"))
- self.failIf(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]"))
+ self.assertTrue(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed) +"]"))
+ self.assertFalse(self.is_element_present(By.XPATH, xpath_table + "/tr[" + str(rows_displayed+1) +"]"))
##############
@@ -1673,7 +1750,7 @@ class toaster_cases(toaster_cases_base):
check_list = ['Description', 'Set in file']
head_list = self.get_table_head_text('otable')
for item in check_list:
- self.failIf(item in head_list)
+ self.assertFalse(item in head_list, msg=("item %s should not be in head row" % item))
# check these 2 options and verify again
self.driver.find_element_by_id('edit-columns-button').click()
self.driver.find_element_by_xpath(xpath_option('description')).click()
@@ -1681,7 +1758,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id('edit-columns-button').click()
head_list = self.get_table_head_text('otable')
for item in check_list:
- self.failUnless(item in head_list)
+ self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
##############
@@ -1703,7 +1780,7 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_id("search-button").click()
#get number of variables visible after search
number_after_search = self.driver.find_element_by_class_name('page-header').text
- self.failUnless(number_before_search > number_after_search)
+ self.assertTrue(number_before_search > number_after_search, msg=("items should be less after search"))
##############
@@ -1722,11 +1799,11 @@ class toaster_cases(toaster_cases_base):
self.driver.find_element_by_partial_link_text("Directory structure")
except Exception,e:
self.log.error(e)
- self.failIf(True)
+ self.assertFalse(True)
# step 4
head_list = self.get_table_head_text('otable')
for item in ['Package', 'Package version', 'Size', 'Dependencies', 'Reverse dependencies', 'Recipe']:
- self.failUnless(item in head_list)
+ self.assertTrue(item in head_list, msg=("item %s not in head row" % item))
# step 5-6
self.driver.find_element_by_id("edit-columns-button").click()
selectable_class = 'checkbox'
@@ -1746,22 +1823,15 @@ class toaster_cases(toaster_cases_base):
unselectable_list.append(element.text)
# check them
for item in selectable_check_list:
- if item not in selectable_list:
- self.log.error(" %s not found in dropdown menu \n" % item)
- self.failIf(True)
+ self.assertTrue(item in selectable_list, msg=("%s not found in dropdown menu" % item))
for item in unselectable_check_list:
- if item not in unselectable_list:
- self.log.error(" %s not found in dropdown menu \n" % item)
- self.failIf(True)
+ self.assertTrue(item in unselectable_list, msg=("%s not found in dropdown menu" % item))
self.driver.find_element_by_id("edit-columns-button").click()
# step 7
self.driver.find_element_by_partial_link_text("Directory structure").click()
head_list = self.get_table_head_text('dirtable')
for item in ['Directory / File', 'Symbolic link to', 'Source package', 'Size', 'Permissions', 'Owner', 'Group']:
- if item not in head_list:
- self.log.error(" %s not found in Directory structure table head \n" % item)
- self.failIf(True)
-
+ self.assertTrue(item in head_list, msg=("%s not found in Directory structure table head" % item))
##############
# CASE 950 #
@@ -1791,12 +1861,11 @@ class toaster_cases(toaster_cases_base):
try:
self.find_element_by_link_text_in_table('nav', item)
except Exception:
- self.log.error("link %s cannot be found in the page" % item)
- self.failIf(True)
+ self.assertFalse(True, msg=("link %s cannot be found in the page" % item))
# step 6
check_list_2 = ['Packages included', 'Total package size', \
'License manifest', 'Image files']
- self.failUnless(self.is_text_present(check_list_2))
+ self.assertTrue(self.is_text_present(check_list_2), msg=("text not in web page"))
self.driver.back()
try:
fail_icon = self.driver.find_element_by_xpath("//*[@class='icon-minus-sign error']")
@@ -1813,12 +1882,11 @@ class toaster_cases(toaster_cases_base):
try:
self.find_element_by_link_text_in_table('nav', item)
except Exception:
- self.log.error("link %s cannot be found in the page" % item)
- self.failIf(True)
+ self.assertFalse(True, msg=("link %s cannot be found in the page" % item))
# step 7 involved
check_list_3 = ['Machine', 'Distro', 'Layers', 'Total number of tasks', 'Tasks executed', \
'Tasks not executed', 'Reuse', 'Recipes built', 'Packages built']
- self.failUnless(self.is_text_present(check_list_3))
+ self.assertTrue(self.is_text_present(check_list_3), msg=("text not in web page"))
self.driver.back()
@@ -1878,6 +1946,5 @@ class toaster_cases(toaster_cases_base):
tasks, recipes, packages need to run manually")
self.driver.find_element_by_partial_link_text("Toaster manual").click()
if not self.is_text_present("Toaster Manual"):
- self.log.error("please check [Toaster manual] link on page")
- self.failIf(True)
+ self.assertFalse(True, msg=("please check [Toaster manual] link on page"))
diff --git a/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_test.cfg b/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_test.cfg
index 6405f9a..685a9ee 100644
--- a/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_test.cfg
+++ b/bitbake/lib/toaster/contrib/tts/toasteruitest/toaster_test.cfg
@@ -18,4 +18,8 @@ test_browser = ['ie', 'firefox', 'chrome']
test_cases = [901, 902, 903]
logging_level = 'DEBUG'
-
+[toaster_test_darwin]
+toaster_url = 'http://127.0.0.1:8000'
+test_browser = 'firefox'
+test_cases = [901, 902, 903, 904, 906, 910, 911, 912, 913, 914, 915, 916, 923, 924, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 955, 956]
+logging_level = 'INFO'
diff --git a/bitbake/lib/toaster/orm/migrations/0027_auto__add_customimagerecipe__add_unique_customimagerecipe_name_project.py b/bitbake/lib/toaster/orm/migrations/0027_auto__add_customimagerecipe__add_unique_customimagerecipe_name_project.py
new file mode 100644
index 0000000..6030605
--- /dev/null
+++ b/bitbake/lib/toaster/orm/migrations/0027_auto__add_customimagerecipe__add_unique_customimagerecipe_name_project.py
@@ -0,0 +1,375 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+ # Adding model 'CustomImageRecipe'
+ db.create_table(u'orm_customimagerecipe', (
+ (u'id', self.gf('django.db.models.fields.AutoField')(primary_key=True)),
+ ('name', self.gf('django.db.models.fields.CharField')(max_length=100)),
+ ('base_recipe', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Recipe'])),
+ ('project', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Project'])),
+ ))
+ db.send_create_signal(u'orm', ['CustomImageRecipe'])
+
+ # Adding M2M table for field packages on 'CustomImageRecipe'
+ m2m_table_name = db.shorten_name(u'orm_customimagerecipe_packages')
+ db.create_table(m2m_table_name, (
+ ('id', models.AutoField(verbose_name='ID', primary_key=True, auto_created=True)),
+ ('customimagerecipe', models.ForeignKey(orm[u'orm.customimagerecipe'], null=False)),
+ ('package', models.ForeignKey(orm[u'orm.package'], null=False))
+ ))
+ db.create_unique(m2m_table_name, ['customimagerecipe_id', 'package_id'])
+
+ # Adding unique constraint on 'CustomImageRecipe', fields ['name', 'project']
+ db.create_unique(u'orm_customimagerecipe', ['name', 'project_id'])
+
+
+ # Changing field 'Package.build'
+ db.alter_column(u'orm_package', 'build_id', self.gf('django.db.models.fields.related.ForeignKey')(to=orm['orm.Build'], null=True))
+
+ def backwards(self, orm):
+ # Removing unique constraint on 'CustomImageRecipe', fields ['name', 'project']
+ db.delete_unique(u'orm_customimagerecipe', ['name', 'project_id'])
+
+ # Deleting model 'CustomImageRecipe'
+ db.delete_table(u'orm_customimagerecipe')
+
+ # Removing M2M table for field packages on 'CustomImageRecipe'
+ db.delete_table(db.shorten_name(u'orm_customimagerecipe_packages'))
+
+
+ # Changing field 'Package.build'
+ db.alter_column(u'orm_package', 'build_id', self.gf('django.db.models.fields.related.ForeignKey')(default=None, to=orm['orm.Build']))
+
+ models = {
+ u'orm.bitbakeversion': {
+ 'Meta': {'object_name': 'BitbakeVersion'},
+ 'branch': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+ 'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'giturl': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
+ },
+ u'orm.branch': {
+ 'Meta': {'unique_together': "(('layer_source', 'name'), ('layer_source', 'up_id'))", 'object_name': 'Branch'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'True', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.build': {
+ 'Meta': {'object_name': 'Build'},
+ 'bitbake_version': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'build_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'completed_on': ('django.db.models.fields.DateTimeField', [], {}),
+ 'cooker_log_path': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
+ 'distro': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'distro_version': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'machine': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
+ 'started_on': ('django.db.models.fields.DateTimeField', [], {})
+ },
+ u'orm.buildartifact': {
+ 'Meta': {'object_name': 'BuildArtifact'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
+ 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
+ 'file_size': ('django.db.models.fields.IntegerField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ u'orm.customimagerecipe': {
+ 'Meta': {'unique_together': "(('name', 'project'),)", 'object_name': 'CustomImageRecipe'},
+ 'base_recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Recipe']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['orm.Package']", 'symmetrical': 'False'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"})
+ },
+ u'orm.helptext': {
+ 'Meta': {'object_name': 'HelpText'},
+ 'area': ('django.db.models.fields.IntegerField', [], {}),
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'helptext_build'", 'to': u"orm['orm.Build']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'text': ('django.db.models.fields.TextField', [], {})
+ },
+ u'orm.layer': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'), ('layer_source', 'name'))", 'object_name': 'Layer'},
+ 'description': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_index_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'summary': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}),
+ 'vcs_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_file_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_tree_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'})
+ },
+ u'orm.layer_version': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Layer_Version'},
+ 'branch': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'layer_version_build'", 'null': 'True', 'to': u"orm['orm.Build']"}),
+ 'commit': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'dirpath': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_layer'", 'to': u"orm['orm.Layer']"}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'local_path': ('django.db.models.fields.FilePathField', [], {'default': "'/'", 'max_length': '1024'}),
+ 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Project']", 'null': 'True'}),
+ 'up_branch': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Branch']", 'null': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.layersource': {
+ 'Meta': {'unique_together': "(('sourcetype', 'apiurl'),)", 'object_name': 'LayerSource'},
+ 'apiurl': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '63'}),
+ 'sourcetype': ('django.db.models.fields.IntegerField', [], {})
+ },
+ u'orm.layerversiondependency': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'LayerVersionDependency'},
+ 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependees'", 'to': u"orm['orm.Layer_Version']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependencies'", 'to': u"orm['orm.Layer_Version']"}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.logmessage': {
+ 'Meta': {'object_name': 'LogMessage'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'lineno': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+ 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}),
+ 'pathname': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
+ 'task': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Task']", 'null': 'True', 'blank': 'True'})
+ },
+ u'orm.machine': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Machine'},
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']"}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.package': {
+ 'Meta': {'object_name': 'Package'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']", 'null': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'installed_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}),
+ 'installed_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'license': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Recipe']", 'null': 'True'}),
+ 'revision': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
+ 'section': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+ 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
+ },
+ u'orm.package_dependency': {
+ 'Meta': {'object_name': 'Package_Dependency'},
+ 'dep_type': ('django.db.models.fields.IntegerField', [], {}),
+ 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_target'", 'to': u"orm['orm.Package']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_source'", 'to': u"orm['orm.Package']"}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']", 'null': 'True'})
+ },
+ u'orm.package_file': {
+ 'Meta': {'object_name': 'Package_File'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildfilelist_package'", 'to': u"orm['orm.Package']"}),
+ 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
+ 'size': ('django.db.models.fields.IntegerField', [], {})
+ },
+ u'orm.project': {
+ 'Meta': {'object_name': 'Project'},
+ 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']", 'null': 'True'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']", 'null': 'True'}),
+ 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'user_id': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
+ },
+ u'orm.projectlayer': {
+ 'Meta': {'unique_together': "(('project', 'layercommit'),)", 'object_name': 'ProjectLayer'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layercommit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']", 'null': 'True'}),
+ 'optional': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"})
+ },
+ u'orm.projecttarget': {
+ 'Meta': {'object_name': 'ProjectTarget'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
+ 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'task': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
+ },
+ u'orm.projectvariable': {
+ 'Meta': {'object_name': 'ProjectVariable'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
+ 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+ },
+ u'orm.recipe': {
+ 'Meta': {'unique_together': "(('layer_version', 'file_path', 'pathflags'),)", 'object_name': 'Recipe'},
+ 'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'file_path': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
+ 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'recipe_layer_version'", 'to': u"orm['orm.Layer_Version']"}),
+ 'license': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'pathflags': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+ 'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
+ },
+ u'orm.recipe_dependency': {
+ 'Meta': {'object_name': 'Recipe_Dependency'},
+ 'dep_type': ('django.db.models.fields.IntegerField', [], {}),
+ 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_depends'", 'to': u"orm['orm.Recipe']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_recipe'", 'to': u"orm['orm.Recipe']"})
+ },
+ u'orm.release': {
+ 'Meta': {'object_name': 'Release'},
+ 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']"}),
+ 'branch_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50'}),
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'helptext': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
+ },
+ u'orm.releasedefaultlayer': {
+ 'Meta': {'object_name': 'ReleaseDefaultLayer'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}),
+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']"})
+ },
+ u'orm.releaselayersourcepriority': {
+ 'Meta': {'unique_together': "(('release', 'layer_source'),)", 'object_name': 'ReleaseLayerSourcePriority'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.LayerSource']"}),
+ 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']"})
+ },
+ u'orm.target': {
+ 'Meta': {'object_name': 'Target'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'is_image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'license_manifest_path': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True'}),
+ 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'task': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
+ },
+ u'orm.target_file': {
+ 'Meta': {'object_name': 'Target_File'},
+ 'directory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'directory_set'", 'null': 'True', 'to': u"orm['orm.Target_File']"}),
+ 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'inodetype': ('django.db.models.fields.IntegerField', [], {}),
+ 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
+ 'permission': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+ 'size': ('django.db.models.fields.IntegerField', [], {}),
+ 'sym_target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'symlink_set'", 'null': 'True', 'to': u"orm['orm.Target_File']"}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
+ },
+ u'orm.target_image_file': {
+ 'Meta': {'object_name': 'Target_Image_File'},
+ 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '254'}),
+ 'file_size': ('django.db.models.fields.IntegerField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
+ },
+ u'orm.target_installed_package': {
+ 'Meta': {'object_name': 'Target_Installed_Package'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildtargetlist_package'", 'to': u"orm['orm.Package']"}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
+ },
+ u'orm.task': {
+ 'Meta': {'ordering': "('order', 'recipe')", 'unique_together': "(('build', 'recipe', 'task_name'),)", 'object_name': 'Task'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_build'", 'to': u"orm['orm.Build']"}),
+ 'cpu_usage': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2'}),
+ 'disk_io': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+ 'elapsed_time': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'line_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'logfile': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
+ 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+ 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
+ 'path_to_sstate_obj': ('django.db.models.fields.FilePathField', [], {'max_length': '500', 'blank': 'True'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tasks'", 'to': u"orm['orm.Recipe']"}),
+ 'script_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'source_url': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
+ 'sstate_checksum': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'sstate_result': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'task_executed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'task_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'work_directory': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'})
+ },
+ u'orm.task_dependency': {
+ 'Meta': {'object_name': 'Task_Dependency'},
+ 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_depends'", 'to': u"orm['orm.Task']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'task': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_task'", 'to': u"orm['orm.Task']"})
+ },
+ u'orm.toastersetting': {
+ 'Meta': {'object_name': 'ToasterSetting'},
+ 'helptext': ('django.db.models.fields.TextField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '63'}),
+ 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ u'orm.variable': {
+ 'Meta': {'object_name': 'Variable'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'variable_build'", 'to': u"orm['orm.Build']"}),
+ 'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'human_readable_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'variable_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'variable_value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+ },
+ u'orm.variablehistory': {
+ 'Meta': {'object_name': 'VariableHistory'},
+ 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'line_number': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+ 'operation': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'variable': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'vhistory'", 'to': u"orm['orm.Variable']"})
+ }
+ }
+
+ complete_apps = ['orm']
\ No newline at end of file
diff --git a/bitbake/lib/toaster/orm/migrations/0028_auto__chg_field_logmessage_message.py b/bitbake/lib/toaster/orm/migrations/0028_auto__chg_field_logmessage_message.py
new file mode 100644
index 0000000..a2f8661
--- /dev/null
+++ b/bitbake/lib/toaster/orm/migrations/0028_auto__chg_field_logmessage_message.py
@@ -0,0 +1,345 @@
+# -*- coding: utf-8 -*-
+from south.utils import datetime_utils as datetime
+from south.db import db
+from south.v2 import SchemaMigration
+from django.db import models
+
+
+class Migration(SchemaMigration):
+
+ def forwards(self, orm):
+
+ # Changing field 'LogMessage.message'
+ db.alter_column(u'orm_logmessage', 'message', self.gf('django.db.models.fields.TextField')(null=True))
+
+ def backwards(self, orm):
+
+ # Changing field 'LogMessage.message'
+ db.alter_column(u'orm_logmessage', 'message', self.gf('django.db.models.fields.CharField')(default='', max_length=240))
+
+ models = {
+ u'orm.bitbakeversion': {
+ 'Meta': {'object_name': 'BitbakeVersion'},
+ 'branch': ('django.db.models.fields.CharField', [], {'max_length': '32'}),
+ 'dirpath': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'giturl': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
+ },
+ u'orm.branch': {
+ 'Meta': {'unique_together': "(('layer_source', 'name'), ('layer_source', 'up_id'))", 'object_name': 'Branch'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'True', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.build': {
+ 'Meta': {'object_name': 'Build'},
+ 'bitbake_version': ('django.db.models.fields.CharField', [], {'max_length': '50'}),
+ 'build_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'completed_on': ('django.db.models.fields.DateTimeField', [], {}),
+ 'cooker_log_path': ('django.db.models.fields.CharField', [], {'max_length': '500'}),
+ 'distro': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'distro_version': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'machine': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '2'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
+ 'started_on': ('django.db.models.fields.DateTimeField', [], {})
+ },
+ u'orm.buildartifact': {
+ 'Meta': {'object_name': 'BuildArtifact'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
+ 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
+ 'file_size': ('django.db.models.fields.IntegerField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'})
+ },
+ u'orm.customimagerecipe': {
+ 'Meta': {'unique_together': "(('name', 'project'),)", 'object_name': 'CustomImageRecipe'},
+ 'base_recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Recipe']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'packages': ('django.db.models.fields.related.ManyToManyField', [], {'to': u"orm['orm.Package']", 'symmetrical': 'False'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"})
+ },
+ u'orm.helptext': {
+ 'Meta': {'object_name': 'HelpText'},
+ 'area': ('django.db.models.fields.IntegerField', [], {}),
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'helptext_build'", 'to': u"orm['orm.Build']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'key': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'text': ('django.db.models.fields.TextField', [], {})
+ },
+ u'orm.layer': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'), ('layer_source', 'name'))", 'object_name': 'Layer'},
+ 'description': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_index_url': ('django.db.models.fields.URLField', [], {'max_length': '200'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'summary': ('django.db.models.fields.TextField', [], {'default': 'None', 'null': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}),
+ 'vcs_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_file_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_tree_base_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'}),
+ 'vcs_web_url': ('django.db.models.fields.URLField', [], {'default': 'None', 'max_length': '200', 'null': 'True'})
+ },
+ u'orm.layer_version': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Layer_Version'},
+ 'branch': ('django.db.models.fields.CharField', [], {'max_length': '80'}),
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'related_name': "'layer_version_build'", 'null': 'True', 'to': u"orm['orm.Build']"}),
+ 'commit': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'dirpath': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'layer_version_layer'", 'to': u"orm['orm.Layer']"}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'local_path': ('django.db.models.fields.FilePathField', [], {'default': "'/'", 'max_length': '1024'}),
+ 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Project']", 'null': 'True'}),
+ 'up_branch': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.Branch']", 'null': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.layersource': {
+ 'Meta': {'unique_together': "(('sourcetype', 'apiurl'),)", 'object_name': 'LayerSource'},
+ 'apiurl': ('django.db.models.fields.CharField', [], {'default': 'None', 'max_length': '255', 'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '63'}),
+ 'sourcetype': ('django.db.models.fields.IntegerField', [], {})
+ },
+ u'orm.layerversiondependency': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'LayerVersionDependency'},
+ 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependees'", 'to': u"orm['orm.Layer_Version']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'dependencies'", 'to': u"orm['orm.Layer_Version']"}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.logmessage': {
+ 'Meta': {'object_name': 'LogMessage'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'level': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'lineno': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+ 'message': ('django.db.models.fields.TextField', [], {'null': 'True', 'blank': 'True'}),
+ 'pathname': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
+ 'task': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Task']", 'null': 'True', 'blank': 'True'})
+ },
+ u'orm.machine': {
+ 'Meta': {'unique_together': "(('layer_source', 'up_id'),)", 'object_name': 'Machine'},
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']"}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'})
+ },
+ u'orm.package': {
+ 'Meta': {'object_name': 'Package'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']", 'null': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'installed_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}),
+ 'installed_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'license': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Recipe']", 'null': 'True'}),
+ 'revision': ('django.db.models.fields.CharField', [], {'max_length': '32', 'blank': 'True'}),
+ 'section': ('django.db.models.fields.CharField', [], {'max_length': '80', 'blank': 'True'}),
+ 'size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
+ },
+ u'orm.package_dependency': {
+ 'Meta': {'object_name': 'Package_Dependency'},
+ 'dep_type': ('django.db.models.fields.IntegerField', [], {}),
+ 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_target'", 'to': u"orm['orm.Package']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'package_dependencies_source'", 'to': u"orm['orm.Package']"}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']", 'null': 'True'})
+ },
+ u'orm.package_file': {
+ 'Meta': {'object_name': 'Package_File'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildfilelist_package'", 'to': u"orm['orm.Package']"}),
+ 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
+ 'size': ('django.db.models.fields.IntegerField', [], {})
+ },
+ u'orm.project': {
+ 'Meta': {'object_name': 'Project'},
+ 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']", 'null': 'True'}),
+ 'created': ('django.db.models.fields.DateTimeField', [], {'auto_now_add': 'True', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_default': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']", 'null': 'True'}),
+ 'short_description': ('django.db.models.fields.CharField', [], {'max_length': '50', 'blank': 'True'}),
+ 'updated': ('django.db.models.fields.DateTimeField', [], {'auto_now': 'True', 'blank': 'True'}),
+ 'user_id': ('django.db.models.fields.IntegerField', [], {'null': 'True'})
+ },
+ u'orm.projectlayer': {
+ 'Meta': {'unique_together': "(('project', 'layercommit'),)", 'object_name': 'ProjectLayer'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layercommit': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Layer_Version']", 'null': 'True'}),
+ 'optional': ('django.db.models.fields.BooleanField', [], {'default': 'True'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"})
+ },
+ u'orm.projecttarget': {
+ 'Meta': {'object_name': 'ProjectTarget'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
+ 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'task': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
+ },
+ u'orm.projectvariable': {
+ 'Meta': {'object_name': 'ProjectVariable'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'project': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Project']"}),
+ 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+ },
+ u'orm.recipe': {
+ 'Meta': {'unique_together': "(('layer_version', 'file_path', 'pathflags'),)", 'object_name': 'Recipe'},
+ 'bugtracker': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'file_path': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
+ 'homepage': ('django.db.models.fields.URLField', [], {'max_length': '200', 'blank': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'is_image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'default': 'None', 'to': u"orm['orm.LayerSource']", 'null': 'True'}),
+ 'layer_version': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'recipe_layer_version'", 'to': u"orm['orm.Layer_Version']"}),
+ 'license': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'pathflags': ('django.db.models.fields.CharField', [], {'max_length': '200', 'blank': 'True'}),
+ 'section': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'summary': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'up_date': ('django.db.models.fields.DateTimeField', [], {'default': 'None', 'null': 'True'}),
+ 'up_id': ('django.db.models.fields.IntegerField', [], {'default': 'None', 'null': 'True'}),
+ 'version': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'})
+ },
+ u'orm.recipe_dependency': {
+ 'Meta': {'object_name': 'Recipe_Dependency'},
+ 'dep_type': ('django.db.models.fields.IntegerField', [], {}),
+ 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_depends'", 'to': u"orm['orm.Recipe']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'r_dependencies_recipe'", 'to': u"orm['orm.Recipe']"})
+ },
+ u'orm.release': {
+ 'Meta': {'object_name': 'Release'},
+ 'bitbake_version': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.BitbakeVersion']"}),
+ 'branch_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '50'}),
+ 'description': ('django.db.models.fields.CharField', [], {'max_length': '255'}),
+ 'helptext': ('django.db.models.fields.TextField', [], {'null': 'True'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'unique': 'True', 'max_length': '32'})
+ },
+ u'orm.releasedefaultlayer': {
+ 'Meta': {'object_name': 'ReleaseDefaultLayer'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_name': ('django.db.models.fields.CharField', [], {'default': "''", 'max_length': '100'}),
+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']"})
+ },
+ u'orm.releaselayersourcepriority': {
+ 'Meta': {'unique_together': "(('release', 'layer_source'),)", 'object_name': 'ReleaseLayerSourcePriority'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'layer_source': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.LayerSource']"}),
+ 'priority': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'release': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Release']"})
+ },
+ u'orm.target': {
+ 'Meta': {'object_name': 'Target'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Build']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'image_size': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'is_image': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'license_manifest_path': ('django.db.models.fields.CharField', [], {'max_length': '500', 'null': 'True'}),
+ 'target': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'task': ('django.db.models.fields.CharField', [], {'max_length': '100', 'null': 'True'})
+ },
+ u'orm.target_file': {
+ 'Meta': {'object_name': 'Target_File'},
+ 'directory': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'directory_set'", 'null': 'True', 'to': u"orm['orm.Target_File']"}),
+ 'group': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'inodetype': ('django.db.models.fields.IntegerField', [], {}),
+ 'owner': ('django.db.models.fields.CharField', [], {'max_length': '128'}),
+ 'path': ('django.db.models.fields.FilePathField', [], {'max_length': '100'}),
+ 'permission': ('django.db.models.fields.CharField', [], {'max_length': '16'}),
+ 'size': ('django.db.models.fields.IntegerField', [], {}),
+ 'sym_target': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'symlink_set'", 'null': 'True', 'to': u"orm['orm.Target_File']"}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
+ },
+ u'orm.target_image_file': {
+ 'Meta': {'object_name': 'Target_Image_File'},
+ 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '254'}),
+ 'file_size': ('django.db.models.fields.IntegerField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
+ },
+ u'orm.target_installed_package': {
+ 'Meta': {'object_name': 'Target_Installed_Package'},
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'package': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'buildtargetlist_package'", 'to': u"orm['orm.Package']"}),
+ 'target': ('django.db.models.fields.related.ForeignKey', [], {'to': u"orm['orm.Target']"})
+ },
+ u'orm.task': {
+ 'Meta': {'ordering': "('order', 'recipe')", 'unique_together': "(('build', 'recipe', 'task_name'),)", 'object_name': 'Task'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_build'", 'to': u"orm['orm.Build']"}),
+ 'cpu_usage': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2'}),
+ 'disk_io': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+ 'elapsed_time': ('django.db.models.fields.DecimalField', [], {'null': 'True', 'max_digits': '8', 'decimal_places': '2'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'line_number': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'logfile': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
+ 'message': ('django.db.models.fields.CharField', [], {'max_length': '240'}),
+ 'order': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+ 'outcome': ('django.db.models.fields.IntegerField', [], {'default': '-1'}),
+ 'path_to_sstate_obj': ('django.db.models.fields.FilePathField', [], {'max_length': '500', 'blank': 'True'}),
+ 'recipe': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'tasks'", 'to': u"orm['orm.Recipe']"}),
+ 'script_type': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'source_url': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'}),
+ 'sstate_checksum': ('django.db.models.fields.CharField', [], {'max_length': '100', 'blank': 'True'}),
+ 'sstate_result': ('django.db.models.fields.IntegerField', [], {'default': '0'}),
+ 'task_executed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'task_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'work_directory': ('django.db.models.fields.FilePathField', [], {'max_length': '255', 'blank': 'True'})
+ },
+ u'orm.task_dependency': {
+ 'Meta': {'object_name': 'Task_Dependency'},
+ 'depends_on': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_depends'", 'to': u"orm['orm.Task']"}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'task': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'task_dependencies_task'", 'to': u"orm['orm.Task']"})
+ },
+ u'orm.toastersetting': {
+ 'Meta': {'object_name': 'ToasterSetting'},
+ 'helptext': ('django.db.models.fields.TextField', [], {}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'name': ('django.db.models.fields.CharField', [], {'max_length': '63'}),
+ 'value': ('django.db.models.fields.CharField', [], {'max_length': '255'})
+ },
+ u'orm.variable': {
+ 'Meta': {'object_name': 'Variable'},
+ 'build': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'variable_build'", 'to': u"orm['orm.Build']"}),
+ 'changed': ('django.db.models.fields.BooleanField', [], {'default': 'False'}),
+ 'description': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'human_readable_name': ('django.db.models.fields.CharField', [], {'max_length': '200'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'variable_name': ('django.db.models.fields.CharField', [], {'max_length': '100'}),
+ 'variable_value': ('django.db.models.fields.TextField', [], {'blank': 'True'})
+ },
+ u'orm.variablehistory': {
+ 'Meta': {'object_name': 'VariableHistory'},
+ 'file_name': ('django.db.models.fields.FilePathField', [], {'max_length': '255'}),
+ u'id': ('django.db.models.fields.AutoField', [], {'primary_key': 'True'}),
+ 'line_number': ('django.db.models.fields.IntegerField', [], {'null': 'True'}),
+ 'operation': ('django.db.models.fields.CharField', [], {'max_length': '64'}),
+ 'value': ('django.db.models.fields.TextField', [], {'blank': 'True'}),
+ 'variable': ('django.db.models.fields.related.ForeignKey', [], {'related_name': "'vhistory'", 'to': u"orm['orm.Variable']"})
+ }
+ }
+
+ complete_apps = ['orm']
\ No newline at end of file
diff --git a/bitbake/lib/toaster/orm/models.py b/bitbake/lib/toaster/orm/models.py
index e4d2e87..3832905 100644
--- a/bitbake/lib/toaster/orm/models.py
+++ b/bitbake/lib/toaster/orm/models.py
@@ -191,10 +191,11 @@ class Project(models.Model):
# returns a queryset of compatible layers for a project
def compatible_layerversions(self, release = None, layer_name = None):
+ logger.warning("This function is deprecated")
if release == None:
release = self.release
# layers on the same branch or layers specifically set for this project
- queryset = Layer_Version.objects.filter((Q(up_branch__name = release.branch_name) & Q(project = None)) | Q(project = self) | Q(build__project = self))
+ queryset = Layer_Version.objects.filter(((Q(up_branch__name = release.branch_name) & Q(project = None)) | Q(project = self)) & Q(build__isnull=True))
if layer_name is not None:
# we select only a layer name
@@ -205,45 +206,55 @@ class Project(models.Model):
return queryset
- def projectlayer_equivalent_set(self):
- return self.compatible_layerversions().filter(layer__name__in = [x.layercommit.layer.name for x in self.projectlayer_set.all()]).select_related("up_branch")
+ def get_all_compatible_layer_versions(self):
+ """ Returns Queryset of all Layer_Versions which are compatible with
+ this project"""
+ queryset = Layer_Version.objects.filter(
+ (Q(up_branch__name=self.release.branch_name) & Q(build=None))
+ | Q(project=self))
+
+ return queryset
+
+ def get_project_layer_versions(self, pk=False):
+ """ Returns the Layer_Versions currently added to this project """
+ layer_versions = self.projectlayer_set.all().values('layercommit')
+
+ if pk is False:
+ return layer_versions
+ else:
+ return layer_versions.values_list('layercommit__pk', flat=True)
+
def get_available_machines(self):
""" Returns QuerySet of all Machines which are provided by the
Layers currently added to the Project """
- queryset = Machine.objects.filter(layer_version__in=self.projectlayer_equivalent_set)
+ queryset = Machine.objects.filter(
+ layer_version__in=self.get_project_layer_versions())
+
return queryset
def get_all_compatible_machines(self):
""" Returns QuerySet of all the compatible machines available to the
project including ones from Layers not currently added """
- compatible_layers = self.compatible_layerversions()
+ queryset = Machine.objects.filter(
+ layer_version__in=self.get_all_compatible_layer_versions())
- queryset = Machine.objects.filter(layer_version__in=compatible_layers)
return queryset
def get_available_recipes(self):
- """ Returns QuerySet of all Recipes which are provided by the Layers
- currently added to the Project """
- project_layers = self.projectlayer_equivalent_set()
- queryset = Recipe.objects.filter(layer_version__in = project_layers)
-
- # Copied from get_all_compatible_recipes
- search_maxids = map(lambda i: i[0], list(queryset.values('name').distinct().annotate(max_id=Max('id')).values_list('max_id')))
- queryset = queryset.filter(id__in=search_maxids).select_related('layer_version', 'layer_version__layer', 'layer_version__up_branch', 'layer_source')
- # End copy
+ """ Returns QuerySet of all the recipes that are provided by layers
+ added to this project """
+ queryset = Recipe.objects.filter(
+ layer_version__in=self.get_project_layer_versions())
return queryset
def get_all_compatible_recipes(self):
""" Returns QuerySet of all the compatible Recipes available to the
project including ones from Layers not currently added """
- compatible_layerversions = self.compatible_layerversions()
- queryset = Recipe.objects.filter(layer_version__in = compatible_layerversions)
+ queryset = Recipe.objects.filter(
+ layer_version__in=self.get_all_compatible_layer_versions()).exclude(name__exact='')
- search_maxids = map(lambda i: i[0], list(queryset.values('name').distinct().annotate(max_id=Max('id')).values_list('max_id')))
-
- queryset = queryset.filter(id__in=search_maxids).select_related('layer_version', 'layer_version__layer', 'layer_version__up_branch', 'layer_source')
return queryset
@@ -260,7 +271,7 @@ class Project(models.Model):
for l in self.projectlayer_set.all().order_by("pk"):
commit = l.layercommit.get_vcs_reference()
print("ii Building layer ", l.layercommit.layer.name, " at vcs point ", commit)
- BRLayer.objects.create(req = br, name = l.layercommit.layer.name, giturl = l.layercommit.layer.vcs_url, commit = commit, dirpath = l.layercommit.dirpath)
+ BRLayer.objects.create(req = br, name = l.layercommit.layer.name, giturl = l.layercommit.layer.vcs_url, commit = commit, dirpath = l.layercommit.dirpath, layer_version=l.layercommit)
br.state = BuildRequest.REQ_QUEUED
now = timezone.now()
@@ -270,7 +281,7 @@ class Project(models.Model):
)
for t in self.projecttarget_set.all():
BRTarget.objects.create(req = br, target = t.target, task = t.task)
- Target.objects.create(build = br.build, target = t.target)
+ Target.objects.create(build = br.build, target = t.target, task = t.task)
for v in self.projectvariable_set.all():
BRVariable.objects.create(req = br, name = v.name, value = v.value)
@@ -333,13 +344,14 @@ class Build(models.Model):
tgts = Target.objects.filter(build_id = self.id).order_by( 'target' );
return( tgts );
- @property
- def toaster_exceptions(self):
- return self.logmessage_set.filter(level=LogMessage.EXCEPTION)
+ def get_outcome_text(self):
+ return Build.BUILD_OUTCOME[int(self.outcome)][1]
@property
def errors(self):
- return (self.logmessage_set.filter(level=LogMessage.ERROR)|self.logmessage_set.filter(level=LogMessage.EXCEPTION))
+ return (self.logmessage_set.filter(level=LogMessage.ERROR) |
+ self.logmessage_set.filter(level=LogMessage.EXCEPTION) |
+ self.logmessage_set.filter(level=LogMessage.CRITICAL))
@property
def warnings(self):
@@ -350,10 +362,23 @@ class Build(models.Model):
return (self.completed_on - self.started_on).total_seconds()
def get_current_status(self):
+ """
+ get the status string from the build request if the build
+ has one, or the text for the build outcome if it doesn't
+ """
+
from bldcontrol.models import BuildRequest
- if self.outcome == Build.IN_PROGRESS and self.buildrequest.state != BuildRequest.REQ_INPROGRESS:
+
+ build_request = None
+ if hasattr(self, 'buildrequest'):
+ build_request = self.buildrequest
+
+ if (build_request
+ and build_request.state != BuildRequest.REQ_INPROGRESS
+ and self.outcome == Build.IN_PROGRESS):
return self.buildrequest.get_state_display()
- return self.get_outcome_display()
+ else:
+ return self.get_outcome_text()
def __str__(self):
return "%d %s %s" % (self.id, self.project, ",".join([t.target for t in self.target_set.all()]))
@@ -551,7 +576,7 @@ class Task_Dependency(models.Model):
class Package(models.Model):
search_allowed_fields = ['name', 'version', 'revision', 'recipe__name', 'recipe__version', 'recipe__license', 'recipe__layer_version__layer__name', 'recipe__layer_version__branch', 'recipe__layer_version__commit', 'recipe__layer_version__local_path', 'installed_name']
- build = models.ForeignKey('Build')
+ build = models.ForeignKey('Build', null=True)
recipe = models.ForeignKey('Recipe', null=True)
name = models.CharField(max_length=100)
installed_name = models.CharField(max_length=100, default='')
@@ -828,6 +853,7 @@ class LayerIndexLayerSource(LayerSource):
import urllib2, urlparse, json
import os
proxy_settings = os.environ.get("http_proxy", None)
+ oe_core_layer = 'openembedded-core'
def _get_json_response(apiurl = self.apiurl):
_parsedurl = urlparse.urlparse(apiurl)
@@ -872,6 +898,25 @@ class LayerIndexLayerSource(LayerSource):
if not connection.features.autocommits_when_autocommit_is_off:
transaction.set_autocommit(False)
for li in layers_info:
+ # Special case for the openembedded-core layer
+ if li['name'] == oe_core_layer:
+ try:
+ # If we have an existing openembedded-core for example
+ # from the toasterconf.json augment the info using the
+ # layerindex rather than duplicate it
+ oe_core_l = Layer.objects.get(name=oe_core_layer)
+ # Take ownership of the layer as now coming from the
+ # layerindex
+ oe_core_l.layer_source = self
+ oe_core_l.up_id = li['id']
+ oe_core_l.summary = li['summary']
+ oe_core_l.description = li['description']
+ oe_core_l.save()
+ continue
+
+ except Layer.DoesNotExist:
+ pass
+
l, created = Layer.objects.get_or_create(layer_source = self, name = li['name'])
l.up_id = li['id']
l.up_date = li['updated']
@@ -882,6 +927,7 @@ class LayerIndexLayerSource(LayerSource):
l.summary = li['summary']
l.description = li['description']
l.save()
+
if not connection.features.autocommits_when_autocommit_is_off:
transaction.set_autocommit(True)
@@ -974,9 +1020,12 @@ class LayerIndexLayerSource(LayerSource):
ro.file_path = ri['filepath'] + "/" + ri['filename']
if 'inherits' in ri:
ro.is_image = 'image' in ri['inherits'].split()
+ else: # workaround for old style layer index
+ ro.is_image = "-image-" in ri['pn']
ro.save()
except IntegrityError as e:
logger.debug("Failed saving recipe, ignoring: %s (%s:%s)" % (e, ro.layer_version, ri['filepath']+"/"+ri['filename']))
+ ro.delete()
if not connection.features.autocommits_when_autocommit_is_off:
transaction.set_autocommit(True)
@@ -1132,17 +1181,36 @@ class Layer_Version(models.Model):
return project.compatible_layerversions(layer_name = self.layer.name)
def get_vcs_reference(self):
- if self.commit is not None and len(self.commit) > 0:
- return self.commit
if self.branch is not None and len(self.branch) > 0:
return self.branch
if self.up_branch is not None:
return self.up_branch.name
+ if self.commit is not None and len(self.commit) > 0:
+ return self.commit
return ("Cannot determine the vcs_reference for layer version %s" % vars(self))
def get_detailspage_url(self, project_id):
return reverse('layerdetails', args=(project_id, self.pk))
+ def get_alldeps(self, project_id):
+ """Get full list of unique layer dependencies."""
+ def gen_layerdeps(lver, project):
+ for ldep in lver.dependencies.all():
+ yield ldep.depends_on
+ # get next level of deps recursively calling gen_layerdeps
+ for subdep in gen_layerdeps(ldep.depends_on, project):
+ yield subdep
+
+ project = Project.objects.get(pk=project_id)
+ result = []
+ projectlvers = [player.layercommit for player in project.projectlayer_set.all()]
+ for dep in gen_layerdeps(self, project):
+ # filter out duplicates and layers already belonging to the project
+ if dep not in result + projectlvers:
+ result.append(dep)
+
+ return sorted(result, key=lambda x: x.layer.name)
+
def __unicode__(self):
return "%d %s (VCS %s, Project %s)" % (self.pk, str(self.layer), self.get_vcs_reference(), self.build.project if self.build is not None else "No project")
@@ -1170,6 +1238,15 @@ class ProjectLayer(models.Model):
class Meta:
unique_together = (("project", "layercommit"),)
+class CustomImageRecipe(models.Model):
+ name = models.CharField(max_length=100)
+ base_recipe = models.ForeignKey(Recipe)
+ packages = models.ManyToManyField(Package)
+ project = models.ForeignKey(Project)
+
+ class Meta:
+ unique_together = ("name", "project")
+
class ProjectVariable(models.Model):
project = models.ForeignKey(Project)
name = models.CharField(max_length=100)
@@ -1206,16 +1283,20 @@ class LogMessage(models.Model):
INFO = 0
WARNING = 1
ERROR = 2
-
- LOG_LEVEL = ( (INFO, "info"),
- (WARNING, "warn"),
- (ERROR, "error"),
- (EXCEPTION, "toaster exception"))
+ CRITICAL = 3
+
+ LOG_LEVEL = (
+ (INFO, "info"),
+ (WARNING, "warn"),
+ (ERROR, "error"),
+ (CRITICAL, "critical"),
+ (EXCEPTION, "toaster exception")
+ )
build = models.ForeignKey(Build)
task = models.ForeignKey(Task, blank = True, null=True)
level = models.IntegerField(choices=LOG_LEVEL, default=INFO)
- message=models.CharField(max_length=240)
+ message = models.TextField(blank=True, null=True)
pathname = models.FilePathField(max_length=255, blank=True)
lineno = models.IntegerField(null=True)
diff --git a/bitbake/lib/toaster/orm/tests.py b/bitbake/lib/toaster/orm/tests.py
index 783aea8..719266e 100644
--- a/bitbake/lib/toaster/orm/tests.py
+++ b/bitbake/lib/toaster/orm/tests.py
@@ -23,12 +23,11 @@
from django.test import TestCase, TransactionTestCase
from orm.models import LocalLayerSource, LayerIndexLayerSource, ImportedLayerSource, LayerSource
-from orm.models import Branch
+from orm.models import Branch, LayerVersionDependency
-from orm.models import Project, Build, Layer, Layer_Version, Branch, ProjectLayer
+from orm.models import Project, Layer, Layer_Version, Branch, ProjectLayer
from orm.models import Release, ReleaseLayerSourcePriority, BitbakeVersion
-from django.utils import timezone
from django.db import IntegrityError
import os
@@ -153,35 +152,29 @@ class LayerVersionEquivalenceTestCase(TestCase):
equivqs = self.lver.get_equivalents_wpriority(self.project)
self.assertEqual(list(equivqs), [lver2, self.lver])
- def test_build_layerversion(self):
+ def test_compatible_layer_versions(self):
"""
- Any layer version coming from the build should show up
- before any layer version coming from upstream
- """
- build = Build.objects.create(project=self.project,
- started_on=timezone.now(),
- completed_on=timezone.now())
- lvb = Layer_Version.objects.create(layer=self.layer, build=build,
- commit="deadbeef")
-
- # a build layerversion must be in the equivalence
- # list for the original layerversion
- equivqs = self.lver.get_equivalents_wpriority(self.project)
- self.assertTrue(len(equivqs) == 2)
- self.assertTrue(equivqs[0] == self.lver)
- self.assertTrue(equivqs[1] == lvb)
-
- # getting the build layerversion equivalent list must
- # return the same list as the original layer
- bequivqs = lvb.get_equivalents_wpriority(self.project)
-
- self.assertEqual(list(equivqs), list(bequivqs))
-
- def test_compatible_layerversions(self):
- """
- When we have a 2 layer versions, compatible_layerversions()
+ When we have a 2 layer versions, get_all_compatible_layerversions()
should return a queryset with both.
"""
- compat_lv = self.project.compatible_layerversions()
+ compat_lv = self.project.get_all_compatible_layer_versions()
self.assertEqual(list(compat_lv), [self.lver, self.lver2])
+ def test_layerversion_get_alldeps(self):
+ """Test Layer_Version.get_alldeps API."""
+ lvers = {}
+ for i in range(10):
+ name = "layer%d" % i
+ lvers[name] = Layer_Version.objects.create(layer=Layer.objects.create(name=name),
+ project=self.project)
+ if i:
+ LayerVersionDependency.objects.create(layer_version=lvers["layer%d" % (i - 1)],
+ depends_on=lvers[name])
+ # Check dinamically added deps
+ self.assertEqual(lvers['layer0'].get_alldeps(self.project.id),
+ [lvers['layer%d' % n] for n in range(1, i+1)])
+
+ # Check chain of deps created in previous loop
+ for i in range(10):
+ self.assertEqual(lvers['layer%d' % i].get_alldeps(self.project.id),
+ [lvers['layer%d' % n] for n in range(i+1, 10)])
diff --git a/bitbake/lib/toaster/toastergui/static/css/default.css b/bitbake/lib/toaster/toastergui/static/css/default.css
index cce3e31..bc8a97b 100644
--- a/bitbake/lib/toaster/toastergui/static/css/default.css
+++ b/bitbake/lib/toaster/toastergui/static/css/default.css
@@ -15,6 +15,8 @@
/* Styles for the help information */
.get-help { color: #CCCCCC; }
.get-help:hover, .icon-plus-sign:hover { color: #999999; cursor: pointer; }
+.get-help-green { color: #468847; }
+.get-help-green:hover { color: #347132; cursor: pointer; }
.get-help-blue { color: #3A87AD; }
.get-help-blue:hover { color: #005580; cursor: pointer; }
.get-help-yellow { color: #C09853; }
@@ -161,9 +163,16 @@ table { table-layout: fixed; word-wrap: break-word; }
.project-name .label { font-weight: normal; margin-bottom: 5px; margin-left: -15px; padding: 5px; }
.project-name .label > a { color: #fff; font-weight: normal; }
+/* styles for showing help icons next to command-line builds */
+.build-result .get-help-green, .build-result .get-help-red, .build-result .get-help-blue { margin-right: 35px; margin-top: 8px; font-size: 16px; }
+
/* Remove bottom margin for forms inside modal dialogs */
#dependencies-modal-form { margin-bottom: 0px; }
+/* Custom column widths */
+.narrow-col { width: 8%; }
+.medium-col { width: 12%; }
+
/* Configuration styles */
.icon-trash { color: #B94A48; font-size: 16px; padding-left: 5px; }
.icon-trash:hover { color: #943A38; text-decoration: none; cursor: pointer; }
diff --git a/bitbake/lib/toaster/toastergui/static/js/base.js b/bitbake/lib/toaster/toastergui/static/js/base.js
index 895e61b..ed22a4e 100644
--- a/bitbake/lib/toaster/toastergui/static/js/base.js
+++ b/bitbake/lib/toaster/toastergui/static/js/base.js
@@ -6,6 +6,7 @@ function basePageInit(ctx) {
var newBuildTargetInput;
var newBuildTargetBuildBtn;
var projectNameForm = $("#project-name-change-form");
+ var projectNameContainer = $("#project-name-container");
var projectName = $("#project-name");
var projectNameFormToggle = $("#project-change-form-toggle");
var projectNameChangeCancel = $("#project-name-change-cancel");
@@ -23,24 +24,21 @@ function basePageInit(ctx) {
/* Project name change functionality */
projectNameFormToggle.click(function(e){
e.preventDefault();
-
- $(this).add(projectName).hide();
+ projectNameContainer.hide();
projectNameForm.fadeIn();
});
projectNameChangeCancel.click(function(e){
e.preventDefault();
-
projectNameForm.hide();
- projectName.add(projectNameFormToggle).fadeIn();
+ projectNameContainer.fadeIn();
});
$("#project-name-change-btn").click(function(e){
var newProjectName = $("#project-name-change-input").val();
- libtoaster.editCurrentProject({ projectName: newProjectName },function (){
-
- projectName.text(newProjectName);
+ libtoaster.editCurrentProject({ projectName: newProjectName }, function (){
+ projectName.html(newProjectName);
libtoaster.ctx.projectName = newProjectName;
projectNameChangeCancel.click();
});
@@ -123,14 +121,14 @@ function basePageInit(ctx) {
});
function _checkProjectBuildable() {
- if (selectedProject.projectId === undefined) {
+ if (selectedProject.projectId === undefined || selectedProject.projectIsDefault) {
return;
}
libtoaster.getProjectInfo(selectedProject.projectPageUrl,
function (data) {
if (data.machine === null || data.machine.name === undefined || data.layers.length === 0) {
- /* we can't build anything with out a machine and some layers */
+ /* we can't build anything without a machine and some layers */
$("#new-build-button #targets-form").hide();
$("#new-build-button .alert").show();
} else {
@@ -149,7 +147,7 @@ function basePageInit(ctx) {
/* If we don't have a current project then present the set project
* form.
*/
- if (selectedProject.projectId === undefined) {
+ if (selectedProject.projectId === undefined || selectedProject.projectIsDefault) {
$('#change-project-form').show();
$('#project .icon-pencil').hide();
}
diff --git a/bitbake/lib/toaster/toastergui/static/js/customrecipe.js b/bitbake/lib/toaster/toastergui/static/js/customrecipe.js
new file mode 100644
index 0000000..4f6b304
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/customrecipe.js
@@ -0,0 +1,50 @@
+"use strict";
+
+function customRecipePageInit(ctx) {
+
+ var urlParams = libtoaster.parseUrlParams();
+
+ (function notificationRequest(){
+ if (urlParams.hasOwnProperty('notify') && urlParams.notify === 'new'){
+ $("#image-created-notification").show();
+ }
+ })();
+
+ $("#recipeselection").on('table-done', function(e, total, tableParams){
+ /* Table is done so now setup the click handler for the package buttons */
+ $(".add-rm-package-btn").click(function(e){
+ e.preventDefault();
+ addRemovePackage($(this), tableParams);
+ });
+ });
+
+ function addRemovePackage(pkgBtn, tableParams){
+ var pkgBtnData = pkgBtn.data();
+ var method;
+ var buttonToShow;
+
+ if (pkgBtnData.directive == 'add') {
+ method = 'PUT';
+ buttonToShow = '#package-rm-btn-' + pkgBtnData.package;
+ } else if (pkgBtnData.directive == 'remove') {
+ method = 'DELETE';
+ buttonToShow = '#package-add-btn-' + pkgBtnData.package;
+ } else {
+ throw("Unknown package directive: should be add or remove");
+ }
+
+ $.ajax({
+ type: method,
+ url: pkgBtnData.packageUrl,
+ headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
+ success: function(data){
+ /* Invalidate the Add | Rm package table's current cache */
+ tableParams.nocache = true;
+ $.get(ctx.tableApiUrl, tableParams);
+ /* Swap the buttons around */
+ pkgBtn.hide();
+ $(buttonToShow).show();
+ }
+ });
+ }
+}
diff --git a/bitbake/lib/toaster/toastergui/static/js/importlayer.js b/bitbake/lib/toaster/toastergui/static/js/importlayer.js
index 2fadbc0..c68f366 100644
--- a/bitbake/lib/toaster/toastergui/static/js/importlayer.js
+++ b/bitbake/lib/toaster/toastergui/static/js/importlayer.js
@@ -195,8 +195,8 @@ function importLayerPageInit (ctx) {
var dupLayerInfo = $("#duplicate-layer-info");
dupLayerInfo.find(".dup-layer-name").text(layer.name);
dupLayerInfo.find(".dup-layer-link").attr("href", layer.layerdetailurl);
- dupLayerInfo.find("#dup-layer-vcs-url").text(layer.layer__vcs_url);
- dupLayerInfo.find("#dup-layer-revision").text(layer.revision.commit);
+ dupLayerInfo.find("#dup-layer-vcs-url").text(layer.vcs_url);
+ dupLayerInfo.find("#dup-layer-revision").text(layer.vcs_reference);
$(".fields-apart-from-layer-name").fadeOut(function(){
@@ -214,11 +214,10 @@ function importLayerPageInit (ctx) {
$.getJSON(libtoaster.ctx.layersTypeAheadUrl,
{ include_added: "true" , search: name, format: "json" },
function(layer) {
- if (layer.rows.length > 0) {
- for (var i in layer.rows){
- if (layer.rows[i].name == name) {
- console.log(layer.rows[i])
- layerExistsError(layer.rows[i]);
+ if (layer.results.length > 0) {
+ for (var i in layer.results){
+ if (layer.results[i].name == name) {
+ layerExistsError(layer.results[i]);
}
}
}
diff --git a/bitbake/lib/toaster/toastergui/static/js/jquery.treetable.js b/bitbake/lib/toaster/toastergui/static/js/jquery.treetable.js
index 42e7427..794b902 100644
--- a/bitbake/lib/toaster/toastergui/static/js/jquery.treetable.js
+++ b/bitbake/lib/toaster/toastergui/static/js/jquery.treetable.js
@@ -421,7 +421,7 @@
columnElType: "td", // i.e. 'td', 'th' or 'td,th'
expandable: false,
expanderTemplate: "<a href='#'> </a>",
- indent: 19,
+ indent: 10,
indenterTemplate: "<span class='indenter'></span>",
initialState: "collapsed",
nodeIdAttr: "ttId", // maps to data-tt-id
diff --git a/bitbake/lib/toaster/toastergui/static/js/layerBtn.js b/bitbake/lib/toaster/toastergui/static/js/layerBtn.js
index a0509f9..7318b3f 100644
--- a/bitbake/lib/toaster/toastergui/static/js/layerBtn.js
+++ b/bitbake/lib/toaster/toastergui/static/js/layerBtn.js
@@ -1,6 +1,6 @@
"use strict";
-function layerBtnsInit(ctx) {
+function layerBtnsInit() {
/* Remove any current bindings to avoid duplicated binds */
$(".layerbtn").unbind('click');
@@ -68,10 +68,16 @@ function layerBtnsInit(ctx) {
});
});
- /* Setup the initial state of the buttons */
- for (var i in ctx.projectLayers){
- $(".layer-exists-" + ctx.projectLayers[i]).show();
- $(".layer-add-" + ctx.projectLayers[i]).hide();
- }
+ $(".customise-btn").unbind('click');
+ $(".customise-btn").click(function(e){
+ e.preventDefault();
+ var imgCustomModal = $("#new-custom-image-modal");
+
+ if (imgCustomModal.length == 0)
+ throw("Modal new-custom-image not found");
+
+ imgCustomModal.data('recipe', $(this).data('recipe'));
+ imgCustomModal.modal('show');
+ });
}
diff --git a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
index 000e803..8c2ec4c 100644
--- a/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
+++ b/bitbake/lib/toaster/toastergui/static/js/layerdetails.js
@@ -7,6 +7,9 @@ function layerDetailsPageInit (ctx) {
var layerDepsList = $("#layer-deps-list");
var currentLayerDepSelection;
var addRmLayerBtn = $("#add-remove-layer-btn");
+ var targetTab = $("#targets-tab");
+ var machineTab = $("#machines-tab");
+ var detailsTab = $("#details-tab");
/* setup the dependencies typeahead */
libtoaster.makeTypeahead(layerDepInput, libtoaster.ctx.layersTypeAheadUrl, { include_added: "true" }, function(item){
@@ -15,6 +18,21 @@ function layerDetailsPageInit (ctx) {
layerDepBtn.removeAttr("disabled");
});
+ $(window).on('hashchange', function(e){
+ switch(window.location.hash){
+ case '#machines':
+ machineTab.tab('show');
+ break;
+ case '#recipes':
+ targetTab.tab('show');
+ break;
+ default:
+ detailsTab.tab('show');
+ break;
+ }
+ });
+
+
$(".breadcrumb li:first a").click(function(e){
e.preventDefault();
/* By default this link goes to the project configuration page. However
@@ -143,7 +161,7 @@ function layerDetailsPageInit (ctx) {
addRmLayerBtn.removeClass("btn-danger");
}
- $("#details-tab").on('show', function(){
+ detailsTab.on('show', function(){
if (!ctx.layerVersion.inCurrentPrj)
defaultAddBtnText();
@@ -174,7 +192,7 @@ function layerDetailsPageInit (ctx) {
$("#no-recipes-yet").hide();
}
- $("#targets-tab").removeClass("muted");
+ targetTab.removeClass("muted");
if (window.location.hash === "#recipes"){
/* re run the machinesTabShow to update the text */
targetsTabShow();
@@ -189,7 +207,7 @@ function layerDetailsPageInit (ctx) {
else
$("#no-machines-yet").hide();
- $("#machines-tab").removeClass("muted");
+ machineTab.removeClass("muted");
if (window.location.hash === "#machines"){
/* re run the machinesTabShow to update the text */
machinesTabShow();
@@ -202,7 +220,7 @@ function layerDetailsPageInit (ctx) {
});
- $("#targets-tab").on('show', targetsTabShow);
+ targetTab.on('show', targetsTabShow);
function machinesTabShow(){
if (!ctx.layerVersion.inCurrentPrj) {
@@ -219,7 +237,7 @@ function layerDetailsPageInit (ctx) {
window.location.hash = "machines";
}
- $("#machines-tab").on('show', machinesTabShow);
+ machineTab.on('show', machinesTabShow);
$(".pagesize").change(function(){
var search = libtoaster.parseUrlParams();
@@ -236,7 +254,7 @@ function layerDetailsPageInit (ctx) {
if (added){
/* enable and switch all the button states */
- $(".build-target-btn").removeAttr("disabled");
+ $(".build-recipe-btn").removeAttr("disabled");
$(".select-machine-btn").removeAttr("disabled");
addRmLayerBtn.addClass("btn-danger");
addRmLayerBtn.data('directive', "remove");
@@ -245,7 +263,7 @@ function layerDetailsPageInit (ctx) {
} else {
/* disable and switch all the button states */
- $(".build-target-btn").attr("disabled","disabled");
+ $(".build-recipe-btn").attr("disabled","disabled");
$(".select-machine-btn").attr("disabled", "disabled");
addRmLayerBtn.removeClass("btn-danger");
addRmLayerBtn.data('directive', "add");
diff --git a/bitbake/lib/toaster/toastergui/static/js/newcustomimage.js b/bitbake/lib/toaster/toastergui/static/js/newcustomimage.js
new file mode 100644
index 0000000..935b21e
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/static/js/newcustomimage.js
@@ -0,0 +1,49 @@
+"use strict";
+
+function newCustomImagePageInit(ctx){
+
+ var newCustomImgBtn = $("#create-new-custom-image-btn");
+ var imgCustomModal = $("#new-custom-image-modal");
+
+ newCustomImgBtn.click(function(e){
+ e.preventDefault();
+
+ var name = imgCustomModal.find('input').val();
+ var baseRecipeId = imgCustomModal.data('recipe');
+
+ if (name.length > 0) {
+ createCustomRecipe(name, baseRecipeId);
+ imgCustomModal.modal('hide');
+ } else {
+ console.warn("TODO No name supplied");
+ }
+ });
+
+ function createCustomRecipe(name, baseRecipeId){
+ var data = {
+ 'name' : name,
+ 'project' : libtoaster.ctx.projectId,
+ 'base' : baseRecipeId,
+ };
+
+ $.ajax({
+ type: "POST",
+ url: ctx.xhrCustomRecipeUrl,
+ data: data,
+ headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
+ success: function (ret) {
+ if (ret.error !== "ok") {
+ console.warn(ret.error);
+ } else {
+ window.location.replace(ret.url + '?notify=new');
+ }
+ },
+ error: function (ret) {
+ console.warn("Call failed");
+ console.warn(ret);
+ }
+ });
+ }
+
+
+}
diff --git a/bitbake/lib/toaster/toastergui/static/js/projectpage.js b/bitbake/lib/toaster/toastergui/static/js/projectpage.js
index d367047..e742ef2 100644
--- a/bitbake/lib/toaster/toastergui/static/js/projectpage.js
+++ b/bitbake/lib/toaster/toastergui/static/js/projectpage.js
@@ -23,7 +23,7 @@ function projectPageInit(ctx) {
var cancelReleaseChange = $("#cancel-release-change");
var currentLayerAddSelection;
- var currentMachineAddSelection = {};
+ var currentMachineAddSelection = "";
var urlParams = libtoaster.parseUrlParams();
@@ -38,7 +38,7 @@ function projectPageInit(ctx) {
*/
if (urlParams.hasOwnProperty('setMachine') &&
urlParams.setMachine !== prjInfo.machine.name){
- currentMachineAddSelection.name = urlParams.setMachine;
+ machineChangeInput.val(urlParams.setMachine);
machineChangeBtn.click();
} else {
updateMachineName(prjInfo.machine.name);
@@ -103,6 +103,12 @@ function projectPageInit(ctx) {
layerAddBtn.removeAttr("disabled");
});
+ layerAddInput.keyup(function() {
+ if ($(this).val().length == 0) {
+ layerAddBtn.attr("disabled", "disabled")
+ }
+ });
+
layerAddBtn.click(function(e){
e.preventDefault();
var layerObj = currentLayerAddSelection;
@@ -146,10 +152,7 @@ function projectPageInit(ctx) {
link.attr("href", layerObj.layerdetailurl);
link.text(layerObj.name);
- /* YOCTO #8024
- link.tooltip({title: layerObj.giturl + " | "+ layerObj.branch.name, placement: "right"});
- branch name not accessible sometimes it is revision instead
- */
+ link.tooltip({title: layerObj.vcs_url + " | "+ layerObj.vcs_reference, placement: "right"});
var trashItem = projectLayer.children("span");
trashItem.click(function (e) {
@@ -251,29 +254,33 @@ function projectPageInit(ctx) {
}
libtoaster.makeTypeahead(machineChangeInput, libtoaster.ctx.machinesTypeAheadUrl, { }, function(item){
- currentMachineAddSelection = item;
+ currentMachineAddSelection = item.name;
machineChangeBtn.removeAttr("disabled");
});
machineChangeBtn.click(function(e){
e.preventDefault();
- if (currentMachineAddSelection.name === undefined)
+ /* We accept any value regardless of typeahead selection or not */
+ if (machineChangeInput.val().length === 0)
return;
- libtoaster.editCurrentProject({ machineName : currentMachineAddSelection.name },
+ currentMachineAddSelection = machineChangeInput.val();
+
+ libtoaster.editCurrentProject(
+ { machineName : currentMachineAddSelection },
function(){
/* Success machine changed */
- updateMachineName(currentMachineAddSelection.name);
+ updateMachineName(currentMachineAddSelection);
machineChangeCancel.click();
/* Show the alert message */
var message = $('<span class="lead">You have changed the machine to: <strong><span id="notify-machine-name"></span></strong></span>');
- message.find("#notify-machine-name").text(currentMachineAddSelection.name);
+ message.find("#notify-machine-name").text(currentMachineAddSelection);
libtoaster.showChangeNotification(message);
},
function(){
/* Failed machine changed */
- console.log("failed to change machine");
+ console.warn("Failed to change machine");
});
});
diff --git a/bitbake/lib/toaster/toastergui/static/js/table.js b/bitbake/lib/toaster/toastergui/static/js/table.js
index f18034d..40b5022 100644
--- a/bitbake/lib/toaster/toastergui/static/js/table.js
+++ b/bitbake/lib/toaster/toastergui/static/js/table.js
@@ -33,14 +33,6 @@ function tableInit(ctx){
loadData(tableParams);
- window.onpopstate = function(event){
- if (event.state){
- tableParams = event.state.tableParams;
- /* We skip loadData and just update the table */
- updateTable(event.state.tableData);
- }
- };
-
function loadData(tableParams){
$.ajax({
type: "GET",
@@ -49,10 +41,8 @@ function tableInit(ctx){
headers: { 'X-CSRFToken' : $.cookie('csrftoken')},
success: function(tableData) {
updateTable(tableData);
- window.history.pushState({
- tableData: tableData,
- tableParams: tableParams
- }, null, libtoaster.dumpsUrlParams(tableParams));
+ window.history.replaceState(null, null,
+ libtoaster.dumpsUrlParams(tableParams));
}
});
}
@@ -140,7 +130,7 @@ function tableInit(ctx){
tableBody.append(row);
/* If we have layerbtns then initialise them */
- layerBtnsInit(ctx);
+ layerBtnsInit();
/* If we have popovers initialise them now */
$('td > a.btn').popover({
diff --git a/bitbake/lib/toaster/toastergui/static/js/tests/test.js b/bitbake/lib/toaster/toastergui/static/js/tests/test.js
index d610113..aac0ba6 100644
--- a/bitbake/lib/toaster/toastergui/static/js/tests/test.js
+++ b/bitbake/lib/toaster/toastergui/static/js/tests/test.js
@@ -13,8 +13,6 @@ QUnit.test("Layer alert notification", function(assert) {
"name":"meta-example"
};
- var correctResponse = "You have added <strong>3</strong> layers to your project: <a id=\"layer-affected-name\" href=\"/toastergui/project/1/layer/22\">meta-example</a> and its dependencies <a href=\"/toastergui/project/1/layer/9\" data-original-title=\"\" title=\"\">meta-example-two</a>, <a href=\"/toastergui/project/1/layer/9\" data-original-title=\"\" title=\"\">meta-example-three</a>";
-
var layerDepsList = [
{
"layerdetailurl":"/toastergui/project/1/layer/9",
@@ -68,9 +66,9 @@ QUnit.test("Show notification", function(assert){
});
var layer = {
- "id": 91,
- "name": "meta-crystalforest",
- "layerdetailurl": "/toastergui/project/4/layer/91"
+ "id": 1,
+ "name": "meta-testing",
+ "layerdetailurl": "/toastergui/project/1/layer/1"
};
QUnit.test("Add layer", function(assert){
@@ -84,11 +82,19 @@ QUnit.test("Add layer", function(assert){
}
}, 200);
- libtoaster.addRmLayer(layer, true, function(deps){
- assert.equal(deps.length, 1);
- done();
+ /* Compare the number of layers before and after the add in the project */
+ libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl, function(prjInfo){
+ var origNumLayers = prjInfo.layers.length;
+
+ libtoaster.addRmLayer(layer, true, function(deps){
+ libtoaster.getProjectInfo(libtoaster.ctx.projectPageUrl,
+ function(prjInfo){
+ assert.ok(prjInfo.layers.length > origNumLayers,
+ "Layer not added to project");
+ done();
+ });
+ });
});
-
});
QUnit.test("Rm layer", function(assert){
@@ -152,11 +158,11 @@ QUnit.test("Layer details page init", function(assert){
});
QUnit.test("Layer btns init", function(assert){
- assert.throws(layerBtnsInit({ projectLayers : [] }));
+ assert.throws(layerBtnsInit());
});
QUnit.test("Table init", function(assert){
- assert.throws(tableInit({ url : tableUrl }));
+ assert.throws(tableInit({ url : ctx.tableUrl }));
});
$(document).ajaxError(function(event, jqxhr, settings, errMsg){
@@ -167,9 +173,3 @@ $(document).ajaxError(function(event, jqxhr, settings, errMsg){
assert.notOk(jqxhr.responseText);
});
});
-
-
-
-
-
-
diff --git a/bitbake/lib/toaster/toastergui/tables.py b/bitbake/lib/toaster/toastergui/tables.py
index 92e3b5c..9c9cda4 100644
--- a/bitbake/lib/toaster/toastergui/tables.py
+++ b/bitbake/lib/toaster/toastergui/tables.py
@@ -21,6 +21,7 @@
from toastergui.widgets import ToasterTable
from orm.models import Recipe, ProjectLayer, Layer_Version, Machine, Project
+from orm.models import CustomImageRecipe, Package
from django.db.models import Q, Max
from django.conf.urls import url
from django.core.urlresolvers import reverse
@@ -50,14 +51,13 @@ class LayersTable(ToasterTable):
def __init__(self, *args, **kwargs):
super(LayersTable, self).__init__(*args, **kwargs)
self.default_orderby = "layer__name"
+ self.title = "Compatible layers"
def get_context_data(self, **kwargs):
context = super(LayersTable, self).get_context_data(**kwargs)
project = Project.objects.get(pk=kwargs['pid'])
-
context['project'] = project
- context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=project))
return context
@@ -91,7 +91,10 @@ class LayersTable(ToasterTable):
def setup_queryset(self, *args, **kwargs):
prj = Project.objects.get(pk = kwargs['pid'])
- compatible_layers = prj.compatible_layerversions()
+ compatible_layers = prj.get_all_compatible_layer_versions()
+
+ self.static_context_extra['current_layers'] = \
+ prj.get_project_layer_versions(pk=True)
self.queryset = compatible_layers.order_by(self.default_orderby)
@@ -208,6 +211,7 @@ class MachinesTable(ToasterTable, ProjectFiltersMixin):
def __init__(self, *args, **kwargs):
super(MachinesTable, self).__init__(*args, **kwargs)
self.empty_state = "No machines maybe you need to do a build?"
+ self.title = "Compatible machines"
self.default_orderby = "name"
def get_context_data(self, **kwargs):
@@ -218,7 +222,7 @@ class MachinesTable(ToasterTable, ProjectFiltersMixin):
def setup_filters(self, *args, **kwargs):
project = Project.objects.get(pk=kwargs['pid'])
- self.project_layers = project.projectlayer_equivalent_set()
+ self.project_layers = project.get_project_layer_versions()
self.add_filter(title="Filter by project machines",
name="in_current_project",
@@ -308,13 +312,20 @@ class LayerMachinesTable(MachinesTable):
class RecipesTable(ToasterTable, ProjectFiltersMixin):
- """Table of Recipes in Toaster"""
+ """Table of All Recipes in Toaster"""
def __init__(self, *args, **kwargs):
super(RecipesTable, self).__init__(*args, **kwargs)
self.empty_state = "Toaster has no recipe information. To generate recipe information you can configure a layer source then run a build."
self.default_orderby = "name"
+ build_col = { 'title' : "Build",
+ 'help_text' : "Add or delete recipes to and from your project",
+ 'hideable' : False,
+ 'filter_name' : "in_current_project",
+ 'static_data_name' : "add-del-layers",
+ 'static_data_template' : '{% include "recipe_btn.html" %}'}
+
def get_context_data(self, **kwargs):
project = Project.objects.get(pk=kwargs['pid'])
context = super(RecipesTable, self).get_context_data(**kwargs)
@@ -326,9 +337,6 @@ class RecipesTable(ToasterTable, ProjectFiltersMixin):
return context
def setup_filters(self, *args, **kwargs):
- project = Project.objects.get(pk=kwargs['pid'])
- self.project_layers = project.projectlayer_equivalent_set()
-
self.add_filter(title="Filter by project recipes",
name="in_current_project",
filter_actions=[
@@ -336,24 +344,23 @@ class RecipesTable(ToasterTable, ProjectFiltersMixin):
self.make_filter_action("not_in_project", "Recipes provided by layers not added to this project", self.filter_not_in_project)
])
-
def setup_queryset(self, *args, **kwargs):
prj = Project.objects.get(pk = kwargs['pid'])
+ # Project layers used by the filters
+ self.project_layers = prj.get_project_layer_versions(pk=True)
+
+ # Project layers used to switch the button states
+ self.static_context_extra['current_layers'] = self.project_layers
+
self.queryset = prj.get_all_compatible_recipes()
self.queryset = self.queryset.order_by(self.default_orderby)
def setup_columns(self, *args, **kwargs):
- self.add_column(title="Recipe",
- help_text="Information about a single piece of software, including where to download the source, configuration options, how to compile the source files and how to package the compiled output",
- hideable=False,
- orderable=True,
- field_name="name")
-
- self.add_column(title="Recipe Version",
- hidden=True,
+ self.add_column(title="Version",
+ hidden=False,
field_name="version")
self.add_column(title="Description",
@@ -374,6 +381,7 @@ class RecipesTable(ToasterTable, ProjectFiltersMixin):
self.add_column(title="Section",
help_text="The section in which recipes should be categorized",
+ hidden=True,
orderable=True,
field_name="section")
@@ -390,24 +398,14 @@ class RecipesTable(ToasterTable, ProjectFiltersMixin):
self.add_column(title="License",
help_text="The list of source licenses for the recipe. Multiple license names separated by the pipe character indicates a choice between licenses. Multiple license names separated by the ampersand character indicates multiple licenses exist that cover different parts of the source",
+ hidden=True,
orderable=True,
field_name="license")
self.add_column(title="Revision",
+ hidden=True,
field_name="layer_version__get_vcs_reference")
- self.add_column(title="Build",
- help_text="Add or delete recipes to and from your project",
- hideable=False,
- filter_name="in_current_project",
- static_data_name="add-del-layers",
- static_data_template='{% include "recipe_btn.html" %}')
-
- project = Project.objects.get(pk=kwargs['pid'])
- self.add_column(title="Project compatible Layer ID",
- displayable = False,
- field_name = "projectcompatible_layer",
- computation = lambda x: (x.layer_version.get_equivalents_wpriority(project)[0]))
class LayerRecipesTable(RecipesTable):
""" Smaller version of the Recipes table for use in layer details """
@@ -422,8 +420,8 @@ class LayerRecipesTable(RecipesTable):
def setup_queryset(self, *args, **kwargs):
- RecipesTable.setup_queryset(self, *args, **kwargs)
- self.queryset = self.queryset.filter(layer_version__pk=int(kwargs['layerid']))
+ self.queryset = \
+ Recipe.objects.filter(layer_version__pk=int(kwargs['layerid']))
self.static_context_extra['in_prj'] = ProjectLayer.objects.filter(Q(project=kwargs['pid']) & Q(layercommit=kwargs['layerid'])).count()
@@ -434,20 +432,197 @@ class LayerRecipesTable(RecipesTable):
orderable=True,
field_name="name")
+ self.add_column(title="Version",
+ field_name="version")
+
self.add_column(title="Description",
field_name="get_description_or_summary")
-
build_recipe_template ='<button class="btn btn-block build-recipe-btn" data-recipe-name="{{data.name}}" {%if extra.in_prj == 0 %}disabled="disabled"{%endif%}>Build recipe</button>'
self.add_column(title="Build recipe",
static_data_name="add-del-layers",
static_data_template=build_recipe_template)
-class ProjectLayersRecipesTable(RecipesTable):
- """ Table that lists only recipes available for layers added to the project """
+class CustomImagesTable(ToasterTable):
+ """ Table to display your custom images """
+ def __init__(self, *args, **kwargs):
+ super(CustomImagesTable, self).__init__(*args, **kwargs)
+ self.title = "Custom images"
+
+ def get_context_data(self, **kwargs):
+ context = super(CustomImagesTable, self).get_context_data(**kwargs)
+ project = Project.objects.get(pk=kwargs['pid'])
+ context['project'] = project
+ context['projectlayers'] = map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=context['project']))
+ return context
def setup_queryset(self, *args, **kwargs):
- super(ProjectLayersRecipesTable, self).setup_queryset(*args, **kwargs)
prj = Project.objects.get(pk = kwargs['pid'])
- self.queryset = self.queryset.filter(layer_version__in = prj.projectlayer_equivalent_set())
+ self.queryset = CustomImageRecipe.objects.filter(project=prj)
+ self.queryset = self.queryset.order_by('name')
+
+ def setup_columns(self, *args, **kwargs):
+
+ name_link_template = '''
+ <a href="{% url 'customrecipe' extra.pid data.id %}">
+ {{data.name}}
+ </a>
+ '''
+
+ self.add_column(title="Custom image",
+ hideable=False,
+ static_data_name="name",
+ static_data_template=name_link_template)
+
+ self.add_column(title="Recipe file",
+ static_data_name='recipe_file',
+ static_data_template='')
+
+ approx_packages_template = '<a href="#imagedetails">{{data.packages.all|length}}</a>'
+ self.add_column(title="Approx packages",
+ static_data_name='approx_packages',
+ static_data_template=approx_packages_template)
+
+
+ build_btn_template = '''<button data-recipe-name="{{data.name}}"
+ class="btn btn-block build-recipe-btn" style="margin-top: 5px;" >
+ Build</button>'''
+
+ self.add_column(title="Build",
+ hideable=False,
+ static_data_name='build_custom_img',
+ static_data_template=build_btn_template)
+
+class ImageRecipesTable(RecipesTable):
+ """ A subset of the recipes table which displayed just image recipes """
+
+ def __init__(self, *args, **kwargs):
+ super(ImageRecipesTable, self).__init__(*args, **kwargs)
+ self.title = "Compatible image recipes"
+
+ def setup_queryset(self, *args, **kwargs):
+ super(ImageRecipesTable, self).setup_queryset(*args, **kwargs)
+
+ self.queryset = self.queryset.filter(is_image=True)
+
+
+ def setup_columns(self, *args, **kwargs):
+ self.add_column(title="Image recipe",
+ help_text="When you build an image recipe, you get an "
+ "image: a root file system you can"
+ "deploy to a machine",
+ hideable=False,
+ orderable=True,
+ field_name="name")
+
+ super(ImageRecipesTable, self).setup_columns(*args, **kwargs)
+
+ self.add_column(**RecipesTable.build_col)
+
+
+class NewCustomImagesTable(ImageRecipesTable):
+ """ Table which displays Images recipes which can be customised """
+ def __init__(self, *args, **kwargs):
+ super(NewCustomImagesTable, self).__init__(*args, **kwargs)
+ self.title = "Select the image recipe you want to customise"
+
+ def setup_queryset(self, *args, **kwargs):
+ super(ImageRecipesTable, self).setup_queryset(*args, **kwargs)
+
+ self.queryset = self.queryset.filter(is_image=True)
+
+ def setup_columns(self, *args, **kwargs):
+ self.add_column(title="Image recipe",
+ help_text="When you build an image recipe, you get an "
+ "image: a root file system you can"
+ "deploy to a machine",
+ hideable=False,
+ orderable=True,
+ field_name="recipe__name")
+
+ super(ImageRecipesTable, self).setup_columns(*args, **kwargs)
+
+ self.add_column(title="Customise",
+ hideable=False,
+ filter_name="in_current_project",
+ static_data_name="customise-or-add-recipe",
+ static_data_template='{% include "customise_btn.html" %}')
+
+
+class SoftwareRecipesTable(RecipesTable):
+ """ Displays just the software recipes """
+ def __init__(self, *args, **kwargs):
+ super(SoftwareRecipesTable, self).__init__(*args, **kwargs)
+ self.title = "Compatible software recipes"
+
+ def setup_queryset(self, *args, **kwargs):
+ super(SoftwareRecipesTable, self).setup_queryset(*args, **kwargs)
+
+ self.queryset = self.queryset.filter(is_image=False)
+
+
+ def setup_columns(self, *args, **kwargs):
+ self.add_column(title="Software recipe",
+ help_text="Information about a single piece of "
+ "software, including where to download the source, "
+ "configuration options, how to compile the source "
+ "files and how to package the compiled output",
+ hideable=False,
+ orderable=True,
+ field_name="name")
+
+ super(SoftwareRecipesTable, self).setup_columns(*args, **kwargs)
+
+ self.add_column(**RecipesTable.build_col)
+
+
+class SelectPackagesTable(ToasterTable):
+ """ Table to display the packages to add and remove from an image """
+
+ def __init__(self, *args, **kwargs):
+ super(SelectPackagesTable, self).__init__(*args, **kwargs)
+ self.title = "Add | Remove packages"
+
+ def setup_queryset(self, *args, **kwargs):
+ cust_recipe = CustomImageRecipe.objects.get(pk=kwargs['recipeid'])
+ prj = Project.objects.get(pk = kwargs['pid'])
+
+ current_packages = cust_recipe.packages.all()
+
+ # Get all the packages that are in the custom image
+ # Get all the packages built by builds in the current project
+ # but not those ones that are already in the custom image
+ self.queryset = Package.objects.filter(
+ Q(pk__in=current_packages) |
+ (Q(build__project=prj) &
+ ~Q(name__in=current_packages.values_list('name'))))
+
+ self.queryset = self.queryset.order_by('name')
+
+ self.static_context_extra['recipe_id'] = kwargs['recipeid']
+ self.static_context_extra['current_packages'] = \
+ cust_recipe.packages.values_list('pk', flat=True)
+
+ def setup_columns(self, *args, **kwargs):
+ self.add_column(title="Package",
+ hideable=False,
+ orderable=True,
+ field_name="name")
+
+ self.add_column(title="Package Version",
+ field_name="version")
+
+ self.add_column(title="Approx Size",
+ orderable=True,
+ static_data_name="size",
+ static_data_template="{% load projecttags %} \
+ {{data.size|filtered_filesizeformat}}")
+ self.add_column(title="summary",
+ field_name="summary")
+
+ self.add_column(title="Add | Remove",
+ help_text="Use the add and remove buttons to modify "
+ "the package content of you custom image",
+ static_data_name="add_rm_pkg_btn",
+ static_data_template='{% include "pkg_add_rm_btn.html" %}')
diff --git a/bitbake/lib/toaster/toastergui/templates/base.html b/bitbake/lib/toaster/toastergui/templates/base.html
index 640bc47..11ac2a0 100644
--- a/bitbake/lib/toaster/toastergui/templates/base.html
+++ b/bitbake/lib/toaster/toastergui/templates/base.html
@@ -1,9 +1,12 @@
<!DOCTYPE html>
{% load static %}
{% load projecttags %}
+{% load project_url_tag %}
<html lang="en">
<head>
- <title>{% if objectname %} {{objectname|title}} - {% endif %}Toaster</title>
+ <title>
+ {% block title %} Toaster {% endblock %}
+ </title>
<link rel="stylesheet" href="{% static 'css/bootstrap.min.css' %}" type="text/css"/>
<link rel="stylesheet" href="{% static 'css/bootstrap-responsive.min.css' %}" type='text/css'/>
<link rel="stylesheet" href="{% static 'css/font-awesome.min.css' %}" type='text/css'/>
@@ -35,8 +38,9 @@
projectsTypeAheadUrl: {% url 'xhr_projectstypeahead' as prjurl%}{{prjurl|json}},
{% if project.id %}
projectId : {{project.id}},
- projectPageUrl : {% url 'project' project.id as purl%}{{purl|json}},
+ projectPageUrl : {% url 'project' project.id as purl %}{{purl|json}},
projectName : {{project.name|json}},
+ projectIsDefault: {% if project.is_default %}true{% else %}false{% endif %},
recipesTypeAheadUrl: {% url 'xhr_recipestypeahead' project.id as paturl%}{{paturl|json}},
layersTypeAheadUrl: {% url 'xhr_layerstypeahead' project.id as paturl%}{{paturl|json}},
machinesTypeAheadUrl: {% url 'xhr_machinestypeahead' project.id as paturl%}{{paturl|json}},
@@ -47,7 +51,7 @@
projectId : undefined,
projectPageUrl : undefined,
projectName : undefined,
- projectId : undefined,
+ projectIsDefault: false,
{% endif %}
};
</script>
@@ -89,9 +93,9 @@
<i class="icon-info-sign" title="<strong>Toaster version information</strong>" data-content="<dl><dt>Branch</dt><dd>{{TOASTER_BRANCH}}</dd><dt>Revision</dt><dd>{{TOASTER_REVISION}}</dd></dl>"></i>
{% endif %}
</span>
- {% if request.resolver_match.url_name != 'landing' and request.resolver_match.url_name != 'newproject' %}
+ {% if BUILD_MODE and request.resolver_match.url_name != 'landing' and request.resolver_match.url_name != 'newproject' %}
<ul class="nav">
- <li {% if request.resolver_match.url_name == 'all-builds' %}
+ <li {% if request.resolver_match.url_name == 'all-builds' %}
class="active"
{% endif %}>
<a href="{% url 'all-builds' %}">
@@ -118,55 +122,65 @@
</li>
</ul>
<span class="pull-right divider-vertical"></span>
- <div class="btn-group pull-right">
- <a class="btn" id="new-project-button" href="{% url 'newproject' %}">New project</a>
- </div>
- <!-- New build popover -->
- <div class="btn-group pull-right" id="new-build-button" style="display:none">
- <button class="btn dropdown-toggle" data-toggle="dropdown">
- New build
- <i class="icon-caret-down"></i>
- </button>
- <ul class="dropdown-menu new-build multi-select">
- <li>
- <h3>New build</h3>
- <h6>Project:</h6>
- <span id="project">
- {% if project.id %}
- <a class="lead" href="{% url 'project' project.id %}">{{project.name}}</a>
- {% else %}
- <a class="lead" href="#"></a>
- {% endif %}
- <i class="icon-pencil"></i>
- </span>
- <form id="change-project-form" style="display:none;">
- <div class="input-append">
- <input type="text" class="input-medium" id="project-name-input" placeholder="Type a project name" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead"/>
- <button id="save-project-button" class="btn" type="button">Save</button>
- <a href="#" id="cancel-change-project" class="btn btn-link" style="display: none">Cancel</a>
- </div>
- <p><a id="view-all-projects" href="{% url 'all-projects' %}">View all projects</a></p>
- </form>
- </li>
- <li>
- <div class="alert" style="display:none;">
- <p>This project configuration is incomplete, so you cannot run builds.</p>
- <p><a href="{% if project.id %}{% url 'project' project.id %}{% endif %}">View project configuration</a></p>
- </div>
- </li>
- <li id="targets-form">
- <h6>Recipe(s):</h6>
- <form>
- <input type="text" class="input-xlarge build-target-input" placeholder="Type a recipe name" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead" disabled/>
- <div class="row-fluid">
- <button class="btn btn-primary build-button" disabled>Build</button>
- </div>
- </form>
- </li>
- </ul>
- </div>
+ <!-- new project button; only show in build mode -->
+ {% if BUILD_MODE %}
+ <div class="btn-group pull-right">
+ <a class="btn" id="new-project-button" href="{% url 'newproject' %}">New project</a>
+ </div>
+ {% endif %}
+ <!--
+ New build popover; only shown if there is at least one user-created project
+ and we're in build mode
+ -->
+ {% if BUILD_MODE and non_cli_projects.count > 0 %}
+ <div class="btn-group pull-right" id="new-build-button" style="display:none">
+ <button class="btn dropdown-toggle" data-toggle="dropdown">
+ New build
+ <i class="icon-caret-down"></i>
+ </button>
+ <ul class="dropdown-menu new-build multi-select">
+ <li>
+ <h3>New build</h3>
+ <h6>
+ Project:
+ <span id="project">
+ {% if project.id and not project.is_default %}
+ <a class="lead" href="{% project_url project %}">{{project.name}}</a>
+ {% else %}
+ <a class="lead" href="#"></a>
+ {% endif %}
+ <i class="icon-pencil"></i>
+ </span>
+ </h6>
+ <form id="change-project-form" style="display:none;">
+ <div class="input-append">
+ <input type="text" class="input-medium" id="project-name-input" placeholder="Type a project name" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead"/>
+ <button id="save-project-button" class="btn" type="button">Save</button>
+ <a href="#" id="cancel-change-project" class="btn btn-link" style="display: none">Cancel</a>
+ </div>
+ <p><a id="view-all-projects" href="{% url 'all-projects' %}">View all projects</a></p>
+ </form>
+ </li>
+ <li>
+ <div class="alert" style="display:none;">
+ <p>This project configuration is incomplete, so you cannot run builds.</p>
+ <p><a href="{% if project.id %}{% url 'project' project.id %}{% endif %}">View project configuration</a></p>
+ </div>
+ </li>
+ <li id="targets-form">
+ <h6>Recipe(s):</h6>
+ <form>
+ <input type="text" class="input-xlarge build-target-input" placeholder="Type a recipe name" autocomplete="off" data-minLength="1" data-autocomplete="off" data-provide="typeahead" disabled/>
+ <div class="row-fluid">
+ <button class="btn btn-primary build-button" disabled>Build</button>
+ </div>
+ </form>
+ </li>
+ </ul>
+ </div>
+ {% endif %}
</div>
</div>
</div>
diff --git a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
index 668e0bf..1f45be4 100644
--- a/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
+++ b/bitbake/lib/toaster/toastergui/templates/baseprojectpage.html
@@ -1,6 +1,9 @@
{% extends "base.html" %}
{% load projecttags %}
{% load humanize %}
+
+{% block title %} {{title}} - {{project.name}} - Toaster {% endblock %}
+
{% block pagecontent %}
{% include "projecttopbar.html" %}
@@ -23,8 +26,11 @@
<ul class="nav nav-list well">
<li><a class="nav-parent" href="{% url 'project' project.id %}">Configuration</a></li>
<li class="nav-header">Compatible metadata</li>
-<!-- <li><a href="all-image-recipes.html">Image recipes</a></li> -->
- <li><a href="{% url 'projecttargets' project.id %}">Recipes</a></li>
+ {% if CUSTOM_IMAGE %}
+ <li><a href="{% url 'projectcustomimages' project.id %}">Custom images</a></li>
+ {% endif %}
+ <li><a href="{% url 'projectimagerecipes' project.id %}">Image recipes</a></li>
+ <li><a href="{% url 'projectsoftwarerecipes' project.id %}">Software recipes</a></li>
<li><a href="{% url 'projectmachines' project.id %}">Machines</a></li>
<li><a href="{% url 'projectlayers' project.id %}">Layers</a></li>
<li class="nav-header">Extra configuration</li>
diff --git a/bitbake/lib/toaster/toastergui/templates/bpackage.html b/bitbake/lib/toaster/toastergui/templates/bpackage.html
index d775fec..81973cb 100644
--- a/bitbake/lib/toaster/toastergui/templates/bpackage.html
+++ b/bitbake/lib/toaster/toastergui/templates/bpackage.html
@@ -2,6 +2,7 @@
{% load projecttags %}
+{% block title %} Packages built - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %}
{% block localbreadcrumb %}
<li>Packages</li>
{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/builddashboard.html b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
index bab8e38..323bbbb 100644
--- a/bitbake/lib/toaster/toastergui/templates/builddashboard.html
+++ b/bitbake/lib/toaster/toastergui/templates/builddashboard.html
@@ -2,8 +2,14 @@
{% load humanize %}
{% load projecttags %}
+{% block title %} {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %}
{% block parentbreadcrumb %}
-{{build.get_sorted_target_list.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})
+{% if build.get_sorted_target_list.count > 0 %}
+ {{build.get_sorted_target_list.0.target}}
+
+{% endif %}
+
+{%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%} {{build.machine}} ({{build.completed_on|date:"d/m/y H:i"}})
{% endblock %}
{% block buildinfomain %}
@@ -37,19 +43,13 @@
<span > <i class="icon-warning-sign yellow"></i><strong><a href="#warnings" class="warning show-warnings"> {{build.warnings.count}} warning{{build.warnings.count|pluralize}}</a></strong></span>
{% endif %}
<span class="pull-right">Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}</a>
- <a class="btn {%if build.outcome == build.SUCCEEDED%}btn-success{%else%}btn-danger{%endif%} pull-right log" href="{% url 'build_artifact' build.id "cookerlog" build.id %}">Download build log</a>
+ {% if build.cooker_log_path %}
+ <a class="btn {%if build.outcome == build.SUCCEEDED%}btn-success{%else%}btn-danger{%endif%} pull-right log" href="{% url 'build_artifact' build.id "cookerlog" build.id %}">Download build log</a>
+ {% endif %}
</span>
{%endif%}
</div>
- {% if build.toaster_exceptions.count > 0 %}
- <div class="row">
- <small class="pull-right">
- <i class="icon-question-sign get-help get-help-blue" title="" data-original-title="Toaster exceptions do not affect your build: only the operation of Toaster"></i>
- <a class="show-exceptions" href="#exceptions">Toaster threw {{build.toaster_exceptions.count}} exception{{build.toaster_exceptions.count|pluralize}}</a>
- </small>
- </div>
- {% endif %}
</div>
</div>
@@ -67,11 +67,10 @@
<div class="accordion-body collapse in" id="collapse-errors">
<div class="accordion-inner">
<div class="span10">
- {% for error in logmessages %}{% if error.level == 2 %}
- <div class="alert alert-error">
+ {% for error in build.errors %}
+ <div class="alert alert-error" data-error="{{ error.id }}">
<pre>{{error.message}}</pre>
</div>
- {% endif %}
{% endfor %}
</div>
</div>
@@ -268,33 +267,6 @@
</div>
{% endif %}
-
-{% if build.toaster_exceptions.count > 0 %}
-<div class="accordion span10 pull-right" id="exceptions">
- <div class="accordion-group">
- <div class="accordion-heading">
- <a class="accordion-toggle exception toggle-exceptions">
- <h2 id="exception-toggle">
- <i class="icon-warning-sign"></i>
- {{build.toaster_exceptions.count}} Toaster exception{{build.toaster_exceptions.count|pluralize}}
- </h2>
- </a>
- </div>
- <div class="accordion-body collapse" id="collapse-exceptions">
- <div class="accordion-inner">
- <div class="span10">
- {% for exception in build.toaster_exceptions %}
- <div class="alert alert-exception">
- <pre>{{exception.message}}</pre>
- </div>
- {% endfor %}
- </div>
- </div>
- </div>
- </div>
-</div>
-{% endif %}
-
<script type="text/javascript">
$(document).ready(function() {
//show warnings section when requested from the previous page
diff --git a/bitbake/lib/toaster/toastergui/templates/builds.html b/bitbake/lib/toaster/toastergui/templates/builds.html
index c0d0c64..a27a121 100644
--- a/bitbake/lib/toaster/toastergui/templates/builds.html
+++ b/bitbake/lib/toaster/toastergui/templates/builds.html
@@ -2,8 +2,10 @@
{% load static %}
{% load projecttags %}
+{% load project_url_tag %}
{% load humanize %}
+{% block title %} All builds - Toaster {% endblock %}
{% block extraheadcontent %}
<link rel="stylesheet" href="/static/css/jquery-ui.min.css" type='text/css'>
<link rel="stylesheet" href="/static/css/jquery-ui.structure.min.css" type='text/css'>
@@ -28,8 +30,6 @@
{% include "mrb_section.html" %}
-
- {% if 1 %}
<div class="page-header top-air">
<h1>
{% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
@@ -56,17 +56,25 @@
</form>
</div>
</div>
-
-
{% else %}
{% include "basetable_top.html" %}
<!-- Table data rows; the order needs to match the order of "tablecols" definitions; and the <td class value needs to match the tablecols clclass value for show/hide buttons to work -->
{% for build in objects %}
- <tr class="data">
+ <tr class="data" data-table-build-result="{{ build.id }}">
<td class="outcome">
- <a href="{% url "builddashboard" build.id %}">{%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}</a>
- </td>
- <td class="target">{% for t in build.target_set.all %} <a href="{% url "builddashboard" build.id %}"> {{t.target}} </a> <br />{% endfor %}</td>
+ <a href="{% url "builddashboard" build.id %}">{%if build.outcome == build.SUCCEEDED%}<i class="icon-ok-sign success"></i>{%elif build.outcome == build.FAILED%}<i class="icon-minus-sign error"></i>{%else%}{%endif%}</a>
+ </td>
+ <td class="target">
+ {% for t in build.target_set.all %}
+ <a href="{% url "builddashboard" build.id %}">
+ {% if t.task %}
+ {{t.target}}:{{t.task}}
+ {% else %}
+ {{t.target}}
+ {% endif %}
+ </a> <br />
+ {% endfor %}
+ </td>
<td class="machine"><a href="{% url "builddashboard" build.id %}">{{build.machine}}</a></td>
<td class="started_on"><a href="{% url "builddashboard" build.id %}">{{build.started_on|date:"d/m/y H:i"}}</a></td>
<td class="completed_on"><a href="{% url "builddashboard" build.id %}">{{build.completed_on|date:"d/m/y H:i"}}</a></td>
@@ -93,8 +101,11 @@
<a href="{%url "builddashboard" build.id%}#images">{{fstypes|get_dict_value:build.id}}</a>
{% endif %}
</td>
- <td>
- <a href="{% url 'project' build.project.id %}">{{build.project.name}}</a>
+ <td class="project-name">
+ <a href="{% project_url build.project %}">{{build.project.name}}</a>
+ {% if build.project.is_default %}
+ <i class="icon-question-sign get-help hover-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running" style="visibility: hidden;"></i>
+ {% endif %}
</td>
</tr>
@@ -103,7 +114,6 @@
{% include "basetable_bottom.html" %}
{% endif %} {# objects.paginator.count #}
-{% endif %} {# empty #}
</div><!-- end row-fluid-->
{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configuration.html b/bitbake/lib/toaster/toastergui/templates/configuration.html
index 3e48991..85d6a62 100644
--- a/bitbake/lib/toaster/toastergui/templates/configuration.html
+++ b/bitbake/lib/toaster/toastergui/templates/configuration.html
@@ -1,6 +1,7 @@
{% extends "basebuildpage.html" %}
{% load projecttags %}
+{% block title %} Configuration summary - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %}
{% block localbreadcrumb %}
<li>Configuration</li>
{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/configvars.html b/bitbake/lib/toaster/toastergui/templates/configvars.html
index 8a572ae..e40c225 100644
--- a/bitbake/lib/toaster/toastergui/templates/configvars.html
+++ b/bitbake/lib/toaster/toastergui/templates/configvars.html
@@ -1,6 +1,7 @@
{% extends "basebuildpage.html" %}
{% load projecttags %}
+{% block title %} BitBake variables - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %}
{% block localbreadcrumb %}
<li>Configuration</li>
{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/customise_btn.html b/bitbake/lib/toaster/toastergui/templates/customise_btn.html
new file mode 100644
index 0000000..54d05f9
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/customise_btn.html
@@ -0,0 +1,9 @@
+<button class="btn btn-block layer-exists-{{data.layer_version.id}} customise-btn" style="display:none;" data-recipe="{{data.id}}">
+ Customise
+</button>
+
+<button class="btn btn-block layer-add-{{data.layer_version.id}} layerbtn" data-layer='{ "id": {{data.layer_version.id}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{% url 'layerdetails' extra.pid data.layer_version.id %}"}' data-directive="add">
+ <i class="icon-plus"></i>
+ Add layer
+</button>
+
diff --git a/bitbake/lib/toaster/toastergui/templates/customrecipe.html b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
new file mode 100644
index 0000000..823bbd8
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/customrecipe.html
@@ -0,0 +1,142 @@
+{% extends "base.html" %}
+{% load projecttags %}
+{% load humanize %}
+{% load static %}
+{% block pagecontent %}
+
+{% include "projecttopbar.html" %}
+
+<script src="{% static 'js/customrecipe.js' %}"></script>
+<script>
+ $(document).ready(function (){
+ var ctx = {
+ tableApiUrl: "{% url 'recipeselectpackages' project.id recipe.pk %}?format=json"
+ };
+
+ try {
+ customRecipePageInit(ctx);
+ } catch (e) {
+ document.write("Sorry, An error has occurred loading this page");
+ console.warn(e);
+ }
+ });
+</script>
+
+<div class="row-fluid span11">
+ <div class="alert alert-success lead" id="image-created-notification" style="margin-top: 15px; display: none">
+ <button type="button" data-dismiss="alert" class="close">x</button>
+ Your custom image <strong>{{recipe.name}}</strong> has been created. You can now add or remove packages as needed.
+ </div>
+ <div class="page-header air">
+ <h1>
+ {{recipe.name}}
+ <small>({{recipe.base_recipe.name}})</small>
+ </h1>
+ </div>
+</div>
+
+<div class="row-fluid span11">
+ <div class="span8">
+ <div class="button-place btn-group" style="width: 100%">
+ <a class="btn btn-large span6" href="#" id="build-custom-image" style="width: 50%">
+ Build {{recipe.name}}
+ </a>
+ <button class="btn btn-large span6" data-toggle="modal" data-target="#download-file" id="download" style="width: 50%">
+ Download recipe file
+ </button>
+ </div>
+ <div id="no-package-results" class="air" style="display:none;">
+ <div class="alert">
+ <h3>No packages found</h3>
+ <p>You might consider <a href="all-software-recipes.html">searching the list of recipes</a> instead. If you find a recipe that matches the name of the package you want:</p>
+ <ol>
+ <li>Add the layer providing the recipe to your project</li>
+ <li>Build the recipe</li>
+ <li>Once the build completes, come back to this page and search for the package</li>
+ </ol>
+ <form class="input-append no-results">
+ <input type="text" class="input-xlarge" value="search query">
+ <a href="#" class="add-on btn">
+ <i class="icon-remove"></i>
+ </a>
+ <button class="btn">Search</button>
+ <button class="btn btn-link" id="show-all">Show all packages</button>
+ </form>
+ </div>
+ </div>
+ <div id="packages-table">
+ {% url 'recipeselectpackages' project.id recipe.id as xhr_table_url %}
+ {% with 'recipeselection' as table_name %}
+ {% with 'Add | Remove packages' as title %}
+
+ <h2>{{title}} (<span class="table-count-{{table_name}}"></span>) </h2>
+
+ {% include "toastertable.html" %}
+ {% endwith %}
+ {% endwith %}
+ </div>
+ </div>
+ <div class="span4 well">
+ <h2 style="margin-bottom:20px;">About {{recipe.name}}</h2>
+
+ <dl>
+ <dt>
+ Approx. packages included
+ <i class="icon-question-sign get-help" title="" data-original-title="The number of packages included is based on information from previous builds and from parsing layers, so we can never be sure it is 100% accurate"></i>
+ </dt>
+ <dd class="no-packages">{{recipe.packages.count}}</dd>
+ <!-- <dt>
+ Approx. package size
+ <i class="icon-question-sign get-help" title="" data-original-title="Package size is based on information from previous builds, so we can never be sure it is 100% accurate"></i>
+ </dt>
+ <dd>244.3 MB</dd>
+ <dt>Last build</dt>
+ <dd>
+ <i class="icon-ok-sign success"></i>
+ <a href="build-dashboard.html">11/06/15 15:22</a>
+ </dd>
+ <dt>Recipe file</dt>
+ <dd>
+ <code>custom-image-name.bb</code>
+ <a href="#download-file" data-toggle="modal"><i class="icon-download-alt" title="" data-original-title="Download recipe file"></i></a>
+ </dd> -->
+ <dt>Layer</dt>
+ <!-- TODO recipe details page -->
+ <dd><a href="{% url 'layerdetails' project.id recipe.base_recipe.layer_version.pk %}">{{recipe.base_recipe.layer_version.layer.name}}</a></dd>
+ <!--<dt>
+ Summary
+ </dt>
+ <dd>
+ <span class="muted">Not set</span>
+ <i class="icon-pencil" data-original-title="" title=""></i>
+ </dd>
+ <dt>
+ Description
+ </dt>
+ <dd>
+ <span class="muted">Not set</span>
+ <i class="icon-pencil" data-original-title="" title=""></i>
+ </dd>
+ <dt>Version</dt>
+ <dd>
+ 1.0
+ <i class="icon-pencil" data-original-title="" title=""></i>
+ </dd>
+ <dt>Section</dt>
+ <dd>
+ base
+ <i class="icon-pencil" data-original-title="" title=""></i>
+ <i class="icon-trash" data-original-title="" title=""></i>
+ </dd>
+ <dt>License</dt>
+ <dd>
+ MIT
+ <i class="icon-question-sign get-help" title="" data-original-title="All custom images have their license set to MIT. This is because the license applies only to the recipe (.bb) file, and not to the image itself. To see which licenses apply to the image you must check the license manifest generated with each build"></i>
+ </dd> -->
+ </dl>
+ <i class="icon-trash no-tooltip"></i>
+ <a href="#" class="error" id="delete">Delete custom image</a>
+ </div>
+</div>
+
+ {% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/dirinfo.html b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
index a5bc481..ecb46bf 100644
--- a/bitbake/lib/toaster/toastergui/templates/dirinfo.html
+++ b/bitbake/lib/toaster/toastergui/templates/dirinfo.html
@@ -1,4 +1,5 @@
{% extends "basebuildpage.html" %}
+{% block title %} Directory structure - {{ target.target }} {{ build.machine }} - {{ build.project.name }} - Toaster {% endblock %}
{% block extraheadcontent %}
{% load static %}
<link rel="stylesheet" href="{% static 'css/jquery.treetable.css' %}" type="text/css">
@@ -103,12 +104,16 @@
name += '</td>';
}
else {
- name = '<td>';
if (o.link_to == null) {
- name += '<i class="icon-file"></i>';
+ namespan = 2;
+ if (o.package == null) {
+ namespan = 3;
+ }
+ var colspan = 'colspan="' + namespan + '"';
+ name = '<td ' + colspan + '><i class="icon-file"></i>';
}
else {
- name += '<i class="icon-hand-right"></i>';
+ name = '<td><i class="icon-hand-right"></i>';
}
name += ' ' + o.name;
name += '</td>';
@@ -207,10 +212,10 @@
<th>Directory / File</th>
<th>Symbolic link to</th>
<th>Source package</th>
- <th>Size</th>
- <th>Permissions</th>
- <th>Owner</th>
- <th>Group</th>
+ <th class="narrow-col">Size</th>
+ <th class="medium-col">Permissions</th>
+ <th class="narrow-col">Owner</th>
+ <th class="narrow-col">Group</th>
</tr>
</thead>
<tbody>
diff --git a/bitbake/lib/toaster/toastergui/templates/importlayer.html b/bitbake/lib/toaster/toastergui/templates/importlayer.html
index ce3d724..033f0ae 100644
--- a/bitbake/lib/toaster/toastergui/templates/importlayer.html
+++ b/bitbake/lib/toaster/toastergui/templates/importlayer.html
@@ -2,6 +2,7 @@
{% load projecttags %}
{% load humanize %}
{% load static %}
+{% block title %} Import layer - {{project.name}} - Toaster {% endblock %}
{% block pagecontent %}
{% include "projecttopbar.html" %}
diff --git a/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html b/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html
index 5b8fd84..8d65f33 100644
--- a/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html
+++ b/bitbake/lib/toaster/toastergui/templates/js-unit-tests.html
@@ -22,9 +22,11 @@
<script src="{% static 'js/table.js' %}"></script>
<script>
- var tableUrl = '{% url 'projectlayers' project.pk %}';
+ var ctx = {
+ tableUrl : '{% url 'projectlayers' project.pk %}',
+ projectId : {{project.pk}},
+ }
</script>
-
<script src="{% static 'js/tests/test.js' %}"></script>
<div id="qunit"></div>
@@ -34,6 +36,12 @@
<input type="text" id="projects" placeholder="projects"></input>
<input type="text" id="machines" placeholder="machines"></input>
-{% endblock %}
-
+<!-- import layer dependency input typeahead -->
+<input type="text" id="layer-dependency" style="display:none"></input>
+<!-- project page input typeaheads -->
+<input type="text" id="layer-add-input" style="display:none"></input>
+<input type="text" id="machine-change-input" style="display:none"></input>
+<!-- import layer dependency input typeahead on layer details edit layer -->
+<input type="text" id="layer-dep-input" style="display:none"></input>
+{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/landing.html b/bitbake/lib/toaster/toastergui/templates/landing.html
index 45e9532..cafaa1a 100644
--- a/bitbake/lib/toaster/toastergui/templates/landing.html
+++ b/bitbake/lib/toaster/toastergui/templates/landing.html
@@ -4,55 +4,69 @@
{% load projecttags %}
{% load humanize %}
+{% block title %} Welcome to Toaster {% endblock %}
{% block pagecontent %}
- <div class="container-fluid">
- <div class="row-fluid">
- <!-- Empty - no data in database -->
- <div class="hero-unit span12 well-transparent">
- <div class="row-fluid">
- <div class="span6">
- <h1>
- This is Toaster
- </h1>
- <p>A web interface to <a href="http://www.openembedded.org">OpenEmbedded</a> and <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p>
-
-
- {% if lvs_nos %}
- <p class="hero-actions">
- <a class="btn btn-primary btn-large" href="{% url 'newproject' %}">
- To start building, create your first Toaster project
- </a>
- </p>
- {% else %}
- <div class="alert alert-info lead air">
- Toaster has no layer information. Without layer information, you cannot run builds. To generate layer information you can:
- <ul>
- <li>
- <a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html#layer-source">Configure a layer source</a>
- </li>
- <li>
- <a href="{% url 'newproject' %}">Create a project</a>, then import layers
- </li>
- </ul>
- </div>
- {% endif %}
-
- <ul class="unstyled">
- <li>
- <a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html">Read the Toaster manual</a>
- </li>
- <li>
- <a href="https://wiki.yoctoproject.org/wiki/Contribute_to_Toaster">Contribute to Toaster</a>
- </li>
- </ul>
+ {% if BUILD_MODE %}
+ <!-- build mode -->
+ <div class="container-fluid">
+ <div class="row-fluid">
+ <div class="hero-unit span12 well-transparent">
+ <div class="row-fluid">
+ <div class="span6">
+ <h1>This is Toaster</h1>
+
+ <p>A web interface to <a href="http://www.openembedded.org">OpenEmbedded</a> and <a href="http://www.yoctoproject.org/tools-resources/projects/bitbake">BitBake</a>, the <a href="http://www.yoctoproject.org">Yocto Project</a> build system.</p>
+
+ {% if lvs_nos %}
+ <p class="hero-actions">
+ <a class="btn btn-primary btn-large" href="{% url 'newproject' %}">
+ To start building, create your first Toaster project
+ </a>
+ </p>
+ {% else %}
+ <div class="alert alert-info lead air">
+ Toaster has no layer information. Without layer information, you cannot run builds. To generate layer information you can:
+ <ul>
+ <li>
+ <a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html#layer-source">Configure a layer source</a>
+ </li>
+ <li>
+ <a href="{% url 'newproject' %}">Create a project</a>, then import layers
+ </li>
+ </ul>
+ </div>
+ {% endif %}
+
+ <ul class="unstyled">
+ <li>
+ <a href="http://www.yoctoproject.org/docs/latest/toaster-manual/toaster-manual.html">
+ Read the Toaster manual
+ </a>
+ </li>
+
+ <li>
+ <a href="https://wiki.yoctoproject.org/wiki/Contribute_to_Toaster">
+ Contribute to Toaster
+ </a>
+ </li>
+ </ul>
+ </div>
+
+ <div class="span6">
+ <img alt="Yocto Project" class="thumbnail" src="{% static 'img/toaster_bw.png' %}"/>
+ </div>
+
+ </div>
+ </div>
</div>
- <div class="span6">
- <img alt="Yocto Project" class="thumbnail" src="{% static 'img/toaster_bw.png' %}"/>
- </div>
- </div>
</div>
- </div>
+ {% else %}
+ <!-- analysis mode -->
+ <div class="alert alert-info lead top-air">
+ Toaster has not recorded any builds yet. Run a build from the command line to see it here.
+ </div>
+ {% endif %}
{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html b/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
index 5bc435d..9b37f55 100644
--- a/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
+++ b/bitbake/lib/toaster/toastergui/templates/landing_not_managed.html
@@ -4,6 +4,8 @@
{% load projecttags %}
{% load humanize %}
+{% block title %} Welcome to Toaster {% endblock %}
+
{% block pagecontent %}
<div class="container-fluid">
diff --git a/bitbake/lib/toaster/toastergui/templates/layer_btn.html b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
index a2e9393..314eec7 100644
--- a/bitbake/lib/toaster/toastergui/templates/layer_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/layer_btn.html
@@ -1,8 +1,16 @@
-<button class="btn btn-danger btn-block layer-exists-{{data.pk}} layerbtn" style="display:none;" data-layer='{ "id": {{data.pk}}, "name": "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="remove" >
+<button class="btn btn-danger btn-block layer-exists-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name": "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="remove"
+ {% if data.pk not in extra.current_layers %}
+ style="display:none;"
+ {% endif %}
+ >
<i class="icon-trash"></i>
Delete layer
</button>
-<button class="btn btn-block layer-add-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name": "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="add">
+<button class="btn btn-block layer-add-{{data.pk}} layerbtn" data-layer='{ "id": {{data.pk}}, "name": "{{data.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.pk%}"}' data-directive="add"
+ {% if data.pk in extra.current_layers %}
+ style="display:none;"
+ {% endif %}
+ >
<i class="icon-plus"></i>
Add layer
</button>
diff --git a/bitbake/lib/toaster/toastergui/templates/layerdetails.html b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
index 7dd3db2..7fe365d 100644
--- a/bitbake/lib/toaster/toastergui/templates/layerdetails.html
+++ b/bitbake/lib/toaster/toastergui/templates/layerdetails.html
@@ -3,6 +3,7 @@
{% load humanize %}
{% load static %}
+{% block title %} {{layerversion.layer.name}} - {{project.name}} - Toaster {% endblock %}
{% block pagecontent %}
<div class="section">
diff --git a/bitbake/lib/toaster/toastergui/templates/mrb_section.html b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
index 396fb8e..bd8f991 100644
--- a/bitbake/lib/toaster/toastergui/templates/mrb_section.html
+++ b/bitbake/lib/toaster/toastergui/templates/mrb_section.html
@@ -1,43 +1,68 @@
{% load static %}
{% load projecttags %}
+{% load project_url_tag %}
{% load humanize %}
+{%if mru and mru.count > 0%}
-{%if mru.count > 0%}
+ {%if mrb_type == 'project' %}
+ <h2>
+ Latest project builds
- <div class="page-header">
+ {% if project.is_default %}
+ <i class="icon-question-sign get-help heading-help" title="" data-original-title="Builds in this project cannot be started from Toaster: they are started from the command line"></i>
+ {% endif %}
+ </h2>
+ {% else %}
+ <div class="page-header">
<h1>
- Latest builds
- </h1>
- </div>
+ Latest builds
+ </h1>
+ </div>
+ {% endif %}
<div id="latest-builds">
{% for build in mru %}
- <div class="alert {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%} project-name ">
- <span class="label {%if build.outcome == build.SUCCEEDED%}label-success{%elif build.outcome == build.FAILED%}label-important{%else%}label-info{%endif%}">
- <a href={% url 'project' build.project.pk %}>
- {{build.project.name}}
- </a>
- </span>
-
+ <div data-latest-build-result="{{ build.id }}" class="alert build-result {%if build.outcome == build.SUCCEEDED%}alert-success{%elif build.outcome == build.FAILED%}alert-error{%else%}alert-info{%endif%}{% if mrb_type != 'project' %} project-name{% endif %}">
+ {% if mrb_type != 'project' %}
+ <span class="label {%if build.outcome == build.SUCCEEDED%}label-success{%elif build.outcome == build.FAILED%}label-important{%else%}label-info{%endif%}">
+ <a href={% project_url build.project %}>
+ {{build.project.name}}
+ </a>
+ </span>
+ {% endif %}
<div class="row-fluid">
- <div class="span3 lead">
+ <div class="span3 lead">
{%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
- <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
+ <a href="{%url 'builddashboard' build.pk%}" class="{%if build.outcome == build.SUCCEEDED %}success{%else%}error{%endif%}">
{% endif %}
{% if build.target_set.all.count > 0 %}
<span data-toggle="tooltip"
- {%if build.target_set.all.count > 1%}
- title="Targets: {%for target in build.target_set.all%}{{target.target}} {%endfor%}"
- {%endif%}
+ {% if build.target_set.all.count > 1 %}
+ title="Targets:
+ {% for target in build.target_set.all %}
+ {% if target.task %}
+ {{target.target}}:{{target.task}}
+ {% else %}
+ {{target.target}}
+ {% endif %}
+ {% endfor %}"
+ {% endif %}
>
-
- {{build.target_set.all.0.target}} {%if build.target_set.all.count > 1%}(+ {{build.target_set.all.count|add:"-1"}}){%endif%}
+ {% if build.target_set.all.0.task %}
+ {{build.target_set.all.0.target}}:{{build.target_set.all.0.task}}
+ {% else %}
+ {{build.target_set.all.0.target}}
+ {% endif %}
+ {% if build.target_set.all.count > 1 %}
+ (+ {{build.target_set.all.count|add:"-1"}})
+ {% endif %}
</span>
{% endif %}
{%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
</a>
{% endif %}
</div>
+ {% if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
<div class="span2 lead">
{% if build.completed_on|format_build_date %}
{{ build.completed_on|date:'d/m/y H:i' }}
@@ -45,6 +70,7 @@
{{ build.completed_on|date:'H:i' }}
{% endif %}
</div>
+ {% endif %}
{%if build.outcome == build.SUCCEEDED or build.outcome == build.FAILED %}
<div class="span2 lead">
{% if build.errors.count %}
@@ -58,28 +84,41 @@
</div>
<div class="lead ">
<span class="lead">
- Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}</a>
+ Build time: <a href="{% url 'buildtime' build.pk %}">{{ build.timespent_seconds|sectohms }}</a>
</span>
- <button class="btn
+ {% if build.project.is_default %}
+ <i class="pull-right icon-question-sign get-help
{% if build.outcome == build.SUCCEEDED %}
- btn-success
+ get-help-green
{% elif build.outcome == build.FAILED %}
- btn-danger
+ get-help-red
{% else %}
- btn-info
- {%endif%}
- pull-right"
- onclick='scheduleBuild({% url 'projectbuilds' build.project.id as bpi %}{{bpi|json}},
- {{build.project.name|json}},
- {% url 'project' build.project.id as bpurl %}{{bpurl|json}},
- {{build.target_set.all|get_tasks|json}})'>
+ get-help-blue
+ {% endif %}
+ " title="Builds in this project cannot be started from Toaster: they are started from the command line">
+ </i>
+ {% else %}
+ <button class="btn
+ {% if build.outcome == build.SUCCEEDED %}
+ btn-success
+ {% elif build.outcome == build.FAILED %}
+ btn-danger
+ {% else %}
+ btn-info
+ {%endif%}
+ pull-right"
+ onclick='scheduleBuild({% url 'projectbuilds' build.project.id as bpi %}{{bpi|json}},
+ {{build.project.name|json}},
+ {% url 'project' build.project.id as purl %}{{purl|json}},
+ {{build.target_set.all|get_tasks|json}})'>
- Run again
- </button>
+ Run again
+ </button>
+ {% endif %}
</div>
{%endif%}
{%if build.outcome == build.IN_PROGRESS %}
- <div class="span4">
+ <div class="span4 offset1">
<div class="progress" style="margin-top:5px;" data-toggle="tooltip" title="{{build.completeper}}% of tasks complete">
<div style="width: {{build.completeper}}%;" class="bar"></div>
</div>
diff --git a/bitbake/lib/toaster/toastergui/templates/newcustomimage.html b/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
new file mode 100644
index 0000000..4487b3e
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/newcustomimage.html
@@ -0,0 +1,54 @@
+{% extends "base.html" %}
+{% load projecttags %}
+{% load humanize %}
+{% load static %}
+{% block pagecontent %}
+
+<script src="{% static 'js/newcustomimage.js' %}"></script>
+<script>
+ $(document).ready(function (){
+ var ctx = {
+ xhrCustomRecipeUrl : "{% url 'xhr_customrecipe' %}",
+ };
+
+ try {
+ newCustomImagePageInit(ctx);
+ } catch (e) {
+ document.write("Sorry, An error has occurred loading this page");
+ console.warn(e);
+ }
+ });
+</script>
+
+</script>
+<div class="modal hide fade in" id="new-custom-image-modal" aria-hidden="false">
+ <div class="modal-header">
+ <button type="button" class="close" data-dismiss="modal" aria-hidden="true">×</button>
+ <h3>Name your custom image</h3>
+ </div>
+ <div class="modal-body">
+ <div class="row-fluid">
+ <span class="help-block span8">Image names must be unique. They should not contain spaces or capital letters, and the only allowed special character is dash (-).<p></p>
+ </span></div>
+ <div class="control-group controls">
+ <input type="text" class="huge span5" placeholder="Type the name, something like 'core-image-myimage'">
+ <span class="help-block" style="display:none">Image names cannot contain spaces or capital letters. The only allowed special character is dash (-)</span>
+ <span class="help-block" style="display: none">An image with this name already exists. Image names must be unique: try a different one.</span>
+ </div>
+ </div>
+ <div class="modal-footer">
+ <a href="#" id="create-new-custom-image-btn" class="btn btn-primary btn-large" data-original-title="" title="">Create custom image</a>
+ </div>
+</div>
+
+{% include "projecttopbar.html" %}
+
+
+{% url table_name project.id as xhr_table_url %}
+{% include "toastertable.html" %}
+
+
+
+{% endblock %}
+
+
diff --git a/bitbake/lib/toaster/toastergui/templates/newproject.html b/bitbake/lib/toaster/toastergui/templates/newproject.html
index 997390b..e83b2be 100644
--- a/bitbake/lib/toaster/toastergui/templates/newproject.html
+++ b/bitbake/lib/toaster/toastergui/templates/newproject.html
@@ -1,6 +1,9 @@
{% extends "base.html" %}
{% load projecttags %}
{% load humanize %}
+
+{% block title %} Create a new project - Toaster {% endblock %}
+
{% block pagecontent %}
<div class="row-fluid">
<div class="page-header">
diff --git a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
index a24bc8e..9fa28a8 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_detail_base.html
@@ -1,6 +1,13 @@
{% extends "basebuilddetailpage.html" %}
{% load projecttags %}
+{% block title %}
+ {% if target %}
+ {{package.fullpackagespec}} - {{ target.target }} {{ build.machine }} - {{ build.project.name }} - Toaster
+ {% else %}
+ {{package.fullpackagespec}} - {{ build.target_set.all|dictsort:"target"|join:", " }} {{ build.machine }} - {{ build.project.name }} - Toaster
+ {% endif %}
+{% endblock %}
{% block extraheadcontent %}
<!-- functions to format package 'installed_package' alias -->
<script>
@@ -38,9 +45,9 @@
{% block pagedetailinfomain %}
<div class="row span11">
<div class="page-header">
- {% block title %}
+ {% block mainheading %}
<h1>{{package.fullpackagespec}}</h1>
- {% endblock title %}
+ {% endblock %}
</div> <!-- page-header -->
</div> <!-- row span11 page-header -->
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
index 642ca69..8a0508e 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_dependencies.html
@@ -1,13 +1,13 @@
{% extends "package_detail_base.html" %}
{% load projecttags %}
-{% block title %}
+{% block mainheading %}
<h1>
{{package.fullpackagespec}}
<script> fmtAliasHelp("{{package.name}}", "{{package.alias}}", false) </script>
<small>({{target.target}})</small>
</h1>
-{% endblock title %}
+{% endblock %}
{% block tabcontent %}
{% with packageFileCount=package.buildfilelist_package.count %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_detail.html b/bitbake/lib/toaster/toastergui/templates/package_included_detail.html
index d2aa26e..568e2f2 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_included_detail.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_detail.html
@@ -1,7 +1,7 @@
{% extends "package_detail_base.html" %}
{% load projecttags %}
-{% block title %}
+{% block mainheading %}
<h1>
{{package.fullpackagespec}}
<script>
@@ -9,7 +9,7 @@
</script>
<small>({{target.target}})</small>
</h1>
-{% endblock title %}
+{% endblock %}
{% block tabcontent %}
{% with packageFileCount=package.buildfilelist_package.count %}
diff --git a/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html b/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
index 5cc8b47..fb310c7 100644
--- a/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
+++ b/bitbake/lib/toaster/toastergui/templates/package_included_reverse_dependencies.html
@@ -1,13 +1,13 @@
{% extends "package_detail_base.html" %}
{% load projecttags %}
-{% block title %}
+{% block mainheading %}
<h1>
{{package.fullpackagespec}}
<script> fmtAliasHelp("{{package.name}}", "{{package.alias}}", false) </script>
<small>({{target.target}})</small>
</h1>
-{% endblock title %}
+{% endblock %}
{% block tabcontent %}
{% with packageFileCount=package.buildfilelist_package.count %}
diff --git a/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
new file mode 100644
index 0000000..b766aea
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templates/pkg_add_rm_btn.html
@@ -0,0 +1,16 @@
+<button class="btn btn-block btn-danger add-rm-package-btn" id="package-rm-btn-{{data.pk}}" data-directive="remove" data-package="{{data.pk}}" data-package-url="{% url 'xhr_customrecipe_packages' extra.recipe_id data.pk %}" style="
+ {% if data.pk not in extra.current_packages %}
+ display:none
+ {% endif %}
+ ">
+ <i class="icon-trash no-tooltip"></i>
+ Remove package
+</a>
+<button class="btn btn-block add-rm-package-btn" data-directive="add" id="package-add-btn-{{data.pk}}" data-package="{{data.pk}}" data-package-url="{% url 'xhr_customrecipe_packages' extra.recipe_id data.pk %}" style="
+ {% if data.pk in extra.current_packages %}
+ display:none
+ {% endif %}
+ ">
+<i class="icon-plus"></i>
+ Add package
+</button>
diff --git a/bitbake/lib/toaster/toastergui/templates/project.html b/bitbake/lib/toaster/toastergui/templates/project.html
index e8354fd..4e83981 100644
--- a/bitbake/lib/toaster/toastergui/templates/project.html
+++ b/bitbake/lib/toaster/toastergui/templates/project.html
@@ -4,6 +4,7 @@
{% load humanize %}
{% load static %}
+{% block title %} Configuration - {{project.name}} - Toaster {% endblock %}
{% block projectinfomain %}
<script src="{% static 'js/layerDepsModal.js' %}"></script>
@@ -67,7 +68,7 @@
<div class="alert alert-info" style="display:none" id="no-most-built">
<span class="lead">You haven't built any recipes yet</span>
- <p style="margin-top: 10px;"><a href="{% url 'projecttargets' project.id %}">Choose a recipe to build</a></p>
+ <p style="margin-top: 10px;"><a href="{% url 'projectsoftwarerecipes' project.id %}">Choose a recipe to build</a></p>
</div>
<ul class="unstyled configuration-list" id="freq-build-list">
diff --git a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
index 27cfcd7..bb38284 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectbuilds.html
@@ -2,7 +2,7 @@
{% load projecttags %}
{% load humanize %}
-
+{% block title %} Builds - {{project.name}} - Toaster {% endblock %}
{% block extraheadcontent %}
<link rel="stylesheet" href="/static/css/jquery-ui.min.css" type='text/css'>
<link rel="stylesheet" href="/static/css/jquery-ui.structure.min.css" type='text/css'>
@@ -21,13 +21,17 @@
});
</script>
+ {% with mrb_type='project' %}
+ {% include "mrb_section.html" %}
+ {% endwith %}
+
<h2>
{% if request.GET.filter and objects.paginator.count > 0 or request.GET.search and objects.paginator.count > 0 %}
- {{objects.paginator.count}} build{{objects.paginator.count|pluralize}} found
+ {{objects.paginator.count}} project build{{objects.paginator.count|pluralize}} found
{%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
- No builds found
+ No project builds found
{%else%}
- Project builds
+ All project builds
{%endif%}
<i class="icon-question-sign get-help heading-help" title="This page lists all the builds for the current project"></i>
</h2>
@@ -66,7 +70,17 @@
{% endif %}
</td>
- <td class="target">{% for t in build.target_set.all %} <a href="{% url "builddashboard" build.id %}"> {{t.target}} </a> <br />{% endfor %}</td>
+ <td class="target">
+ {% for t in build.target_set.all %}
+ <a href="{% url "builddashboard" build.id %}">
+ {% if t.task %}
+ {{t.target}}:{{t.task}}
+ {% else %}
+ {{t.target}}
+ {% endif %}
+ </a> <br />
+ {% endfor %}
+ </td>
<td class="machine"><a href="{% url "builddashboard" build.id %}">{{build.machine}}</a></td>
<td class="started_on"><a href="{% url "builddashboard" build.id %}">{{build.started_on|date:"d/m/y H:i"}}</a></td>
<td class="completed_on"><a href="{% url "builddashboard" build.id %}">{{build.completed_on|date:"d/m/y H:i"}}</a></td>
diff --git a/bitbake/lib/toaster/toastergui/templates/projectconf.html b/bitbake/lib/toaster/toastergui/templates/projectconf.html
index 4c5a188..30fd03e 100644
--- a/bitbake/lib/toaster/toastergui/templates/projectconf.html
+++ b/bitbake/lib/toaster/toastergui/templates/projectconf.html
@@ -2,7 +2,7 @@
{% load projecttags %}
{% load humanize %}
-
+{% block title %} BitBake variables - {{project.name}} - Toaster {% endblock %}
{% block projectinfomain %}
<h2>Bitbake variables</h2>
@@ -43,6 +43,7 @@
<input id="filter-image_fstypes" type="text" placeholder="Search image types" class="span4">
<div id="all-image_fstypes" class="scrolling">
</div>
+ <span class="help-block" id="fstypes-error-message">You must select at least one image type</span>
<button id="apply-change-image_fstypes" type="button" class="btn">Save</button>
<button id="cancel-change-image_fstypes" type="button" class="btn btn-link">Cancel</button>
</form>
@@ -312,9 +313,11 @@
});
if ( 0 == any_checked ) {
$("#apply-change-image_fstypes").attr("disabled","disabled");
+ $('#fstypes-error-message').show();
}
else {
$("#apply-change-image_fstypes").removeAttr("disabled");
+ $('#fstypes-error-message').hide();
}
}
@@ -546,10 +549,14 @@
// Add the un-checked boxes second
for (var i = 0, length = fstypes_list.length; i < length; i++) {
if (0 > fstypes.indexOf(" "+fstypes_list[i].value+" ")) {
- html += '<label class="checkbox"><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'">'+fstypes_list[i].value+'</label>\n';
+ html += '<label class="checkbox"><input type="checkbox" class="fs-checkbox-fstypes" value="'+fstypes_list[i].value+'">'+fstypes_list[i].value+'</label>\n';
}
}
+ // Add the 'no search matches' line last
+ html += '<label id="no-match-fstypes">No image types found</label>\n';
+ // Display the list
document.getElementById("all-image_fstypes").innerHTML = html;
+ $('#no-match-fstypes').hide();
// Watch elements to disable Save when none are checked
$(".fs-checkbox-fstypes").each(function(){
@@ -558,8 +565,9 @@
});
});
- // clear the previous filter values
+ // clear the previous filter values and warning messages
$("input#filter-image_fstypes").val("");
+ $('#fstypes-error-message').hide();
});
$('#cancel-change-image_fstypes').click(function(){
@@ -569,17 +577,24 @@
});
$('#filter-image_fstypes').on('input', function(){
- var valThis = $(this).val().toLowerCase();
+ var valThis = $(this).val().toLowerCase();
+ var matchCount=0;
$('#all-image_fstypes label').each(function(){
var text = $(this).text().toLowerCase();
var match = text.indexOf(valThis);
if (match >= 0) {
$(this).show();
+ matchCount += 1;
}
else {
$(this).hide();
}
});
+ if (matchCount === 0) {
+ $('#no-match-fstypes').show();
+ } else {
+ $('#no-match-fstypes').hide();
+ }
});
$('#apply-change-image_fstypes').click(function(){
diff --git a/bitbake/lib/toaster/toastergui/templates/projects.html b/bitbake/lib/toaster/toastergui/templates/projects.html
index c2d77b5..678a796 100644
--- a/bitbake/lib/toaster/toastergui/templates/projects.html
+++ b/bitbake/lib/toaster/toastergui/templates/projects.html
@@ -2,8 +2,11 @@
{% load static %}
{% load projecttags %}
+{% load project_url_tag %}
{% load humanize %}
+{% block title %} All projects - Toaster {% endblock %}
+
{% block pagecontent %}
@@ -36,17 +39,29 @@
{% else %} {# We have builds to display #}
{% include "basetable_top.html" %}
{% for o in objects %}
- <tr class="data">
- <td><a href="{% url 'project' o.id %}">{{o.name}}</a></td>
- <td class="updated"><a href="{% url 'project' o.id %}">{{o.updated|date:"d/m/y H:i"}}</a></td>
- <td>
+ <tr class="data" data-project="{{ o.id }}">
+ <td data-project-field="name">
+ <a href="{% project_url o %}">{{o.name}}</a>
+ </td>
+ <td class="updated"><a href="{% project_url o %}">{{o.updated|date:"d/m/y H:i"}}</a></td>
+ <td data-project-field="release">
{% if o.release %}
<a href="{% url 'project' o.id %}#project-details">{{o.release.name}}</a>
+ {% elif o.is_default %}
+ <span class="muted">Not applicable</span>
+ <i class="icon-question-sign get-help hover-help" title="" data-original-title="This project does not have a release set. It simply collects information about the builds you start from the command line while Toaster is running" style="visibility: hidden;"></i>
{% else %}
No release available
{% endif %}
</td>
- <td><a href="{% url 'project' o.id %}#machine-distro">{{o.get_current_machine_name}}</a></td>
+ <td data-project-field="machine">
+ {% if o.is_default %}
+ <span class="muted">Not applicable</span>
+ <i class="icon-question-sign get-help hover-help" title="" data-original-title="This project does not have a machine set. It simply collects information about the builds you start from the command line while Toaster is running" style="visibility: hidden;"></i>
+ {% else %}
+ <a href="{% url 'project' o.id %}#machine-distro">{{o.get_current_machine_name}}</a>
+ {% endif %}
+ </td>
{% if o.get_number_of_builds == 0 %}
<td class="muted">{{o.get_number_of_builds}}</td>
<td class="loutcome"></td>
diff --git a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
index ca2741d..ee86b54 100644
--- a/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
+++ b/bitbake/lib/toaster/toastergui/templates/projecttopbar.html
@@ -1,12 +1,18 @@
<div class="alert alert-success lead" id="project-created-notification" style="margin-top:15px; display:none">
<button type="button" class="close" data-dismiss="alert">×</button>
- Your project <strong>{{project.name}}</strong> has been created. You can now <a href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a href="{% url 'projecttargets' project.id %}">choose image recipes</a> to build.
+ Your project <strong>{{project.name}}</strong> has been created. You can now <a href="{% url 'projectmachines' project.id %}">select your target machine</a> and <a href="{% url 'projectsoftwarerecipes' project.id %}">choose image recipes</a> to build.
</div>
<!-- project name -->
<div class="page-header">
- <h1><span id="project-name">{{project.name}}</span>
+ <h1 id="project-name-container">
+ <span id="project-name">{{project.name}}</span>
+
<i class="icon-pencil" data-original-title="" id="project-change-form-toggle" title=""></i>
+
+ {% if project.is_default %}
+ <i class="icon-question-sign get-help heading-help" title="" data-original-title="This project shows information about the builds you start from the command line while Toaster is running"></i>
+ {% endif %}
</h1>
<form id="project-name-change-form" style="margin-bottom: 0px; display: none;">
<div class="input-append">
@@ -17,31 +23,40 @@
</form>
</div>
-<div id="project-topbar">
- <ul class="nav nav-pills">
- <li>
- <a href="{% url 'projectbuilds' project.id %}">
- Builds (<span class="total-builds">0</span>)
- </a>
- </li>
- <li id="topbar-configuration-tab">
- <a href="{% url 'project' project.id %}">
- Configuration
- </a>
- </li>
- <li>
- <a href="{% url 'importlayer' project.id %}">
- Import layer
- </a>
- </li>
- <li class="pull-right">
- <form class="form-inline" style="margin-bottom:0px;">
- <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a semicolon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i>
- <div class="input-append">
- <input id="build-input" type="text" class="input-xlarge input-lg build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
- <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
- </div>
- </form>
- </li>
- </ul>
-</div>
+{% if not project.is_default %}
+ <div id="project-topbar">
+ <ul class="nav nav-pills">
+ <li>
+ <a href="{% url 'projectbuilds' project.id %}">
+ Builds (<span class="total-builds">0</span>)
+ </a>
+ </li>
+ <li id="topbar-configuration-tab">
+ <a href="{% url 'project' project.id %}">
+ Configuration
+ </a>
+ </li>
+ <li>
+ <a href="{% url 'importlayer' project.id %}">
+ Import layer
+ </a>
+ </li>
+ {% if CUSTOM_IMAGE %}
+ <li>
+ <a href="{% url 'newcustomimage' project.id %}">
+ New custom image
+ </a>
+ </li>
+ {% endif %}
+ <li class="pull-right">
+ <form class="form-inline" style="margin-bottom:0px;">
+ <i class="icon-question-sign get-help heading-help" data-placement="left" title="" data-original-title="Type the name of one or more recipes you want to build, separated by a space. You can also specify a task by appending a semicolon and a task name to the recipe name, like so: <code>busybox:clean</code>"></i>
+ <div class="input-append">
+ <input id="build-input" type="text" class="input-xlarge input-lg build-target-input" placeholder="Type the recipe you want to build" autocomplete="off" disabled>
+ <button id="build-button" class="btn btn-primary btn-large build-button" data-project-id="{{project.id}}" disabled>Build</button>
+ </div>
+ </form>
+ </li>
+ </ul>
+ </div>
+{% endif %}
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe.html b/bitbake/lib/toaster/toastergui/templates/recipe.html
index b5e4192..c6ae2f3 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe.html
@@ -2,6 +2,7 @@
{% load projecttags %}
+{% block title %} {{object.name}}_{{object.version}} - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %}
{% block localbreadcrumb %}
<li><a href="{% url 'recipes' build.pk %}">Recipes</a></li>
<li>{{object.name}}_{{object.version}} </li>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipe_btn.html b/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
index 77c1b23..baab06e 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipe_btn.html
@@ -1,7 +1,15 @@
-<button data-recipe-name="{{data.name}}" class="btn btn-block layer-exists-{{data.layer_version.pk}} build-recipe-btn" style="display:none; margin-top: 5px;" >
+<button data-recipe-name="{{data.name}}" class="btn btn-block layer-exists-{{data.layer_version.pk}} build-recipe-btn" style="margin-top: 5px;
+ {% if data.layer_version.pk not in extra.current_layers %}
+ display:none;
+ {% endif %}"
+ >
Build recipe
</button>
-<button class="btn btn-block layerbtn layer-add-{{data.layer_version.pk}}" data-layer='{ "id": {{data.layer_version.pk}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add">
+<button class="btn btn-block layerbtn layer-add-{{data.layer_version.pk}}" data-layer='{ "id": {{data.layer_version.pk}}, "name": "{{data.layer_version.layer.name}}", "layerdetailurl": "{%url 'layerdetails' extra.pid data.layer_version.pk%}"}' data-directive="add"
+ {% if data.layer_version.pk in extra.current_layers %}
+ style="display:none;"
+ {% endif %}
+>
<i class="icon-plus"></i>
Add layer
<i title="" class="icon-question-sign get-help" data-original-title="To build this target, you must first add the {{data.layer_version.layer.name}} layer to your project"></i>
diff --git a/bitbake/lib/toaster/toastergui/templates/recipes.html b/bitbake/lib/toaster/toastergui/templates/recipes.html
index 5cdac43..d144893 100644
--- a/bitbake/lib/toaster/toastergui/templates/recipes.html
+++ b/bitbake/lib/toaster/toastergui/templates/recipes.html
@@ -2,6 +2,7 @@
{% load projecttags %}
+{% block title %} Recipes - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %}
{% block localbreadcrumb %}
<li>Recipes</li>
{% endblock %}
diff --git a/bitbake/lib/toaster/toastergui/templates/target.html b/bitbake/lib/toaster/toastergui/templates/target.html
index 65e6c4a..4c33eaa 100644
--- a/bitbake/lib/toaster/toastergui/templates/target.html
+++ b/bitbake/lib/toaster/toastergui/templates/target.html
@@ -1,4 +1,5 @@
{% extends "basebuildpage.html" %}
+{% block title %} Packages included - {{ target.target }} {{ target.build.machine }} - {{ target.build.project.name }} - Toaster {% endblock %}
{% block localbreadcrumb %}
<li>{{target.target}}</li>
{% endblock localbreadcrumb%}
diff --git a/bitbake/lib/toaster/toastergui/templates/task.html b/bitbake/lib/toaster/toastergui/templates/task.html
index 635098a..ef628d9 100644
--- a/bitbake/lib/toaster/toastergui/templates/task.html
+++ b/bitbake/lib/toaster/toastergui/templates/task.html
@@ -3,6 +3,7 @@
{% load projecttags %}
{% load humanize %}
+{% block title %} {{task.recipe.name}}_{{task.recipe.version}} {{task.task_name}} - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster {% endblock %}
{% block localbreadcrumb %}
<li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
<li>{{task.recipe.name}}_{{task.recipe.version}} {{task.task_name}}</li>
diff --git a/bitbake/lib/toaster/toastergui/templates/tasks.html b/bitbake/lib/toaster/toastergui/templates/tasks.html
index b18b5c7..353410f 100644
--- a/bitbake/lib/toaster/toastergui/templates/tasks.html
+++ b/bitbake/lib/toaster/toastergui/templates/tasks.html
@@ -1,33 +1,34 @@
{% extends "basebuildpage.html" %}
{% load projecttags %}
+{% block title %} {{mainheading}} - {{build.target_set.all|dictsort:"target"|join:", "}} {{build.machine}} - {{build.project.name}} - Toaster{% endblock %}
{% block localbreadcrumb %}
-<li>{{title}}</li>
+<li>{{mainheading}}</li>
{% endblock %}
{% block nav-tasks %}
- {% if 'Tasks' == title %}
+ {% if 'Tasks' == mainheading %}
<li class="active"><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
{% else %}
<li><a href="{% url 'tasks' build.pk %}">Tasks</a></li>
{% endif %}
{% endblock %}
{% block nav-buildtime %}
- {% if 'Time' == title %}
+ {% if 'Time' == mainheading %}
<li class="active"><a href="{% url 'buildtime' build.pk %}">Time</a></li>
{% else %}
<li><a href="{% url 'buildtime' build.pk %}">Time</a></li>
{% endif %}
{% endblock %}
{% block nav-cpuusage %}
- {% if 'CPU usage' == title %}
+ {% if 'CPU usage' == mainheading %}
<li class="active"><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
{% else %}
<li><a href="{% url 'cpuusage' build.pk %}">CPU usage</a></li>
{% endif %}
{% endblock %}
{% block nav-diskio %}
- {% if 'Disk I/O' == title %}
+ {% if 'Disk I/O' == mainheading %}
<li class="active"><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
{% else %}
<li><a href="{% url 'diskio' build.pk %}">Disk I/O</a></li>
@@ -39,7 +40,7 @@
{% if not request.GET.filter and not request.GET.search and not objects.paginator.count %}
<!-- Empty - no data in database -->
<div class="page-header">
- <h1>{{title}}</h1>
+ <h1>{{mainheading}}</h1>
</div>
<div class="alert alert-info lead">
No data was recorded for this build.
@@ -54,7 +55,7 @@
{%elif request.GET.filter and objects.paginator.count == 0 or request.GET.search and objects.paginator.count == 0 %}
No tasks found
{%else%}
- {{title}}
+ {{mainheading}}
{%endif%}
</h1>
</div>
diff --git a/bitbake/lib/toaster/toastergui/templates/toastertable.html b/bitbake/lib/toaster/toastergui/templates/toastertable.html
index 9ef4c6f..98a715f 100644
--- a/bitbake/lib/toaster/toastergui/templates/toastertable.html
+++ b/bitbake/lib/toaster/toastergui/templates/toastertable.html
@@ -12,7 +12,6 @@
tableName : "{{table_name}}",
url : "{{ xhr_table_url }}?format=json",
title : "{{title}}",
- projectLayers : {{projectlayers|json}},
};
try {
diff --git a/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html b/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
index b9f8fee..0301a6c 100644
--- a/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
+++ b/bitbake/lib/toaster/toastergui/templates/unavailable_artifact.html
@@ -3,6 +3,8 @@
{% load humanize %}
{% load static %}
+{% block title %} Build artifact no longer exists - Toaster {% endblock %}
+
{% block pagecontent %}
<div class="row-fluid air">
diff --git a/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py b/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py
new file mode 100644
index 0000000..04770ac
--- /dev/null
+++ b/bitbake/lib/toaster/toastergui/templatetags/project_url_tag.py
@@ -0,0 +1,34 @@
+from django import template
+from django.core.urlresolvers import reverse
+
+register = template.Library()
+
+def project_url(parser, token):
+ """
+ Create a URL for a project's main page;
+ for non-default projects, this is the configuration page;
+ for the default project, this is the project builds page
+ """
+ try:
+ tag_name, project = token.split_contents()
+ except ValueError:
+ raise template.TemplateSyntaxError(
+ "%s tag requires exactly one argument" % tag_name
+ )
+ return ProjectUrlNode(project)
+
+class ProjectUrlNode(template.Node):
+ def __init__(self, project):
+ self.project = template.Variable(project)
+
+ def render(self, context):
+ try:
+ project = self.project.resolve(context)
+ if project.is_default:
+ return reverse('projectbuilds', args=(project.id,))
+ else:
+ return reverse('project', args=(project.id,))
+ except template.VariableDoesNotExist:
+ return ''
+
+register.tag('project_url', project_url)
diff --git a/bitbake/lib/toaster/toastergui/tests.py b/bitbake/lib/toaster/toastergui/tests.py
index 4d1549b..9e6c46a 100644
--- a/bitbake/lib/toaster/toastergui/tests.py
+++ b/bitbake/lib/toaster/toastergui/tests.py
@@ -22,15 +22,29 @@
"""Test cases for Toaster GUI and ReST."""
from django.test import TestCase
+from django.test.client import RequestFactory
from django.core.urlresolvers import reverse
from django.utils import timezone
-from orm.models import Project, Release, BitbakeVersion, ProjectTarget
+
+from orm.models import Project, Release, BitbakeVersion, Package, LogMessage
from orm.models import ReleaseLayerSourcePriority, LayerSource, Layer, Build
-from orm.models import Layer_Version, Recipe, Machine, ProjectLayer
+from orm.models import Layer_Version, Recipe, Machine, ProjectLayer, Target
+from orm.models import CustomImageRecipe, ProjectVariable
+from orm.models import Branch
+
+import toastermain
+
+from toastergui.tables import SoftwareRecipesTable
import json
from bs4 import BeautifulSoup
+import re
PROJECT_NAME = "test project"
+CLI_BUILDS_PROJECT_NAME = 'Command line builds'
+
+# by default, tests are run in build mode; to run in analysis mode,
+# set this to False in individual test cases
+toastermain.settings.BUILD_MODE = True
class ViewTests(TestCase):
"""Tests to verify view APIs."""
@@ -39,27 +53,58 @@ class ViewTests(TestCase):
bbv = BitbakeVersion.objects.create(name="test bbv", giturl="/tmp/",
branch="master", dirpath="")
release = Release.objects.create(name="test release",
+ branch_name="master",
bitbake_version=bbv)
self.project = Project.objects.create_project(name=PROJECT_NAME,
release=release)
+ now = timezone.now()
+
+ build = Build.objects.create(project=self.project,
+ started_on=now,
+ completed_on=now)
+
layersrc = LayerSource.objects.create(sourcetype=LayerSource.TYPE_IMPORTED)
self.priority = ReleaseLayerSourcePriority.objects.create(release=release,
layer_source=layersrc)
layer = Layer.objects.create(name="base-layer", layer_source=layersrc,
vcs_url="/tmp/")
+ branch = Branch.objects.create(name="master", layer_source=layersrc)
+
lver = Layer_Version.objects.create(layer=layer, project=self.project,
- layer_source=layersrc, commit="master")
+ layer_source=layersrc, commit="master",
+ up_branch=branch)
- Recipe.objects.create(layer_source=layersrc, name="base-recipe",
- version="1.2", summary="one recipe",
- description="recipe", layer_version=lver)
+ self.recipe1 = Recipe.objects.create(layer_source=layersrc,
+ name="base-recipe",
+ version="1.2",
+ summary="one recipe",
+ description="recipe",
+ layer_version=lver)
Machine.objects.create(layer_version=lver, name="wisk",
description="wisking machine")
ProjectLayer.objects.create(project=self.project, layercommit=lver)
+
+ self.customr = CustomImageRecipe.objects.create(\
+ name="custom recipe", project=self.project,
+ base_recipe=self.recipe1)
+
+ self.package = Package.objects.create(name='pkg1', recipe=self.recipe1,
+ build=build)
+
+
+ # recipe with project for testing AvailableRecipe table
+ self.recipe2 = Recipe.objects.create(layer_source=layersrc,
+ name="fancy-recipe",
+ version="1.4",
+ summary="a fancy recipe",
+ description="fancy recipe",
+ layer_version=lver,
+ file_path='/home/foo')
+
self.assertTrue(lver in self.project.compatible_layerversions())
def test_get_base_call_returns_html(self):
@@ -181,6 +226,140 @@ class ViewTests(TestCase):
data = json.loads(response.content)
self.assertNotEqual(data["error"], "ok")
+ def test_custom_ok(self):
+ """Test successful return from ReST API xhr_customrecipe"""
+ url = reverse('xhr_customrecipe')
+ params = {'name': 'custom', 'project': self.project.id,
+ 'base': self.recipe1.id}
+ response = self.client.post(url, params)
+ self.assertEqual(response.status_code, 200)
+ data = json.loads(response.content)
+ self.assertEqual(data['error'], 'ok')
+ self.assertTrue('url' in data)
+ # get recipe from the database
+ recipe = CustomImageRecipe.objects.get(project=self.project,
+ name=params['name'])
+ args = (self.project.id, recipe.id,)
+ self.assertEqual(reverse('customrecipe', args=args), data['url'])
+
+ def test_custom_incomplete_params(self):
+ """Test not passing all required parameters to xhr_customrecipe"""
+ url = reverse('xhr_customrecipe')
+ for params in [{}, {'name': 'custom'},
+ {'name': 'custom', 'project': self.project.id}]:
+ response = self.client.post(url, params)
+ self.assertEqual(response.status_code, 200)
+ data = json.loads(response.content)
+ self.assertNotEqual(data["error"], "ok")
+
+ def test_xhr_custom_wrong_project(self):
+ """Test passing wrong project id to xhr_customrecipe"""
+ url = reverse('xhr_customrecipe')
+ params = {'name': 'custom', 'project': 0, "base": self.recipe1.id}
+ response = self.client.post(url, params)
+ self.assertEqual(response.status_code, 200)
+ data = json.loads(response.content)
+ self.assertNotEqual(data["error"], "ok")
+
+ def test_xhr_custom_wrong_base(self):
+ """Test passing wrong base recipe id to xhr_customrecipe"""
+ url = reverse('xhr_customrecipe')
+ params = {'name': 'custom', 'project': self.project.id, "base": 0}
+ response = self.client.post(url, params)
+ self.assertEqual(response.status_code, 200)
+ data = json.loads(response.content)
+ self.assertNotEqual(data["error"], "ok")
+
+ def test_xhr_custom_details(self):
+ """Test getting custom recipe details"""
+ name = "custom recipe"
+ url = reverse('xhr_customrecipe_id', args=(self.customr.id,))
+ response = self.client.get(url)
+ self.assertEqual(response.status_code, 200)
+ expected = {"error": "ok",
+ "info": {'id': self.customr.id,
+ 'name': name,
+ 'base_recipe_id': self.recipe1.id,
+ 'project_id': self.project.id,
+ }
+ }
+ self.assertEqual(json.loads(response.content), expected)
+
+ def test_xhr_custom_del(self):
+ """Test deleting custom recipe"""
+ name = "to be deleted"
+ recipe = CustomImageRecipe.objects.create(\
+ name=name, project=self.project,
+ base_recipe=self.recipe1)
+ url = reverse('xhr_customrecipe_id', args=(recipe.id,))
+ response = self.client.delete(url)
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(json.loads(response.content), {"error": "ok"})
+ # try to delete not-existent recipe
+ url = reverse('xhr_customrecipe_id', args=(recipe.id,))
+ response = self.client.delete(url)
+ self.assertEqual(response.status_code, 200)
+ self.assertNotEqual(json.loads(response.content)["error"], "ok")
+
+ def test_xhr_custom_packages(self):
+ """Test adding and deleting package to a custom recipe"""
+ url = reverse('xhr_customrecipe_packages',
+ args=(self.customr.id, self.package.id))
+ # add self.package1 to recipe
+ response = self.client.put(url)
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(json.loads(response.content), {"error": "ok"})
+ self.assertEqual(self.customr.packages.all()[0].id, self.package.id)
+ # delete it
+ response = self.client.delete(url)
+ self.assertEqual(response.status_code, 200)
+ self.assertEqual(json.loads(response.content), {"error": "ok"})
+ self.assertFalse(self.customr.packages.all())
+ # delete it again to test error condition
+ response = self.client.delete(url)
+ self.assertEqual(response.status_code, 200)
+ self.assertNotEqual(json.loads(response.content)["error"], "ok")
+
+ def test_xhr_custom_packages_err(self):
+ """Test error conditions of xhr_customrecipe_packages"""
+ # test calls with wrong recipe id and wrong package id
+ for args in [(0, self.package.id), (self.customr.id, 0)]:
+ url = reverse('xhr_customrecipe_packages', args=args)
+ # test put and delete methods
+ for method in (self.client.put, self.client.delete):
+ response = method(url)
+ self.assertEqual(response.status_code, 200)
+ self.assertNotEqual(json.loads(response.content),
+ {"error": "ok"})
+
+ def test_software_recipes_table(self):
+ """Test structure returned for Software RecipesTable"""
+ table = SoftwareRecipesTable()
+ request = RequestFactory().get('/foo/', {'format': 'json'})
+ response = table.get(request, pid=self.project.id)
+ data = json.loads(response.content)
+
+ rows = data['rows']
+ row1 = next(x for x in rows if x['name'] == self.recipe1.name)
+ row2 = next(x for x in rows if x['name'] == self.recipe2.name)
+
+ self.assertEqual(response.status_code, 200, 'should be 200 OK status')
+ self.assertEqual(len(rows), 2, 'should be 2 recipes')
+
+ # check other columns have been populated correctly
+ self.assertEqual(row1['name'], self.recipe1.name)
+ self.assertEqual(row1['version'], self.recipe1.version)
+ self.assertEqual(row1['get_description_or_summary'],
+ self.recipe1.description)
+ self.assertEqual(row1['layer_version__layer__name'],
+ self.recipe1.layer_version.layer.name)
+ self.assertEqual(row2['name'], self.recipe2.name)
+ self.assertEqual(row2['version'], self.recipe2.version)
+ self.assertEqual(row2['get_description_or_summary'],
+ self.recipe2.description)
+ self.assertEqual(row2['layer_version__layer__name'],
+ self.recipe2.layer_version.layer.name)
+
class LandingPageTests(TestCase):
""" Tests for redirects on the landing page """
# disable bogus pylint message error:
@@ -255,18 +434,48 @@ class LandingPageTests(TestCase):
self.assertTrue('/builds' in response.url,
'should redirect to builds')
-class ProjectsPageTests(TestCase):
- """ Tests for projects page """
+class AllProjectsPageTests(TestCase):
+ """ Tests for projects page /projects/ """
- PROJECT_NAME = 'cli builds'
+ MACHINE_NAME = 'delorean'
def setUp(self):
""" Add default project manually """
- project = Project.objects.create_project(self.PROJECT_NAME, None)
+ project = Project.objects.create_project(CLI_BUILDS_PROJECT_NAME, None)
self.default_project = project
self.default_project.is_default = True
self.default_project.save()
+ # this project is only set for some of the tests
+ self.project = None
+
+ self.release = None
+
+ def _add_build_to_default_project(self):
+ """ Add a build to the default project (not used in all tests) """
+ now = timezone.now()
+ build = Build.objects.create(project=self.default_project,
+ started_on=now,
+ completed_on=now)
+ build.save()
+
+ def _add_non_default_project(self):
+ """ Add another project """
+ bbv = BitbakeVersion.objects.create(name="test bbv", giturl="/tmp/",
+ branch="master", dirpath="")
+ self.release = Release.objects.create(name="test release",
+ branch_name="master",
+ bitbake_version=bbv)
+ self.project = Project.objects.create_project(PROJECT_NAME, self.release)
+ self.project.is_default = False
+ self.project.save()
+
+ # fake the MACHINE variable
+ project_var = ProjectVariable.objects.create(project=self.project,
+ name='MACHINE',
+ value=self.MACHINE_NAME)
+ project_var.save()
+
def test_default_project_hidden(self):
""" The default project should be hidden if it has no builds """
params = {"count": 10, "orderby": "updated:-", "page": 1}
@@ -274,26 +483,116 @@ class ProjectsPageTests(TestCase):
self.assertTrue(not('tr class="data"' in response.content),
'should be no project rows in the page')
- self.assertTrue(not(self.PROJECT_NAME in response.content),
+ self.assertTrue(not(CLI_BUILDS_PROJECT_NAME in response.content),
'default project "cli builds" should not be in page')
def test_default_project_has_build(self):
""" The default project should be shown if it has builds """
- now = timezone.now()
- build = Build.objects.create(project=self.default_project,
- started_on=now,
- completed_on=now)
- build.save()
+ self._add_build_to_default_project()
params = {"count": 10, "orderby": "updated:-", "page": 1}
response = self.client.get(reverse('all-projects'), params)
self.assertTrue('tr class="data"' in response.content,
'should be a project row in the page')
- self.assertTrue(self.PROJECT_NAME in response.content,
+ self.assertTrue(CLI_BUILDS_PROJECT_NAME in response.content,
'default project "cli builds" should be in page')
-class ProjectBuildsDisplayTest(TestCase):
+ def test_default_project_release(self):
+ """
+ The release for the default project should display as
+ 'Not applicable'
+ """
+ # need a build, otherwise project doesn't display at all
+ self._add_build_to_default_project()
+
+ # another project to test, which should show release
+ self._add_non_default_project()
+
+ response = self.client.get(reverse('all-projects'), follow=True)
+ soup = BeautifulSoup(response.content)
+
+ # check the release cell for the default project
+ attrs = {'data-project': str(self.default_project.id)}
+ rows = soup.find_all('tr', attrs=attrs)
+ self.assertEqual(len(rows), 1, 'should be one row for default project')
+ cells = rows[0].find_all('td', attrs={'data-project-field': 'release'})
+ self.assertEqual(len(cells), 1, 'should be one release cell')
+ text = cells[0].select('span.muted')[0].text
+ self.assertEqual(text, 'Not applicable',
+ 'release should be not applicable for default project')
+
+ # check the link in the release cell for the other project
+ attrs = {'data-project': str(self.project.id)}
+ rows = soup.find_all('tr', attrs=attrs)
+ cells = rows[0].find_all('td', attrs={'data-project-field': 'release'})
+ text = cells[0].select('a')[0].text
+ self.assertEqual(text, self.release.name,
+ 'release name should be shown for non-default project')
+
+ def test_default_project_machine(self):
+ """
+ The machine for the default project should display as
+ 'Not applicable'
+ """
+ # need a build, otherwise project doesn't display at all
+ self._add_build_to_default_project()
+
+ # another project to test, which should show machine
+ self._add_non_default_project()
+
+ response = self.client.get(reverse('all-projects'), follow=True)
+ soup = BeautifulSoup(response.content)
+
+ # check the machine cell for the default project
+ attrs = {'data-project': str(self.default_project.id)}
+ rows = soup.find_all('tr', attrs=attrs)
+ self.assertEqual(len(rows), 1, 'should be one row for default project')
+ cells = rows[0].find_all('td', attrs={'data-project-field': 'machine'})
+ self.assertEqual(len(cells), 1, 'should be one machine cell')
+ text = cells[0].select('span.muted')[0].text
+ self.assertEqual(text, 'Not applicable',
+ 'machine should be not applicable for default project')
+
+ # check the link in the machine cell for the other project
+ attrs = {'data-project': str(self.project.id)}
+ rows = soup.find_all('tr', attrs=attrs)
+ cells = rows[0].find_all('td', attrs={'data-project-field': 'machine'})
+ text = cells[0].select('a')[0].text
+ self.assertEqual(text, self.MACHINE_NAME,
+ 'machine name should be shown for non-default project')
+
+ def test_project_page_links(self):
+ """
+ Test that links for the default project point to the builds
+ page /projects/X/builds for that project, and that links for
+ other projects point to their configuration pages /projects/X/
+ """
+
+ # need a build, otherwise project doesn't display at all
+ self._add_build_to_default_project()
+
+ # another project to test, which should show machine
+ self._add_non_default_project()
+
+ response = self.client.get(reverse('all-projects'), follow=True)
+ soup = BeautifulSoup(response.content)
+
+ # link for default project
+ row = soup.find('tr', attrs={'data-project': self.default_project.id})
+ cell = row.find('td', attrs={'data-project-field': 'name'})
+ expected_url = reverse('projectbuilds', args=(self.default_project.id,))
+ self.assertEqual(cell.find('a')['href'], expected_url,
+ 'link on default project name should point to builds')
+
+ # link for other project
+ row = soup.find('tr', attrs={'data-project': self.project.id})
+ cell = row.find('td', attrs={'data-project-field': 'name'})
+ expected_url = reverse('project', args=(self.project.id,))
+ self.assertEqual(cell.find('a')['href'], expected_url,
+ 'link on project name should point to configuration')
+
+class ProjectBuildsPageTests(TestCase):
""" Test data at /project/X/builds is displayed correctly """
def setUp(self):
@@ -303,8 +602,18 @@ class ProjectBuildsDisplayTest(TestCase):
bitbake_version=bbv)
self.project1 = Project.objects.create_project(name=PROJECT_NAME,
release=release)
+ self.project1.save()
+
self.project2 = Project.objects.create_project(name=PROJECT_NAME,
release=release)
+ self.project2.save()
+
+ self.default_project = Project.objects.create_project(
+ name=CLI_BUILDS_PROJECT_NAME,
+ release=release
+ )
+ self.default_project.is_default = True
+ self.default_project.save()
# parameters for builds to associate with the projects
now = timezone.now()
@@ -338,6 +647,7 @@ class ProjectBuildsDisplayTest(TestCase):
}
def _get_rows_for_project(self, project_id):
+ """ Helper to retrieve HTML rows for a project """
url = reverse("projectbuilds", args=(project_id,))
response = self.client.get(url, follow=True)
soup = BeautifulSoup(response.content)
@@ -345,35 +655,273 @@ class ProjectBuildsDisplayTest(TestCase):
def test_show_builds_for_project(self):
""" Builds for a project should be displayed """
- build1a = Build.objects.create(**self.project1_build_success)
- build1b = Build.objects.create(**self.project1_build_success)
+ Build.objects.create(**self.project1_build_success)
+ Build.objects.create(**self.project1_build_success)
build_rows = self._get_rows_for_project(self.project1.id)
self.assertEqual(len(build_rows), 2)
- def test_show_builds_for_project_only(self):
+ def test_show_builds_project_only(self):
""" Builds for other projects should be excluded """
- build1a = Build.objects.create(**self.project1_build_success)
- build1b = Build.objects.create(**self.project1_build_success)
- build1c = Build.objects.create(**self.project1_build_success)
+ Build.objects.create(**self.project1_build_success)
+ Build.objects.create(**self.project1_build_success)
+ Build.objects.create(**self.project1_build_success)
# shouldn't see these two
- build2a = Build.objects.create(**self.project2_build_success)
- build2b = Build.objects.create(**self.project2_build_in_progress)
+ Build.objects.create(**self.project2_build_success)
+ Build.objects.create(**self.project2_build_in_progress)
build_rows = self._get_rows_for_project(self.project1.id)
self.assertEqual(len(build_rows), 3)
- def test_show_builds_exclude_in_progress(self):
+ def test_builds_exclude_in_progress(self):
""" "in progress" builds should not be shown """
- build1a = Build.objects.create(**self.project1_build_success)
- build1b = Build.objects.create(**self.project1_build_success)
+ Build.objects.create(**self.project1_build_success)
+ Build.objects.create(**self.project1_build_success)
# shouldn't see this one
- build1c = Build.objects.create(**self.project1_build_in_progress)
+ Build.objects.create(**self.project1_build_in_progress)
# shouldn't see these two either, as they belong to a different project
- build2a = Build.objects.create(**self.project2_build_success)
- build2b = Build.objects.create(**self.project2_build_in_progress)
+ Build.objects.create(**self.project2_build_success)
+ Build.objects.create(**self.project2_build_in_progress)
build_rows = self._get_rows_for_project(self.project1.id)
- self.assertEqual(len(build_rows), 2)
\ No newline at end of file
+ self.assertEqual(len(build_rows), 2)
+
+ def test_tasks_in_projectbuilds(self):
+ """ Task should be shown as suffix on build name """
+ build = Build.objects.create(**self.project1_build_success)
+ Target.objects.create(build=build, target='bash', task='clean')
+ url = reverse("projectbuilds", args=(self.project1.id,))
+ response = self.client.get(url, follow=True)
+ result = re.findall('^ +bash:clean$', response.content, re.MULTILINE)
+ self.assertEqual(len(result), 2)
+
+ def test_cli_builds_hides_tabs(self):
+ """
+ Display for command line builds should hide tabs;
+ note that the latest builds section is already tested in
+ AllBuildsPageTests, as the template is the same
+ """
+ url = reverse("projectbuilds", args=(self.default_project.id,))
+ response = self.client.get(url, follow=True)
+ soup = BeautifulSoup(response.content)
+ tabs = soup.select('#project-topbar')
+ self.assertEqual(len(tabs), 0,
+ 'should be no top bar shown for command line builds')
+
+ def test_non_cli_builds_has_tabs(self):
+ """
+ Non-command-line builds projects should show the tabs
+ """
+ url = reverse("projectbuilds", args=(self.project1.id,))
+ response = self.client.get(url, follow=True)
+ soup = BeautifulSoup(response.content)
+ tabs = soup.select('#project-topbar')
+ self.assertEqual(len(tabs), 1,
+ 'should be a top bar shown for non-command-line builds')
+
+class AllBuildsPageTests(TestCase):
+ """ Tests for all builds page /builds/ """
+
+ def setUp(self):
+ bbv = BitbakeVersion.objects.create(name="bbv1", giturl="/tmp/",
+ branch="master", dirpath="")
+ release = Release.objects.create(name="release1",
+ bitbake_version=bbv)
+ self.project1 = Project.objects.create_project(name=PROJECT_NAME,
+ release=release)
+ self.default_project = Project.objects.create_project(
+ name=CLI_BUILDS_PROJECT_NAME,
+ release=release
+ )
+ self.default_project.is_default = True
+ self.default_project.save()
+
+ # parameters for builds to associate with the projects
+ now = timezone.now()
+
+ self.project1_build_success = {
+ "project": self.project1,
+ "started_on": now,
+ "completed_on": now,
+ "outcome": Build.SUCCEEDED
+ }
+
+ self.default_project_build_success = {
+ "project": self.default_project,
+ "started_on": now,
+ "completed_on": now,
+ "outcome": Build.SUCCEEDED
+ }
+
+ def test_show_tasks_in_allbuilds(self):
+ """ Task should be shown as suffix on build name """
+ build = Build.objects.create(**self.project1_build_success)
+ Target.objects.create(build=build, target='bash', task='clean')
+ url = reverse('all-builds')
+ response = self.client.get(url, follow=True)
+ result = re.findall('bash:clean', response.content, re.MULTILINE)
+ self.assertEqual(len(result), 3)
+
+ def test_no_run_again_for_cli_build(self):
+ """ "Run again" button should not be shown for command-line builds """
+ build = Build.objects.create(**self.default_project_build_success)
+ url = reverse('all-builds')
+ response = self.client.get(url, follow=True)
+ soup = BeautifulSoup(response.content)
+
+ attrs = {'data-latest-build-result': build.id}
+ result = soup.find('div', attrs=attrs)
+
+ # shouldn't see a run again button for command-line builds
+ run_again_button = result.select('button')
+ self.assertEqual(len(run_again_button), 0)
+
+ # should see a help icon for command-line builds
+ help_icon = result.select('i.get-help-green')
+ self.assertEqual(len(help_icon), 1)
+
+ def test_tooltips_on_project_name(self):
+ """
+ A tooltip should be present next to the command line
+ builds project name in the all builds page, but not for
+ other projects
+ """
+ build1 = Build.objects.create(**self.project1_build_success)
+ default_build = Build.objects.create(**self.default_project_build_success)
+
+ url = reverse('all-builds')
+ response = self.client.get(url, follow=True)
+ soup = BeautifulSoup(response.content)
+
+ # no help icon on non-default project name
+ result = soup.find('tr', attrs={'data-table-build-result': build1.id})
+ name = result.select('td.project-name')[0]
+ icons = name.select('i.get-help')
+ self.assertEqual(len(icons), 0,
+ 'should not be a help icon for non-cli builds name')
+
+ # help icon on default project name
+ result = soup.find('tr', attrs={'data-table-build-result': default_build.id})
+ name = result.select('td.project-name')[0]
+ icons = name.select('i.get-help')
+ self.assertEqual(len(icons), 1,
+ 'should be a help icon for cli builds name')
+
+class ProjectPageTests(TestCase):
+ """ Test project data at /project/X/ is displayed correctly """
+ CLI_BUILDS_PROJECT_NAME = 'Command line builds'
+
+ def test_command_line_builds_in_progress(self):
+ """
+ In progress builds should not cause an error to be thrown
+ when navigating to "command line builds" project page;
+ see https://bugzilla.yoctoproject.org/show_bug.cgi?id=8277
+ """
+
+ # add the "command line builds" default project; this mirrors what
+ # we do in migration 0026_set_default_project.py
+ default_project = Project.objects.create_project(self.CLI_BUILDS_PROJECT_NAME, None)
+ default_project.is_default = True
+ default_project.save()
+
+ # add an "in progress" build for the default project
+ now = timezone.now()
+ build = Build.objects.create(project=default_project,
+ started_on=now,
+ completed_on=now,
+ outcome=Build.IN_PROGRESS)
+
+ # navigate to the project page for the default project
+ url = reverse("project", args=(default_project.id,))
+ response = self.client.get(url, follow=True)
+
+ self.assertEqual(response.status_code, 200)
+
+class BuildDashboardTests(TestCase):
+ """ Tests for the build dashboard /build/X """
+
+ def setUp(self):
+ bbv = BitbakeVersion.objects.create(name="bbv1", giturl="/tmp/",
+ branch="master", dirpath="")
+ release = Release.objects.create(name="release1",
+ bitbake_version=bbv)
+ project = Project.objects.create_project(name=PROJECT_NAME,
+ release=release)
+
+ now = timezone.now()
+
+ self.build1 = Build.objects.create(project=project,
+ started_on=now,
+ completed_on=now)
+
+ # exception
+ msg1 = 'an exception was thrown'
+ self.exception_message = LogMessage.objects.create(
+ build=self.build1,
+ level=LogMessage.EXCEPTION,
+ message=msg1
+ )
+
+ # critical
+ msg2 = 'a critical error occurred'
+ self.critical_message = LogMessage.objects.create(
+ build=self.build1,
+ level=LogMessage.CRITICAL,
+ message=msg2
+ )
+
+ def _get_build_dashboard_errors(self):
+ """
+ Get a list of HTML fragments representing the errors on the
+ build dashboard
+ """
+ url = reverse('builddashboard', args=(self.build1.id,))
+ response = self.client.get(url)
+ soup = BeautifulSoup(response.content)
+ return soup.select('#errors div.alert-error')
+
+ def _check_for_log_message(self, log_message):
+ """
+ Check whether the LogMessage instance <log_message> is
+ represented as an HTML error in the build dashboard page
+ """
+ errors = self._get_build_dashboard_errors()
+ self.assertEqual(len(errors), 2)
+
+ expected_text = log_message.message
+ expected_id = str(log_message.id)
+
+ found = False
+ for error in errors:
+ error_text = error.find('pre').text
+ text_matches = (error_text == expected_text)
+
+ error_id = error['data-error']
+ id_matches = (error_id == expected_id)
+
+ if text_matches and id_matches:
+ found = True
+ break
+
+ template_vars = (expected_text, error_text,
+ expected_id, error_id)
+ assertion_error_msg = 'exception not found as error: ' \
+ 'expected text "%s" and got "%s"; ' \
+ 'expected ID %s and got %s' % template_vars
+ self.assertTrue(found, assertion_error_msg)
+
+ def test_exceptions_show_as_errors(self):
+ """
+ LogMessages with level EXCEPTION should display in the errors
+ section of the page
+ """
+ self._check_for_log_message(self.exception_message)
+
+ def test_criticals_show_as_errors(self):
+ """
+ LogMessages with level CRITICAL should display in the errors
+ section of the page
+ """
+ self._check_for_log_message(self.critical_message)
diff --git a/bitbake/lib/toaster/toastergui/typeaheads.py b/bitbake/lib/toaster/toastergui/typeaheads.py
index d5bec58..dd4b7f5 100644
--- a/bitbake/lib/toaster/toastergui/typeaheads.py
+++ b/bitbake/lib/toaster/toastergui/typeaheads.py
@@ -27,7 +27,7 @@ class LayersTypeAhead(ToasterTypeAhead):
super(LayersTypeAhead, self).__init__()
def apply_search(self, search_term, prj, request):
- layers = prj.compatible_layerversions()
+ layers = prj.get_all_compatible_layer_versions()
layers = layers.order_by('layer__name')
# Unlike the other typeaheads we also don't want to show suggestions
@@ -35,7 +35,8 @@ class LayersTypeAhead(ToasterTypeAhead):
# layerdeps to a new layer.
if ("include_added" in request.GET and
request.GET['include_added'] != "true"):
- layers = layers.exclude(pk__in=prj.projectlayer_equivalent_set)
+ layers = layers.exclude(
+ pk__in=prj.get_project_layer_versions(pk=True))
primary_results = layers.filter(layer__name__istartswith=search_term)
secondary_results = layers.filter(layer__name__icontains=search_term).exclude(pk__in=primary_results)
@@ -120,12 +121,12 @@ class RecipesTypeAhead(ToasterTypeAhead):
return results
class ProjectsTypeAhead(ToasterTypeAhead):
- """ Typeahead for all the projects """
+ """ Typeahead for all the projects, except for command line builds """
def __init__(self):
super(ProjectsTypeAhead, self).__init__()
def apply_search(self, search_term, prj, request):
- projects = Project.objects.all().order_by("name")
+ projects = Project.objects.exclude(is_default=True).order_by("name")
primary_results = projects.filter(name__istartswith=search_term)
secondary_results = projects.filter(name__icontains=search_term).exclude(pk__in=primary_results)
diff --git a/bitbake/lib/toaster/toastergui/urls.py b/bitbake/lib/toaster/toastergui/urls.py
index 46e5761..a1adbb7 100644
--- a/bitbake/lib/toaster/toastergui/urls.py
+++ b/bitbake/lib/toaster/toastergui/urls.py
@@ -87,28 +87,29 @@ urlpatterns = patterns('toastergui.views',
# the table pages that have been converted to ToasterTable widget
url(r'^project/(?P<pid>\d+)/machines/$',
tables.MachinesTable.as_view(template_name="generic-toastertable-page.html"),
- { 'table_name': tables.MachinesTable.__name__.lower(),
- 'title' : 'Compatible machines' },
name="projectmachines"),
- url(r'^project/(?P<pid>\d+)/recipes/$',
- tables.RecipesTable.as_view(template_name="generic-toastertable-page.html"),
- { 'table_name': tables.RecipesTable.__name__.lower(),
- 'title' : 'Compatible recipes' },
- name="projecttargets"),
+ url(r'^project/(?P<pid>\d+)/softwarerecipes/$',
+ tables.SoftwareRecipesTable.as_view(template_name="generic-toastertable-page.html"),
+ name="projectsoftwarerecipes"),
+
+ url(r'^project/(?P<pid>\d+)/images/$',
+ tables.ImageRecipesTable.as_view(template_name="generic-toastertable-page.html"), name="projectimagerecipes"),
+
+ url(r'^project/(?P<pid>\d+)/customimages/$',
+ tables.CustomImagesTable.as_view(template_name="generic-toastertable-page.html"), name="projectcustomimages"),
+
+ url(r'^project/(?P<pid>\d+)/newcustomimage/$',
+ tables.NewCustomImagesTable.as_view(template_name="newcustomimage.html"),
+ name="newcustomimage"),
- url(r'^project/(?P<pid>\d+)/availablerecipes/$',
- tables.ProjectLayersRecipesTable.as_view(template_name="generic-toastertable-page.html"),
- { 'table_name': tables.ProjectLayersRecipesTable.__name__.lower(),
- 'title' : 'Recipes available for layers in the current project' },
- name="projectavailabletargets"),
url(r'^project/(?P<pid>\d+)/layers/$',
tables.LayersTable.as_view(template_name="generic-toastertable-page.html"),
- { 'table_name': tables.LayersTable.__name__.lower(),
- 'title' : 'Compatible layers' },
name="projectlayers"),
+
+
url(r'^project/(?P<pid>\d+)/layer/(?P<layerid>\d+)$',
'layerdetails', name='layerdetails'),
@@ -125,6 +126,16 @@ urlpatterns = patterns('toastergui.views',
name=tables.LayerMachinesTable.__name__.lower()),
+ url(r'^project/(?P<pid>\d+)/customrecipe/(?P<recipeid>\d+)/selectpackages/$',
+ tables.SelectPackagesTable.as_view(template_name="generic-toastertable-page.html"), name="recipeselectpackages"),
+
+
+ url(r'^project/(?P<pid>\d+)/customrecipe/(?P<recipe_id>\d+)$',
+ 'customrecipe',
+ name="customrecipe"),
+
+
+
# typeahead api end points
url(r'^xhr_typeahead/(?P<pid>\d+)/layers$',
typeaheads.LayersTypeAhead.as_view(), name='xhr_layerstypeahead'),
@@ -148,6 +159,14 @@ urlpatterns = patterns('toastergui.views',
# JS Unit tests
url(r'^js-unit-tests/$', 'jsunittests', name='js-unit-tests'),
- # default redirection
+ # image customisation functionality
+ url(r'^xhr_customrecipe/(?P<recipe_id>\d+)/packages/(?P<package_id>\d+|)$',
+ 'xhr_customrecipe_packages', name='xhr_customrecipe_packages'),
+ url(r'^xhr_customrecipe/(?P<recipe_id>\d+)$', 'xhr_customrecipe_id',
+ name='xhr_customrecipe_id'),
+ url(r'^xhr_customrecipe/', 'xhr_customrecipe',
+ name='xhr_customrecipe'),
+
+ # default redirection
url(r'^$', RedirectView.as_view( url= 'landing')),
)
diff --git a/bitbake/lib/toaster/toastergui/views.py b/bitbake/lib/toaster/toastergui/views.py
index 8689a12..0e255f1 100755
--- a/bitbake/lib/toaster/toastergui/views.py
+++ b/bitbake/lib/toaster/toastergui/views.py
@@ -26,12 +26,12 @@
import operator,re
from django.db.models import F, Q, Sum, Count, Max
-from django.db import IntegrityError
+from django.db import IntegrityError, Error
from django.shortcuts import render, redirect
from orm.models import Build, Target, Task, Layer, Layer_Version, Recipe, LogMessage, Variable
from orm.models import Task_Dependency, Recipe_Dependency, Package, Package_File, Package_Dependency
from orm.models import Target_Installed_Package, Target_File, Target_Image_File, BuildArtifact
-from orm.models import BitbakeVersion
+from orm.models import BitbakeVersion, CustomImageRecipe
from bldcontrol import bbcontroller
from django.views.decorators.cache import cache_control
from django.core.urlresolvers import reverse, resolve
@@ -45,32 +45,50 @@ from django.utils import formats
from toastergui.templatetags.projecttags import json as jsonfilter
import json
from os.path import dirname
+from functools import wraps
import itertools
+import mimetypes
-import magic
import logging
logger = logging.getLogger("toaster")
class MimeTypeFinder(object):
- _magic = magic.Magic(flags = magic.MAGIC_MIME_TYPE)
+ # setting this to False enables additional non-standard mimetypes
+ # to be included in the guess
+ _strict = False
- # returns the mimetype for a file path
+ # returns the mimetype for a file path as a string,
+ # or 'application/octet-stream' if the type couldn't be guessed
@classmethod
def get_mimetype(self, path):
- return self._magic.id_filename(path)
+ guess = mimetypes.guess_type(path, self._strict)
+ guessed_type = guess[0]
+ if guessed_type == None:
+ guessed_type = 'application/octet-stream'
+ return guessed_type
# all new sessions should come through the landing page;
# determine in which mode we are running in, and redirect appropriately
def landing(request):
+ # in build mode, we redirect to the command-line builds page
+ # if there are any builds for the default (cli builds) project
+ default_project = Project.objects.get_default_project()
+ default_project_builds = Build.objects.filter(project = default_project)
+
+ if (not toastermain.settings.BUILD_MODE) and default_project_builds.count() > 0:
+ args = (default_project.id,)
+ return redirect(reverse('projectbuilds', args = args), permanent = False)
+
# we only redirect to projects page if there is a user-generated project
+ num_builds = Build.objects.all().count()
user_projects = Project.objects.filter(is_default = False)
has_user_project = user_projects.count() > 0
- if Build.objects.count() == 0 and has_user_project:
+ if num_builds == 0 and has_user_project:
return redirect(reverse('all-projects'), permanent = False)
- if Build.objects.all().count() > 0:
+ if num_builds > 0:
return redirect(reverse('all-builds'), permanent = False)
context = {'lvs_nos' : Layer_Version.objects.all().count()}
@@ -84,9 +102,12 @@ def _get_latest_builds(prj=None):
if prj is not None:
queryset = queryset.filter(project = prj)
+ if not toastermain.settings.BUILD_MODE:
+ queryset = queryset.exclude(project__is_default=False)
+
return list(itertools.chain(
- queryset.filter(outcome=Build.IN_PROGRESS).order_by("-pk"),
- queryset.filter(outcome__lt=Build.IN_PROGRESS).order_by("-pk")[:3] ))
+ queryset.filter(outcome=Build.IN_PROGRESS).order_by("-started_on"),
+ queryset.filter(outcome__lt=Build.IN_PROGRESS).order_by("-started_on")[:3] ))
# a JSON-able dict of recent builds; for use in the Project page, xhr_ updates, and other places, as needed
@@ -1215,7 +1236,7 @@ def tasks_common(request, build_id, variant, task_anchor):
context = { 'objectname': variant,
'object_search_display': object_search_display,
'filter_search_display': filter_search_display,
- 'title': title_variant,
+ 'mainheading': title_variant,
'build': build,
'objects': task_objects,
'default_orderby' : orderby,
@@ -1862,11 +1883,21 @@ def image_information_dir(request, build_id, target_id, packagefile_id):
return redirect(builds)
# the context processor that supplies data used across all the pages
-
+# a context processor which runs on every request; this provides the
+# projects and non_cli_projects (i.e. projects created by the user)
+# variables referred to in templates, which used to determine the
+# visibility of UI elements like the "New build" button
def managedcontextprocessor(request):
+ projects = Project.objects.all()
ret = {
- "projects": Project.objects.all(),
+ "projects": projects,
+ "non_cli_projects": projects.exclude(is_default=True),
"DEBUG" : toastermain.settings.DEBUG,
+
+ # True if Toaster is in build mode, False otherwise
+ "BUILD_MODE": toastermain.settings.BUILD_MODE,
+
+ "CUSTOM_IMAGE" : toastermain.settings.CUSTOM_IMAGE,
"TOASTER_BRANCH": toastermain.settings.TOASTER_BRANCH,
"TOASTER_REVISION" : toastermain.settings.TOASTER_REVISION,
}
@@ -1908,6 +1939,11 @@ if True:
queryset = Build.objects.all()
+ # if in analysis mode, exclude builds for all projects except
+ # command line builds
+ if not toastermain.settings.BUILD_MODE:
+ queryset = queryset.exclude(project__is_default=False)
+
redirect_page = resolve(request.path_info).url_name
context, pagesize, orderby = _build_list_helper(request,
@@ -1982,7 +2018,7 @@ if True:
build_info = _build_page_range(Paginator(queryset, pagesize), request.GET.get('page', 1))
# build view-specific information; this is rendered specifically in the builds page, at the top of the page (i.e. Recent builds)
- build_mru = Build.objects.order_by("-started_on")[:3]
+ build_mru = _get_latest_builds()[:3]
# calculate the exact begining of local today and yesterday, append context
context_date,today_begin,yesterday_begin = _add_daterange_context(queryset_all, request, {'started_on','completed_on'})
@@ -2101,35 +2137,38 @@ if True:
},
{'name': 'Errors', 'clclass': 'errors_no',
'qhelp': "How many errors were encountered during the build (if any)",
- 'orderfield': _get_toggle_order(request, "errors_no", True),
- 'ordericon':_get_toggle_order_icon(request, "errors_no"),
- 'orderkey' : 'errors_no',
- 'filter' : {'class' : 'errors_no',
- 'label': 'Show:',
- 'options' : [
- ('Builds with errors', 'errors_no__gte:1', queryset_with_search.filter(errors_no__gte=1).count()),
- ('Builds without errors', 'errors_no:0', queryset_with_search.filter(errors_no=0).count()),
- ]
- }
+ # Comment out sorting and filter until YOCTO #8131 is fixed
+ #'orderfield': _get_toggle_order(request, "errors_no", True),
+ #'ordericon':_get_toggle_order_icon(request, "errors_no"),
+ #'orderkey' : 'errors_no',
+ #'filter' : {'class' : 'errors_no',
+ # 'label': 'Show:',
+ # 'options' : [
+ # ('Builds with errors', 'errors_no__gte:1', queryset_with_search.filter(errors_no__gte=1).count()),
+ # ('Builds without errors', 'errors_no:0', queryset_with_search.filter(errors_no=0).count()),
+ # ]
+ # }
},
{'name': 'Warnings', 'clclass': 'warnings_no',
'qhelp': "How many warnings were encountered during the build (if any)",
- 'orderfield': _get_toggle_order(request, "warnings_no", True),
- 'ordericon':_get_toggle_order_icon(request, "warnings_no"),
- 'orderkey' : 'warnings_no',
- 'filter' : {'class' : 'warnings_no',
- 'label': 'Show:',
- 'options' : [
- ('Builds with warnings','warnings_no__gte:1', queryset_with_search.filter(warnings_no__gte=1).count()),
- ('Builds without warnings','warnings_no:0', queryset_with_search.filter(warnings_no=0).count()),
- ]
- }
+ # Comment out sorting and filter until YOCTO #8131 is fixed
+ #'orderfield': _get_toggle_order(request, "warnings_no", True),
+ #'ordericon':_get_toggle_order_icon(request, "warnings_no"),
+ #'orderkey' : 'warnings_no',
+ #'filter' : {'class' : 'warnings_no',
+ # 'label': 'Show:',
+ # 'options' : [
+ # ('Builds with warnings','warnings_no__gte:1', queryset_with_search.filter(warnings_no__gte=1).count()),
+ # ('Builds without warnings','warnings_no:0', queryset_with_search.filter(warnings_no=0).count()),
+ # ]
+ # }
},
{'name': 'Time', 'clclass': 'time', 'hidden' : 1,
'qhelp': "How long it took the build to finish",
- 'orderfield': _get_toggle_order(request, "timespent", True),
- 'ordericon':_get_toggle_order_icon(request, "timespent"),
- 'orderkey' : 'timespent',
+ # Comment out sorting until YOCTO #8131 is fixed
+ #'orderfield': _get_toggle_order(request, "timespent", True),
+ #'ordericon':_get_toggle_order_icon(request, "timespent"),
+ #'orderkey' : 'timespent',
},
{'name': 'Image files', 'clclass': 'output',
'qhelp': "The root file system types produced by the build. You can find them in your <code>/build/tmp/deploy/images/</code> directory",
@@ -2313,21 +2352,33 @@ if True:
return context
+ def xhr_response(fun):
+ """
+ Decorator for REST methods.
+ calls jsonfilter on the returned dictionary and returns result
+ as HttpResponse object of content_type application/json
+ """
+ @wraps(fun)
+ def wrapper(*args, **kwds):
+ return HttpResponse(jsonfilter(fun(*args, **kwds)),
+ content_type="application/json")
+ return wrapper
+
def jsunittests(request):
- """ Provides a page for the js unit tests """
- bbv = BitbakeVersion.objects.filter(branch="master").first()
- release = Release.objects.filter(bitbake_version=bbv).first()
+ """ Provides a page for the js unit tests """
+ bbv = BitbakeVersion.objects.filter(branch="master").first()
+ release = Release.objects.filter(bitbake_version=bbv).first()
- name = "_js_unit_test_prj_"
+ name = "_js_unit_test_prj_"
- # If there is an existing project by this name delete it. We don't want
- # Lots of duplicates cluttering up the projects.
- Project.objects.filter(name=name).delete()
+ # If there is an existing project by this name delete it. We don't want
+ # Lots of duplicates cluttering up the projects.
+ Project.objects.filter(name=name).delete()
- new_project = Project.objects.create_project(name=name, release=release)
+ new_project = Project.objects.create_project(name=name, release=release)
- context = { 'project' : new_project }
- return render(request, "js-unit-tests.html", context)
+ context = { 'project' : new_project }
+ return render(request, "js-unit-tests.html", context)
from django.views.decorators.csrf import csrf_exempt
@csrf_exempt
@@ -2582,7 +2633,155 @@ if True:
return HttpResponse(jsonfilter({"error": "ok",}), content_type = "application/json")
+ @xhr_response
+ def xhr_customrecipe(request):
+ """
+ Custom image recipe REST API
+
+ Entry point: /xhr_customrecipe/
+ Method: POST
+
+ Args:
+ name: name of custom recipe to create
+ project: target project id of orm.models.Project
+ base: base recipe id of orm.models.Recipe
+ Returns:
+ {"error": "ok",
+ "url": <url of the created recipe>}
+ or
+ {"error": <error message>}
+ """
+ # check if request has all required parameters
+ for param in ('name', 'project', 'base'):
+ if param not in request.POST:
+ return {"error": "Missing parameter '%s'" % param}
+
+ # get project and baserecipe objects
+ params = {}
+ for name, model in [("project", Project),
+ ("base", Recipe)]:
+ value = request.POST[name]
+ try:
+ params[name] = model.objects.get(id=value)
+ except model.DoesNotExist:
+ return {"error": "Invalid %s id %s" % (name, value)}
+
+ # create custom recipe
+ try:
+ recipe = CustomImageRecipe.objects.create(
+ name=request.POST["name"],
+ base_recipe=params["base"],
+ project=params["project"])
+ except Error as err:
+ return {"error": "Can't create custom recipe: %s" % err}
+
+ # Find the package list from the last build of this recipe/target
+ build = Build.objects.filter(target__target=params['base'].name,
+ project=params['project']).last()
+
+ if build:
+ # Copy in every package
+ # We don't want these packages to be linked to anything because
+ # that underlying data may change e.g. delete a build
+ for package in build.package_set.all():
+ # Create the duplicate
+ package.pk = None
+ package.save()
+ # Disassociate the package from the build
+ package.build = None
+ package.save()
+ recipe.packages.add(package)
+ else:
+ logger.warn("No packages found for this base recipe")
+
+ return {"error": "ok",
+ "url": reverse('customrecipe', args=(params['project'].pk,
+ recipe.id))}
+
+ @xhr_response
+ def xhr_customrecipe_id(request, recipe_id):
+ """
+ Set of ReST API processors working with recipe id.
+
+ Entry point: /xhr_customrecipe/<recipe_id>
+
+ Methods:
+ GET - Get details of custom image recipe
+ DELETE - Delete custom image recipe
+
+ Returns:
+ GET:
+ {"error": "ok",
+ "info": dictionary of field name -> value pairs
+ of the CustomImageRecipe model}
+ DELETE:
+ {"error": "ok"}
+ or
+ {"error": <error message>}
+ """
+ objects = CustomImageRecipe.objects.filter(id=recipe_id)
+ if not objects:
+ return {"error": "Custom recipe with id=%s "
+ "not found" % recipe_id}
+ if request.method == 'GET':
+ values = CustomImageRecipe.objects.filter(id=recipe_id).values()
+ if values:
+ return {"error": "ok", "info": values[0]}
+ else:
+ return {"error": "Custom recipe with id=%s "
+ "not found" % recipe_id}
+ return {"error": "ok", "info": objects.values()[0]}
+ elif request.method == 'DELETE':
+ objects.delete()
+ return {"error": "ok"}
+ else:
+ return {"error": "Method %s is not supported" % request.method}
+
+ @xhr_response
+ def xhr_customrecipe_packages(request, recipe_id, package_id):
+ """
+ ReST API to add/remove packages to/from custom recipe.
+
+ Entry point: /xhr_customrecipe/<recipe_id>/packages/
+
+ Methods:
+ PUT - Add package to the recipe
+ DELETE - Delete package from the recipe
+
+ Returns:
+ {"error": "ok"}
+ or
+ {"error": <error message>}
+ """
+ try:
+ recipe = CustomImageRecipe.objects.get(id=recipe_id)
+ except CustomImageRecipe.DoesNotExist:
+ return {"error": "Custom recipe with id=%s "
+ "not found" % recipe_id}
+
+ if request.method == 'GET' and not package_id:
+ return {"error": "ok",
+ "packages": list(recipe.packages.values_list('id'))}
+
+ try:
+ package = Package.objects.get(id=package_id)
+ except Package.DoesNotExist:
+ return {"error": "Package with id=%s "
+ "not found" % package_id}
+
+ if request.method == 'PUT':
+ recipe.packages.add(package)
+ return {"error": "ok"}
+ elif request.method == 'DELETE':
+ if package in recipe.packages.all():
+ recipe.packages.remove(package)
+ return {"error": "ok"}
+ else:
+ return {"error": "Package '%s' is not in the recipe '%s'" % \
+ (package.name, recipe.name)}
+ else:
+ return {"error": "Method %s is not supported" % request.method}
def importlayer(request, pid):
template = "importlayer.html"
@@ -2596,12 +2795,16 @@ if True:
project = Project.objects.get(pk=pid)
layer_version = Layer_Version.objects.get(pk=layerid)
- context = { 'project' : project,
- 'layerversion' : layer_version,
- 'layerdeps' : { "list": [
- [{"id": y.id, "name": y.layer.name} for y in x.depends_on.get_equivalents_wpriority(project)][0] for x in layer_version.dependencies.all()]},
- 'projectlayers': map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=project))
- }
+ context = {'project' : project,
+ 'layerversion' : layer_version,
+ 'layerdeps' : {"list": [{"id": dep.id,
+ "name": dep.layer.name,
+ "layerdetailurl": reverse('layerdetails', args=(pid, dep.pk)),
+ "vcs_url": dep.layer.vcs_url,
+ "vcs_reference": dep.get_vcs_reference()} \
+ for dep in layer_version.get_alldeps(project.id)]},
+ 'projectlayers': map(lambda prjlayer: prjlayer.layercommit.id, ProjectLayer.objects.filter(project=project))
+ }
return context
@@ -2628,6 +2831,15 @@ if True:
return(vars_managed,sorted(vars_fstypes),vars_blacklist)
+ def customrecipe(request, pid, recipe_id):
+ project = Project.objects.get(pk=pid)
+ context = {'project' : project,
+ 'projectlayers': [],
+ 'recipe' : CustomImageRecipe.objects.get(pk=recipe_id)
+ }
+
+ return render(request, "customrecipe.html", context)
+
@_template_renderer("projectconf.html")
def projectconf(request, pid):
@@ -2733,6 +2945,9 @@ if True:
context['project'] = prj
_set_parameters_values(pagesize, orderby, request)
+ # add the most recent builds for this project
+ context['mru'] = _get_latest_builds(prj)
+
return context
@@ -2797,7 +3012,7 @@ if True:
if file_name is None:
raise Exception("Could not handle artifact %s id %s" % (artifact_type, artifact_id))
else:
- content_type = b.buildrequest.environment.get_artifact_type(file_name)
+ content_type = MimeTypeFinder.get_mimetype(file_name)
fsock = b.buildrequest.environment.get_artifact(file_name)
file_name = os.path.basename(file_name) # we assume that the build environment system has the same path conventions as host
@@ -2833,6 +3048,10 @@ if True:
queryset_all = queryset_all.filter(Q(is_default=False) |
q_default_with_builds)
+ # if in BUILD_MODE, exclude everything but the command line builds project
+ if not toastermain.settings.BUILD_MODE:
+ queryset_all = queryset_all.exclude(is_default=False)
+
# boilerplate code that takes a request for an object type and returns a queryset
# for that object type. copypasta for all needed table searches
(filter_string, search_term, ordering_string) = _search_tuple(request, Project)
diff --git a/bitbake/lib/toaster/toastergui/widgets.py b/bitbake/lib/toaster/toastergui/widgets.py
index eb2914d..6bb3889 100644
--- a/bitbake/lib/toaster/toastergui/widgets.py
+++ b/bitbake/lib/toaster/toastergui/widgets.py
@@ -20,6 +20,7 @@
# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
from django.views.generic import View, TemplateView
+from django.views.decorators.cache import cache_control
from django.shortcuts import HttpResponse
from django.http import HttpResponseBadRequest
from django.core import serializers
@@ -38,6 +39,9 @@ import collections
import operator
import re
+import logging
+logger = logging.getLogger("toaster")
+
from toastergui.views import objtojson
class ToasterTable(TemplateView):
@@ -45,7 +49,7 @@ class ToasterTable(TemplateView):
super(ToasterTable, self).__init__()
if 'template_name' in kwargs:
self.template_name = kwargs['template_name']
- self.title = None
+ self.title = "Table"
self.queryset = None
self.columns = []
self.filters = {}
@@ -61,6 +65,18 @@ class ToasterTable(TemplateView):
orderable=True,
field_name="id")
+ # prevent HTTP caching of table data
+ @cache_control(must_revalidate=True, max_age=0, no_store=True, no_cache=True)
+ def dispatch(self, *args, **kwargs):
+ return super(ToasterTable, self).dispatch(*args, **kwargs)
+
+ def get_context_data(self, **kwargs):
+ context = super(ToasterTable, self).get_context_data(**kwargs)
+ context['title'] = self.title
+ context['table_name'] = type(self).__name__.lower()
+
+ return context
+
def get(self, request, *args, **kwargs):
if request.GET.get('format', None) == 'json':
@@ -219,7 +235,8 @@ class ToasterTable(TemplateView):
"""Creates a query based on the model's search_allowed_fields"""
if not hasattr(self.queryset.model, 'search_allowed_fields'):
- raise Exception("Err Search fields aren't defined in the model")
+ raise Exception("Search fields aren't defined in the model %s"
+ % self.queryset.model)
search_queries = []
for st in search_term.split(" "):
@@ -242,11 +259,14 @@ class ToasterTable(TemplateView):
search = request.GET.get("search", None)
filters = request.GET.get("filter", None)
orderby = request.GET.get("orderby", None)
+ nocache = request.GET.get("nocache", None)
# Make a unique cache name
cache_name = self.__class__.__name__
for key, val in request.GET.iteritems():
+ if key == 'nocache':
+ continue
cache_name = cache_name + str(key) + str(val)
for key, val in kwargs.iteritems():
@@ -254,9 +274,14 @@ class ToasterTable(TemplateView):
# No special chars allowed in the cache name apart from dash
cache_name = re.sub(r'[^A-Za-z0-9-]', "", cache_name)
+
+ if nocache:
+ cache.delete(cache_name)
+
data = cache.get(cache_name)
if data:
+ logger.debug("Got cache data for table '%s'" % self.title)
return data
self.setup_columns(**kwargs)
@@ -330,33 +355,6 @@ class ToasterTable(TemplateView):
return data
-class ToasterTemplateView(TemplateView):
- # renders a instance in a template, or returns the context as json
- # the class-equivalent of the _template_renderer decorator for views
-
- def __init__(self, *args, **kwargs):
- super(ToasterTemplateView, self).__init__(*args, **kwargs)
- self.context_entries = []
-
- def get(self, *args, **kwargs):
- if self.request.GET.get('format', None) == 'json':
- from django.core.urlresolvers import reverse
- from django.shortcuts import HttpResponse
- from views import objtojson
- from toastergui.templatetags.projecttags import json as jsonfilter
-
- context = self.get_context_data(**kwargs)
-
- for x in context.keys():
- if x not in self.context_entries:
- del context[x]
-
- context["error"] = "ok"
-
- return HttpResponse(jsonfilter(context, default=objtojson ),
- content_type = "application/json; charset=utf-8")
-
- return super(ToasterTemplateView, self).get(*args, **kwargs)
class ToasterTypeAhead(View):
""" A typeahead mechanism to support the front end typeahead widgets """
diff --git a/bitbake/lib/toaster/toastermain/settings.py b/bitbake/lib/toaster/toastermain/settings.py
index b149a5e..b28ddb2 100644
--- a/bitbake/lib/toaster/toastermain/settings.py
+++ b/bitbake/lib/toaster/toastermain/settings.py
@@ -23,6 +23,11 @@
import os, re
+# Temporary toggle for Image customisation
+CUSTOM_IMAGE = False
+if os.environ.get("CUSTOM_IMAGE", None) is not None:
+ CUSTOM_IMAGE = True
+
DEBUG = True
TEMPLATE_DEBUG = DEBUG
@@ -87,11 +92,9 @@ if 'DATABASE_URL' in os.environ:
else:
raise Exception("FIXME: Please implement missing database url schema for url: %s" % dburl)
-
+BUILD_MODE = False
if 'TOASTER_MANAGED' in os.environ and os.environ['TOASTER_MANAGED'] == "1":
- MANAGED = True
-else:
- MANAGED = False
+ BUILD_MODE = True
# Allows current database settings to be exported as a DATABASE_URL environment variable value
diff --git a/bitbake/lib/toaster/toastermain/urls.py b/bitbake/lib/toaster/toastermain/urls.py
index 521588a..6c4a953 100644
--- a/bitbake/lib/toaster/toastermain/urls.py
+++ b/bitbake/lib/toaster/toastermain/urls.py
@@ -60,7 +60,7 @@ if toastermain.settings.DEBUG_PANEL_ENABLED:
#logger.info("Enabled django_toolbar extension")
-if toastermain.settings.MANAGED:
+if toastermain.settings.BUILD_MODE:
urlpatterns = [
# Uncomment the next line to enable the admin:
url(r'^admin/', include(admin.site.urls)),
diff --git a/bitbake/toaster-requirements.txt b/bitbake/toaster-requirements.txt
index c4a2221..1d7d21b 100644
--- a/bitbake/toaster-requirements.txt
+++ b/bitbake/toaster-requirements.txt
@@ -2,5 +2,4 @@ Django==1.6
South==0.8.4
argparse==1.2.1
wsgiref==0.1.2
-filemagic==1.6
beautifulsoup4>=4.4.0
diff --git a/documentation/Makefile b/documentation/Makefile
index 9197a40..99adea2 100644
--- a/documentation/Makefile
+++ b/documentation/Makefile
@@ -333,7 +333,7 @@ ALLPREQ = html tarball
TARFILES = toaster-manual.html toaster-manual-style.css \
figures/toaster-title.png figures/simple-configuration.png \
figures/hosted-service.png
-MANUALS = $(DOC)/$(DOC).html $(DOC)/$(DOC).pdf
+MANUALS = $(DOC)/$(DOC).html
FIGURES = figures
STYLESHEET = $(DOC)/*.css
endif
diff --git a/documentation/adt-manual/adt-manual.xml b/documentation/adt-manual/adt-manual.xml
index 6ce62c9..67b330a 100644
--- a/documentation/adt-manual/adt-manual.xml
+++ b/documentation/adt-manual/adt-manual.xml
@@ -87,9 +87,9 @@
<revremark>Released with the Yocto Project 1.8 Release.</revremark>
</revision>
<revision>
- <revnumber>1.9</revnumber>
+ <revnumber>2.0</revnumber>
<date>October 2015</date>
- <revremark>Released with the Yocto Project 1.9 Release.</revremark>
+ <revremark>Released with the Yocto Project 2.0 Release.</revremark>
</revision>
</revhistory>
diff --git a/documentation/adt-manual/adt-package.xml b/documentation/adt-manual/adt-package.xml
index f3ffa06..68eee9b 100644
--- a/documentation/adt-manual/adt-package.xml
+++ b/documentation/adt-manual/adt-package.xml
@@ -27,7 +27,7 @@
information about OPKG.</para></listitem>
<listitem><para><emphasis>RPM:</emphasis> A more widely known PMS intended for GNU/Linux
distributions.
- This PMS works with files packaged in an <filename>.rms</filename> format.
+ This PMS works with files packaged in an <filename>.rpm</filename> format.
The build system currently installs through this PMS by default.
See <ulink url='http://en.wikipedia.org/wiki/RPM_Package_Manager'></ulink>
for more information about RPM.</para></listitem>
diff --git a/documentation/adt-manual/adt-prepare.xml b/documentation/adt-manual/adt-prepare.xml
index 01f569f..65df1d0 100644
--- a/documentation/adt-manual/adt-prepare.xml
+++ b/documentation/adt-manual/adt-prepare.xml
@@ -364,6 +364,10 @@
Comments within the <filename>local.conf</filename> file
list the values you can use for the
<filename>MACHINE</filename> variable.
+ If you do not change the <filename>MACHINE</filename>
+ variable, the OpenEmbedded build system uses
+ <filename>qemux86</filename> as the default target
+ machine when building the cross-toolchain.
<note>
You can populate the Build Directory with the
cross-toolchains for more than a single architecture.
@@ -371,6 +375,17 @@
variable in the <filename>local.conf</filename> file and
re-run the <filename>bitbake</filename> command.
</note></para></listitem>
+ <listitem><para><emphasis>Make Sure Your Layers are Enabled:</emphasis>
+ Examine the <filename>conf/bblayers.conf</filename> file
+ and make sure that you have enabled all the compatible
+ layers for your target machine.
+ The OpenEmbedded build system needs to be aware of each
+ layer you want included when building images and
+ cross-toolchains.
+ For information on how to enable a layer, see the
+ "<ulink url='&YOCTO_DOCS_DEV_URL;#enabling-your-layer'>Enabling Your Layer</ulink>"
+ section in the Yocto Project Development Manual.
+ </para></listitem>
<listitem><para><emphasis>Generate the Cross-Toolchain:</emphasis>
Run <filename>bitbake meta-ide-support</filename> to
complete the cross-toolchain generation.
diff --git a/documentation/bsp-guide/bsp-guide.xml b/documentation/bsp-guide/bsp-guide.xml
index 5477ca8..d9bcc3f 100644
--- a/documentation/bsp-guide/bsp-guide.xml
+++ b/documentation/bsp-guide/bsp-guide.xml
@@ -99,9 +99,9 @@
<revremark>Released with the Yocto Project 1.8 Release.</revremark>
</revision>
<revision>
- <revnumber>1.9</revnumber>
+ <revnumber>2.0</revnumber>
<date>October 2015</date>
- <revremark>Released with the Yocto Project 1.9 Release.</revremark>
+ <revremark>Released with the Yocto Project 2.0 Release.</revremark>
</revision>
</revhistory>
@@ -113,7 +113,7 @@
<legalnotice>
<para>
Permission is granted to copy, distribute and/or modify this document under
- the terms of the <ulink type="http" url="http://creativecommons.org/licenses/by-nc-sa/2.0/uk/">Creative Commons Attribution-Non-Commercial-Share Alike 2.0 UK: England & Wales</ulink> as published by Creative Commons.
+ the terms of the <ulink type="http" url="http://creativecommons.org/licenses/by-nc-sa/2.0/uk/">Creative Commons Attribution-Share Alike 2.0 UK: England & Wales</ulink> as published by Creative Commons.
</para>
<note>
For the latest version of this manual associated with this
diff --git a/documentation/dev-manual/dev-manual-common-tasks.xml b/documentation/dev-manual/dev-manual-common-tasks.xml
index e927a89..f0836e8 100644
--- a/documentation/dev-manual/dev-manual-common-tasks.xml
+++ b/documentation/dev-manual/dev-manual-common-tasks.xml
@@ -2249,6 +2249,19 @@
Typically, setting these options is accomplished by running a
configure script with some options, or by modifying a build
configuration file.
+ <note>
+ As of Yocto Project Release 7.1, some of the core recipes
+ that package binary configuration scripts now disable the
+ scripts due to the scripts previously requiring error-prone
+ path substitution.
+ The OpenEmbedded build system uses
+ <filename>pkg-config</filename> now, which is much more
+ robust.
+ You can find a list of the <filename>*-config</filename>
+ scripts that are disabled list in the
+ "<ulink url='&YOCTO_DOCS_REF_URL;#migration-1.7-binary-configuration-scripts-disabled'>Binary Configuration Scripts Disabled</ulink>"
+ section in the Yocto Project Reference Manual.
+ </note>
</para>
<para>
@@ -2364,7 +2377,16 @@
<para>
However, if the compile step fails, you need to diagnose the
failure.
- Here are some common issues that cause failures:
+ Here are some common issues that cause failures.
+ <note>
+ For cases where improper paths are detected for
+ configuration files or for when libraries/headers cannot
+ be found, be sure you are using the more robust
+ <filename>pkg-config</filename>.
+ See the note in section
+ "<link linkend='new-recipe-configuring-the-recipe'>Configuring the Recipe</link>"
+ for additional information.
+ </note>
<itemizedlist>
<listitem><para><emphasis>Parallel build failures:</emphasis>
These failures manifest themselves as intermittent
@@ -2708,23 +2730,20 @@
is configured, it might be important to mark the
packages produced as being specific to a particular
machine, or to mark them as not being specific to
- a particular machine or architecture at all.
- By default, packages produced for the target are
- marked as being specific to the architecture of the
- target machine because that is usually the desired
- result.
- However, if the recipe configures the software to be
- built specific to the target machine (e.g. the
+ a particular machine or architecture at all.</para>
+ <para>By default, packages apply to any machine with the
+ same architecture as the target machine.
+ When a recipe produces packages that are
+ machine-specific (e.g. the
<ulink url='&YOCTO_DOCS_REF_URL;#var-MACHINE'><filename>MACHINE</filename></ulink>
value is passed into the configure script or a patch
- is applied only for a particular machine), then you
- should mark the packages produced as being
- machine-specific by adding the following to the
+ is applied only for a particular machine), you should
+ mark them as such by adding the following to the
recipe:
<literallayout class='monospaced'>
PACKAGE_ARCH = "${MACHINE_ARCH}"
- </literallayout>
- On the other hand, if the recipe produces packages
+ </literallayout></para>
+ <para>On the other hand, if the recipe produces packages
that do not contain anything specific to the target
machine or architecture at all (e.g. recipes
that simply package script files or configuration
@@ -3554,7 +3573,7 @@
require conf/multilib.conf
MULTILIBS = "multilib:lib32"
DEFAULTTUNE_virtclass-multilib-lib32 = "x86"
- IMAGE_INSTALL = "lib32-connman"
+ IMAGE_INSTALL_append = " lib32-glib-2.0"
</literallayout>
This example enables an
additional library named <filename>lib32</filename> alongside the
@@ -3565,7 +3584,7 @@
</para>
<para>
- The example then includes <filename>lib32-connman</filename>
+ The example then includes <filename>lib32-glib-2.0</filename>
in all the images, which illustrates one method of including a
multiple library dependency.
You can use a normal image build to include this dependency,
@@ -3575,7 +3594,7 @@
</literallayout>
You can also build Multilib packages specifically with a command like this:
<literallayout class='monospaced'>
- $ bitbake lib32-connman
+ $ bitbake lib32-glib-2.0
</literallayout>
</para>
</section>
@@ -4307,18 +4326,18 @@
A source plugin is created as a subclass of
<filename>SourcePlugin</filename>.
The plugin file containing it is added to
- <filename>scripts/lib/mic/plugins/source/</filename> to
+ <filename>scripts/lib/wic/plugins/source/</filename> to
make the plugin implementation available to the
<filename>wic</filename> implementation.
For more information, see
- <filename>scripts/lib/mic/pluginbase.py</filename>.
+ <filename>scripts/lib/wic/pluginbase.py</filename>.
</para>
<para>
Source plugins can also be implemented and added by
external layers.
As such, any plugins found in a
- <filename>scripts/lib/mic/plugins/source/</filename>
+ <filename>scripts/lib/wic/plugins/source/</filename>
directory in an external layer are also made
available.
</para>
@@ -4539,9 +4558,17 @@
option or the equivalent rootfs derived from the
<filename>-e</filename> command-line
option.
- Exactly what those contents and
- filesystem type end up being are dependent
- on the given plugin implementation.
+ Exactly what those contents and filesystem type end
+ up being are dependent on the given plugin
+ implementation.
+ </para>
+ <para>If you do not use the
+ <filename>--source</filename> option, the
+ <filename>wic</filename> command creates an empty
+ partition.
+ Consequently, you must use the
+ <filename>--size</filename> option to specify the
+ size of the empty partition.
</para></listitem>
<listitem><para><emphasis><filename>--ondisk</filename> or <filename>--ondrive</filename>:</emphasis>
Forces the partition to be created on a particular
@@ -4585,6 +4612,49 @@
This option is a <filename>wic</filename>-specific
option that says to start a partition on an
x KBytes boundary.</para></listitem>
+ <listitem><para><emphasis><filename>--no-table</filename>:</emphasis>
+ This option is a <filename>wic</filename>-specific
+ option.
+ Using the option reserves space for the partition
+ and causes it to become populated.
+ However, the partition is not added to the
+ partition table.
+ </para></listitem>
+ <listitem><para><emphasis><filename>--extra-space</filename>:</emphasis>
+ This option is a <filename>wic</filename>-specific
+ option that adds extra space after the space
+ filled by the content of the partition.
+ The final size can go beyond the size specified
+ by the <filename>--size</filename> option.
+ The default value is 10 Mbytes.
+ </para></listitem>
+ <listitem><para><emphasis><filename>--overhead-factor</filename>:</emphasis>
+ This option is a <filename>wic</filename>-specific
+ option that multiplies the size of the partition by
+ the option's value.
+ You must supply a value greater than or equal to
+ "1".
+ The default value is "1.3".
+ </para></listitem>
+ <listitem><para><emphasis><filename>--part-type</filename>:</emphasis>
+ This option is a <filename>wic</filename>-specific
+ option that specifies the partition type globally
+ unique identifier (GUID) for GPT partitions.
+ You can find the list of partition type GUIDs
+ at
+ <ulink url='http://en.wikipedia.org/wiki/GUID_Partition_Table#Partition_type_GUIDs'></ulink>.
+ </para></listitem>
+ <listitem><para><emphasis><filename>--use-uuid</filename>:</emphasis>
+ This option is a <filename>wic</filename>-specific
+ option that causes <filename>wic</filename> to
+ generate a random GUID for the partition.
+ The generated identifier is used in the bootloader
+ configuration to specify the root partition.
+ </para></listitem>
+ <listitem><para><emphasis><filename>--uuid</filename>:</emphasis>
+ This option is a <filename>wic</filename>-specific
+ option that specifies the partition UUID.
+ </para></listitem>
</itemizedlist>
</para>
</section>
@@ -8166,6 +8236,29 @@
must accept incoming connections from 192.168.7.0/24,
which is the default IP range used for tap devices
by <filename>runqemu</filename>.</para></listitem>
+ <listitem><para><emphasis>Be sure your host has the
+ correct packages installed:</emphasis>
+ Depending your host's distribution, you need
+ to have the following packages installed:
+ <itemizedlist>
+ <listitem><para>Ubuntu and Debian:
+ <filename>sysstat</filename> and
+ <filename>iproute2</filename>
+ </para></listitem>
+ <listitem><para>OpenSUSE:
+ <filename>sysstat</filename> and
+ <filename>iproute2</filename>
+ </para></listitem>
+ <listitem><para>Fedora:
+ <filename>sysstat</filename> and
+ <filename>iproute</filename>
+ </para></listitem>
+ <listitem><para>CentOS:
+ <filename>sysstat</filename> and
+ <filename>iproute</filename>
+ </para></listitem>
+ </itemizedlist>
+ </para></listitem>
</itemizedlist>
</para>
@@ -8563,7 +8656,7 @@
</literallayout></para></listitem>
<listitem><para><emphasis>Manually running tests:</emphasis>
To manually run the tests, first globally inherit the
- <ulink url='&YOCTO_DOCS_REF_URL;#ref-classes-testimage'><filename>testimage</filename></ulink>
+ <ulink url='&YOCTO_DOCS_REF_URL;#ref-classes-testimage*'><filename>testimage</filename></ulink>
class by editing your <filename>local.conf</filename>
file:
<literallayout class='monospaced'>
diff --git a/documentation/dev-manual/dev-manual-model.xml b/documentation/dev-manual/dev-manual-model.xml
index 6e0ded2..6e42c7b 100644
--- a/documentation/dev-manual/dev-manual-model.xml
+++ b/documentation/dev-manual/dev-manual-model.xml
@@ -939,14 +939,14 @@
For example, if you are using Luna, do the
following:
<literallayout class='monospaced'>
- $ git checkout luna/yocto-1.8
+ $ git checkout luna/yocto-&DISTRO;
</literallayout>
This puts you in a detached HEAD state, which
is fine since you are only going to be building
and not developing.
<note>
If you are building kepler, checkout the
- <filename>kepler/yocto-1.8</filename>
+ <filename>kepler/yocto-&DISTRO;</filename>
branch.
</note>
</para></listitem>
@@ -975,13 +975,13 @@
Be sure to provide the tag name, documentation
branch, and a release name.
Here is an example that uses the
- <filename>luna/yocto-1.8</filename> tag, the
+ <filename>luna/yocto-&DISTRO;</filename> tag, the
<filename>master</filename> documentation
branch, and
<filename>&DISTRO_NAME;</filename> for the
release name:
<literallayout class='monospaced'>
- $ ECLIPSE_HOME=/home/scottrif/eclipse-poky/scripts/eclipse ./build.sh luna/yocto-1.8 master &DISTRO_NAME; 2>&1 | tee -a build.log
+ $ ECLIPSE_HOME=/home/scottrif/eclipse-poky/scripts/eclipse ./build.sh luna/yocto-&DISTRO; master &DISTRO_NAME; 2>&1 | tee -a build.log
</literallayout>
After running the script, the file
<filename>org.yocto.sdk-</filename><replaceable>release</replaceable><filename>-</filename><replaceable>date</replaceable><filename>-archive.zip</filename>
@@ -1340,6 +1340,40 @@
"Project" menu.
The console should update and you can note the cross-compiler
you are using.
+ <note>
+ When building "Yocto Project ADT Autotools" projects, the Eclipse
+ IDE might display error messages for Functions/Symbols/Types
+ that cannot be "resolved", even when the related include file
+ is listed at the project navigator and when the project is
+ able to build.
+ For these cases only, it is recommended to add a new linked
+ folder to the appropriate sysroot.
+ Use these steps to add the linked folder:
+ <orderedlist>
+ <listitem><para>
+ Select the project.
+ </para></listitem>
+ <listitem><para>
+ Select "Folder" from the
+ <filename>File > New</filename> menu.
+ </para></listitem>
+ <listitem><para>
+ In the "New Folder" Dialog, select "Link to alternate
+ location (linked folder)".
+ </para></listitem>
+ <listitem><para>
+ Click "Browse" to navigate to the include folder inside
+ the same sysroot location selected in the Yocto Project
+ configuration preferences.
+ </para></listitem>
+ <listitem><para>
+ Click "OK".
+ </para></listitem>
+ <listitem><para>
+ Click "Finish" to save the linked folder.
+ </para></listitem>
+ </orderedlist>
+ </note>
</para>
</section>
@@ -2183,7 +2217,7 @@
</literallayout>
<note>
For complete syntax, use the
- <filename>devtool update-recipe --help</filename> command.
+ <filename>devtool build --help</filename> command.
</note>
Building your software using <filename>devtool build</filename>
is identical to using BitBake to build the software.
diff --git a/documentation/dev-manual/dev-manual-qemu.xml b/documentation/dev-manual/dev-manual-qemu.xml
index ccc915f..903028f 100644
--- a/documentation/dev-manual/dev-manual-qemu.xml
+++ b/documentation/dev-manual/dev-manual-qemu.xml
@@ -197,14 +197,14 @@
but also is not as easy to use or comprehensive
as the default.
</para></listitem>
- <listitem><para><filename>kvm</filename>:
+ <listitem><para id='kvm-cond'><filename>kvm</filename>:
Enables KVM when running "qemux86" or "qemux86-64"
QEMU architectures.
For KVM to work, all the following conditions must be met:
<itemizedlist>
<listitem><para>
Your <replaceable>MACHINE</replaceable> must be either
- "qemux86" or "qemux86-64".
+qemux86" or "qemux86-64".
</para></listitem>
<listitem><para>
Your build host has to have the KVM modules
@@ -212,13 +212,25 @@
<filename>/dev/kvm</filename>.
</para></listitem>
<listitem><para>
- Your build host has to have virtio net device, which
- are <filename>/dev/vhost-net</filename>.
- </para></listitem>
- <listitem><para>
The build host <filename>/dev/kvm</filename>
directory has to be both writable and readable.
</para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para><filename>kvm-vhost</filename>:
+ Enables KVM with VHOST support when running "qemux86" or "qemux86-64"
+ QEMU architectures.
+ For KVM with VHOST to work, the following conditions must
+ be met:
+ <itemizedlist>
+ <listitem><para>
+ <link linkend='kvm-cond'>kvm</link> option
+ conditions must be met.
+ </para></listitem>
+ <listitem><para>
+ Your build host has to have virtio net device, which
+ are <filename>/dev/vhost-net</filename>.
+ </para></listitem>
<listitem><para>
The build host <filename>/dev/vhost-net</filename>
directory has to be either readable or writable
diff --git a/documentation/dev-manual/dev-manual.xml b/documentation/dev-manual/dev-manual.xml
index 608d3a9..3ddd01f 100644
--- a/documentation/dev-manual/dev-manual.xml
+++ b/documentation/dev-manual/dev-manual.xml
@@ -26,7 +26,7 @@
<affiliation>
<orgname>Intel Corporation</orgname>
</affiliation>
- <email>scott.m.rifenbark at intel.com</email>
+ <email>srifenbark at gmail.com</email>
</author>
</authorgroup>
@@ -77,9 +77,9 @@
<revremark>Released with the Yocto Project 1.8 Release.</revremark>
</revision>
<revision>
- <revnumber>1.9</revnumber>
+ <revnumber>2.0</revnumber>
<date>October 2015</date>
- <revremark>Released with the Yocto Project 1.9 Release.</revremark>
+ <revremark>Released with the Yocto Project 2.0 Release.</revremark>
</revision>
</revhistory>
diff --git a/documentation/kernel-dev/kernel-dev-common.xml b/documentation/kernel-dev/kernel-dev-common.xml
index 27c82ce..ab7f80f 100644
--- a/documentation/kernel-dev/kernel-dev-common.xml
+++ b/documentation/kernel-dev/kernel-dev-common.xml
@@ -389,6 +389,10 @@
You can use the entire <filename>.config</filename> file as the
<filename>defconfig</filename> file as described in the
"<link linkend='changing-the-configuration'>Changing the Configuration</link>" section.
+ For more information on the <filename>.config</filename> file,
+ see the
+ "<ulink url='&YOCTO_DOCS_DEV_URL;#using-menuconfig'>Using <filename>menuconfig</filename></ulink>"
+ section in the Yocto Project Development Manual.
</para>
<para>
diff --git a/documentation/kernel-dev/kernel-dev.xml b/documentation/kernel-dev/kernel-dev.xml
index e3df2cc..38850fa 100644
--- a/documentation/kernel-dev/kernel-dev.xml
+++ b/documentation/kernel-dev/kernel-dev.xml
@@ -62,9 +62,9 @@
<revremark>Released with the Yocto Project 1.8 Release.</revremark>
</revision>
<revision>
- <revnumber>1.9</revnumber>
+ <revnumber>2.0</revnumber>
<date>October 2015</date>
- <revremark>Released with the Yocto Project 1.9 Release.</revremark>
+ <revremark>Released with the Yocto Project 2.0 Release.</revremark>
</revision>
</revhistory>
diff --git a/documentation/mega-manual/figures/add-variable.png b/documentation/mega-manual/figures/add-variable.png
new file mode 100644
index 0000000000000000000000000000000000000000..6bdcca705afe530a2c2b72c4f0d8050354c23410
GIT binary patch
literal 110712
zcmd?Qhg(zG+CCh_G9tyX3<v_20R*H-ktU#`p!D9GBE3p)Avg{&h=9@}AOu8OXd+E&
zP=wF}1PDDq=mA22B#@Bgw{_lgzB%uE{)3NeU1VK5D|@f~to5{e-A}xsz7_`?FB=F1
z;&}Y%fiVbl0_d{t{Bjcb at F_x%f<RY5k00DK4Sl~kON%(an#p|5h^E_+<IEZ&KE$O-
zxHr2$nf7i7nwpK`Ylyfuxm`bKJNuO2vlaX@>-fxB_IyRTr1QwrvEQ%0J1+8-<<uWv
zd2AeC{&Mm)>Xg+f&u2Z1NC=Pn%^qI<NX- at pOpt@(xZ6sjtL8Q8&TE&{lztRy8Y0YW
zF{;=PU57C&{J~|3jCFOQ2ptXCCEWf-HRl6*iw4wU<`UNXPg2Egp!XfNZ@}z9^g*!%
zhhb8MP!e+&+3c<){z&j{cwtr5&~kvcZzJAeoAV=tTKwM{LXc{3JetdcIXO<bvX3Zz
zbFqA%({78ke&m!}L1Hokn8|->>M)XPHp{`4eP*5 at Q}6J$j?smO|8BFe^gFC?!goB-
zGc)hsdqhReF=P*2i;-w?@S!apMLM#@S^0#iw-y%oHr)9{S6 at T^w`c4L8u)iUy+uRm
zrnl%8X+xr at yN%<BnclkA`$&X2o!kHQd6p}y%$JkQqWk7wW?0I}EH?w`@yHLuB~e5y
z;w`?aexn+4n0%^|d5V63R;T~(28rrJKD`yw at q~kub7N&7dpEpwRC#nDTR~n?@djFs
zn_spVmkGSc9`h?+9nao=s<4P2)p*-C-7|m;dh_ANtN&>NquPH$G&D5WPQDC2FzgOV
zuc*D>fEdBqRWVjqS1+=kl$VqH=%@G|<JImZ3o2c#(koM1t{Wmrg!KC6<8;z|!<C&t
z2YEk4`QH`@H4BmB9h;bVckD$pf2c&m%8Ie8<Z{+z8soqpgP5zEVX(f4?&|8gkf<3T
zz<dDeK4dzQ5u(%Q*=Aq#1eGz9a?1|EgD0c5D$TJZKAG!pA96gn_Uk}@zuOc6Gn!`b
z)$q~VM<4U}c at j09vx;0?z5(yS7IPo?FRGrLlsL^YpUgNc2Cf7vRj6OSeUUvzPDx1!
zp<a^dXIWEIb0WtuCO5iI^~o94d}zSYf7vUDP-?Pf!K(+?nnDP3pT|ws6t^kXTMVb_
zciXeg#gmhhX=kO;!DljAx(^*9>At;V-;H at Aw@6OJyIXzAQHyD~J=U*zjQukXZ}9;(
zq#Ve>^Ij(~#&=_n%NGMv-8TcT>~Zzgg_Wt%I;%FS7*xE!dQFJYM20=LRLHs(lM18G
zbWD at D9jJWtNp3_DDr!MIDg76a9i&cvnetMjBVn9=fMV)Es+WHSlM@`$J@?Fi+!BvM
z>?=@b#=UtjU9#I{v|!;w=j$h4{U2?Bv?A*=0Lg97G}dh6@{I9=IVv)GCc|!Wc>f+*
z(3y%;^dqTQ2J|9GIbHqikOQ5hur$?TmK=$v$qYQ|T4wC@;)A2fQPY=z-5#T7BGqD9
ztezMbrBC{ff|T+p_)1t8yJv;(LJ=dbYEb&&p}9ZkV7(%Wz9VAr at eV`8y$`b8haK8(
zJvB~m?*bI2Q!r7}B+8!feE9$Fc_w`fvbfPS-QYVt-EF!)ttW`_hf3`q_Sr%5>jdc7
zHn7ctpCUfose1WDG+%2deRUgx*3J#>AuSC$Oy*CFdA25ut1BvcsWbYRhw8L21Hz;$
zGindoux??XS~l2c$IH)eV%PC2cq<#*AjrhPc!PWS6E!b##+gxlnNQRihj9(~LvH)g
z$z+tL<9x1*i;K+o+Qh^+p?2o3AX{7q(6TZ!t1<lSv8KBPkUA)hOwk#e*v}{`Djth!
z(=bq_y;q~fR87_Vf>j5*bUI9w*_ElP{U77TByDFiptsv5C#?V#Cs8QV&}`u-*n#Zf
zsu#YeJ~BUf6 at DM{LroJHG#c$<5=6qP-YNGNkP=g{pP^8((#u at 2F}I|wa)I^ohje?L
z3{>~t^B2vwj8(bG!QBxK5Na6Se+DtL+x_9ViV^cLfmscsl`$i_7<3g88}2CPXiZph
zK<}zf<LO65&Wv at UOho2+LT>LDU1^?C7?|kk?>z at sk680$i at lEz_Y?h>Il18>B&G at q
zgg^TIDKoP)1=>?Qf`Q@>8#5fXaWP3D5>y9m&?D8*I#JB&6x+rW@{%)P@$6N0i}<tZ
zqJ~`5)$ZK+FyJsJj9ICmHZTuj=<ksXlKR%Az}3MJMPY0d<gP>Lfp3LXlud*9*<U<@
zgUzQA6y}dD$ptJLuzY<HEse+SqUA`dL`On`1HI^e{u>;Xd<W8Qj}cGQyM#oH(sLL`
zUdaabV6ElY{M}vuW-;*)cT8n(8a5ruClib)ST|E-G<G4f=u*xtfP?zq4HgED&kmex
z2{T#nvn+CVDgW*iFOE-vGziqq5HC=VNNY^MAOrj0`5kh+lhq@@sQoYvVoRqR#lRpF
z6E$yo7xstFx6wKv=2y;|0v1w=NntKxVHD>do&{KSz`{*@orJbgE8cTt9PPkxed^`$
zJ)*Nmwb-brNhxMS9&3gGs7Q)3JQ+a7HRpy&;;CIC!kYxan}-l)3MrbC=CU7*c~{AC
z(tHUd!t^=vh|`CumhG*gY=Vd_N!w*_o@}DmzY_*wn8O;^pn6>F{W8C!fSjR)W<uW$
z-=XhpIrDvBR!cnN3_ofS32q8oe$~{}G&(j`C{Bb`0c*D#ut<#A?X|c-$3l?ma)Bmx
z&~wOzlqTx7*b#{Izx)A{*2vrk4T;WcbG5Toq}yXXFq&%+QI`3sT;`KmQsf5%$sp&W
zqwsZYnD93~8enrU%%Z~E*}g&c>-8NquDL3CfK<GbuveDOI7~{S<>XaV%GTWxtuqP;
zO2K=4#axK=y2?qK@%<)htO6S^ZfSJ%TL_4;XTYt>h=V%R2&!YBi>^}JxVc2s0R?oi
z+b&HFAw3$9S2Ygs?xaM>)gL6uHDt}oh-F>Wr`mb>=m%6!z;jvkmz$|s>;;d}_)p%=
ze`rvbW>0Qa-h at 8kF;BPf at ZHMZ*nn9go-doUNty|D*&3#o^+6-(1#^;iO-sWM6iJlx
zbOF2Feew6?0P0?iYKDQ{eneoYZ#R{&^XDCCliY<sYqjzy11MGG8y;eNSuC<a0!N$x
z&op1dqgF$g=aR*3M3MjFuA8dFe+7lN+9L at VlxaKxBiIyfPl)of*Kl7LdkryMRX at 19
zdgtYdiiV*r5eNpdh;mK`uFk0!t1!OR!|cUx<$k}_6XgE<8pswOAhM>KyBDxgX$wpE
zc78X|uJ<4l3D2XdP6{|QTW`BAjKR}DevOzWS2*A)9VQue_>q~aNR#GZbwNZwrEg=q
zt;z4&$z#FY<Zdke$|{-JJmM_{Ssk>q+pzwHmus}mbchGd+P=?l at D1;aYB at aUd5@>{
zk_nxzGEuU4|G4Q>KZFma7-Cb%ko-PMtC>*2qQv24j6#9qQ1RU>Zvwyzj)rP5gEmKL
z&*TL^!>^9gxOl;qx!*h7jEC|CJ^5IW+ynk7%xTo~^wse5a23yF- at 3ASoM4Msi2VzP
z^ej|J502O!P;C`!RJhH~;@C at e^>Oz-I+Us}KB;JtoYp5 at o|)aFUR)(L?R2;gAvtTr
z8o8=sLmmQFA-3{#+%j1CDUS?q__!C7+nP>LBltxImsRwo%IMS-Q<A<lCNa+?SrpN~
zWYKMqJIgJDFUqI6ux1^VcHtPjO&zh4OmtY^`e)cy6~uhoeILZb7PGk{N({JhLHkgN
zL^RsMZm0Au8 at q2kjF>dM at iB8axwdn8B%>I0;Zs{?TF}RGDeuF5>rzr2a<F^ZzjUME
zt8<0aWdRdh>NIJo&kk at oI=oopW9 at Y+%$MOIly9rBSFc`;zG5;Cxo9;o$m8>l9;oD-
z0tCaS-ySwrF5OyimZzasYj(n07zz at uC)QaXReg8jhf3lNaL`W1<2#RN?vsOQ&aN&l
z`%s7Q2bBXhq(%fov$rR^%^odRw?$wMH%)eNw+X|1t%3D{9k$dZ!Zr^wb<u&B4X6hq
z!Xh<;pq8l+yGq2XWLnQ|Io$!@>{Er0htXwl<jvfUqNeQwIexjCBq<DIAmkA5&NBaP
z7pDv<zb%nAQK+D9^}anW?vBTVO=gqVp-;{xukPe{VvVnxh4qk8BZY&c*DrSNOFrxJ
z8HALS6!ghv2GTXr{o8aUYr1>Q#|>+F#q$o3Jd21vu5La~{9tFQ@~1N6*lHWqwj+wg
zCno*jJ>9XkmvHq+zv1$x-q`*cH4Ey&g_g*jCQkEbp{xUjqOInaM at f!kg*Wj!9B2BP
zv5!wDR_v8nwJimR^&S3Z{ghecdpEbOnN90j at Wf<b(6=XtdHSZ8;2up)OY~-I0wjK!
zHs{YRXA(dm&b44*;VntUmy;jtsH>`E*9wYYJ~F at Gl7mJtQ2V95(t#hPzIaqsjj1vC
zz+wN01DLkXSuWZj9(L<g)pP11-%6IS5=T)Fq|`i4L`!0RlPBp(-BBY}3j{UpuMq|%
zthI`IYZ+eC230_gVivz at Ez6Bs+c3Q1%A7<hR8DP4dLPbqKI~hXhAh7Oef3Ia5(KaU
z(|gPe`_~Zj$$<UZJGn7ETmq<v@=X<w#a)}G$9B4e1{5pQL(L-2!NP(OWp}4S!?82`
zOx;>73oxEWMdTh`@?vdeC at 4w1FFhw>vS_`(gk6UFs#4$azXlSGu?PapzE*eHq<ITj
zMiKC{#SHEI1#Xy?NRG70{}Hu6NLC|Pk at u?h6;H9Orwf2wtXC2o4vSj*Cl0<iG1Wu8
z;#z04T-667*gcKFmpZbZ^CuS*wNPaD5y2FQ*In0SHQ%_iWFp0(#^sXP<<T(0o1^?U
z!bob+hF>~+$I!ZpxtmI8+hF)}g<Nyy(8nXjV~$W1-ZAECN2uBLx9+o~@UftcPwcon
z$?(?Q(3UKAExEaXeyYWbmjfGoS*ADSL<yb0iKmrCYFvN&*EJUL?<G^tcJ&dTsvmOG
zVlU(jggDF?ZGC9(lpq|ntgNgCd7u`hR}w3U&N<97ldH44A0Y?_f#t?R!*SBda!CGU
zfc9JhNrqj+JH%zvJ{48aziPS|8PHb}dJmaAHYF<&vIRC%y*?gx?#nRTZn-&dHx?D8
zKR at WcC8nM?clSZVTot;Kd%8U6R3%(Y6!iYmrt$2Y9T8_zYGGr5uloq{JL;MYmA;Jl
z*j#CLUAAu;+o#F^`)-Ne0Lj7UMnmoKgOM#VZQE$FllBRpl3<HM^7t5F4^s|yduNrS
zh)LJp{&k-+=tikjwrd;ChX!Ag3Fb$qxqEypHj79l2W?gFkq_VavtR$!bMpH#dAT`g
z^QhwEt%E>@WrY}ysc6{fS!EreS-$t3fsFOvQuZ@$>wX=s-v+lMI`@f(tS8nen3G8L
zM0=*E%|9cmB6l$!_KmJYzNCe$fVJBnI*1^@ggzk*ncl?BRqY~-S~r5~Ov7lu3wR~s
z=~H6f*ryVRidtiDh2o1m)CVdJ-X=kwh(EsO9eZ(Ae)HyV{byy46UTszuZi-!qTXB7
z1o<c&q*#vW)!7d<tBbNRKgV^gp{$(h&2gd}R8{k&SUY&UbZd(~wc=me1iqUe0j)!n
zkMh>^6{a8|Wy!t<$d`S6R8oQZxF=Mr+?zeb17cOm at 2|#~7H&p5O5gCc$q~TTcTSzM
z5ikqeqGi2XGdwJqt|0kNR&GthY~{#zBO_njz2YR4^f(;!t~7<Uy-t}Kk+d~PpG3}<
z57u)(Grin%Fe!5`{>HgSY at kH39Kpv?M at jrLys<VG;BkUhc&b_%&+=3q#f+3>lRT?z
zS8R7GX??S&DF*48j1&<#5x7!lr|h at eb)Wfy4=zz<dvLVTobPlhcp4T22p<0o_1Cqx
zo3K<&4I3M1FHGZ6<&v}7(ONnGYkD7o4{#p|`gxg|nK5}=0XAd1KKKu$A87)R8U)c~
z7ImOi6UibDCtH?%+bYU1RGFj*H#f`c1x{p$h{Lg?RzXHU*Xrn)!c<=*ei#`TGH<U9
zIBU!8S=3~o7ZB!7JB()%&Xl~NH>PnvD at xrNoMe@G&6dOemz!k$PR!ft#xRcesy92N
z1A~Xy&TC4x-RzjS?)%KX+U=TNlGts9((sNUPdg_dBUROcKf8RV>ag*hiz_ZZK&~hZ
z0u^J|K>Auji38uISaRbb?#|y^Dp+IlUr`fAT1YdGe*ZA(rkmALBGxf9hi<rddcV_k
z-E8g1 at WEcdt%tbyU^U-I*H`f}ZR;(eN9B^a>Y0b1r|gj2t)Ujw(2Ff?rG0$|ob5Mh
zZc8n_92%!k?BcwQE- at 9pff8!Ty0Xiw`$XYW_Ho$;>!y1P2N28#`i-aq)&@{;t;Hv4
z?peDe{<lv|OFhM^x37;k(FMf6?7kM43Ai5B=ozzNqc2i{dDGle at F)+%_8QI!U*31;
zS9Kd`DZ4YCy*Fc7K~eWaICFwzQB!iJ)dbdor2sV!SWPmfJaakp;WedW?J+vNWt;+I
z>*#?gizjpn(H<6=+mO;_mk&-9^ek5(+6nmZdn*-ofycejyHm1R)eYWsp>4$QIj-AW
z at Ww)`Q)P<_;ixZw(kt7;Ya77iz=YPV at xIldgLwfno>(~fvMD;wLjEj-!v^Oy+;-4p
z?Q>wU&r`KTbRbaviS#g+%@=n^+uGC)=~2kLVgZljy#_!>MDZqa4@;x1<d)l729{vq
z_C1T`3q9lqpcE9Id~rzCnxWDfI*%dlY(2NjT{CIy6SA0`-aYY>jkDp0!b at TbJoxIr
zeNHvAS at JjQ$^Px#iI*Kyuy-%MET3+jm?&Azo$)#GdfWWO%X at Y+uwMwa{@$Wy=yaWN
zvaO^lai692pjiZ$tX?@-9ew}2pl5Sm;YKn+lxNe-?9Ks=^n#nz{7S1Luj=!|Hb=t_
zZjayU=~O(qUdIzV{^FHLo$8!cCz{lB%Q<n9K$)f~VHn$ZybWNOoChJWxj-q~_~1F*
zTVyVMb$C(}FFVq9o_l|LFLtKbM|81P4WZ at JF_hcovL(yjn2h}-NFlXc?I<zaE7iQD
znSK$JWNTXZq`PFQI0IcgHu42UWhZJTUwiv#<f8ROk2^uu5~PU5)I6UX=ZNbSY#JA}
zDvP`jK%DShRua9BAN9dE#wF*Dtea at zV1=A(<GLHJpAz?}*rnR)bb<Mr2+H(=C2Gtb
zxvJ0_W(y$?VK$vZj#eS=gfn&F>*<<wgLE4kfx~+GL{)CMu=5=>I*PuCfYeB%cK~?G
zq`($6c4Uu27?wHEv9eR-9LT7v8uJs7|HGzP?5>>sB&Eklh+}9XW?K!mT`3zX%$@T&
zN)h&eH<w-b1g1Rwk+)A_qYToSlybm})~+6M??0H-r&S{kMy_vcH)aJuD##8z>vf9d
znIl9o;Pq%1vh7-qyu7Tn#M#YSC(8h}eJidvWrEG0e2C{PDg8F&X(93~tElp}S&tv0
zpn9M9 at V;_HC~R(z3S2FsmV^An7@>I-J#okPi4xmV=h7P{B?^u>4j1orenqps8d$+1
z%&z7{<zI6;o7y_Fk!3x1Ca^OZas?d%>Ov5taGQu20;pv%Kmb{XYsTFpl<NkV^OG*h
zyyo6_?|zLia^VD_k<edSc$<agxf4Wx%SJ!5C}8g}+{&B|22Ctky|Z(t4~BQ>D><Yd
zYqzP8>Xv5bCmqNuK%4ACQngmnNZcK58TJ4?HZXv~N7B{CAoCJywpQy3Yonk~_q7Zh
z(nR{$^$iRfex%pK&#fAY?<e6M6z$(WM0yV6)!fx3H?A_cJvtZmMvmS;tyUU{qm~DF
z5oo-Lf>KTf3Bp1HsF*<i2Kml5DY>e~#&;_#PED2$LLE0SjSEZONai2qC75?B7ZW<=
zsvh%K$UNIr7DXT;i1l>yHRe;=o0S#c9&a8Ga#mKt!)2wXbm!Sk4omziQdtyA4IGJa
zn5TW6;%8oj(7C at v{WCsYP7=AyDbB+_#o~DN;xFu_WFx5UG?$ydizYHRuxELy=zPO5
zwxk9mYkL40l`No$@H?N#hg|Y+++Ui;1g)%Z`8Vc{*4 at 2}i#HrtHV&eF`r}>|d=dYc
zYiJWRLi$ruU&yEBS3_K?WTS22#=Bo8SsXj at vjC`K<Y1C%D+$ewqGYIM<jb0e9){Yv
zYJ(>D9O{R04baxz#q<7+^=05t+p6>;--v!*gY`b%93s9Gh=C#bCbF`!qE4s=DwSGJ
zm@{aK at GH_j9_<;#i1UFB9=6hAjq*)qxofAT_ZM1k;(@aTkxF=Rqjs!OaYT_Qntgqr
zMI*NPAw^9U(C8GTs|TE-hYx6hs70}k=B4|}g+0qU14HSPwB)!G+<hcVRsaRov$z<4
zuy20ECff{KLK!nW!{?*}clO_`;9!pl^<U7!HP3Qy)Z|t%^*o6ux!Gd&#|{#2G5q_k
z10c2)6ydl2xov;Ux6oGRy)A?qQ`Jr1v_FA69THCOFcA0wAuA-ILI5ysz^1`{iqH_@
zr%r33t3rB64On_U{n{>#m0D^fX>mkjmmRZcfEXYRa;@tWmX}Sbk9kg8O68e^+~-8f
ze&8GMxzvn>V&&xda?nS%rm`$B&Fz_yM9<l#P)6;XqTwYj|8hsEP<+~^jx1KKVw<l)
zez_sZ%*$tvb1RYvlD?J8hn$spy}H~8HfT_%o5F<0wx%gdVZO<AE!YCFg8Td?H98Yq
zCgFXpigGGr3KtM*k=<-UGRLDWz at 9X2zrkIK^ATtJ`zJ1)_edw++oM8EZG2i!WB65y
zoRCTDod*oJFN&Yn?)0j$4oP$<mZ-RlWLvJqk^x_p6#CnVXdsR}%LP(ZTb=LS%dm;9
zHfTt}cmjz1^wL`;bXCXW8h*-n8=Sm-b)eH21+8NUw!{GHCt)YhN{S5IcDh(KmC(V7
zZ{3P)QI6$CY^S;!D<8##?@#T2qh7CRnz6iEu=v->MI_$M_ioMGzjOn%2|&u{wmIze
z`#PPGA&(|J!dQ;f<EolpiETv%LxZ=b3SD7|4s3?RENWG&dxeVgw9(@cTe+0|D(~@|
zxcM9|ZnD90P563ZNRZR0sa%Kpv+_}*EuP8Zu=U{|4pyp``JKIeZq8oMz+lyGon`*f
zQI}wHldZohIi(AnL#^&B^d1xR{OE)Lw4z>}>Xe?5R`T(qX<@Q8bijw^oh>Xi-V5Lc
zJ^0k(`UjOF_Cqg3Y^RK8^V{1`1O9o;F82+VU~oy}iu6a;=?cEYKkr`!JUQT36LZ3>
zC80WXP_4k{%mV*Lu|U}i##hc7YI(=oR<e;gp%faOEyf3aO>KNWw3#0i)q>5c`?5T2
z>^W0dNVEb=nn5D%XbsJ^%j-3w)Ak1fh$s9LZD(y)YShm|grl~%wgxVNG_RG)f-s9m
z1jRSV)tp!1K~W=DI!Z91^-NeY#Qr&AIbA8zI`+xhLE;--NCTW5h{HI<XAnDKGBSK7
zH|0L+6x-|@Z`pg^&U at 0$&z!n}-}7)9xqUt#CbGP`gwi>aD(WI%^~NWt0Y6bz7anY}
zSd(L8fmZMHdGqRle?Q2!lsYNJP>Jf<Hn+n!Kf!KK$>|}_%U$NgQy?W6b;i<ZdXEFx
z>IViwLeO4_F$tISsF6wyO1Ez1PpP-Swc1GZnE4&xyu}r9AlMqzB7_UjZ^6I`NApN3
zUaPG_3PM+*YJfGmh_gF$qY&mw1GV?I_~_9lHv%r0wr$w)R-q<Iv~kszUiF~R*LV0a
z&jw~sGe)_l|76YfC at rf?*JNe1INZtC!_CO7&PGZ>p!SdVZ3oXY6Gdgli!-RTd>*E1
z#U at a~B(C~c`*m{YZsX(oonK|y4pia2w-N at zAg*j6j!RvVq=RcRdNBQGkuwqoNn01g
z?_ at xZUg|J7+w(e<i<_{o5vN5?#K*%zU}@N!a-edIp+EC#RW9lrh!e8=xwR_i4{^`d
zxFChFi2Nvi-Q&?K<trE7QWo9i1?F6_X1x;;+Nos+;eBT0*WG&ptsz&KJE(~e?H6t<
z2)7!+s*Hz7@%K(A9nE&}69NsSqx?|CY1Owp2`Dy at LvzaK7A!3($hIm;#CzJcb$f<p
z>fqpOfg3LH at Vb*f*Eim{V?I@{5rsHn3 at v6R)Z7x4`<PIi7361-K1<Va^{HCKdlvvW
z#5no(ROs5j4`U(A4bXQi?*u^9NHrR236?6zbv)M8<|&wh^*h>~!TUn{0Ig`LH!mb+
zMqC#pG)Se>z0K0$aJZ=%$wrkjgNCb47UxxI8GNx7^K>(@E7eg~3pT?ft4Ufsu9(UW
z>0J&tZv8s{Vd&<sARp#zV;YvL!2;=emb1i(dAqUR5|^EuJH9-1uF=+ at Ox+zE{N|uJ
zKvWi_LWXuPPgRO+-LhE67^oLxRq3_*;c8<Hz(193KRPW;Pc7i(&oR9seF1WWd-&D4
zjn>f6VDaK^yBb*^sXoo#o~|x<YV^%>e?1Q~`CJoP-$lR-)k`r4EQz2`8;@W*Lr%zl
zaRK_f(|E<%(-myTw*u<MSJMn1<bVG&rSwx#W!=PdD5Fy|M=hc^yiJu=nqK3z0`hx8
z8y_<ocTI^1myg1Yz*iki(eX9P)Be&p*U2AIW?JMQOK at A(!P>6 at u)uDTl6W+25<)i^
zXHnu%<YD*l_wX3T9VSU#FxUa$!_R6EQF?N+!31V%b!tJJ9-5C7d45h`C|7o}K&-=X
zdMgj7?Ay|86HEK^Xu-X1^Y$~IQ$f`b-M8-+SL7AA&2-Z9F^e?;-xfag|3y;$V=v`C
z<5rmJs+l07v1 at qSD5fKU^)Biy+ogy>v9d$UJM1OKm{H?FRJ2;C8v3SE!yS_+F&!r1
z$g7~u-HTC-stqEn#fvGf`NXWUFEukMWGGA7`|{}Bn?VgB@?BE+%WNtqqt|gd$L&Sb
z?LxtSs(~$HpSYn^>`zd!I;WF57CsFkET0ITDFzMEa)VxGrDBS=yifS%)-vQ*|I%U@
z7<dxqEXI7h<P;R7M4wy1<@qCo9GEeenUxr^C7-sEr0Zdkr+r2cu^a=)3q1!^6fTsb
zxDD_#BN7|8h*BQD!6NjiyFsy6J6g|z?CW0o!ARDnZbPjfiL;9C{4g#WD{xw(;-k@(
zYm$|djkaysj at -|(R~xR_8A8IP%d<HrX(-<uZ1Y^(lVn<j8Xn@|6LkR3jUcsrAnLSS
z{OkfY=U?xo9h8&)Zw5ye<g|eeRM|BP!%)SgrJ{OzdXwrR$Kbll6shCUFCRa#_Ac#f
zd)@G{$?ogIZSN2uh8s3W-40jDYufd14QEsyMIrPveBbst53rTvPm3*;*7!<(F5Cbg
z(iv&q26}oDUJ#waN*X;YD{Ewbzjn&Ae7 at 5A_h+Y~HHfPr0-q&MN0mnOZ=)b|4)5oU
zrk at eloliO%%;JDRZf$A)wd!`JfdRb53qdW?s)aP`R7xPmBqFBIhc9Do{lV at Hu}2zH
zh=D?Hd2Zvb_l$t2kYXrm6<z0v`E3ByA9!@0W#0Nd6K#>aOv)@S#iiKGvCCuM4XQ<{
zfc9@(z8!=gZTtB6yen`DUX)UKqnTV3wERxt+5l=ml$TUi`pt062K)mh*?YT_c9F_Y
zoKUy8yk3J$eHS^rbO~eHFlOTfb=cbrc-8r#i9RQQukpHq0QsrfGqXQeI4b$_0AQzJ
zZB88mMexLio3c_)p7C&$pZg at Rv?Zndb>OtT8P8PEQBw!GIB13+u??QeGLHy%Gar8R
zz@@kT<o at R;C!!a2-q_2q^S7#bS4o|Vce~9yHWT at vm~1HuR=hlJiv9Ic*RK(G&O`Ce
zJW^}*8cYS7+;rlmsGiF4=)-MPen6aT3-R}3YWSG8H6q+a?;YRf0TK(!!Rn$BTz(5G
zAlWUIfc~b^M`ljRF6esLm+}Zob(!eu at S?&%jP;kLpep?k?9jlrtg at j`B7WEO*@6mt
z2qJ$wTOnwBi&YeP&3X3mSF>ku5w)7YDz(kF%IsOejmA*a_H}_6AFHbc#7(}9mT)_T
zCe(MS1l5uknWPB%39wVs(cGC6$Lk`Nh$tXwP8=RQAa2;#zD5&!e*<MjC4((0p!z{;
zD_dnArFGl2kvsjWG}<Lqa-)-nBEwn?LJqR~5^lCSr}ivycJ><6Yu6$2SB?<NK68O^
z8w=k#)77}DUTJo-mhnQrXT}4>dHNU{8bm|;v@*)&b#`ZVUVk&OgUhft;^)R2&tR6r
z&{+~K%(Y8)h%l3!V(cfMbN=6Jo?s!9YSXSXFW6QMxE at 6&P_{(cV1qcKo4^0atvA|t
zZYwFdLs20HaoPa>P;;#P0f>9kw^}M)qSVLYigXbamp at -=q4owDpbt4H3<}%&ns7Y}
za0>0~s^kGhNj>VtcN?QPV$i0iU at uRGo&lFN^h&cWbp!>es_%o6zTyq6 at S<QVjTh09
zqn0f5t)V-=@hDfE1JDtRcuvG at QGF^YyuWT|Hs(cjC}=|Mlb=S4L^6IrmU}E{MUQ@@
z1EfwWL1P39gAUxdb3fwfrSctU(9t~VM-nz6DA_|0G#<DOWNp3sz1f1 at Dj8u2<t;3r
z{$Y0n at JYSI#|HXHStXF|)*fL_M9PMVfDw!0h*OvkHef=xG<iLEqQ8w^x&)Fg?>3DC
zcP<R)KF)OU0KGey+lfWzG=<gJXi<<=-~18z)98e%H at aM)iuilYf$+Vi%8+_Xg{;?*
z3~gJ|Ql<Cs7_gV}mxXAu2Q*BV%*klJ1(L%MdwXPGK%D{hfUN#8Qem#H4KLot5C3F+
zdHfx9e^da7X at Zg@?W0QeI4;HJn>4&+Gq4KTp+Acx`m?&0&#zRdA-*k$0@@`8sk`36
zqZ>5NCu5H{1~ev3L>?puHt!CdA01#v)oq{MR2yDZWR=Fgde=}ZCE+z0aPViWuIKAn
zk&WfbN8pw=Cq;?<8PGBTy{D7Ka?o;z(TQ&cH;rdC2DuVn8_LR*cd=<`j`20^e%&L7
zjl%W=r~&1f;Sr_~#lsPw27QvA+c>+pSM1m{5c}WOOy9s$x}|e1VCvqp#7}#Fx#~U%
zFh|d!MHgJh+B&98eklAS-MN~?Gf)O^?CV#m%3CC*ICoFOqIER!b&U?U#aM25m~g>(
zl)oj`ILV?n$~I7~lXV%cDoXQl2!MVYesm;d5 at HPEG5=k;tj(nKMR;d!!3I~?vse>s
zz_nqkFl){ta at ePb8Vdlqr06Nyeylmwb=7=r?J(-$^(Qd{r*o8f5TgydUn1Wc<tV?W
zrn8vQk~T6R!E^`c-$c2G*6Tpl?|dp+$h<w{mmk)@$-aKOvKd#X at 98pc*#H;B*86GM
zLv_+QwzB>@6~`FfGoPn~7HAd~%d4t>=tA24Nd5~SGe7Lys-{n!gW4vm<s%y;%0qP4
zeaDo%>=tP~ZRZ;6$0mLTQGTwe+6`Y)x{To%Wgi<THtD at ld|#pJ7OS~*SpHQ39^viZ
zkG{;c$Xq}i57!kb6Es*a{rLGFOy9ERYBSa!2|?%)xNZtSDtANgkj;`Olb&3a1wn1v
z%Jcvzy3TfAapvP^9dPSxxKqPb+<fB<Y;4g%q;6HUiiCA}B)Bd6j3+Kg#p{HfxwI?T
zB{OGZ?CTPWwB6zH8d6l!e8&S^XPS;?ziYy<DK=>v at j`tC6K9;XU7l&K;#1X=P1ko8
zz8`;QvD~w(6sGEFvU at t^V6tsme}o{Tnrjb0<*K=!?h2hZhFiaW6#|Z;Pq&=I*{w4y
z0>FJ+2nEKINE!FTzmz^w*)(E_<!U?op2|Gt?Fw*l!Ir1scU6dzN8e2+F4rB4>9tsH
zRC&^RNYe~jZ-s8A&dvI17QFbhozrmag{uSe5o;=%t^c^(t#FIgxjCs0>Cw>1rsJX1
zjG)tN`RBPuAt8oseh*p)A{G(NABWfTTwIRvw$7G9#VU46km`Ie4)emwp2BVHUq!Sm
zlRsjq4Rh#et>lfh;R5Buxzqf*xhFz*%D)YFcd0NI{#vPVklqU9ue-L;iB~8HNcmWD
zY48*Muct(vPuGp`pQm>EU-y56p)sx!3IJdg)_D!cIIjZm)I_<vlnP(A#Z5*b{Ov^K
zQHq^sWc=2<g-_prbVG>NxZ-8H_eyk$B7WhOTU3<(UdoEoIP^S9bM^PmMKs}h%F4yW
zKQa5E685lC%iL35z>pdjG7gc3OILJ#`gUiLsBa at Hp6#1C-nK`(82@;$+6vF};3>KK
z at wUpjoYbek;w>!=41ZS>CfNAURDYmb=V~$%A6#RLd71 at F=+P~gx;#A7av>ga%l~)b
zPM7OMqLso~;}#Lw%SM4db5lMyK0f-r=<x6z*xvU~3O<p{_$PG;F+&vgaU4dY3*zJB
z{}B6?e29a#3p3T8YrMXD#nFMx%YJg1PjI}wJ-Vx?oX_cZRMeR+gqHLz at xdl^)x{+}
zU0uNG$avFO;gc&PWIFc`W~Q22<-)@Ai0pWxP<^UpTu`b1U0g>8uYf>?R9oVYFfKVV
z&s!2oe&3p1yO|an7YA at TpH)q>T>+2tfN|qEClhkpqyAXk&6f{ghuhOVJ&#HI``rYJ
ziU93<wJs;ff)**`>KaH~YfFRFhBWQ2FLp1YL=sRCd`*7~eR9S$&_1QS3}9WlJQIev
zoYs;P5&bPe^xUgQKrl4$@ZxTqoQkK|xojwabfqrhYoac~OwY!9*q?y~09Ul0zWoI7
zHD48h2kX=*UFy?CVEwrp017s#|E4evOTchx3u4ZzPnQ-o%nbu<o|IFTUUhSHO4s at A
zo-}NBRswtJvg6nX?!~Vek`Gs0aD6fIvVlf4u at Q%IpPX%q=jPLbpfIdaa{r_fsTkG%
z>Xdh)D@~r8>-o1LQG<Y|nudkSA}$x=A94 at e_&h=l59`v!$6Rj7R|Qc19^|!iXv4_<
zN%&KT1mV>W<m_+s$RkYMxAA at 4Yr4qXXvP<VfYu)GG;qs8GUQ0*o&%oOj>mNlWpLD4
zyQ4zTsw$b029EWH-L#qUqU)J7F780Jn{(Tm6&#TN;Ft!OUIT4zZ;u1~*e)azSWh43
zo!hrFelV+mzcfQh at ZnOXSNt+s>XyDe=HTE9|A^3d>MtEBnCv^b@$o8C6d`C^ZL#XI
z at zm0)P}e*6nfN!-L at Y&8U>E`J$m+3xgef{7F6q2MV{#alyHVP&MZ*v-Q?PZKua}qZ
z?CdPD`9j=hfsO~DFSl0_rIRf#cl$lZZL={?7plHqhAE7w`wB}m|LVXL2ae~<zW2C6
zL|sM*Bc6d?x&;N}*<U{(HIZ`4w<~*kN?)UL-n|>$*(nhg{!Kl^#YNKzhfC;^SN8A*
z9_2N>n`&axB<p9;(Q$njSv*$sTBy_<&KxV*|8u(XU^C0ITM)vUX?jC=pwq=9L$Cka
zu0a>pO_=_w)73n)ruty%vUp<h1E-X0<j<*$H&0WZ4nNXnzCE~Ew3PWU{?fzLc*NNw
zb8FZ;vu8rg1lMa9tyjEst9znyJnnqCQC>b3VCkx=kx9YuzGrq??jyd^U~TzS)l*|i
z=WO4Sz*FSUGZCElNamMs6b&X9mH1DpIjR7*1R5&U)Y95gmo?j!IW(nG{Z-Y`yXVh`
z>~~2CqNN<xKfRPICM{3R0Sk0es<jB&MtMhW2{$iDO~ubKHQ7N4TR%9o3KwOf_fN7_
z+~;L1S~Qf^Z<~2DX at VOEJtm?kX8)?dIKdN7A`y=6uBtb_`^<oD at R4Q(88w`j!yiK^
zYssXkw++7~I^oHLqH<q9H%kDMGNX-@!F?4|WRkXXJ*SSAechM at W*)pa7*BE<Acq$f
z7Y7|IV`@owNY$%eJ2-fK>>^$rcD`r`8IUCM{@`18e~s^^bH^FcP_mO+ja#q<gKmS8
z)eA5R{q%tzr}xlleEGxM1H$!N_;dYk-)$TAAa+U2li_qU6W|VA&&r0O%QZgPyD?Y1
z`rFbD+t!%()EWOg+E?mI{qnuOtW4+n_3KG27K_zy- at Z+Q<zzVc0K)3-{!6t?`WC+O
z4e^;Z6VL$FY$+vO+bTwLQ`2VOUp4&9`^WAMG8gd>ldA at nJ}+a+nE*Y+CMS{t1~avo
zMP1i at i|$Yi)R`As!HcT&yudg$#=#%-_h0j`f?f8^Ik=K<TwrteinPr}9C0KjCKs1S
z;Oh|vR at nLZH@4Xg8 at jZxpx~h5o3sN|2z+&;uH1=Era;O=uuQ*)G?XjTXP-3dOGov8
zFJ4m1`>!<r9C1~UZ5d#0>zTTY#y3H)lai)nnHeg%F;+3>gAW?!=px73zf(k&`I$?g
zpG15J+8EX{Mf$-a)&dB_Q_YCrVJFDv!#--<2>%ojhIn*HAF!bV+*&ap5eLX%KbX3Q
z7zfOjN{C5@&hhB at rVwAlA7~^FLd%5bhTmSU_QoD+CBA;`!tV(%dI(_6e-|<sl^Ml@
zc6!src`skCWi7oguG+56_2pHoc at y*N*L!x2{z9%lxo9B2R+NwjSWF0{`~D`tvRhuQ
z<JH~0jo7dA^?3U98jk#fFS$0?dXJ7i at 2pJvsznZc`8BVNIf2+n?-D+7jHPvECzi2{
z?K94uo{q5N@}>Fo63($W7BQ0B4(l1)!^X3%AqL#alK7mA at rO98QqZR%I${Lrd7b|s
zF!#T84y#B%_0k*^N~Z>ewc4vh^YZe3X4+~CRb58|if6w at 9S=Vo+s5Ka8&neh#Hr}_
zOfDeRK4&m!x-PDZo!7S5y$#e1w5p~`ft4uRt-O4E7RW+<{t|Fc+j0m%US3*C+i-}`
zKs+ZHb>NXeH9+R>j4P~cxOycc4V##pj9<rYp=A+e!*i^0#$7lHZHzo at MXy}R;{;%W
zxi-Fpu02|ZR9W-t)GIRLH(EqNV%+~>)x#JHF3cBq at 1oIYfRa2Ge_mvCa<Wt<WZTWn
z?a|AZFN3e7AB6e&NiPF+B>`g|Rq7b>NZHU<l{qtHd&bDswOIeXV*c>35dirYKf9hO
z1^|qI?h&I at m_P=4;^o&(7RPWQ{UU%Qxw{w6pI0X!^?%AknBkPi%zcDC-N3-0Z*|Yz
z&(CmmFbAzdXen4(aq-~a$O)MnZVXtJ1FA(}C|4AyKlrHT1R%^#EaV=GV<pE&3+l-L
z4!1%~!??=3|MG(C2um8*@p7wZ6B84%p7am*^}}<yQVF|ZcUsx(0D`Y}a)=V1Pf!r^
z{rjK7!oo{?hf5UNo-#MvX at I7l0C;+RKAS|A6?ppGlRk-m94-E1S2)~2V5`>G-Bo_s
zKaAWxj3lFg$Ay{g2FR$YV{qbjF+RSHIGcFJd08f~<0^rpJYYMxFs)ec{+p2g>O;x?
zE{#5VvgCeprU~fLMTj#8=)8!@ZoJvr>G~|Z&DPd`DK+?6e88>2j6wu}{#7Uxe+p{+
zbC3DM9M-5%6 at mXg=VIp5Er$`-S?0^gBL#_&6XK08$El!7GWow$m;4K@#xyhaRDsOs
z-(@*JI&ekLRQIgEOA3qtwrFEVw{=m~KT4GVRljH-e_84+KIZ;afH8jKGH0Kho;Oge
zqWx!d&pk(fo_DtK7mfep7j@)x(Hfnlu=shYUl|Xt{py{SlVkS#IisR0(yiyj|8oK!
zbTN})sK600Y+!KE!vx@|Z*G>4ylh|6zLWVMLrW4()|Kr2cN73tHc()oS8b^~>^55Y
z{bkRKEB{|<)eqCe*N`IHx>PRpTY~$K0;{Lh at 9cWcD4uxvACr7o;j6S9+GB+UMqC65
zTkIbD&#z}4(sL=^SumKzhY`V#{~@#uM%hxolo04Yufo50q^6Wp9RFkJE9)pBozox|
zpneYcyTE<y?vGCpDDSUdLC5~?K70*2`*-ig)8o;9_wN3B9d!Kf?kgUaD}VP4zyI<-
zH;TTd3Hs&lix+MkyZd+V|Hrqium|xZ_R0->6XUh3TLAT~_~{3X{}gX at qSx55_PJP@
z^t7~_`Py{_<;L<H0~`CC=PMmM{FICF;gNV%xxWRdRmKC_wtWhEXI`i>7Wu at nF81`&
z!20_(CTn|1OU{;ur>{kXe_dUlivDq~AHQg)``}JR6Q_)3KhRWNzS1i~S=;kAv}F<7
zoI!Jh)}L!0O%n#)6csgkY?Tvh;n{wdv-2|OcDi%az%27$1H^#=M)A$*gcIMJx+C?W
z at ItIDAzuQh-TUznP^TCFv36rKjC^USdp_W(0!z9oWa9eHo)-FK^f3<A`K#vnzju;h
z|M*qVOzGUs(#L*ZEcCYdCpFsnIU)tGe0r*j1bzA%fk65Ey{GVJK^dhY?`Vgrdg)dg
z?ZUoE=?}mg?!HEe5yinD2X5Y+tu`488rZnh{p)p2WKe#cnYXw1nXxH2dG2`xUrq%F
z{N{AE8(p45VmGNcM#KmvSv%^!nlw_o+_zNeK6HW*y3L>Z%@ktL%<C~Dreov!*uAt@
zY}Uig#{@!E%;+p0tT(Sy-b|hMtIEQ|xf5NrCiTbUY9;4HPE<Oi#70a9cDI at oKF;@F
z3Gi^H7zECg)z|Lj*VUP|Hs&JEtv=N(qN+ at rLaPz{Q&v_LMHy#!cbp&1qz-P8>wjzH
zcfn>fWslC~u95zTO>pYH{!@xvX&ihYZKFCfsB(G10~O97WwojXlA*C;TC27=ev}}W
z>sTE8Y${lzs(&FkeYu*UvBf$LZ>b2AaL8DlO^Q>=-m}Jj3(uDSbWSO+Lrv6k&D0=4
zrK;L=ysq#04NkmN1wLJ_QaGe2;Dc_CJJL^{Y+zuwl36+!(rfoM;FexK-Aus4OuJ?C
z6D;5&^f>E}N%=7++gb8HE|{<G{El;OSCe;T|I2?&KgcC3(v|GyTC}Xw$M%asa7k%h
zY2K&8+9uUL{djoIRoZ5^7r0(3gbj*T6Rj1qNedgXUm+2^+{`oz(bN=F>DaV-%<PHK
z7*yx)IZ7 at _WvESSJiYci?$O^iqn+;RbSiqc^y at -%&u<RoOQtnWchejI+5>*jTx`?&
zzPyU<;!MqEvpBTp`8R7db3fRoV&IdQafF|K#R{WG9b_95aO+mAP#gr<`mO`VpPjt&
zw}@YJ2!OO(Ih;B1k2yfJ8v7_~c<%-;zp`mTj at 7oDt@Uh1xCQ1;M+v`*|4i-gU=@|#
z- at x26i+)~2p}}EB#^r at UeKX8x$yCnu<I|Jx!^n1OyHg^C at IXvS(NvD?GmlGuNj{+`
zph^elHwdsu)^;-`ZlQ;#tOLjv0c&sI;yL!R=38DH>CfP;`PS*_K4z|s>w`%->Hf{L
zK!eX%m5$qDTTlO->+Sa(f*{TYjN(briuj!y8)k(X(MFSgS0(!6;SFP9Ia at tYhm~In
zdO7QQ+n5 at o#pI^TUq_O%()cuAQ{+ at mJ#*%8$K4)VR4gku)yrWmRT;c&9+2T!oF5W@
zPd^F#xuD1lS1Jlu&VJ8YJ(5NKW87E03NSozoa=^qb-@{CWeQ)YG?6NhU)|uthhrJb
zDT}dZO6d=g5kcMVWUux7Q39)}>3~WOnKgvvN9i?aKB{4XwcXM8rPG=bH^Lk}{r>QC
z_iO086&~!MFyY(%$!|A8 at E<N&k9_jD>>4D|W)$-~N3FTapD{q)gI_j|a&=tE9*s9i
z)%cVeb`;iKZy=V<@4G#0wJIlGVJv#dq!RS0);g!-Qt%S*CM at z;yO|1i&A!F#?Kfea
zZD%-H0;r8Vfi0uCI#EB3+85?5hQ-mu*Kly*VWx78o;_QzOIw1+?&b}ow1?KzX88$K
z&U+T_K{hKQiYHXuS at N6=zo3- at Q$O4NhR+BQJ)MVBdz|$)^ZAw5q_6hc-D&cmK!#6C
z-Gq80Yx|fA_bF?B7o+WxK7WiG`iYA}rsT)DbC!C?qkjkjbfF?q5JVnTDi<O0N9)&Y
z2bWNXuJZerH1QT+a(`S?aJi$Tzvl2W$<7>;dU(1>LptL(P_RJn9s7{7j!mg-G^6L&
z38m*Pvi?-(!u1axWrLBYJ$u<(Z?ZT7^f25M<|%Ut0Hp}FfmF%<UYDxRud)D&l#Cu4
z?r6C3LE8WN@#tH1xnGLZqbhBxC|cug**|A>hv#-A=$*G}&OM1kpQ6D!6V>?W at 3%JL
zZ%u+%<m^LqAb=#iuM2_pOMT)@?xuRWR_-k4=;H=%q4j%ZFWcQ;Yci*axPrdCT3w9E
z>c?747<MO!_NiH7LDEI%wWK`JCj7*vk5tB_{DkDs2Xe&%8(4W@)A}8YVx9))0?N2d
z>3L462~XYHN&ZG!aLc-;J&U917AGx#ay at He3B2ZKwX1zH+L@zO3APca6asvk0d51H
zN?~swQ|8vIGj+*Tova<rZv1G80-oxb+e~faX9&eb_aFc1H5`S!HbFx~;gdpQlapR2
z?uX6E*S}Ft`|^8JB$4M|TmbnhKS at Lz|I4(N`h`0>5)^jn)n;6!8)z*sJ|Kli*3jVs
z)okw7O{ps-Z^3gC23cn5s;qubR<H)VRd^9pVQe&H=1%pi>AyGq*Xn%M_A_xZ4rEJX
z;}1FU1U1<R8SLHsXT?+D;bYV2g53M?8Vg*bB#ZqXXvlOgMWaQ&>G+p&QJuT4~<
zpJSI#Mtjykc29#W at V0?X$0rUskr^fH=!1h$>q0^g=@*cb^7C48p&cDA76|dNV|qQu
z59zkQbnZAA&FU?0<)SHsjlry*o!>Mi7;pP$dvzR-9>mW+FOiMlx>sx{HXX7d at dTD;
z3Rl37)$50R)T8CL37z=yOn<>?U at Pa)n%|JZRD&{Kc8u!8VU$6(mw$+KI(K8pKz(t$
z<L6qIrv?22s)@TgJRfb%rKGB0pDtl-858iyG<CVMI%Ra)wxCzLVP^Y*8T at lm&{emo
zyDWKovv0(g2R^HxvYyR^Sy)4Hm93ngXA2u7`uIbT)216cEolTTAe8y?8?eCDcC7)!
z>$LMa+QBZT?Q;m)kyn=k`~BmIuOg9-pF0<@g2ge>wAM(9;LquZyZ;P0#xIZLYm}Oq
zm{jCA4?>TGEdn4OiwpQbPKYv6wphJwZsj%VaptZ17su{CY=s9-2o`RSzYdvC<g8VW
zid!5kno-!g;nqTQES11*y{(zKTu`goaagXd^>a=zr)H1Ur}YfDECqu$UH^pQDvZe<
zgx<3dmaKF5wXs9ph4ItUeA)$K8e9AHG3Ta_0k%O&Ar2B|K_=PMI568uFz+_O$RrUx
zG2)`>{SjoC(lB{-=x3;vI2GQ)OF1F0Hd9q!#EZNXawf#k{*U(xO*hQ+0-C7+Mt$c_
z`P`WSc)#Kq34z+eQ at T1FAdDk(Da6ZS-8OA>dg&-jY}TrPJjZhQ$2|@TrQ~bQGEFvn
zL_>A8nH`#z=BDLb$H@;ja$deF0lq)~jYItx=1<vK+EC0uYjWtvDSx!;_1QB&5E7;x
zS at PuaHZD#iZ)Y%ClAY#ocE-*JbM4N at qsv+$yQ=kN{*slJkg?vt{CYHp^$6ZDDLd&|
zz2cFM)Hn5?H#J9r&x6cw+ZtBVZiL!gZbL~_`Io7KS@|SEX&*YaI29_oWi8?E0qjP5
zpZ{QS)F=Xf1_;YR6oaeC;7(NM#q}yv33_HTAL7kckxJNm<Yd3 at T7I$eKK(o^+}HN<
z at pJzp>n8JCpnhLXqd~ENvVm;ome|RuoVJ$|I$I@!M|3a!kiYDZfRvZ;W{EiGqCvCS
znN-;a13k}M(&0V+lj|RLs?ZBXJXU0_xm&|xTd at 1dTd#5xMCqiGrg?_g*f at -ITP#UI
z+A0{tlQ~*ntXx|`%&0tZEqpIs=TFGrdXR5+21J7 at vchWv<ATkb%rG;;gq?F8EDi{3
z&c>QZq)nuavrnDvS_mij11o%RpC05Kb1M3hYxCp57Zw at b-(e+l^}=QuN|2CjvqE^e
zyD?$s^9p_W)|_zWD|pS}8(gBiwzjtEN~MWGeYIjac3o4z%Di at whFn)U_#FFGJV?@I
zv+7=Y;~(uKGGle*CHV+rHh4{;zDkH9p{A)YGVIwiV{G!NDD^PkyELX>{LarbAX>iG
zgJr(U(Ic|GZ14<_CU~29dX`z+Ob6!ISah^qWcz*_gjTreYfwBjJ+&z?Efv_SB7HMp
z(u6Uhkbz=XHR+(YHocL{J)>%$c*-JNI*c<chHPLHwBmRZVfDN$MDirKV`Hl^ufF~u
z+{Surd`^_mevslCsi|jj4`zVF;dm*BOM54rB}va-p+HNY9exUPT<h(rXv^n)M at elo
zJ-M}1sWlUbYYncyOUUjwTJ&jDf3L5FS8LqQK(w7T26Q$iEbmx*9`Ei!WvfdZpXbk;
zfV_?$kG|2*`Wuk5EVF^cm+fHU**_H%w0j@)*SE8vqS2(LL6X4lKZoBn2S&f1Eckrt
z2FR=X94N#5wtHx6+~1k%8&;MpY^m>9EUiDJq>O~7mwYTQy}{bP()&FJqGM)l4d-`O
zF$0&}+fx01?7d}FRo at yfy!NI$rMpAA8vy}HDM31<Te>@x5-BAWluqgHmX1w_NOw2f
zrT=rzJ@?}s<G$mL_Z{#0vTMbh^NIO9zb7`_u9)E8`vo>(|G&&hw(Ev#14CT at 1q^{`
zK(Y>N3~}H;3;O>%_5kp|jcBwX5 at JTIpL@G)kJG!ky1vAJZhz%{wJb4u`A{1*Q0ae_
z#yY1JpaGY&s&(xX`VX4IU+yGWJeb0<3${@CCnJpax!PnnI|xJ~1h!r$4%GVJ7qn<k
z6;X;!HM3AtL00^-uX_?HyuYgkoc*M?_bv>X1J30}^v9*k&I+!3CcU#LKoT;U8kT9p
z!NL705&#h`UXt%j at 8?Fr<{c<Nimp~OI1HEWM|NtU3F{6P0k=!xt~R^dDo&<zIPu4b
zdcHIMT at e)?`o7zAR}3HMQ{*L~2lQ?3Z#3?Y1hik>eZmGDoQ4E)r^ObsPgpIWAcSGe
z=j!Upg!``ek`thEgby4ne%#kRHj at JC+QrTkmK%`tH2u#<S^akX8o&p9K?c`{i6o}<
zUuT2zh`oI6 at i<8-=3?EfN(i2UPYsm>E=i%1P)U5NW@)y<@;^YyD-sA*;4KD(3KY_+
zr67Xme|*KjbMR%wUmB1HBB3Q7U!MQPtc?A at m%3$a02j!X+$FbCgAW96pkoBS90<S%
zf{z^aM$*NHPyqliP5AHIu9#LtvU~TqmO9cDFu1KdNG4SHYIAdxc_<Mg(OOGb@(T$T
z at H<K>-m>!M)?7AuFWTnbxw|^)URrF>zZiSRb-%M^f4(W^Z>flxlX<$;tt#tU5ugjZ
zVVt_ at x4-{gpM=r)aCPbDeLo(lD{)~n{{Ys&xGF9OSlmn3DUZ0?KFZaeCAbj{e(W|v
z(w0phna5xx7<)bvdax)b4O*LZl>eC&J3r6Y2r{@NhwAH%Q=Jzwji9lX+r#yuve3U!
zIxUrvETzTs*GGP_^{L;u;Ucq}Q at MHU1$<umJPC6bni2j}De_V at bB{_96yA=^dh*qY
z*fx5n<sBC!8y|y*KdF#4H%Xbm_`LQX7|)6>eLsG?x!=XPI^UlASv;3ort{eRSVPx;
z`|R=_4;WV3ihGps at wlDr`MepEDPjDWsI;`@r(T-9(<E5we9XRt>Nec3g0b1Xpz+nl
zLu2prBL3`8_=8)9u>E&Ibh^O^vF*cs6r^UPWSsmJv}o at bgTm-3;F0N`qP&nVNiJ{Q
zd at hl%XM=(g8lQBSw<GZ6+pEi|l+ at _^q4QCT-p1#d^8yFPl>3X7L^JZFtsJ%Wi$m}q
zA|oTW=(qs7>{<*sNyNZw8D>!t7hA%Pc8F;|ujvaM7k;drxjjLbqAF~ATQ<758^xU4
zY;sFk)Bp!-R{}TkqR6Dh8T>hsAJodDl_3Xu4t#B*hy94uTqCGEb7Y^QQ~Yo;en{s#
zthd1HS6aZ8FE5`A25pM#vT$=d5JP}WIri%Y#VxTCoIr9`Y~W{1->OBgXai-*+UX&g
zqbk7kNRiHVve4p;<Rds?(R(c={d%3>Hp_<wJh<Jd7%B)csqs;%$zr6Rnx}_EL#S|?
z?TG+x;Ab8@<q7hSV!yi<Wt0<4PScET#<=X%k>_LMT(og23TqpqqPm$f at sz;(I-wt-
z9_xV{w7bII5oGy|Oi1RYWX;m2C%2gCT#a1BoS34fnOc+8v(9W(_pQ~N{oLZ*9IFYe
zr(O`M^0;Jvk>S|QC2g+(j4z4&qC^8&t>Rv|2vlEcRWT9d;E?IoeZ&OYQZ4Z;*Ucn6
zx^U3KoF~51eJaC73q5)fL2l`YFo_c$>=~%T6u4|OD?>#r*C;wvx2}e4a{L6KN?7QH
zlOtLkWgi~c$G&i%vYo0H;w)z{9jp#+;1`+Oyud-*%Z3po2RDy-O}hDTlH*Q|MH8!a
z{mw_TbU^s=?4X^sOR7=OXADkNy={ovylRaMalsk+q{QMQl!3B->XIT<=IPKi7x}<N
zn5DzICRB30{(L6cxyBJefRe4q at 2uYnP&~j$Pm-SIS#%IhlFMcnb6&H{LW0Y2IDaiM
zzu8{p{>?`8{Q>J~_ at Skg$W^`%v8sUku~#j*TY%f at qbA%dq+!F^KCGYJ<@neGBl=GE
zc&&$-YV$rdBO&#IA5ivIa$<?kcKjvOxA;d^66D4Y<wh&tEgQMMfm^7rb8c*i!(G6`
z!NJMMgcXPt*I5|X&Y#*?^98CuXt2OZ(s<9OD*;>W^^d-RE{|DiVjcC5cL<vgg9Z;?
zkAut^YiMzIr&SM|!Ry`iBNQtO0YABcr|-yon?!#1z7h>9d5Np{RnQ@}?l&hB3RTPj
zrpVG%Z0vX#miiWBa~TF;WF~{zF^pNVGKV*WTz#O`<rE01#DC>0-VhWtW-dhbx+nRW
z#&;YG3V4 at g!5JPh6h1NTkcOz;Ueu=pXkRusGvKKXR&%6d#YD1|_>|3to1?yq2^FJV
z9Xq6vZ;B06jcDt<ML5zl)Zp5?SXpdwd&+E*&SW}V5gq67;+ef;ExBb<!H6ktLM$Mv
z5Y7|;TeL;8$tu_v2e at sEuAl7$MdIv=QgnT<DK6Rn6=bV=FhM8mztEMsKtP?@wXndl
z)Le%OX&cYS|A}cQ-)_jz5|>w6E`09e;7j3V at 8X%7Xe57NHeM0McfA?Ux*kU*`Xe21
za&UbmzKPyIY5(QB$b9nhvTko%-^V*L#S!fbPZ3>N0Zz_B_;d$POn|IwEZg7zN%O$w
zyuJ=@<!TM?(*5ZNq(_#BFw38cf{%3Rtroc#9!`$hBq%;(VM~l at Tg~+M51GU$a7b!*
zEkm<p4X@!2!}Y_wIRAcJhz<9?mF>YeiSTP5FNg+rtjsCg$IP+Np4U_YJ^<*q&8t
zp&c*$TeKIX3*6O`Y0&r36R(t5-wXxsl53;x0KKO~l#MPVLj_E`8I5&5n?2S7YufvK
zfgvGqzs1eMV%gT~)b~Sk%5|Q~qxGh<=f~eFCEY~RcZJ~HHcNa4oG>zjA3J<wTv@`j
zHlf4!u(z)_n?>0$_)nE at zGYcnLVzNP67rK-Em2iKUT&-%D2F$#lh@&+MbMR<@Wz0)
z at zg_%x#=RJL}o|m*LMx{pQF<>aLlQBjD_%B at 0a_KQ=XTQIIM74PeqgctVi0HX9~j~
z_-S at P#6vfT0c0_J4Sx|9mlmJL5VdtM9L@^6Ljnv}b&W0z863^!#;m0q8u+nHf!y`W
zkpWu1#>ONU#<5ZrB*Ttz2(N}LR$xfEIDikKW(4%pPW#$NQK3N1#=?%6?}3Um3fWW*
zlSbe=@RCG`$<OHXsET_ at e-s7tigLJ<EQWH<m5f)bBOdYkX&wn6?4&_q|Go~tJY%Yu
zwLmn^L|Jd%U^ajh(LnvNTJWO6LT?;?=VQ6v&f&7edzxI|vJE%oHu53F8icuG(aZ5o
zOFoUI3Bl#~=B#a;Z4VRO2ZIkSMf9GSm`+1>at0CnuBxkd&qa0`1j=n^*g+MZUHc4o
zFxGBVp!G+{@1QfwMpy3W_1Qh2O4e>z&;uW0U<y)%afNTu!yT$*R(Eik0HSJ{+LMny
zj%OR)q0#sq^w|*<dfSJ#!~0>~rq6OgZ`pyg#N#0OtT7ut(C|{fdoEjW8#vOs;TumK
zpUYrAY%-f4->mgdhPG8GZ!gy>Q0Wwl6)|%HPe0 at OqT8GHQ}&LBSK03O)rpcE{zC1L
zLkE(^q&HponLWJ+zm`I-T<JvK?nHZ`EULQW at ctA@EH6I;UZNUURMP&8{j!G>NP~(L
zNVqx1T@}g$iWm#@bBx>Kt>y1(jLn|Sb)3MHKDLk#Duh3_p_1Emb}#dzHwMD}Bai~E
zf!kS074clZg}Ch)ztDuT-%BqPAr>lnRT8YWJ8bKA$TSAD??yxtZ9y|?VEK3(F_7oR
zjb-YHw~@Lx-GWV#nN$Cx>}^3-ylgNiVP+1#1a9^Yd|SzMV>GRl6X$*xsj?$(UoUz3
z{gmeTkFGx`V(2A3jD+5)JBg$~KXh%{r!K=BM0SKNj^e!tEE_G4<6j?KVq(3Do_j7M
zBXdR|kB~eSII at Z<&yjnHgS!7>_pv#)<9jT8`t$rgN)HuN)T0;?50i?sXYZ#A<M563
zwE|vA{nSMUCO*TFIVoHgC|DSFnpUhxE=ZisELa}b5j5|DlIW?`QLUH+3L*(`&{_>K
zMl>_pY`UC6^q)<BluCc!7qozue(OuHDQ+|%6i2xEV5{QSyoN;iz~2;p*kagS-&(wK
z&~V1_#t+zv7eAflDbU??J{Um<1~r^8B+VyBpJp<|KqdF9=B1%+P4QkgPV{?NUp?Nu
zHqa|6wVyV=T&0B%#1z<>vsf|)1mUbL$`+>6FC|Fg1}|GRMFFx53Epo-uE3QhA+XWX
z8cGj#VQBXIS?|I5D>*Mbg$VGbSceZh;016tIW`tj+MBf$fls&5)^YLBw)BGClgW7=
zT9c<SBQyaw-tIe1_`vW=!G(lW5)RNa%|9uAb^iegW=Gm^tJYf7LLR!#`BGO=!@qex
zY@}q+raG?p%l)*lg%MFz6sQFAcba>KKT2Z&mdX6sOK5Fuamf0ZF9IT7k40naqY$b9
zsx&~=27KTPu8^?`u06Ywb#hX4IWB(w at V-HNx^8rb<@y*MSFG4suZ22iJTRMtsNRM2
zYl?_hma at 5_iRnqa_d-rT%A2l^fM+MI(Z+Az;-;_>=sZn1KI_-`IW#u~IQj0en;yd-
z#Ko96IbjPpEVO-Om1ttRYzV~Xj#U*8?%kJSI7Pke=>es+>|*S_BVMP6?Bs5#cgpE-
zJhqHzx^F0$K(x^03}<GR<8}Y*txx&yRJDN2%#7ZTwwPa!C>#biTfNp0bN5@@n7*)m
zC)d506^f2og!@9deL~WvnvmehD}-tO-j?MQRYNs%rv<hW>mT%Vo!B#JY@{2Xr_A|w
zn3IO17GwSxwN1J{pn73RD>^1dN@?pc_kOEi!(e{8wuVcXKb%y+;nzkCX`PEDQKOK(
zkBvv$nmaXf<dumNwzSYl<QciDsp}r(DFGTqbj+{S-<?f95LAh%_v$wTk+^`YAtIMw
z-{EMnEy`)-b-+lvGu!qJ!{ujgRA3F|*?n_8ID-w#JRDzQFI%{_h-KoY0CT;Ym>0cA
z=SHub4vP4GdV8$CUg#p6TYI>Jnw>(<&sEDxR_Z}Ov#b~&888A(l!xewYrvfrMaB#T
zp1<};;FL!N!mbz(IE at R_s*-93zu)7!aVl%WH#VR9=3uF1eWte9t<}}VG&jVKZUv3~
z@&hMKMB?mIlhzXc%J$gn$?E#06?|iBVMd^9dfH_vEkQbww}E3oBMd9MLCt-i-P)}h
zY5KDnLZJEzF)V%ldm8kqGINZrETKZX)>q)==Zl7KD97R+=B*yz*}}nXWV^{^QTOdh
zl^s`fW&P#(G-BY1cf^C8Q${>&_SQ<YFgB3v$o4^1g0AG!)7 at 1S1IVimVE9<}dH{c=
zzRA)c6Iy)ToSf?f8hhdqqCd2SOKaz2g-^pBVxGkfg^ct{M-o;4!|~rMgl(HPmd9_{
zze$jk?HGC-;!|LpF+e4`;JiqVF1>m&7wb@>x`ScF&oWx_OWND1&$AZU^KR;$L<?HP
zc?I)tmA;;j_=<3x4omQQ&N`8tV$>TDL?Q586qp$h_Nnkp8$JFg#R5s~VDs?0aafm%
zjCF>?5cE|SR$|g at 1kGHP_pe>#tdqxM^>Y$5Ky`&|SF&Xo$1o1QC88un1e&4`2<;vx
zf9K!SOKIpNZGU4$==g?C6=A(B-I!}w*6xun8s~AS0|7KHJ_j#vFDVAJxA1z)db8Cp
zR~&1uNR5~Z`I*b009d!=-t?C#WAZHvI8AewsC`&~%i(jM=2{*=Y3<-Ky}ka`_jJL_
z*^xS74vB;cG2fe%C+W8iq}G5ZJyNj3dXv9)=1GwfWEc&Q at MzbztC+@zYa6Fq|FW4)
z3bXUq_xbV8R+Zn`Up_O{r#mhh7q at EYSE>lherRFrQ&wD{FwJ-7_&UeH^Ui0hnI=MJ
zu?ShZ>l$;r3C_g?{I1R-sdT<M`O#=aG*16Ir#P?!veJjXBm8P<g at MZ502vQ0bkxU|
zI4jQ1SY_$AG>VEu#fyNpzOGA7&L6?H4%b*@Ck^l9z(CO^ft1NvY^j;>nZl((t>8Ca
z%c1HZf?bx4#N{z4<O?@97r{)o*Dg2WWX3zJBjYy|Zi`@ML)RU(zRzzp0Z9BDe@>}l
z?fUWBU7v97dJFPTw#{XjHA3Lq<#aI%KnJ$bp{$BeF at h<+U2b`3^kA4|={Hx+T-GcU
zg5<-A2_#T6OV*aI1+nV7;(f68V)1KagO8Jlb})xaI(SmdtW0n at IjZd?8 at M+YYZ*Sx
zwHdcopsd??w5UhD<_>xwI9g(BfKw0c{cA@@Gv-4v)%>IUAOR3%P{{v+CCyz%6`?E*
zoUL{bW+<Q6ePF=$%D{08%5azYq<7y`Z*^O`SXW?(H(F+9<-=Xjk~z at yF@#ug$$8yS
zo08kG$Iz3o&9>M9;kS4lB7L2(XOb8{!P1!DE0Ooy$=H0)ez8^`COOI83hiGTLF$+T
zC>6eFDu_fgwWrreK#cF+Dc`qL?;qL7ZtbI4pZh%dHGWzo3Ks@#Gc_5{sBo6oaKr<E
zV_ at ex0`Ycg&G4#b(n%Gi<7u+^3e~O8N_?Cev{yX~2Z-!K(0NKgw-z64uZ8bJfVIm?
zyZ(Sl9M)Lh+FBo!bzy1GX>(`S5(8PWm8p?FvS)enjP5JC{)@Gg-Eqw&7b8bA%08^E
zw}vAacV`klPJ?L!nYY6X;`cTfDFN at L?)BK at fMof}Ql1nZ^Qnd)wri1SdpipOXRFG!
z99DMamy8IZ3c#m(OTd(Db0~FDU&P{g?0I8 at kIhfYmmcI=I|;`Iof)z`K|^<Hnt>L6
z{QHmAinJKZ)dv(sJ_A_5e*Ugb#~Z3gENt5YH)TrU(f#p9?H(mxto=oW^3>tiikuR_
zB%-Qi^=^Ij?AXC5yli%0pu2qsrocv3kcwz*{V3}_NnnHR$V#peX&;5La&s$_xJ_E`
z8~F#7F6`lr(p8VKm~F9pkDB$R54RmmfPTEdlg~abkd+`_Q*KgVct<XcMAU4~ED^&}
zoHBK)%8~#smF=S`>BAoTjQzNLpRMiq?EnMC%@^gaK-^EH`xYhk8lq2;V&A$oj<E+^
zxC~k8T5Eh>aN{ys+rIi(N;#tcx;IrP-vG3~WTrTpxYHz{qpNK{qdT46tazWf<^gcC
zYRV&-O8I48zW$3$tn^Kz6gf@}nMEd2N|@5oveMRa_yo3D{G)y0?6XwLU&%4t(syk_
zGO9k at Pn6+Cw+wGR#y&}cOFXVHId70{#4o$zKXN+xdUGuWp~5`dln7+FVyPexI~$~J
zNwft^K+vcfnZwm)e$S(94+o?JqmOS at J)%!4>GQC at ZJu%`S`Q8`B{gkVr=8^UI~oEy
zcf?~ge6(cZ`iz&apXQZCC*Fu?7631;%hb{mznt%*0a0EUut>bk2mP<W(Fp5N|D*TC
zf)T7b&rIFlUl4jkM at B_Jh=Vt{94tahAt|4GD#z6i&lRH+e at SnBW|%0;KrZ_M25Tf1
zUUFZRLj~5oFMpBw2biN|={s9b3;e`Dvvj&>^h$5u5}dBCnmVx}bSZVS#se!iDi?-c
z47-l3<s6Jl*LZLYujU+XOrEy*I3rpPSk<0gd!;i^5<bbF;1&?hiPirZX&t)uJoEew
z^T^HE8%#rKc@~ph+b-Ar4|#S*$D~HLE5IN0=ESp==P#jF+<bXBey17C!Z`(=H;n}i
zGF>c-ENcSDOb~?&x51SU2bT0rFQLy$#Jm&=U}BbnLtM4*_k(qrfS=^u$vzyt^`&ny
z_T?+o-CwqNnaN`)D59uG!?iu~i at us$Jiq-ouh#co)cd9Naw*vbiv%HBa3Ynu^{F#d
z(wwAxeEOJi#JJ*&hFx`j$%i at 2*DrbR%;-69X5f%`N!qk6K0t91Z8fhupwd+TcklT&
zx%^cDA#mV4dhYhZ0s1y at Hmk<@e1reN-I7%M&~9y7)rh6 at -?;#9kc$S|sK{1UYcmJn
z1DEXw;kwl8&b3s0P&2Y1#`ck3ubi%WD3IzbYH~`;BuCZ46Hp6P!0u?{0o6EAlLg<Z
zch=V_FH_(8-0X|=3$wYLxSn>v4XMJCeekj_U(iB*1nP1)Ks|deyytCkrV*Gj?UokA
zR87L(Vs({<4v?Q9f0J<~%oe at BoK0{(_oG+hO#PJ~%{zbr^!D_)@(BsO8>>+3j3KPr
z=RpOq(4=Es403F(@>CVlysbur-h*KrrTMJ<-CtrpCmQWO+zkRbqiSF(r<$n<YJV(4
zVsOvxNkia3q=>n9#n_Es*}5$y0gz0>U at o@?v4}!gGpmKvQ(ElB#V3y7%^h#w$X^>$
zM#q?r at x_7NaflHEzr$Pfq5y;2thC=BFtu0!%}iz39>?=CZEHtgLgVZEO)hK6caG!Q
zbii2(4uJR#^h)uU?}awKjjqeloKT(ih1(*h!cI$RP>e;RRU1-Rez<H~Bk9T&5xa_9
zU=yrMD3N{R+SD0~MlN0yW}}$r7XNWTq+(EpsJO;HSv|CJDmO)<hWiI93+3fcu|Ute
zW2tU(xiTVIdIRJa_w(~z1A}j0el3O}zUf4R6|)_tv!)u;u_K{5z+9J{w|}zA<ltBd
z1asOft3lh=^lL}?z7=$)U`P<YlZ_`paFfYUYn`zmbiKC{g>s54YO#vYR93m;^H7&v
z6UND|-~Nm(M;o;LHH)76o#l}E{^KINjD(*%pJk#6^#JcIJ&cB3?~nZi{cvM$b%bi?
zo`<h8&}p4$-7$W)v)9b{J4PxN53tGFmwKDk{q|-+zMxfl_DCpTabO|7p&R7xO2V9r
zgU}pDd%&s=?TC>5rz|gI#p7f-UIWKZ61JPb4`H^(XtRemgtS5Yx81BuH at oYX+!nov
zfboiS_b=VvB2dXcpmCvL{}E=g!KqW<*Q`#i5c(0s?1H<t-ae4SDi7Bke*#+qoPyYu
zAvD~5vE#VEOok#W2ODra%6NOf_W3dwU^MT5SuG;H^$uTc1q~d){ZepWV%Jcc|Ldm;
ziB|%O{riMmr^1e#^HR2ejX)_7h#+L8ky{1Ykfw>Fip=}D)U)K?Y%_5!nnn_m?l66G
znam%rzPa~q!U5X9-4L<R5~^T7bbi=!+hnordwhY9^*GdrWysCG?AkPdcd7zjqEJTl
z`w{$$%^<1Or17oSFA5-EYMSSiRWW&CKDW>|-X7tAp8ChpX*gej3Iy|(*;A2S!OL^Z
zZ)`ERb?56G<FW0J*F63xeRAJH0nk2*YO2x`{@qFVXp%5;Dxb06hZCrY^9VN1t-jV_
z)O#FV72NL)1HI5lo6#5Wf%R!LR{J*YwCA^?4VQ0WGq>ygBcDEJXa`J}w(@fz34kVc
z90Mchd*&kI$dXc7VGQgxVPIhXI{vLQ=EQhu80&3d-lcVLHU#%3Zy6KAu>1FKTJ&XN
zwX&~DIT=4j^2@~hxWg<jtj{g?t;(bzU*0}EhtW9LO6jOACDl*5<D139(c4oMj9$!#
zRNOXP*oLfVA~vj5Ee8~sjDKi|UB2A0y-f`qKlJ(9QW|Ys38D<5*VvVnE)Bq#X?^q?
zQT1t_Y$ZP}aU(lA<AX{a6(eHiO%E&0%tHGL{hsW>?>_9`T0}&FpZ14q{Sn~ASZ_sG
zVg2xdyE;iO_uAWV->Sb~YtI(FgwGo2mC$aP(`L3S3B!J2oq79F7ARerproA*(8x`g
znM0?}Hh2+83l!iE>pN$8mv^(2{CRV+CiQ2h;M<~uwyjni2SdJqiIoox3Z50)dcDhT
zCZPzeqF$j3FZ*}rC&|q!bT}o_B*X+#9?fOM{C(}}tm at 2MIpn}yB8FM$_t-!a)M0($
zaC8L=8^O=%_gkNn(#8#gX>zk>7wzV_y`CqqicHvsINh3$oQ)hc$L}G9=-e!5+uXE@
z;cZL{Y+)@Nv8-*^AVKao8~Gfjc|*B-t;J$&U)kBnVssP#cm6xnX5RveLwBJ8Z&^dQ
zhRsX2_;V%~P(*K8w1rxwkpTanvuAJm`8XutZh)6Q%k>g)ZSRHOa^Ct54LmbuUVdG#
z!UDK<zdt)Hf`c~<bv0SYlL*J2y0<;xgR<VvD8tF`D?+}glJwUK*Ha?|3Q1($4x$Pl
z$h{qglc`N;IOPPsnbn`uyxnOhD5`1z-&_$Y{8>HC+yrDG>V>)CW*GVV=WYgV_dkZO
z=T@?oLK7Mtj!%=k`Eo{g+-5DAGPtvqKD+y*S7!Ejq|OUCURZNqFwDK|w at tkCC0_)|
zDp$his=w6cp)D{P-<aU|nLfi3kKCv%!!C^&co4q7?b;}a&@29Reu$TrcmD|+RIq9>
z-Wm|&4M~!v?BWuODn;wB<i^`p?_+d}z9}(;G<&L3lvp;cajMa4X#-aT1aNIeWqKSm
zf-c=de2}92hp(MMJlYFn*K&X6!MLN05IAwdfLFi!!Fs4(+qgpKLo)1p&YBm3bx8Qv
z_CZE(jQvSfE*z0F9+}>5-~$-p`g<g;f){e+IE#9n at GKnA<EPSm!j|!DrdZLk79pBg
z<*&K(yykYwhFx_#L at Yj_O9j&kY!4X&eZZfHA9xHL<-!0u8ew+CKy=^_&JKc1=-|68
z`_BJ*NYH-*YIJ{;Crvgt=YK+le})ed0ueD#=B&o#zwX=yK4Xa=9Uun&Y)9aF5fcHp
zWAot<DllU6_h1R>Tn(f`&RayM$^OU%h|1p2Mm^qgxIB4O0Z;vVkrr26Z^-`s{)7V}
zj#@tvK#}vXEA+6Ll=MD;@!tb3{6vNP>GS9I;bF`?DBhS}5M%{s2MueuTKM>}O1#UW
z{3NI4--FN+dWOAn?78A32!@beKP4#I*?qhUh;TYs?$x26emtKQe7IZY(OF)Sh<~Is
z0p$Og9XP+ve~$<p))Xf=*?%8=f1-{5I at B=C{y%hyNIU at MWWYlqU=?n;j-vrsuNRr^
ziQ7u@@2NZLcf(1l;aAkxzmud2TwFA0^1c4p?QLu0;XxQA38bZ^p+o-RsmOc=5J^Rc
zhaw|}M9R=a%H~9Nn?9Y^1OF`sKVBZb-55Ja^2>ND#ed(qEhYvdw9}+(&6y4tg<!X&
z$Wt`dNf1QyViX>|{|MlpquH4e#N%?tG_ag?ir2uu!!Z930r*yBplv!&-FG0EQEusA
zZpOd)1sn_~@TLO&{eK8Ig^C#XH2E1A|Ne(Dvvu2n58d2M{~@y`D-rNR2N4v!zaj!|
zfe3Jt1cP7x!xU;Ipir3-<NuqrX$qg91FxTknEq!t)xi*|DD#*9a}cloPYt4w1^D at f
z3R$W at ssD|FnDfJ?;(b2kzCPADTVY_gk;PhDxp41PQ|WoDhB)ot1wLa1WwV<*-v$*R
z{29afS!rF%PmCl at cT~bo`kQ1Xjz{XLIBaxXRGqYWdZWqZbH=gRf}1(fxk2mg*}PU1
z%eCkejaf^!*oU5l<t*8mtH{69P>TVj-;`L>4Ixl at 9VxKErXydqPsGueTB6+gCyE{X
zA!lk@>e%==jg||KaKs{_{ZFj9hV*#6-2`>wa|6DrB7&q7Q7tL+EWS0M9QB9oUs7bh
zH~o84dxSuSPfBb at 8`1Dj>C3r<d#p6Is}b#|=1O(XHlS?^{(1je*ew{StiW}yCInJP
zP0x3RNj==xk at z<d?z!m0g{MfWv}_w~)R;#!=s^|sj~1f*OUgoVz|N|BGME$%4b4W#
zo<CZ5$f{5P6F8MSK#7D8LAGJ>4^;~eo72H~rdM54#83Vpss;TQxwB8W{xDSG4qTfo
z&x!VVg870K7cvmXO|HR-4&K3yoL~U?n9A3XW5Ge7sbvMnJz|K8Vl1;0DS$IlzR8#)
zak6x+4;kmG+0fI^|H{wsDi}v|^Pxg+x3P1W`1p3^90BJYnHbw3vNQa>xM#CN-J;>u
zoj*KneD;W(c~*4}LSWL>!CE}koj6C6gTR8}_7d$v(5Jt=s)GEV>2c=h$eNseZaTkT
zkhaQqlr%G=1#4W#UK+)1JRkti(5rc~zkbERz&P*8K>@#?c^MbJLEVL>U$#sx*Jb_O
zC1*@%XUvqM+eA%&!7`-28s)q at R{$oE-5daY7P9xP3K+$5aiIl^ZvDn)W&*u6;KCQK
zsXveKM^ER5L-(zjW|BMM?eD=Sf4Hep+qvzzP+K!*K9B($sCe6%nZfOl>VCC9IKCN<
zD9uHzRwW_X8M8~yq`b^0j%l#0K*PcJ$vh#!nlC3-M#yA4_p*2B?ULd=oJjJU9zX-)
z?iYLSiS`}kq=VEN7!pv<F^0CXoV2Y!Dg9-6N7la*uH^^J=sX4RIVTe-pYkR(v=}Yq
zVtKw#B9kGBNDK?cwFjm!L!vQ&l|4u15)7MaW9mE&Oe`RTlk^M}E-Bk3hhA`*5}i~T
z at RV{bW=<-LvT17W_|Cu&Pl?V{oeFs#XOd0$c!k}UyECpwB+VGZ8&c84;pmkK;{-9}
z@(7BOsqbC%W-Uu5fupNszaEMA;cpL`3m!)U)BjQ{U-PfpC<Lu23b!OyT6iuKeq?K<
zbD|;QR82vE7dZemoJCzEwp#5)j?kf at Z_d7)i1ul@!*5Nnk81D(bk*oKUm)-KvrnhN
z*_|O&IY*^mqG6n5gOnAY+O2FK<ZFiujMr~eoU&hBiV;3OD4+s7;#Gtqs_{R(E6HDj
z<4Od|q04?jhZp5GR#_}-kbe{+3%JRFLZw9sq$+WK-cfTbjOf?I((n`8i3(-Sz-wtb
zB|x`>=lEH|W at YavXIt5xpBHXXRa=`=UH!!1gsJ}5S0y;zIgzoYah*CpjX7!!|0)u4
z*eLpLBA#IuA(}>~6(73!*=me4K!k+d`?B&FfAV7Nu0?lCpr!Su$HLX!?Q3&=TXQvf
z3SW{-Ax~@Tu8Z`SXwo4sn9WDHJk)aoA;=dpDCnu*$mwB7EH7AxP3(ukngdNLkGbYf
zH7{O+mV9xShvTFGgNB%J1jEY3&5FUN;QFa8QRVfpzJInIgeC;Yig*pbQO7Y2a&MG@
zXYjEA3H)<uH9LeH<Zcy-MAPPa(0^>}RKTp;xy8ssOW`)>Svwe!=+U2JpaOX=H`o7)
z59QMeDIbNw%qRk1@;fDBr6jvhwo3-|JeJ)!9(@jn_PBTMYuo7=cn^260~npZcLq?j
zXwjq*_Z`|~h&6%`LLT@(>waziIClAJnWpTCPC*M#!{&{h@!aSF%I+3CgKP;==E)Pg
zlnbvP#Gz@|A{ubRrFT at tAdbK^GG_uY4r}qr*<O^r6rcMTP~tC8OULksg4t_DJ7AT^
z8G`@3iJU=N%Tj$+<Z99uN`#~ux<Q&++4WL}y`X<8_!BvyzE2*-%O`~;`<$Zla~IFY
z{Q6 at X6gjZ-gD;xdv`8Ue_~Gq_^eD?fM)~Hph*~q|iCTQD>ybK2-x4^SOi)!*GcXmL
zJUn)15Eq6J;<Ryu6Bt%#J3w^@w?Z+HrM at _s)hKSfYL*re9mlu9L)M<R7~RDrzgzVj
zthzu5=1Ay=cM0mo!18%TP at G|9ZLKvwJ-!gE=J)_-%KPi!2snxynWKgne{b<Ao3c{w
z at pjd<Z^#Hh$imCX$(c=cB3Rsu_?IAQfzf2M$yAJGFr0n79p~UXEs=)?ZOqEjM<()o
zkZOsAqjViwZCq!v^T^1ztz6?cWh57;sJ=LA71_(T)$2*V(Zwexcb}|o9&PFoF1BF=
zp7Ne-|AuSpVb=>1;m*vpsah+2B^ybLd)B#Y*cLh!&CqFG0HzAepB}z25u_=Zcwg`i
z#XyILiwnWFvAsUZVdmqAg{xTQxOi*3u=fyxfV$Az<tNBMjBEglg5RsRy5XLp(AJSC
zgn9U%`#sAr6UfR~R`svHlWhl~p&AmBw6UeBIFvj>9F=SOzjVcWnFLum&5N?Rx~QfN
zej|*bhEM&TX8hLqZhxcrt_AIsk(W<k$KV-ASjq)7+6;nt+>eo=rcRz6I#KEVl3MvK
z+dpy+I#4 at 6Z+Ye@Z1rfL`W3>ykKUiHEc`BphmIJ&S;LB>-1=Fb#o6==q(Fmfy at En}
z-nlLs$I2)r?3yuZ*BbtuiY3qHmiJ&MWs8suBM6m$C<c|neQ7kx($_neNe>!is<rBk
zX6<ERo6+vxJ&{hJ9Fo%$LiatB<@hy<w>=TJM|OPy&N=<X>OXTfg&5Pf`bY?qDm?1@
znel|@z7@!({;P?E8+OnDv&O3s(T>BxdO>w5?#)kh>c1$&lj61w)TZGVI*;z at eLef%
zc?jno4|_3+KbR2XrOold(Qe(FU<TB!hjdoQVu|Fc!MI{BheeJn+ at 56WK;Ow at 8|iEu
zf8{>E>L3$8a5J$Ii>(&oc&LYk+0JeE#&aS%u>Gpt{Jz`bVNKB-3&<XF{OYvbMW(}@
z at osq^$1!BK73Tlj*vg!o(kQi)FfK%%4);^QUQfhwozq&kV)T+xhoi{e)sYJDP6iru
z&gN_Kxz~|H=vXBJ?=T~)J%T_0Opcuz at m~;$yPOA^&*hidpy-2>J$aA}nSf*ckwh_R
z19O`mhwoK_IVO0;tNHs at 3J2P6LKgPJQCJ-HoM)nu)Vrcf)|HB|7T!3B_U}pQ1|uIp
z$5r!lxpBE#sQ+R`0v3SQYbZORQ{78iR^a{-@};0HoLm;7c1``#YeFza_Ik>U7wU<T
z+v`4icCR1b!h;UDc=Qf!7f5F%A&2Wm!wf}>!M!l<ruYdKz<RTYX80+Fe~MZCyrlDb
zqV^v<KlaNGv~AR-OmrU>Q{8mLK?;2z95~YwsmUEAvq#?|n3X|tmxdYPQ0P>K+Z5)0
z6eqNc(h~5 at We-bS#*E{*x8}|bNkmjlQ0{wt1bLK?jm|YkDj#Zq%d>#R26m1bT$DRs
z)=ihU2n*xQEdf4A;A+-1R(iqihhpqyV1Ax?FVp4;jzyE(I%u_*EO&(sjahNJyV2Yy
z4UY0P0>ws>d3%M9NcV-Knu}~+=2waMh%@@<Jc!1SrrqXIOmYEF>0;S)aO6_A^BKv3
zR2M?>NzS=YX%utr_IKHkSANp8sd{r<yrP<8e1LN90=X%K3R=0^SK`e(3CnpH<!+yR
z(}bePrQ-51Iq_;2|EF^OzE!whg6^y0!)Rz*cxg5*ag+oraVL3f_5JM3Wb{QTHM(1J
zE8>dUA2DC)_q}v(CB=KiqnnC)s99V>z$yp*>jjS;YZ(Cfp{8!jrPjF>1RV2z=Jstu
z3-byz87j1FT~77OpE2<8Q0QnNcL}(~=Vd0!^0eSD<vR(%C71%D at 91QxW7tyUQlY*s
zNEKE1ymJS`{m(M-ndT0D7HoQiKL0jhP1nhBTp;W{8f8oqWGR$2*bKvRP|UeYTm!Ry
zJzJNfjC{F5*Ip>S&UmYL7x{hS#LfM<kzWK%nK|Z6l;ozTVe2~jPIgg(LSuRh{rE0l
zlugG*kp{Od;)L(PdM2*iw}tI8mE_>QAE)0s4liYqtH5Z&+4r&pU-Dsh;-~=04IMyx
zM;bx+&&u<k6Y6rXN2-MIZQZP6Teef(aepQ;&UB(JCC#?veO?J}JrL;{<|>lX5LjaE
z=dMJxKutQQLin75mhd3M-OvM<C%Ym!z|n_l^eA!G;0Y(Wr5ggCg=hD#W2Og1o&usf
zmF_bnfs7A}mhkX?Xhh^YQW`<b9T at v~5n2E29$VO2q(Do6S!378-V54=xxK4_jKB|?
zhN?95vcEt4jLjr;23I>h0j}h at 8UN#n(8qqkmV<$CYmgz^)16dEBVRl-yl6=A>)&%r
zfJ!;U2}3!Zz)=rIm46EUkSHtZ&^ptRBG7zAPnVyCu at 8UbNUok1fXTcWy{czFlOj*`
z6$OBM2M;YJ+~IRqpFO1y!%wE*=v&=okxIR23gG$j`F%#$656#$L$%A!v&Axgz;2I2
zn2+<<o`AlQa^vd`HMlm!5DdcTkeXLl=yMEpw-~WnQYq1^ktG`@A>Etk(%(Db+AiLG
zS&)+z=}JAxg_4HZ%qk0=cvEz4u)Df3PrZA1mlM6hjahoq!L&FDL%qmYMQ+OhtFj)g
z9{Rd&REXG^t!9=Z4xqk?mKcIhf#RPYSwSVO2<I3WR(5tWX40TFKfgMd=9n2&DG|VE
zqTzQOpYo5H^*w(MC_f06tF<t22;=wQT1Pcy{TAw7>G`o%NDep7K_O?e#aXTrvVwqB
z<JQ~#?Sm3t?s~Y37sU9D90nd^rw}aWK!Fw`jtKC-QIgOSWJZoWXz5DA5fFc{kQE@;
zp#*k1#dBa}IqH3v?M{*yl2f~(HQ)K*Ipj4`k}iC!v03L1bc+kI0A*#Onpxwt)Q&`5
zJR<U%?4s(UDp;<6t at lz6Vqor#oo9UioA*^?q2U*5elLlQB%{>kcjniDUeC2KSzCY2
z-xM}NbPGauossC_deH)Xqbdl)R}mN;liuh;E_rBZpLPaX4Q(qjc;4%9>Kv*Xu^mwe
z7am6XX|DpD2fUuK(Yg3&4xO88piRRxk~(SG4Q(6ny at VDIUGH;}7V8lSAb%&F%X at z&
z{1 at m@vo2%@(7m*$wwr2#8}|>)R`i&`YJ4-W#E~-mB+ieatmraE8xL@|mg}>Y`tcUp
z_EOSNb at X$9!H^rcF at J?ZR*V*J9$fBt%k&}+J?<TR at 7riqXW2La*I16eT}+Zt4<Cpx
z6;j{>ckrNY at eZiy)nh)5zrh6SUS->3^v};3+!UP0`1yG|Mc+IR(6((iFw$fEL7h}N
zXiQ at 3hgZxm5F9T^^Nd4wNEY%6j6~$((P)HgXej4e3~8>Q%c8-DVGQjPkx+zJx8f;>
z(_YMB$mJ%{tdX+c_)U{4VU*}BYY74}3!bP>8hK9~0<e!g;SD#LbWxQ;*ysV#fl7BB
zK&Rkv$)0FqI%h%{Axk3Ccob>gDP{F0W=J3IA6$mz&-Nqp7AvdY1SYY}fz26qw_`ye
zVJCBxf;MhJpgrv(@I7*6<iy)Iz#w`9!KD`!z*F;O&bqx#syk?ac->3VyWU>c{6LXc
zDQApuu7`YasKg#B?K2vBv3v9`J5p1jZQao&WCRqR^I3B*3>nI7q5Fn)&r%gEcFX+^
z-C|vIpwaF|P4PQ?V6aF2mDjr4YV1_cjf$1t1}QuK%Ov%f at +7dY$B}MKnf5YwY6dEq
zz}%C|qk(13Z)DHbV)TD=&s}Ak`e|<ioNIg(G1{g{WI*zDF*ya0&Aoh&Gh)Kc_hixQ
z^S><IDMEnZqmJfuHfX)7#)Sy2F0;4PB`%tKh<xr+l^96#)7R}e)w!4{xE&a-i_%$8
z1wF_~{mXg6qx^j|3lGF(>Dnag+NRRgR~M=6_IH)O`u;#Z%7WCq&CInKRU_+<-il%s
zh(Ez#GZrCPeObT#3&gu|-erD~7S9WH7zMr6-QwEI)eBC*cP(1Lory!Hd_(#5Q at 4;f
z!JAX}%&Ex=xHiy7wvduV&-;<AI~NH04A{uom6D^=1t`iq?aaI>W3joVYpRQ`Sj5FB
zmfX|<H;!SqrQ=|6k$n8vw}@nm)6 at ZR+aAalwoO^q<3+Tk)oc-7Qmxi at UX#DpV0KP^
z2f!Khh9zilS%i1O(DH}_ws4g|->B$dkcL<50Z)gAf=unTQ+RhnS<1G$rZ}-vktIH#
zFx?2|J3UnI0i2f&6Ic86dAWYGyI@}2By8!{0>=pKVpy`K%?l{W9BW0?P$nNmIG(}0
zS}()Md=FO32oufnjtvh{q4hb?1Skd8h|SzuN0$F+RUR01en$t_#)1l<#k^#Fb&e5Z
zWqsIjl-Ou&Wmfe}Dr(HNGn%r~fUQS^g%lMb at O-P5&A6`eWuUo~nXQCxm^*hryvhDk
z+_Oo6uge?V!R@;4L(;Qum@!b^oN5^S;fLe<^#k8D6w}ECL*71XtAnn at TB&yBQR7qe
z1Qd*n=N;V&XNx%Q5cYL1RN)eY+`)nN*SpwF{(0?I?R$xP;7ZCujDwu2ahLrTkZdi3
zmgx;7K2>1zDtZ3Pc>Bfz*Cs;~l*nX!7o=ynsbX{(a2RB!J-OeMwt%rx=}0crJN#=v
zfI{!zxd66u at Yz2??Bjv*L%lWNC{7~c2V^B5Kk~kuK)Wn0wxug&S>zn%yO$LFY+bk?
z-~Y4Dcx{Op4)|YZiNRHk>L2)NRZ$L3ZSwFLkH>4N?OC!50&bk2Xh$STYQB!(eAmsG
zDt_z!gqj|hT&Vnjdps!PzwAGH*gf8o?|_+I`r=cg``0FwoN-W{gHUGC3t4RJI63Th
zT{v;Q)QKO}-uyc9SuCGTKe}0P5?(~^QA88qmV!5|#pBN-^go2Aqd8pBPH{4FheR$%
zA>?83r(tMl at Cy<)(J#Z&UY`3|R<`e7nzV0+&Tq;+Z#W<t(IqA<X!GEp`gPgfyb?OZ
zkkMPe5<Wutbl>CsKLV))8VxMZw1nA=Z7s1BTac4|aqPknzIAKz-)XQgOX5$+%i_(<
z#h9_C%W!AND#+W!;!)*J$meMw2APp;yOIQ-q<;7~J+DabGM6B$(Bf|FM+%1}P+pfJ
zE6hey!y$j at Sh_0<6lN`|D%j5}Q++0g|2UGOf&w}l@*C+AK90<h);K2DOC7f~GF)Mr
z3NoGou_fhSYV?HUgfnDy6AyUIokqr+Ba!!drd)En6CEs#&;8x}n5yOG4|JdY7uH=U
z3}~`^R<hYCUsDu2xZ*QUk|Vol2{aR7j|kSgl8*3a6U*@tn&ZO|_xb4~X6R#6`(HS?
zCo8nghK(A(FD<ob8Ubq>7kzqZ`hS7JSDeAcScqF)GUI5ub4Cfc^M|zV8g;B&a^NWL
z=1u%qD*aziuV6)?P6}pvZ}UBL&Vcj~rvCo`hW=j at _`e6_|6d-&b1kGmpH+jsgK!*<
z6Mw4msOGC}B-!FQmj7lA9ss?LYr#=gRW(lEukLbE<M%y<4&!D8Xtc&7o1GNiHFyz`
z?sy4s+9ewuQp)N0r0ZJf^d_Csl{X6Jim1-;WV$q|-#Z~K)Oq*S-<BlI%qUV-<cYls
zILz!X3WwG4S7(c;%qO>s at K3_-V@=M_ojvND(#piTJX^<_&%Olw1iLB+byxVGot?Ga
zdC2jHYR#20yDV!(kCblu#x)Y{!fH68`*ZZ;{uA68tI#w8h>Rk%P?8ZH*YdI)I-fp@
zitdj1Jg#=$5`7405#D}AgVWO`$*)gx85%E7S6<8g86)F{0ehNE!0A@}AZ|f2>q7XQ
zm}qmR*vKazLLbrzA~K?`^IbR_P9e{GVMHXk@|wn{)ty at lmvWp;5pnlx6m%C=y<l~W
z2pG)X2zsX9>Tgik4vC(5bq at LBLE|HFpK#)J!TBA9g7WF1MH~;-n-LE`?2uajo{9Kf
zq9%WGI6tvjTTD#Tu9|QeUj!H*WYbg!1z4|Py%Zm{B$DZY<?-H&#V*PaO~}<#z)1=h
z!mRh?I+4Sqki#xN;A5#Y{wde^bL3@%7SVYg?3>e84O}o2O%iVWkyucD9+IDjMTO0g
zzi<^*ga at qR2VoDbGBD#|X-Hwf{{iD0;<pbf!VcKtYN1T;v0qUtWYyP(b{!OxAYYuF
zedz`NcJK|VsctA!v1xf8k{DcE1xEmXeeKg$3*UqMOGakwbRAhKk78%wYLrnjQG)fo
zb!5StRiHc%tFjS=t|Q8Zhy at H<Ppu(R-0*JVQNL&Y_B-H0j3TkLzJa4TMS+GhKvkmS
zWHy`x*f|i(kagN_A>)pvrmA&(P{}$tRTcOp*GK{87rgV#_>}si-C`mc&oDqgz?cEL
zIf<W}Yj-5eoto18iKwPyVG6<J5nDDd{pAwBc&)ldxlnUo-zJ}M&wdnW`nPh1QCAXY
zWEgN>>Y1D(D%MT#LW>+`_Ai=JoxQMCn#E1A{s}_kG-rUu_nDIXvqja+=Dpp1{PAtx
z at ocb>sgu^NKe{U7ck3F=M at 0i*X2Psnb|Fs0V#v1PLn)R<6h*No0hdFPR8f1ct<L8L
zb_2^<#w;Hy5f-+lr^+GZpV~^t!<+YPXI(Da><*-jvbYUqqr=KSxPWUnW5(b4R9kg~
zug*obYa33InG@~j@>p{&2H at jewaHUNOZ#2CwJ?@QX-gIt)70AbHOXg~0K?+0;X^ZH
zSW4Y8<N27nU_AMdz!A3ip&7F#xt{3UIT7$Gy0QqukkDVglh&~E<Tu<JKW|@|$J{q#
zb}JsjD?2<poVMB5Mn?<kZZz3KWomp?aZ=V$ZvRhds8!YG$UV-~K%`FA2-d?HUq}X>
z^uGf6H()mq!09#S6+?1oD(rG)S*KT)D&23nDBy9kNWJfT&_a^j at A8O|x$E|}xwUg)
zB7_u+a<Dy7{M*D-o1YzH&3aoo)&%MNr$!Eg)0>I&rg9E-UVwM)qO;fY<cjNH`NObD
zjd*9~v&dvZ0CS<OuMgQ_xg~~FfWp{*L=Yfrdc<@1<TJ{1<grjc7eaB0A)0)s2X+Em
zsqt- at 7jQ81rcL)4LK@`w4ue*XSM9do6e9 at yb}B<sg<ZN{UaQ-WD2jf7Yuj9fhgPa%
z&kAsd?3WOGX=Xp!J*EW}iE;PSPid3bB^3q4Lqp0|`LIx13<G3n;EGJboo)&b^v#0R
ztB%^9SLhg6X8A==&IdMAi*?8x<jgeiQq$7L at -r(bl!u0_9BiaCik>(Rc`3)RZSC#J
zSXzpt^4f2C^g at u!`E7&SH(q at jvZ&%Wm+rZ_K<V^BFB`T9X_++-y?DMI6N2ylN<S6b
ziTKvBaP40qb(Pms2!VPN0^g3dlBNBW4OB}Vad#098Qqf#%0hJBv8>L!i7tPFDZL|a
z%YF=d2FxHua6}qAA+?WEj9cTVjlA*aWQtQj`yJ*7dY;dU^VH?Pt7AXUYC2ek+bir9
zm#UHkt~?bb3<N&Aq~q=x_}xLHB+T;!utZ(W);I3}r<LPm2UI7P&jHHxA6Tn!UMx31
zAM&%9Z`n;2AmMrp{j!S4q`s(!o){p882BUs14t|XGQ2lrT*yj_?mkCz4KZGLCwsj)
zt=8%-URM3&9OK-|iXzw at x1!NV+{i4zU54_DNZBmgmZ9UMzUmQX!M^o@(dc5Qre)4e
z=2V`D$OlZbR~T3Nkx&2=8zT%mCGQ?_fyV}U3zIHxD(fHRC*v4Zhz2AaySed1itmak
zDKAO4-ksimHwd}xb($&;HKIVaxpIH9bWfCtF%UGq!qasD`*u{QN;;0Q@|^eG8}&jN
z8q8ic>w$xNge-h?M8B&S6l{V?JgB9ffK~YU5>XFW=+w+o_D<jk8E1VaQ(V7N*Q8q4
zq}d(gGP5LqRcCq1c6|30YcZ_!*HUG=L12=xqbUa0BOV{G&#yR>H8p-?4LRV#U?_9M
z8v_=eRbUT8dP`bIkCa>4LJsc{jO at TBzx!~m->aZAf6?0MU2W8SvHx1)qkjZ%s^bdd
zRq(St_>d#;9Lfv*fcMRB%Lpw29p+h}9EacDG>>={jN$W=LGoi4cs?83SV`s0qNdHq
zDOK$9emd81a~WYp6TY2t at eo?m*&3;t_*^MUO{1~H`>QlvV8W+p7RR5*0si7*<?`oX
zS;-0 at X*C-!X3>wO0{=IlM3Ze40<JCIJG#(OZU?MSd^znuiM(o1)#M30Tag4P*s0 at j
zKa9fr3?9RGoYHP>Z at 2f|vEw?&341GxC^)`uY+1_mjrM|nMoo%-z%IW at OymJ(!(MD1
zn5^`u>MTx>rD?!nC0A+$x-6&Zuww(>ALI{AyPj5i34CrV^o>Pvq;o8hycdqV0h~;)
zzc=XpxW0gfetY`}-H`hRxGby>*f!QXVq+23P@%pk?#sD$7(twDQAC9l_<?=NA_ki>
zMSP<z-$A}4^8=HXmd<Aa0~#S<i6HPyFTj1EtdzvWAd<)^uf3R*IA5&HgijAgE*{|8
zB#W`gJ1F@*{9`pWAolu+%miR4x0*TDBv6T3K_jO457TKb7IFegRPp$KO#7~j^4i*n
z&=29Ca25O|l2kxgR$89!1HKFhxeAFUil?aL@%FyMc7<uj;<!yXB%OZKkXrIO%TnB)
z`@+hFKwTilpQjEDP5kuO;BBBR5|+4e{;hQA#Wfl8GZ%eB^Lh6CUPd?4QmZn?Nb75&
zoSLX{OFkF@!hUJ at i*p{SS=btKn*uW#AZsj62PAf_rk7_oe`jVyx9bQtcFK4Q*OqL8
z45S+j at GcX0x<nA6qU{LHG2S)Qb{#4B16xP()XNXC7T%oyPHMSvD;Ne|;*q_WcpG;k
z9_3b5cnyA>F>iXs7iwGKeF~LamLUYYvWzZ_bJ*iTfk?B$*4K-BW-}@Mttz0CIGCIM
zBG4uOx!6d)1l*%c<6I_nt$#*qWQn4HfzB>fgNY#2$-)8=GY6(E^<?MuUl*Syd*{_U
z7<_gU)|!VH!-W(659Z!Fs;a;H8r^g^NViBxN_U4M-QAti-QA!9N{Z6b-6^1ScZ*0I
zLYhOo8}<1<&+qr%aqoNYc<&w8vHx%|;GDhpr{-L9uC at G*psmh|7&bCn+?|ia!3wdS
zmXZycdm+sSIi8Igw at d21YXYEC7&6eEsUUVri;%&w9#0jD9&(^EyodM^F1fdwHt@|V
zOwi9=KSQ7qN0cwv at Xw5<DG~Xjy$=KIEurNq+*nQdaIT>OUGa~WtImolW*t%Uj7lq(
z6vW~TFN)XmUb!nEm^^N4$mT at wLJ4kT=izF(Ux0WFF&}EyI{n?FONf7)FKju0Q(Zmu
zp4y1MN7 at eU`@!$U$^*qIdI)vItXw5mtVs2Sj&`kfEJ1DYE`%1CK7k!`kjR^#>*1YF
z?7Pl92ZL_AT$uOxP(g~G;?CUyDtS_UXyR|u85N-M+nS^i3u<QO&tPf5X!#x0hQtaP
zSTG?Ge*FT96W5C+s(mg%@Fl_ug%dN9?1rCxPd7reH86zbw}=S3p%wo>Gb{aX<v1}9
zVxVuji+xvpyXP+TSjOkFw+?Y4SUEm|+N%HI=2G#8F}5Z>ternjaEDGw=JM)@8r6I(
zhw#^z<g)w+^A#*%1LEM1#2>^`%uFBT(<e_UV%Dkz<FpBC!@mGWpDrCV(<AM%6<etP
zo-iFWzl8$9ASs#{m_f3;(@6nV?aT)`IV*wxbOeFJuRk0t(Xk7vk?VD5`vXnN*o4fk
zUWLP~<beU0ZRJrucR$a0+J9yxi!Abl-k(jP-fc~w`xr^N=cKLV^!3l2!G8Re_Y;yO
zS at 9H<_{eq_ey|g~FdnXpNgP!gbjaulw`yq~MPJqF^(9wbTxkKtzb1#1*Q3XYTC+Id
zP7?)x%$AmUdAX3{Q|>u3`eE@{)wP at t)GsYY&xUcI at LX((EJ<I0{Zd|TwmCiGXr>T7
zQ-(NzjE}x&UIXiOF<SDZBl7P6G|qU1+%!_qs at roIErT@DG<u;+G0gJ^1!y`9%P4>i
zA at u&5IZlcuA=v3b!CaeM=hoLq^fVDk6{C67OS$mrLezJy$CH=vyX*XTRb!;o2HoAK
z)<7o$BaD$3>x*?5QegFj4#UdQoWT1<i<|03np-~;93#=Ajl^Hj`$4)gD?T3u+db$l
z#SP?`DS$rGQ*sYlx$K at -z8Ovi9IR2kJvsMvKC99au7@_^t1B+0NDN^i3SS;%lXlpE
zgY7_(AV=1=%5YH`F}Uk1f21y6d0r1DNWQKzb_^<BiMzDn4g0gAerkOJ)$b0Ed6n6%
zE=^r2rnlV_y|7>zo6E)2)0%X@=s??=&0D=iIVspnP*)H1YenLCo01U79^1 at APZ5E8
zBxE23{@kbqZvvVZWppt76~-8Ulv4g9YQ?qG)h*W#O6J`1;pk%J0DvL<bxmUfEe*>P
zj-xVicXG$iUmXZQWz4+`^jwr8OV=MKI(XbzI-}XB*k%x&Z{G3<-a%}LMh^s3X4l`s
zi4|kH^~-qXv)AzYmSY`2z8%KOIXQqIo**i;oE-8MZO|(@Wd*HK^H^!s_gKi|x@%z(
zjGidTXdncA1yhAN`6e4;>Ov<S(f<zd*Wx?iD1`iQbx~S1K(uvV8VsW<oxd6F%{OyI
zN|Hmyo_s#UV!syRjzekqUQ-tBj_k$Sww~ft9gFEJ(PBfk_WE+fAko#gGB>wBCdfou
zxk6V1I3q8<Cwtv5zHND0HC4ZQLll(s(!A#zCcVgwC1OV#S149Tav`oKbI;jQD7aMG
zeahd(WZ)+$7E+@=?*WuO?Ik)d6_9p8F;_=q7HZ%k$Tqy*BagXL2l557Yz^5b?HBQA
zg!Bzn?_L)B510blFP|KQPVT?~$l|;*kwXtqTT4q+CTpd8 at 4|w{SrNTwX*zmjg!NR9
zel6bIEfOCC2&c-dXM8E_AAw+${JcAaQgIR1MbRMpJB5hNV8U8iOCvhgzo<@$ijyo*
zG>`pw4J;m!GmYcDVAg%P(JJJA4yAJwn(JJpU at n1Kt7)kLEhOEp!)FqurM3V=+hH$d
zpxb5*<?`izGilE9=~`*VU}H<FuTqnPn#@yHxt!Oc_gj at nMl1SVY_5i2m7!xTPj%01
z>&FSo=AvwXU&nAlLZ;bUGtEbBE|rZz9Sjb)uZWE>*fs at ai6offgV=%&BbG07B~kb-
z*_+z}cOM42;|C}-*++hzLfBR(d<i<%&f*{3S at LRar>>HMt^AC+Yvj@&zrw%%8rJti
zv$lcfqv2hX|6Cb`7CR8fH%>!&KQEeL{H%^vJJ)~Z18Bd*(B|7!q}dQDUv{zR5zQA!
zUB^lEQv7>NGiicu_)fa`IH(J2a4myEj{#W@*wtPRmh<C8RO`yy{Q-eRIS<rIJN@^D
ze!Pz*@WDnd-5qDX>j~TS+ at iou!C*qO(`*uUO^(rxH*ropgzCp?uM=2vinnBbnQx=t
z7hDME0b|baYoZDEcIAY9fwd0{RGO+f6!c77Zoamz&)N{VE at xdwn&oM~w4`W@<*>1J
z7Kkt7FE+XpN)wDpKD)2+^z3lR^jtZ*LYnq{R)}TFEG8sdjJ6_cqr4H2B&eP37P at 8H
zqGP(aXxw1KQ2VXND}&udqHzVBg$s-jnK+~LxmvRYOa)iw=#-Z_Z|nu~UNX at z##=_P
ztppr~5 at T8oe0VJA@ltIS>j=(%WQcoK9~1R7b}t;pSd@`)CPYMBj9sNtUoG~z7d%Xe
z-~`6;V->XfC2 at S_ui0Vd190Nl*e~ojulHfaim at Z*v8j+nqPWF|WvP&1yZKwZLkQrr
zU^C5%3!!{wKUTQ{pkH9`%IV?#0*lYwAb%qj7**?N0B`Nl-WV&)+S_d4s8gMo6aj*r
zkdv(~?&D1!Esu76UqyHvcrf$9-kNidELi8I<t#RDxgAVy9+FeSu}<c at Qe%(uD5C_c
zYfFst_J)(i7n*j5Z%0w(*eYnfSt?i<MQRXr=DU%ugP(M?Xm&4eao?;L)!Td8Djc8z
zMzhefy{Dz={>pt-qqUNvE6pmQ%ubsfA~TE4s@(>YXCK2!`ugjL1N$AzOgx(6zD`bF
z at Apt19afLVz~lm23=Y0+cw^GPbj9c+ma*XvgNVJEObuZ|<OQ!9KymZYWvZ&r+)tE`
z=FB@~)Zg)`E^&VvY%Q`%Q6t0VwW(oWNEC18^bK>~6&x?J{VKqACehjp^!?@W7mh_N
z9f6dY)XQ!ba7JvfouN878{A7GAXdv!%CJ0*@`8S9$1<Wy)Q}FZ)_tb9?G9h<1>Fz9
z0lrno{8Alvo2aZG at +e_g+|RM{skqC?<8g-Uc at M_rg(ed)KW8%65&w8Cj2T&7u&2}N
zS&FKW%yFSG0_sd$Nx_=~aRDI}nofpZVZ#yifhLkA>%zD2-xbN*>k}NLyDp?pcx}&S
zW)qdQjQlFkt3ew%J#K!mC)Gag8hSMFI4l!(DS4^$d`bd8WKBwU7cs~IXeu(&dq(#1
z9P(8A#U(W|>nERj*q2CI*qP${m6Ew_D at UXF*S9?Nfb1IP$lE5Azc~u=1>pR!Kp56U
zD~l*WFenfmtVY*y$ep&8;1-^=t{a;Q<*1tvsV>Xa*T}8awdToCuGg at 4;8pgoj1l##
z3b`77q{~uvP)Jy7(P8lg`B=B?Nl6B3Nk+^$>zDS59~T}k9Jt0+!M`Xia^xAeeUG`S
ztj?v!V(-Ajpk-lS%)+I9+ZO*sw=BXVryXex>FENr^tw&qgl_<qq_5#z|FG3c4~m#S
z4P}mnSu at rJey+SqY||e=uu_JfA`=P;N`kl;WW5j7!^Xz78wdyI2PKVoV%5-`QyN$O
z$q_QF(0J<>Zv|B+>C at BIj@Ru+Y>RlXtj6Nr)ldFT0K+GeM1V+!s=Y+Z at N}L?sner=
zM-i#hJP|!M_0EN$q{FK-C1O7VqmmowNVdP=a*Lkc=faX(av*{V*^Gz}2D<=I#@dqD
zzy!0kl$1YH6Yd}eelRED$iV~0rFAawQw5QWIQET<sBJM7d{_7>X2oue-DUr~z&~)2
z>sp2fsAb6y{`HLs^WIz6NH^n4hE;51$8x341{AimKB0$lbW_zE`MO%kE)Xfm1UUo^
zOhh#uD at F=JU|EtstYpx7(L;wE^+UrSF&C|>H6T#1BIj;T)(BDixwZHQ1{iDFA2?KA
zoBmK(Omni!uA{#s;k at CN0QmL{Us}3m-T-#V9#iL%elQ7~2S3*G`#*0Rp#z=*)*q2O
zs5;3<V3cv(?T|dsRbO1k(|u{GL<@OpKYyac(hF`wnRhFaqUyq@^0{RN>q`y=ALcuS
z?}_gIqKCVhLs+p#c5Gh&<)F3rbMT{pt8}aoDyk2Zi+ax!Yzkpxd1`=Zvepows{$b`
zOH$0otTkk%KvbpnTpC>*JM##-oVwN7(&T at DNfyj3@*>a*5B}K=?H{f8HvGYZtcDKM
z`Cn(YBmbg9aR5rxC7yjoa4$Fhb}EH|ljsr1&YD+HA6y?}%32;C7=n~#uZ#vr@)TZ{
zM0q3li;B7KYfFq3*FomjKdl>bM(gmw5?{8 at cc!X;Vf*JPMEbzwi0Wd0av+8pxttyK
z3cl6n(vmgsu|o}(5yo+D!=YgzeN-kRWKdQJ+pkUD- at T-rGPhsggq`wC0y|Sq^ZX8j
zGup<iZ*?v{(gzs$XAI~cEa(c5J%F7sgeok~qFJ>p1T3GaS`6#nfXAnf@>Uh+izy0$
z%@{?9QeJ$cQqWqxQG(FGM0``WMaLxi{U3B{z50+5F%KeF<y8 at XHmT==D17NYAv=LU
zP=|@U&CYbM=1J3O!e1zx|B&hN=V7`CDS#PNnvHSnr4T at zXz^s7 at -K;*0>u*W%|iJB
zDLRx2-d_ at Mou+>1A!}j%q*BeN%&E8!rT4&p5OAL8FlQ{x{-dqL<Nto9e^V`$hs2p`
z#(xweE~W=|%Jc8U8JRC*h(Q-=@==CNYgkp%WKE4B-(4Umi*r%}dcEJ at A`NKP8+qlP
zew at -IFWx6PaKaEbGW_*#J at BI`GF+#_<Bs%T+9dGm3O<fI-sWX}d$FW=Jt)}cdN^cn
z{7Vg|qgCB|y=%g?ES?)2;v36?yA9~C6vBT6GH6H$Bnbh>fD0f&3^7t9Fsgb%qI6oq
zt|bBME;E>xibiK%UU2c!l>x3lCstXPg-ZiPHqqSK*!B=+LtaNu at 6w|n?&>fymyON)
zKOUXK4aV5}j)E*0eI+Y3m#E`uktoB)ShBa at nVivxUh&#MA?IbZ$l&3$nfIredg?)L
zztdt7sFQy0(=OthK*}h-u`4LlH7c+rDyLO6 at -$-QZh>jV>z*gT- at zbom1m=hxb at c#
z>bL4RsHfIZUu2%h$0Hs?;Z#{&ESegvAIG~^gK{gaky_yMnv`RDOYZ4y-|?DaRoX(^
zGWa~~5&M5IMfF*(ArDd2QE%QYp at JV>56)CR7rW(OFK-6DTk}Ta{I+^@UXJVxeze=W
z9FDBv(|bcT%XFEBCEfbUw##~t{%~~d<NifK{o}{1tZs_}Sa0n9sSD5?^xbn&Mvu~e
zhIn<+YwM>FF4iYPilKkr4~@?=@ST6FljWPz`Q^JyvB7D<tnql at 1zedXUI~rlif(_$
z&x=;?`XHr^6Q4PrSo<yCo1HL<_HfH1k9~?2evZV at V05xzn^ymGkpouNJ^9eOHG4)^
zt(N;u0{a17=>5~AuC5b{0lQK!I`F`i!_3ity79V(9~^(O8&iyGW?KLD7X5h+k<ih@
zip|-F&tk?j((dx5FRVL)Oi9`=zy}2iOc-qV9c at bc309m9zcQzw^fTzxyFL>gvKjQj
zE3BpZWo(WT*i;|Fdv?TnZA|I{!NEj)=4I86*>sL93aKU4>5jHT*j!0GaFj^3c-%1-
zG9gKycJwv8^-&6<WpdebK9AZHjEiHVzB&YE3~|2xfAYz!4<p!sHyUrWG><(P7BOaE
ziTPG?zHs=TFD%=+E--iPKYBlmND}|#n=8V at gsza^v*seb{4R%x#P<2)ynUX{&8;t2
z1_r|m3 at 4;#e9k@^Xw!<GmKR$|%PCb&t+29Gq4&)l at h$-<37uT5S{c?{B-UIOt-RS?
z;{N={EW&^vRF?o8h*-ulC;Au#E>aAx_bfvJS)t%ss2hitW$=+qfOInPy)`$%%Ye*a
zGoeH%3&ejoHS8k6eC^U1fwYeMh6`MduS>1DNf*v+QIOz>Z}x_nzUvZ$|BD-Sk|=-s
zs_0^6*qudRc*bFGEZqIp2d`{8(i#5Q<<_vQF1xom&IL)<u|d~fAnV$J2)}XIzjv7!
zYIMMYAtuJMG`y at NY+oNGCo^l-D%av at Pfz0$-lQ}9BWERz=FuYeR`P+hwJBOR%NcU6
z^P9cfmJp{A%XQ at MRZO$Tid3Nu?S@?+#1Q)_>^BdliTPmBv{lRpY~j9Hk{jix9`B7>
z*3Ab6qhk`o<j$l)G0NCxN9{Q8F#Y&KXGK~=wGu~&MsHq~UpQly86k<V*>RF?DcmrA
zV$leI{3LI^UMFw$P|q>pYmaJbkp~~k>#*F0u{<wt+V(>+Q$0-XmZ8p<tr{J^zC#lg
zr#)l2!|g~;FNh?Io3NK9hSuh!%;ojBasHd_X>Pwlu9t(=vMv9_%EpU`Kz(gzhQ{!=
zHW%`)kU?34Al?$M><kxkN8ai1altw=^G5L2JPXUq45mYB;7wIP1t2TdJKq$^M>MeJ
zXMvX!XLa;r8uv+}h4Y#{aSZcEKhJsO?iHb`C_LT+yIXcxF`R^BSSFtqT`Go+ve6U1
z8*hq8rR`Uj`?xEDEm0>IzWrYcaz3DweaJk|yt`>Rrfc=}AYL7 at t|7aBvsznQqw~5_
zWf3F*ScuPv4x1V#SGTT0D42g7K^2Weje32LrTtRMBphm$SyPXn3nfbSJs<K+(q0T$
zUnl!#Q_gE6Z3fu=6*Ig&_6<ja at g@XTrb2l+J`BeQ*4sC4w;=Ih53G${eOm*L{PKP8
z&o8_<lfan>Crg!>m$xS4N0Jc4gLVLSd#fAhGT_)SX3sNjZEq(ZbXG4AtgGYXdEkPX
zAoggR_x<&+%_r~eN-t;SV7!Yje4$Wpt~bG(o6w|;<?ZbXwv8jL#7d28OeAoj37H5C
zH)?i24MsO?)2_;bxtw&hE4a`&&JaUPP=>Ma at 91oBwD*9{FZCVcp<UWLVsr=!#G0Mx
zEljLwqLp&WU$;lM)ey<n{MVsWUiSJ#IroaRqg`F<+7Myq9nIaAq{E|y^+j$5pT;fZ
zrLHPHJ2?xjBV8&ua2Ug51lR#LvUfe-hj9<~pmSNG#o_))imAB+&t at K_p1yNDNnf2g
zXcEasNIBGhYU1IIAuBSiw2iUcv#c8kSf4uhJ+k`2l%Dl;BW-g5hQt%v?m5Y2rvi1L
zYsqD4x&0h;`b!{X_LnZ@=x1 at w`Xg~U(#TbVr|Sp5Nba1~p%KO0O<)9~t;YWP8<QpF
zn^*gskg>!D$0 at 48#mkDsv-<Kk&a+ at akPi{Z#|M`qtZ5wHKDs&nmp!ST9nAmb;716m
z&dY1Aw#^J!WWhOHF0t`l{>oJH6zll9@#-2~k@@+xp%1PIw8s7G;Z2$J$E>H<CS-Q}
zEJuQwWjpIx9<ay3qw;-*p1XYlE6+OUYlA##7d}vTyeqbo4 at h)_6VuUDF=Qg4C-zL8
zS0u2=xIL)_jzE6b=M=NhSy!>mvKjzZBBOgA&ivF`y`$e`5Qg!Ar<M3OP>6Vdu^hx_
z&SdX6&XwH2rF+s%YrhL6;Q2(d0<E$3o?W-wo72SiGh#lwC2c)Bqn(;2q#XJ8(YDY6
zvZ^!e%6VH8JGH)DT9hpXgcqgZ5j$g8IyOHq7>XR3lywyb&tz)CH6^(b>=smKG)obt
z@#~3^tbeW>fY76~`20*-C1Y+uecaY&(4tfWp}IuOp?1ucoB4Kj!6C2YqHNlBx63?`
z8$=_dF<ZQK<5Kb(Rdr=~&GS;FHUfS<M5G8?C2=g%Lae&?qy=!|BHH6CM$?B5 at B5@u
z3BcW)VR5-WZZGS?-m|aaVtyP<`2UOkxR at e10WJjfm^}3DuQhP6ZIm_m(!_rLl4wBS
z>U at n;p|7VMSOn*vWeQ>^3ZOc>*>;cb=2(dJ?E?%l`R85afe6sqTwc6}-)o1%Zu>uw
z+wc5m5WfGVV%F*p`Oo(MPQs4=orJCMUq0#o0!#i*!Y=rawe{fL0-^C=TLK94egoG3
zCpYmaZDCb+ZsoHnn3zgBE%4^YCgJiQB0}R644&0XCA8c%F;X5FrFtG0a_L!%JJ&0A
zHP!8|f_m<ss_h!@;Z}Qmu53Y=t}6~kkY$+Y@@5dn%Ee#igOSbT7x^l0K3~XxAyX~p
zn%KdgFokg#oaTu!B`J18wW*qOEt4<%o*X5Ojf#MSDw`xnn7eSwm~~JAdipGsdt`W<
zSI6%C6rqa1TR)OxYxob!$jRDd#rif%{-Bxg(#IB6OKpMZt at _@cpxK)j(M59S{y44(
zZjtqzj^~Hf2{mE*Ou^QCamsul+CtHO`Gs))x(pTHLAU$$?#L2uNqh(7m(U-?AD{OS
zPMUFM{|&Y)9H*}<0)K;Ma3j^?3D6!;%QgxFVL0XXE*x|N+59Nu9n7o_t=>l>kUSB>
ziw99PCZz&$HjVJ&_X<Juy6nqkG`k0ec$w5wL-9J<?vnc`STJI7*Uh6Dg9K9I5XftP
zgfF^*J#f%*J;hIS1koG~5cfhhM3f*Rw}Uw(@yncLQ7G<mP`N?SXk&lu&9$QcF_n%g
zj2tq*r;nC0sTHG@?V_$(^hQvZ^+uO{;E`3Cpw}mM_&=H63r^s`eSUk~OaTap7<S2w
zo}D%k3j>*5XOtws53~m;qGnj#VP%K5I`W3&{x%ltleVa1JlHxC&G&O~7E`ww%8%~l
zB&8QU4(&fMdoqs+HfNki2^%6*^S`Gv3Y}6BVbcD*a0@)?%hkPp+zC1E-h-s}L&TY#
zUNgUc*WR^ro}PWt2_f!*yp!WyBSWL5NTmJ=iAd;jLkPblTB3mHG~kTzuOIuYpLwkv
z_d7d&hQ8!0JbRAr9{NSO*^*qT0qcV?c0f*{l^>myKv&76!_~@2%VVH8ckr?SRmL=`
zzx#;D-&L~q9kRB;y8}f3$=JC$M_WP)-Xm-85qwxyQ|Q<GlRt at cd1-UXV5t5OJ_rWq
znET}H at c8NGLM;xk($NyaD}sNv>a_X5Q=Tqwr&^{S_dy%h!O?wvEO?m~TRNB20<$)%
zw0%5?b+&gnx<2%)U?t7{=0}fCCd-St#)c5B)f`zNC{VHEU%B*juu-(Zw6z}u-n0!f
z at ph#bF_#vFiJLSle0AOVUnKRR&j9>Pxi_^}4yk|=Rz<UlJ_fbc=nz)}qY&3<oNKr;
z$Jqz$GhIt+59oLCI~$R2rx@#g_dX_!ggh&0TmpGCyRJQ3F5RSGbq+>lPwyIOQ}e$m
zyDnF`ASSatZmzjKWuII~JD99fA0xV`ox%W?lVSJW`)7AzJ)tVkJ2zdrwoa*3_OE6%
z2_|Jac_S5oPBVK)d$EbM+td@!IBa$!O%F=FKS6F1Vo9(X42X00tk6L4(WS(u8E3cE
zB+Un_<Cml#MoR^D3|e3^L@{6EOX;DXjk)}84?+$^qz>)L>?U6&tmWFhL+M)VgF1Nv
zS^zv}F0Zzq at +Ip}rBYHhMOHIQmJ4 at xi6I^i&3d+ZZmv{&+ztqdTs8+aBv at bEnUp*F
zz1|#XU5T^-89?hVi>q)X15msCK{bl^6%LI1Ov5o0*02Hggk~~=Rp#ng-I-CI5{#4k
zUB=CxC{CoRWfAWme{k4&t(LR%NRk=6NTh|h8K^ip{6j_GONgXNvZhHY;wQ7cP>u(K
zT+6KiQl`)GUz~HI#owh{N$$Qt=@?GYSF5zf1YDN^b}Q!abDF~UmO%4O)R)bLi`~^s
z?7B7-H8a*hK|eF<UN!zHM0=RIk_tDg%Vp4yS at E%!tMtA;t{>oeRI}{+=*60Z@!z<P
z8Q3pKG8jGJPJ?(=AA22n=}QW;WNHJ>Ef<`uH9~B-1uek5owkPja?_<QTIOT0j9Q=X
zCNWtilVmF00~w)BlJsbCHRz(JcJO{Bj&)|(QJG*_6D;#FI{Z7x@`yj#=^BAFjVNc8
z3swy3dv+1G{i-9st#Cf&XeAk)jI!L=OcGka+fn}0-`ZsNgbXvV<}Ngp39Q)DMnVSo
z;9y=gccs0b4fLeNMeCZ!0}2G?jh0nvsflZ*m#A?7s%Yv-Ts>hKHP<5nghqW<@Zv+D
zr{Vuv4ezxU;3Zgv!Vxcg7h(f2rBFjX`Gl#>*t**}Ty)Ze>}-)+${ehNZ32x129uXr
zC+|YC8Prd3jayI)>gqp{-L%y(3l5gi?zBs4y^)Qr_r0^QN~@ZOJ!(++ewbdqtRwC^
zdvE$TEToR^09;O<>?O^_fE!tQV*^H00XgQcnKFTTP1I%Lp#PcXD7>W}%($FPM#s!#
zk>qasIBxr4+TQH~(BD6R(KeV`Xs<S*1Qu3XqD8}N^V=%O+d{QOTSI3Pc6|vF*f#EF
z5Lb9oSy%f=bGBabXvx-mXg$h}1w((>t#X7Z*Pn$6L$cV%$i+D*>kv(UY_+u$q2>$G
ztSItr$>J=ai(8EbczZ;;hxNX<K+I($l3<uBrV2^M_YgdpApx4#&U_xK^t at _WPxR<%
z^2iU8;)1Uz+#bU*TEZ=WkO8m|)1^zEE&{2qey<|gRl%>+S_onU+?xFh4l$_l(P>il
z=jA!lBp(0dg(%FC3)Wb=H;Dp6tTxoE=d_c*jQ<6GpyOaP3aRj05&_C#f|WBBC}-%M
zIKxZ%)f5|Zu3`X#o at w#<O-|X`z0sr>Eu(udYhA at LXXJXgJhqE6MZ6-b!dngYwu`Jl
zZHE>XAjwZAlGVQsvL`=*M9)omuZ#U>F5C#isWJBTQJzXaoOAIIDfGruNopd>&$WP`
z;)-uS7v7=5wpP(hN%Z1IO;3D)fk~sdjK<B4>BC(c`7D+jud5(YhRquyW(WSdV`MuP
zm+^d=jKt7kc>kt2`+WTFf+~!OlBZ1#|BFQyfD6g%z*#9#!T(hx?!dNGR9=++2XoYC
z!@dCK+?n#Q+0bTi|E6^J8+J{XS7!PKeT}vhP9n8gFkagu<mQk7qZJ~qyuXp^kO)EG
z4Z+Z3SDDW3%M(dCVQPcxrP}u1hH%T8Xc;p-Jy^eXQ~02SW1$1m!@0ii91fO-UC3w6
zNZ$Jtz`}A%^hb~^Qm#fW+2<9{-keF3-R<Hq4PqVjRSEs5Ck2HC>$>-iM@`7GVp6}5
zvdxFUriNOfaALf at Jj&IX`+HJ(h+ul|&!+CAToPY6R7GCD07^d*@T$Ps<@ZOa{Xla7
zi3sVEqOc{kmY0^gT_*OL0mj0;%A>%Ds>BClb!mv`Tu(QC^VvuY+=AR?rc7r#vj<HZ
ziD}lV!G}UDz*nL%t7qVDJFA@`hHmfT(F<<*pxslM+?>G>4?2vBs?$bZR*lMZNY2&;
z5!lVl-Uzr<_Gvw7{G+pt%MrH&&OKznH)Wm|3nrvs$ZznuKlSn%BSb9Tv-~Z4OKSve
z&TipR#KF3wLf;KHi<sY5jfFYoXWD>Qii?A6SHj;;LM7YU={j4MT2c(gR at KBnb?&R3
z_d~dfuO?#nEkT)*EMao1p7?_pNB*@FCtWt19tO)I-V*r91Ka851Ter9<u?zyodGYo
zk%9{L+QTf4?JiE26c^vV!7;^PVgcL^y_D{$X at ot{0T at QYs`?!_-MfQ$U8{A78*<dj
zMmDTiOS at b4;j-+Q?m~w&leIy~KGz`~1D^stiD%s|mQO0cmaAW}@nPq56|86`7`rE!
z$oLl*W`ek|VdmJ9Ds+}@56PTik?(jL+-nhroa}smIN+zQgS+*01iHH!xl_DVa}B&C
znwOU7&IK>0I|Bv+;YNW at 7#L^qH|+JS4vB|iA%^*IHs({py2y33FSh-qYlr+qI$bHB
zBs56|R<!q7Z!yf*h;q83^Bou at u|2BJWdZFdcgxEw73-dAc<ncUn6!FM({`*4{n3jo
zV2r#^qSY0(To&!><wE|!idWa0RK>cdG$F#i2mHd~QXz)^P0qtpg)s6luIDF5=mlde
z&(>B{1yB=f8XV~R@@^w-h+uLBtM|}5+jYErf1*)QZ_G0S`!{-WauK)7w}|n^GqGNd
z&J4}B)?YmsD_=1TbW0xG{;uUFRf~mT1TZ|cuGdY4dqx5(W at VPV%xWaob-D{(6c0fx
z1Zf9TJ2mOje3p(fO at e`vnTQ4Jy!;Z7B^EjIj@$Co)}MNil<cr$)&*;p7E_Ysc~l(w
zI9&+qEi#p46kNEK*S*)JJPpuYFvZXS(dlJgZ9WN8J}y(8LATIiq}@RNq}-w=W}Sg1
zaz=4V*o%DdnjyTwsNngei;%C1P`6Mnn+E`QGjqK?`3Os2Ezj22Vt1OP-;^wlHdXvx
z|DPkkv_6^q)=TW at vtQs*Nd4gl$B$Qb^w9G+i+EB2PVb2R%!KiFo at P)zID`BDE0OyH
z{b?R}>Hi{|yh~pwdK)vaeKJ58Q#3UtELxnZiY%+fE=o->i5!0g9!%IT at nO`Hkdf9;
zeAdWg%?`^ljMT-cb0k at FWIt$!Oa;7`$!2S*@~Q_#B at U`T(9yRC6db0Lzm?NKvrfAu
zsb=n25Q9cj!Y<P(k3*&c>2iW(v8hf|2NTs_T`<VwhGK_N*)CJAJ%UH35ba)PPYK7}
z5P=C<lVB&4Vb<{LZf{6VxQ0UMk&k32=j0I!9+ at 5?;QhS6wkmaE&VENJg7{|`Pffw8
z*jN>j17gkRpa1iFE7gLqU+M)o5N_%weMh0z8sDh$(356N3mRn<!(Ng*OtCC(!iJ}|
z4zo)k3ZZID=2T at wp)L%nI-UIDbX5cjSe<w;az80~+sV^CmY{%KSO?7Ve9}h_S?g8v
zFd41A2+Q^!yJYSQ`h!jkKZE;)odp at HxwCc2&A%T%CQ2{p=^M`58JVT0V$O&vRsN5W
z5<wC2>%2kTN{PpIZm|#YOqO5~%|1T%kgzoK3~MJnvNM8OeVUp$A$(Wt4XfJPlpj&Z
zTFB+n%n#dadEhdx&)A7#bI%p+vgJPWOEGlVYW%PEy%WI$2=TE4Z<1OYgS7gcdT<6h
zIaoK+jLJ<V%hx}e(HKHa2{H<xlW9MWUt<xn>%FFSQg{A7NepS~bZEu#4br%6-+$}f
zdOiOvh4*m%tr%ipda2o&Ax_7QGS|vUUopYbs?YH{{@xWRGy%2<rq3dr8KR8Y!>onE
zQ}_*3<*_H5g5?#TdgEw~1cuviU=~t!?j%YKMPs{4*J|LfiU*0>klw=p6K0Bhp&JPX
z_VUtYpq2beAG5fKGGtBiSz0JV%)l0|Ga9Vl_+uCFaIc!wBM5iHt&$@GdEp0V_-MD4
z>cH&xiDIA(iE-2U7`}_!%hIS&sfq(R1TXmwG6zeZHYY-AzR<=vdq@`*c+pgS+5)rv
zP`%CK?DAnJit&HFz3WwY7M=sq#VPhuhc=*v<0x$zJJiRUDoW|%Q=hA|f_Gtialghf
zSJTf&*z)n-$rTZd2E4w|6RlPGGuJ2D++fz0pSprLln)=2L`W}QU2Zaiy4W3iL-YxK
zwKKeBQn~v<#Re~^!XzK&4y<m at g02)HKNEz*tjq{7o}i>C+*<%DHUS0DK#_i{qpP+D
zc>%Oh2#GXl_WI&L?zGy!5B1(ELxq7isIMAN{a1uUMEh<G%~l(tio!iqSwT5 at jZFSr
zG$&RJ8~#T0e)Ar(DmX$O5r!(^$h(m*uGarJ%%Hm*CiiiIICh9On+LQ-tx1w*jFsl+
z?mqX=;L*d-e#q24g;bS;qp$r at wom?L!n&5PSdK*Aj4A8xWT0yoFOMbhrnOaH9#c1C
zV-nL3Y`2RB6Y^MWcrD~&ud#{p(Y=ZL1L<$bm>RwQBkk?{Sy`fj$teMsMEk>L%tOMx
zY;i}UWUwwz{!GvDnxhGXpq*YY#7<z(P5PkF%uue2QH35~3D{yCfRlBNcb>#tr?2l9
zD)=fz8tK;$xLNpwRP6KSt#iliP0sho$Y5}aF^C&Zfg^~WMy;*_SBb9Z%1v`fM8N&j
zHb2>&<!yMR8YuTe1%Njb*Wx55+9T`MY1qfMU8+_x+KQ``j?6mGgxPG7d>d(foIlZQ
z;I5&bg?U57*K=arwC#9x=e(Eg539B6oQOZy-y19M-=!q_P$9EE_Q9l6K|^VThdGF<
zFEnV;6k{?V@)`&y@{q*tQzmg<w&tDffNwO2*@Nz$WiBkTQh&##YV2O%ExP{j1T+Ke
z$Tsuw+3dkrgI<Aj2JP}Xc^fYTlZ!je6kY3`*gZ~^oM9sLnXIb|ta0g^o<Lp6&JL*Q
zX0hJiRD|+0RzRIp;q#-x^w!2GBZ at s%V$z(|u+R1zZO7<j{Rfh%7N6QdV##bQ{r1&u
zD^KWQ=Y#apBj|PZ6Wwq;=XO({ykSJC2S>Z}HX^Uh&JNCr^j`LqXXTPPv8GAjeb(OR
z<nmiG!1hA|7Q*6`>>}QX%{~e}bwOmvf~_G6P9h+Fl$+6HQ*(6<D;7(FyUuaxXJ|H~
z&rs+4d5RRUjSSL;>r7G;8{;x7e{&>x)Vtpy%pm40Teaxn|F-r~z4ynKLlp*hSTQvZ
zE%`)oY`^-hcOLJZis*q;Nb{&6J>V7z>2ETKvN3V6?X2GOfC&(OyfmouRp}YxImM>F
z{Q~agSwv9#w!aJN??ZW9<QSYv#cWof#~`v$^C*o}ei=~Ktn>msu$^2Jq#CVwppX*o
z&QSds$&Y5`S}3t62b6l;C?ZE$*V}4h`2qvc8b)HB;|P^GR`PS_Rg;Gw9Upup!*sh-
z+N~mZ6G at e8D!jVT0h9YE-Fq{XHrI3rP8``iEgUrApuoak5am%j{4nfw`PoMSD^?d&
zxr)`XYBl6_67jkP at s&SJ?l5}i3Q$ROV(a at WAG+C~ON~@jc{1K}b(zjHIYPKt7pR+a
z4JRh&-Mg6w84}>wk65c60Z!@8aU&wAkrmNbG*zUhXglX!NnE#emkN=Z;L<ESg?ETf
z_pt7VsMkh8*=CaWtkCvPnS`io3<tpLr{9+!*H7+F<PZ}^<*n;Z^IJ(v7jV~F&lRNu
z at 3wPBx^V_fZ56_q2h&?JLur$~T*W_muh2H5d0deU`zysBJ}ArC$?OVdg)g;#$pdZ}
z)ZR4l2t^3jk)z}sTQ7rR&iw3F5reLGT0-cfthqwuJ{9Jvz_&@P+SEYuJjNn<Xqi_h
ze;Qf>x&$fIWo6nX{m|?uK$tE&q;NZgjYx)uE>C;jqW+z(l+-HkDEZ6%t6GCa06WM7
zTb3j`-9tNal?yuF3O`4OjC{C`Zw6WP7aUm`4A-xRGW|HqU+NOCffLMjLH~T+1D3`^
zff3c+Sov!?8l3<wZ=@Ej6yRAW68Y5*i{0Boy29e+ivE}TK&h5T9W4p_LvXDH_mq8s
zt*r$)ccsR=pFG&3Ha7`AKh<r?G9Kd)iRE-97#bls9t2lYFv8MXC|u_-fy2F6|G4zy
zL(L>mSJIMwX8Ia||6g?hoZ){YZ$Iy(HG=X0Zv^BOmye+SM_2aW4*Ru>=x>TY#T|W{
z<@K!;1>VH)Pe!+%yO{98TUqxf?G%GKIJ%dq5?ow}4X=*Efvzptg&$$dF+|fHqtVW`
zY-r}g{`*+Kw5ckZE&@!*AO=_lMEP-y)C(!5T}VI!Q+HjzBu}jqWsf3GHkgjdU-^Z+
zI)ixbOtLT6?&2ts^RI^{yX^sv?0HRE>ZF4{lFb2J7tZhlmnAVoQPHMc1m9q0-0Pv%
zvzCSGwVwIrVh4h){Ja3C?b=ncf*2Ri=%Zvu5Z_~%J2C67Z2iMYl&i9xAd7(Va1Sjw
zN{#E8sM9V at VYzBSYp2vdJteW>dzm9WPmzMIqR>LHS2&i`PS)GsMYMtQK;4d8PB>>)
z({7+JPxo>MRZp>vK(O%4M`GYGQwQ^>nG>KbIlw69jFen)mRPez^_m_P=xNCw$T+>o
z{A^D)hfCo%!3Lfy*3C!(?0 at Z2*RTFXLagUC;bIoV<U!7%_hqKO{!K$Z6N6KU@)?gM
z+csziSvxN{>%^3PFahQ at 7w3W(=mwm&LN385^FO(@{b<u{G_8oF>5V)PP~=YvNJ#W@
zTj%g8d~*_Jpe1k<$A-7YyJylRVz^X at jG7w)hQg_kSIDvIi$2}Vv>`%#puI4;VYyVD
zIrUB&1d^%PEQH6_H6*m>&@+g%5irMU`m!?nrTvo#ePQ{aoX5b at RT38H;KSQt9xtcf
zKM=0WU#%g6YdNZD_?JOTSoFceXTVq;H(ZB%=WL59iee6m+VjZpI-lvwZb<>y at FEX6
zneGGjsQ2|#4K+gzDX6=H0SdlnZ*dm_g4!D?h at M9^BJhDx5zQ3mgW7%dX)JJi^Bd@$
zgby;AT_bi%p#WlVb03|lxo!#`N;Z;mQ;sj}`$e^nnvSuCP4!DVOV=J!5CJ7oiQepw
z_6{26P=K;^yR=8&-R})1sU7MqxkSCfa;AyI<~vuBo?U)vI%Fq?V8Igq^~nhv(c*!Y
z(zy710y1QCX9m^Il)Uz%2c9((fC&h4PQiD at TQ>v6%ZLk1F+1t)qPa>LO<K=weY=Up
zjkFj)WZ~{jVjYA2M_pe=obWszNd<H}&cP)!mGAQ0wTli8jE({Yhl$(Wj#jFt2tlTm
zYyi4onTejlROmA&BL3U95_NG_;_>#;kHe1mJ&vHo at K~RMUnR_1%LYd}!=m-k_4D?F
zDh8J;Sf-LkQK%t=(SD%Q&Ot+hnjAs_OXG#DL`a1Jy6_HNbS*V(SGRC$x8}b3p*#d)
z2p-ce;2L^rw{)bS?wDaq7OP5pQ2tr^{u;eMSLe&a#?0Itf>0b?b5B3`*B19vmP-{T
z_cK>*e)llq#g5r+?t{GyC_)JHFF#l(@@eujF<WhJbUL!<%#9CQMG!xtDuhk?h3r#1
zX at +3sspBMq^DNwO*~KRm+W~X)=QJr$A6u0jD)~4}Ur`EeM#nM#4aND{n?*`-l at 4zH
z9|tXtTE6 at rcqy?+3Lhg)a at RhkxjDG2zfr*{c at sKXjF7u?)&*nS%hE|OLflc*#18L?
zpQ0;P#5q$y66=w6^l0PGpkom4t7r>{wdOIJ at DVh!*YonHSL!<DpOZJyx)!uR?h#M7
zV*&0C#SyAiU_dJD#o<@t(F2wwTY@(+(r;c6$nCDIPIi31_`0H3s;*oNUQ<+%+L=rK
zWF|U%!PVQiNG<O89X#}%lMkc7_iCd*fpWsozXnJn%)0LfNa177%5NXl$NAjkwMhP^
zd$kpRCDpYgJ1wdwc?*WY?Y&rhS*d?R#HSBcib2J7&H1$pj>D*k6L!-wX6|2ty0HD<
zoqGQ-s;mF^N%>!Y`*_j+K8g4L>?TAUp1Xfen^h^3hdW4CHembMY8ZZ+38k4XWdMJg
z7GbQ9sNU8ra_Z0Z-%N#?X{=_Zrg<HT2GYB4&bQUH(rTfz+pkPbVe#;A^jo~T at 0tcI
zKF`+?izHkQ(+#%FZg)&nd^vVDrlkAs)Q7`UM<DVFMt*OZsxq at 98qeeeO4BHyH&H%&
zB9mh^Sbf$oV4=RnRGvL|B}kKYa^3Q+k+>n?qPU`3JI!K1Mvy+K!sFWU)?vr?K0Q1!
zr*k;pee$Awvoy*BQZXN?ONx_mr|^>Mm&S_qiA#Hlu+a!D1&ZE5tU;Fa@<a}bAGcmT
zg!UixJde`y61G!96>I&;tLsynHpPwagf>%lXz7{hoxQ!UUZ%|^$J=yGywfZ7@`92*
zQOfT7`gOBlTWRCFI*DBt553~XMt*Fg*8zIMp2^hoR`cC~fMfPSgu2nztONAoNb_aK
zHeUg&LHE>G#YO_z=c&}ftv0o<Ty|;7^@YrCZhxr~xcIBwN1(jSl(P}n*0_gw;c7I+
zeE;O(|LfBZRAH6l>Ws#`DM7DFG2I)NutL9kXLDgS(I`EfS?hTCJN%O;PpYg at f#D8<
z6kTmX5&rO4Lbi>icdvbnl#H9og=vN5+<RI!)2djtUO|^^GKKs}USC7IU(>(3{{B2u
zewBCO#^)7z^(j!LSn1`0s#UJf)qdMMO*c^Bl$Fkx-%)dt(X{%Hn;|ND22>JWYsG+(
z?E+gdO?CBxQ5~!7tk&S+2-y5_snYo{-PQup4pSkkT5kwg#7ft<bhfr~ZzF`_v`mTg
z!&+}I{1elL>$HOxgM8c^!O_v|)rsm4KD>-)j#>N((b1a&sU?lYqpF$TL?mkFr9RI0
z${d*T9+k3feA*E{-f<sL6-VoPQU at rb?I`BWo!n}u0osS~uIr4SOBBl3$}}=Fgc81T
zuD)NG7Y16-4K9RdpVT>ng*7eD2RBoX+pm-*Bs&_464&3pb%0z&n4$t5{h=9!wMR}&
zXm#M%jZ4|l7ABt9FwY9!j)x9jGMhI!PCETdN0E|Jva^Qk1n;`rr0mI)?uC7Rort`W
zMvI{-!RRl;5ocF)C(QhI8S9fq)EUDYGsC5P1Tzu^^RkOc7Q}<ale+13+P(3w7wWE7
zfN$x=o(S&wP~VU9peZ+`#LcRL<$262gJiARF}52ziW$N)x=y_7XB$MRg9w?R<%}Mi
z-yOA3F{?XzfN at E`To<-;HxDd=FRyG)JaG*-q_~}Aq~F_pBm5>m3$C-J0603;Vl=PO
zS!yj|a}Wu at DNT9gWqaEkVk(ZNnHb3J<Tsn*U7vH8!4K%aP~3$vX%me2mMYS2VlKbx
z2`A?N^>i4C?vv89fAtEW at zIRn12TK3nq1T0zwe%U$G8+wbjV0A+MCvQ=VRhmqh9B~
z!V2t{ZqA-kReWmjCTpN9H~EqGNI$Fns&k=ZWWVj}<C22a{4-n%A+M;CDHK2{Pnma=
zthEBc2G1y0dm7A9<W<&h{1k3WuV`Jf;RE(%di^>*Gqd;j=y5sQ8OTjU>FW+Zvl_Dd
zFTP?{_e2GhbS;7Nnd7HV!B?=g!&cXk(-K-YEqMKFnTSH})+EOOXe>es`WkYzT9mLy
zUmMus)bVuhmOuW>bS6c4c4zeFf6VK*A20y=iZb0)fcKQxvxYEX4?5zWTF_U?JTC+`
z6r|{AjM6L(*R+G1RkZWHFfb_p*zV>oCU!~i?Z+Ll_{uAD`DL-E?s+x+M#Qs9wt;sv
zde5>sF$v$bMhuUjcWyqnFR8ZS0U<75bjZ>KbWuXGE<o at 0&fOnurMnPJXN$+;O`wLC
zb!1QebyL^q%ZLf>FSxe*!dD$D7<;U&Gj+sqXVRP3s{WlOkMZyt*^O4zfJPs^#rva6
z!ubOtFa{&O at toP|eY?Bfmye`{3Wxvh>2b;oDyDp|Zs1L;(hUopnF7%4u10Ly)rx9$
z2NZ0m4KFKn%sSe$U^@?-P*W?cp|f;^9kS<WWm&OJG)!-0i_~KpKaF<F3$wEry(RFo
z3RB0?Z}cG`G{q5)YKd~!h&WxwpzVz at XpAd0x}E0ZxO^cl2>(6I=8?(A`mtr-BQM-N
z;XyZtp79Do>Zhu_LP8WhTT>c0XHs+c*^KEebNtv__^gGhQ8^R$0Rr(3Er3$-o-d$i
zdK{p+ck!JL|0#h`iMsNT!9-3+^fkz{rFY>I at c1ZNf~KY`;wF>nE11P0SDN|9!mQ+n
zh(T?uqyKn~e}2Vq0_OByZ#&D}pVYloV5mlS_x*yL&bn84e$E<Ce!AGVTv2DyzWS+7
zjMWd5KqENMx-NSXlk{C{X2YqHO%cNqpH-O8f_<+m!&C-1#i}PdW!7abJ{kG<t-TGG
zwJv(`pnouF)~GG`(^r_)SiLKE0Ez--KQ;xEs=ZFtaaG$^B&pd}ubXi7hh2Y7s4{h-
zupj3B^~?L?1YhvHWXp!4<Kf|@zh@;i%PX?ToV-vR(i$GUKnl{$K%I)0eyI?_;?L)5
z0plVmeVAgdqe)e<GSPot>rTx5 at 58I`nHz{JdEzW8W^D6pbTLbpE8YjFeIDhVy5mvk
zV7zu3mMO##?&K`zg)WZEKcp>LOzpW(HJF2Ov!a-#$@-WwAM&&7N9wNkaUz~rY$_zz
zE$<hcFxo_SbE`P6KY<}P at wW}i6|>Z(EL<77dL>uan&hOUq`F2K%ZKV`7asj;5es8|
zHIs^J8ZZ5o<Bm01MxV}9aWoWLuRe8}Zt>@ew^?mq!q{AGIfVYJJq-?y at IwNhQJyOP
z7hIC_w|QbJ0j=%m?dAI`v)hK>SpCWVqc+;d|8++l32vaBiEm8|*iyw_eNXv)qLJI*
z%pgO7-xfKNFF>UxHt0)B2K{1nFtv8rYK&lwichLG_;h=>svME(O!004;kDXgi!OEX
zdFe7tSrWR;=lXl9PrV<T;)F?vhjrsTo<Jz#@qbYWefkzxg?OrR90NiM8r)Fp>URzq
zA%|_Z3i&EUMFst6a(!mVkrK$Vd2()jmTB!e{pN*LKU;Ybs+4PP!`cJWZgWo#->mFp
z=>1n)+HJb<pNOAN at oyvxy6eO^zK2jDW5W|p-~x;oX;eQuP>!U~3R*OzmY3~9IN{~}
zEWBqhs_2E_0gl~05hqqHY=pW7rE>y&h$LrA0Q at AkU5CDjS`J-U=EC7fE;3N`sRwRl
zPrMm1N_;!PA1^F-<}Sg^B*4kX>7ErDe6>1!zS<a#RCC*vQ+KeI+>QOG at TfK0Z}7|=
z17pm(UlpNVf}BW~&WT{DO5%9J?Md{*zJ#bD!nfUP{8zcE%Md<=4>o!v&Z%#6hqswB
zi$Ct#x!3xc$Kd8URq84o4yV7Q+~+g@*K8{&+;mc>Vw2>!!5$Qbw-kkoiPl01)&p2p
z+d4|<C&wI(!W3R at hK*TSJXuFxZAU&rN0(+v9^|pv7YAFb7NXYMW%rK4B~K at pbDex}
zNEa0#-C)fvmeF?-oznLA0|xZJd4&)0pO<Nb7!-mRol;LRiMzJ5Zp at oeLj8UB9mY0K
zcq9bYug{fQ{iQ#HR9ou2<Fbf%QsDc<1v&s9o_At_OE_#;Jo7OLOrfaC?m63!$jPm+
zLDD+-?5n61CC}dKFz?x_OB~ovT~^GFevGt9l)_1rw82nip-3K}4m)xd670krHkMAP
zScs=sh}Nzw0d4odp{_upsGwYT#&&GOXy8R2Z at trH0xK_)96I}k%I)2k5gj7SU}Idx
z`3jkFOa|f+^u}GZtY7%XAA=<!^fX?Q!mN_<zyOI=O;s?@jn4H(Ryia({dBy4iT^Qi
zE?9wD(NAP^?ayiL=iqMD`PV~b)z6;=7K>;h;#`QP`*^LYNWUR1%>Hbc0=>Z3%CnAo
z+P3I9?n0^vKUh@*JMjy4EO^P_C=pba8o-Icgz#dDK{8;hvu=Nivy({*7*#Kij{PjO
z&^e~)+u%nEf~a<%VmLM`n3(g?i+{t={lVNx at KPsa?C#gcF~l*}PEq6HS_YGTPcJhB
zfN7(>OTO3_u2a)LU$Ey;kz&h-JU?IOw!uOOv9c;1vQncAO9=ZXGYj(2o`XC0TnYFo
z&G&r|QQwxH%oTJi*$kR0z!(dBpRsC|9*-~|3fhC$Pa%5NO->7_{~x)PD0~IMCS5+s
zFJ<HD+Dxj9!`^2FXig*_q^xG^gjQvq4gUbfGRGl2k48arhzpLtjG@$_7EXYbr_j*4
zKD!S5m<-cYmixO>_x{nH$yBacm*rPz(cJi^*Y?7*>Fu6oU~_aq;qlfTaz&|L)G=0S
z^LGyO%ZH<c!!W?FSNENOvUja@%eIk+2XO`q5V$CHm$0*tMZlF~Klg{ho|A*=W-~zx
zN-)OFNmEuKP1yTk!3W4OS4G^H&)5#nz9=(n;T(Hd#Swr>1DqiZnc3E7WPB4S0YjXC
ze;2mI2So&&xKBQ*iwi_VKy$Jk+z!WW5JuskR|j|0YpN$^L?_-p-C|fS1!;?jLB2$>
zlx8TE>i9UZVQYt1h~Rudo!>wFDe=ohhLY{%vowK9;>vdA90q?DYvZ!6`^x$$z4Bgb
z4>4D&uV?DZ7D<}NRe0FfwZ!2-(81gpV$kreOCXSLFd at +nkuBKj`WMDJ2bJ@`gZJMI
zL4MN{)Purp1dr&%AgoUz5rz&^wz#(8jX1qJaNu1kou~-H2QBdaxK4!!zb)n~wh#qY
zYkQPUq6A8 at oRyP+E0rZBaA3nc1Y<mRhsJWx+VUh@^R0R%6kKK^9jnjUWdLiD-Y;BF
zlHcuJ=NQPj^X^M_SFqfAgujFVBX*m|osjd+y_2r(lkUAlli?raSx(i6L0QW9zzZVI
zVRbIw)~hiO#I-Cz&!jr2zxU=>#Q5LiWKH>yqKHv+iw87Q*9WI;ap}?Ha_2e>QK3nO
z*fM`4$aK8C5xG32D#8=^mzf9A<Uh<j^Jf3e%u~0RJZjzmV2d%XNAjmnN)$VKZ6|KU
z`QM}VO{jy9NeCRcGdIKJP7+F2ncub3*gEX<A%6Kbq6RB1oauUvcg;p;)*-ToyXKfX
zkAbm_J=?Om9sSd!Z0dG6huIyv9Z$Te{-Ph742|ZA=F1v%2wbNJ^~^1=lHIG)H?i7x
zf|aWOvlS at tPctp4UeH%SqW+N(XpUc_UnT`!0Jg;k&kTfzREF0RcA7`sTv&|-=o%(H
z=<0gbalsYTwkdoY8Fe}*2_R3!;RVI(MBBEv_-SDcWGYUs`eH(V3c{O at no;YlEbEmg
zHJ%XhNzO6C;>T|_Ifl`w#Cd0?9 at kNft%uE8Ex3-82T!?L$1LuJE)pRL!?Vye%g2JP
zq1u-3B3$dh9Vs`Wa&QUBX;pR0u<SZCo30a$VYbxETHu!V_1CqLjq8zn|G%BofQOaU
zNm2(?V($$dO)7bEv%t)BKO<1_*UVrm$m+B+lxQ{{N;t8m&UxN~&nxjisQb>arkZcx
zjUZS+EU$D#rKo^_bO^;tFVdx>^xg?QC<;mmg3_BvGlZg4DIpZ;O-evo0 at 4XxAV46w
z8(#nSKKJAOa?d$=;DH48%vx*Ktn!;RGwBv8sdJd(w`crK67F{`oxOQ^C}A|LB?X~L
znb1G)Gx|^8KNe3s;(8>Oj`)0t3m5PrlMYf;sN#BPP0;hBuaN>^0jy)V^FIU`2EMnx
z)UZql*P0CV+6J8By2H)D`Kf`W(m-1Yz^l>m9L;G0lSjhEUuQFMj{a5WW4&6oQ<Cm5
z4XtrR&K;0gm$t=91asHm6=%>(uV3VkTT*>_o(fz9Dmm_s3Y-?daN5wf9rYLZ-?am`
zkGf9pt?Eez6QdEujhnUjya1QRO%8+Uy~!&1PtmCD8CFSb(B=bO7`k|MS}rIGt4v?N
z03Dgyi at C-8;Ycr=0jR$XB6})`*D9-bG``!7yjRVStt?`5s4cvR9poG1b%;Nwl6x*^
zGJ%c!Yj^MHxbSue{nA1rE%N^9Ps0wwFq%Jd at 4>yxU|Ej%#>Q2I{`lsBOODapI}&8i
z*zyW}B7 at tlR7@zEKW~9StH4Fxn*Oi#%LhY4a#Eur<72ke&ZK4II(a{4^d821dhh72
z<f*ES at uasga<#egP)fLY`pX&U(k(kn!K3!6%vPE=QG#Dc$B)*x$W!^OkGNXilshPC
zq?i)am}s?H5htxZfepStuJieHT<6m~v$-7)*7=a^KYU4Sp+5|^EO}&mrt;4UmsaMx
zh2_+azZWBBTY?DD)92x%+`>HaH5U{u7|sJvgFnfN$VHy6eu=cr%ls5QN$jWoy0No;
zp8hlcPX9T;VrigTfPe+<pUiFAx`pgHGWFM&=5>p%ECb+14Z&KUCy&9>Wd0jtWY-t9
zuOEv>*zv#Xe6Jq-FI at N8))wrNlkoNQ{h+U}&>ZN{%plR@??^(KHxP0#1 at 6BUB`tOH
z%SG6LLuxG<9RKQ^#rz+1({yclo4BwW6*$`HzUIxo{HeV*&FQ at bbi-yUG9kFz<R at hV
zw4`~{)plwRgw{%@ddo5$`s#zO!J$qz3?ve3(IhU#cEvP&#sGX2Hv(OIbe*mZeWYic
zM_h-!nc*OxYvU-}TST%22W(gR^ubKRW(;8c8Aok8ZinNiC4);&hg7kKq-4HqhAN;*
zjFQ1YEsJf$$h%YS%<}kc{3PCOk2L0t$9<TTBd at 6tWXXq&lBA=p^Yn}Vdxy)VRTmIu
zDLRy4Lz5ZcP?x67UT?4+N^4-*g96^bo at V^PUA{I1Engc^)Z4{DmZ+?Uz0O=kMANc`
zUy&5Ag%`Dvi{x=l%S~kK_27(g$tyBFe+0L<*IB2}r0xE0 at NW9fpuzf_P2A@v3Zmmi
zP&<3cw06TcK<6!D!om5I=%tO~eqM>zqOgfKl`PzhMmHbd!SH{jdUtwklt=CI=Q#Zc
zsxF+Y)y-JoGM7>ZLwcaxCD+HXO7ryX-hRJ>{;V#pqU{{#(1(pN5fU7GjcfUtjzR0W
z3gLZvha1KEq!Dtlx$L0=_8U1LOOiO4Glxl&dmGGU`VHC?YY2o`$!9BeN8|EKd_?+N
zxaN4`LEyS^kQvb=Q|?GVE+2_D8JTf4o!oOJly7Cqk7yRKj*)z1ycab6>j at Qdd-7x{
z+K at 4_0zPyTxfQdG;kdSxE>D)>0kHj@#7sPP>WOdhYChhd&_`D0lXqO2G?yJPn8CBf
zluzP*YLY(hv~sdjTm+6^Q&x=P06fhbWl)Gmp-BNK!U(!QAGTrsw1PCgBjgh85BoWe
z5v-^tYLkd~^To!{e1AuT=Y(GUOn&o1ZQu6jvV{N2!KJmvo?b2>c+0rxaDQP;CLu?D
zsZ8^l-JC7C(3~`#ORgI4+itNm2xjrrJ48Z6`i3xhT&wb!@ds>y3#|rmIf8OQZd<ZZ
zoMsK41iix&Qcw}jWU!OGN_J)UKllxviuP-Zao-OmZ#UN&6twBQ5#B~xp!Yd4T9Q37
zC^~fF0Z7~DWfRCzF&yj5jk~d2_CsU?)XsyEn8I)z^}?q7A8~Q4Zw at DL>V)gGm50;~
zs5iFq0~kK?#jtzwUXz&4zTq8{0n`CXByFZxZt<FmAhkbH{xB3>M>v8joJ%- at Cjv0i
z{TOqV0oBPbSWvcTGE%;IgWyP-=Oq6rso3hGQywrtr^6(0G%+z;s38n_3sPjV{}3JM
z&t-4Ep6)~c{0C$}am1k6_Rp(6+`gCQKy2_1>?m8Gw6b2lB_C8s(^f{Y at kVaXEl?17
z;G`H=kD(ze2Jiy&<QDqaOuc22$dMpge=`dYGanJ(HW}D$#_g+yl2`Iv0_T=CL)%<s
z1}*^<CoF3C+ at PHDRK|{w^IkYVYSFxg+*{I_T%;~rF$*q&!o;rtoLWx%o)ef(@~-32
ztZQ(7-->gPm<(;^b2cFV=5Gtxz!>n%duQc1LQy`-m44^YSTg{3AVR1keW<qe$JcNw
z`yXmTE4DJ%>~-P at dkFHrGC?R~Y0uhqnRqsHN06lDih`-451ch)&?NCdaKFxV02=@v
zF(gjmw at _xPJirJWPd*o7AaRHY%ia``B{cn!{l4=fv*ot(!H3H967QLH7yCKfEuw4)
z)%_Ee-cy0PDu-L_4f3fVXb)rs+Y6ivq3?BrR~D1xo^b{QerZdsJ=o6RXuCEMcroLV
zpqZWQv#pxoKb}R0E5%s*z$=I8`QB|9OYqCqoZcUD at Oh`?Uf<4B!Ub+R@$KG<TX8v>
zNTgA<N2hFeuUFdHkagSm*Dn951vos2nI_buP$hl(G{Jj;!e>LUmI2ZLiBNL%N8*~s
z=>~f73*78W$PGUe*)>oL=ZobIVC!~sIC8e!_p+iLXU%DwtN_jJ-W3S_711*xCp=w0
zE8qeg9;N69j}3Lg4x{BsE3P}p;IAKdn at 54~H#7%OteK8;N4Sh7wz1`d+Le0Tkjmyu
z^x^KvYP&!Kq1+>vk6aW~EVnl*Z$G!pF{ga6Tm>tMC;J-nkrBD^^0m2r>83&YndYbJ
zJm!kG2p2%ToN0{ps>_F#Owe&oHU&s>1HoT62hjQGnxc60p>5GDo^*K%CqLBL_lmor
z4Y!Cov^CoA!a2<4OL%)9<>tf&`*|O*hpfx{-&oQ-SS%s+q7%`3w~9=HKJ_$?9Q47)
zM|QCz{$%;XM;oKgLFL~6WGtwMOP{)a!f?Y2MnNDY<|r8|2;CWV9oZR0J1v&MMt at S?
z`bB3+a72l*wie69-&*p6>2Qc$TP(`$-E7E=haReN=)tmo<BGyngVD<qgT@?cf_%aG
z(=cg|YfDAwl|@gO{G}ptm+2hYQ8klhf%N+WakFnHQa-HqDy%{rD>L&k;7o#aOvYnu
z1>@NegG_3XE3g2Ab#l+T*LteOt!Y=ZHfe#-q<&uk=d`?xJ5)d)7ReJe*CZMX(fw9e
z-Xj~2*lTOFh$ibJ*Ori$%F;hI9UG(Cj!L$>mKS)3ui5{}<qAR`_Td7*{Kw4j`)r<?
z3XiEkO-%&!O8BoY1WOWsznOKWUhl8ndYVZCnOJr+Sm*bK*ZQyTVy&c*IjGgp>jOv1
z=$hT3Op0H=OeU6k98x4PIr411zTCvmP}?@0h2X;}1lDNJiLkS at mdVAwWPnaOB>f2Z
zzD(1E0#A3{dp=tqyeazD>m?(N5q*7l8+spA?|WnEP5x>J^0b%-L66pE6-93N04E#*
zzH`OcBQHqQ$G99zO$i55R4ctcA%9J$E&O0*Fnob1L5ijQJ8(*`A{hbL;^rSc)X{Vh
z>gf5`uC+dn#YyCOo6VM}D!IT<P}t^ES9GV^cLP*-X36sE#-1MPPb7`!jjdJsb$ohm
zZ*>8*SnempU?xF0M&6i&4ekyF&YWmPTnNx^!O!%+Cpy)AYRks&g%lfhzXn(5ot;<M
z(tUFLS0Q7+HiO?2|25(Zj{qwnhNvzU0M(P%Iak^_mpUf3uOwDf+F9klP}AGLD?9n!
z8s9VbNYhaQZ#2$haq?VT^hsBV;(*KK*;5vVBd*SAUO6u2e0U?zKWQWO1tyh40hUKS
zgR2H-l1_*_e0C9FjygTFMcpvYn~1FOB!+?Axwzit^(tWiV$#45OYHxY$G75AIVY>l
zhAZYB523-|N<Mp=yP5|S^vn#>(;PQ66 at LF;irIk at a2xg@%E54MtIgwu<?wI7_iGuV
z0#fCTAHFN*it9g^uWZs`<7gip8)!wP at +RJ$1g}}Man*s)<X<i0bS4aYulG8Oh5i|n
zRs43eVP~F-CwSHRsaCm&Va&#V3Ju&tu`3#<I+k`?8}3w!SBY0tS7aMF_y}e!p%!6}
zI9wL*T{`jqZWMun6dU`077ljDU74deR((l_``q*)jomUO`FK#K-Vh#m%jpKrQHc_w
z>f0iG0j>_gI&zo1;3zT2rrZW`tYP542ZztkH~vnQ#`YIEHhvo^sL?`aIrw6Y$KFk(
zRmn=hb`(q{@EqYI-^;4kah6A86FXfau9 at VZ*Wok=iysvK+}K}W^$+yLemEJR4gX_t
zCp`e_ at _Ign(T%tkm<Zs9TS+Uio)m8QN)EEi==h-GS|QR%02#Pi*_ym==eW<^pix`k
zv7fS%Ob3BiI-Bw(dLO~BnA|>-fEiC2`?2Ty1;UZ2CtyCP at QXRdYvF2wP<T@^%+a6x
z!5bxZg+ku<uyt6H at _3Z4zXSE-$Awc<T!2cOQLUDKwMq1$M#}jRY+i9<R{`8|A}V{e
zQhu-m`gKY=l5Vx86BF<)(;3T)3`7-iDyLSJAWiDCR)6JIjn`-ibe)qB_p5+1scg;Q
z`m#kx!`q}=lS))3gA0B25c2+sulA)o6GE%deI4k1U7dY5$V32nxQS|q5b`Kfsz!CI
zO)$evXI&K?47y5RnL_(61JJdg6|~@2i8SJhMSyDRI8B at ksPuAX<5JTydhuO777V}n
zs2fK27~ci2j|^9M%+<?93&tMv1{{9+Pgmj9p=LUB9){ilY`^j-$A(w&yylR7S$|`Y
zey9DmG;Uzo&bX>L222msC0r&GP~Q;gN9`OO&ih?a$f_Y1Tz@)5BztnWD5i at yF||>)
z{vnVS2}6opax=vX_68fBbXQLgPGnA-i@;3t#DRJjECyRI%KFo1EvRs-0&<JGVKqQ6
z{w|Cfn|$gM*U~eHF{^`w>vGN2(YhHUQ`FIn+gXq5K+~NAy2<aCM3%iLoyNfVrWp<E
zK0FyI6aK%gGrq32B+L5G;h|olW$#*dQ8CTmtJ;t6T+$;41=*erQKX^SvPl`+?0=aS
zUCD7&JUQGLo9$3tINqzgxvHc%-L`NhWIBxFhx{?s4KXwn?;GDTQ#G_aUu&<<_NXpo
zC5R6dYn&R}BRDocp>X=*UtNf=s!FKQn1y>GP4rQWnG7-F;502kEcn%UI&Z-nC0Tbm
z!fx1J2sw}2SNuz^(_eBmFL<Kncihgd?TpWah!6F67|t!H|1u0QUX9TcNVKMT`IA0u
zq`cZ~@cjndi)dsxhp)2i!=I*b8~ji?P6D?No4l6!^|QjmP-2*8U8v3z#qZbw_^uBU
zjjBrvkgI~053g_1A9Ld7e(B$tB;#y at eOgsG3f%THCh<3TR3LiNDcSMQ6lox(slkUx
z1vn;_+*^;A7$5Vftbjc{BlD|nHIpziKE`rwac}RLBDTJAczsVbB-FY^8oSA9wO=!a
za`tO$8`zBX at h7|@P-35Yz1aYji1dv$bqqTyzZu~7)Avg}A2c3~LN2UjV7W;rx*p8+
zR{_oBz3taFds7ONf!oS7y(w~VmjNvSq)DZhqce%<HSE%H4qjbh at oxQ>8|T{~ks1FZ
zxX<U!4NxatO;RCiW6|Rt7i=D;FD&X~wqm5_j^5C-I8H~Qf2S8+2QHJ3xd#|IPR21&
z3aA&rHrD(2_=vJyTO87>SA`5WlInK}gbFn5`ugiD904>eYb$oPwqK4$*&p{#Z>B4X
zbOn#Rg&nsN!g2c4_0UTqXF`$)=^1FrbFEn!9Q8}Y6Lu`5{*LL%yZhRIEf>}CgMjh_
z(A>YE{+nrWwGb`?1Ofr)+wfe-%z9;g{mQ?g`u&@AyTEr8swh1 at UE-P>Q<MQS1Ogeu
zVuL5igp-DVy++h7;Op!AMG$?c4gS%?ln@=xMm at vd>}|Tbva;AEh#s20F<y6KKSMas
zBi8_K`BN^gu8xk5k&S!((W|S at zd26YQi@vV{+k5>-<keKp}>9cY{(N9fDo$xL@&Tu
z1>j#sfXh*T{WQSE^p_n#N$7820KB*O>$idHjsJ}sY+w$|PoyD^jZb3M)-rbK&6aB=
zf>e)%5_07d at KW`~FZ>sb19B1$hu0iUPkhU;M1pTI%XX4RZcY79(``%>>^nu(_3(Fh
zCX at S&?^YN&?|i<s$yNdWI)1l8I_QZeY#5)Qrh`#Xg-dvc9Hdtot&Z9{BPU%DlS}sf
zh=uy_2L{nbPx1`o?DdB1pjS~tdl1>p;KX2Y10Q5ofpteYZviHC`9hrt`xUb5N{l`-
z`@w8YsEhHA!;?Jw0&OJH8j>H(A?Q=J?Y2|AhD~Qi(pOXjxGm#O>>(Bm)!dZ5y31*s
z-?AeD^+Gq4G%+i)We+{&X#G$%!smOfD?&x8opVER at na9H*mm?(G~qoXHT`AvP2M^M
zV>9oUI at MZmsq!i*ni=<S24Wm!0^*eubQhwIT+Q&R)XC_nh&Ojbw<y4tEHw@!#KGG)
zd!NSTE8HuaLWia>$c7Q;4g&X5nepapf}1 at j${1`%b$=@EYmpPz_CI>OSL3^Kns9Rt
zvgC&6e6-N8=k4wKdD-vB;g7$6+<Ky8bEiaiueLmeQrS##bPAfcs_bEvXW2CT%do^)
z*gE-5JI-njs$dY`Ejeucv1^WpGgYthtE5M?RL={pJ!`#E{;QtJ)d8u2`OMxL(o1*x
zhIw<F|9s>X!#F0CKL64EW#%qaZ5t=~p+{XdK>UMV5xx_z-(*?(M0LksJ$HhOEnzIQ
zdR*QI9re1NcrYVT3_sGG4gRAz8S}WI=x9c#-t<^m8t9{eGbWcmNPdiG7dXA6+jaVq
zkimyr2;-ifZrby&%s%O*b^9X;oT|F%3QQDbm^EFXd~A1!_Pe$x4+)irXBdC<gwi5!
z077IGTUNIj%T<5k`K&~|zU`w?^Bm<=N1r%tvmLK_CjY%_q94`s<29@?i?FgE_p%YN
znY9&lDwFYuY8p*Upu&=uN_B+nAI7$Wt$wZz*-_azF7}#$v2oZ9W$CdX;j^#l(f^!1
ziSh&(juqpvC58)-77l%uAW+Fgr+dyOehwMEQRc+-CakpSA||Oe48M(8Cx~q;=uikr
zZ|&^w5ei0jObnW{_*}WvdjK^?UF3)!5_70kRM0OqX9|r?4x1jB>xiG-CN4uLqsyHD
znbpzH?t}E6`=1g1UBf~HQi)PF9`Xo_gsItT{9XAl|K|YhP5a_cDn*ElvMCBUVOuC|
zx~d at GeBHs77-K{iOz4TtX<lvTZxCB$Pd~hRqSnFBj#Vhh_*zPj#$DB(5#m-2Mo6ea
z79o*Qoxt1KXA?W>J-nj!jrsg33toeC<5vOo_?m+G0hQcAm3;6k%3{}u3uukjCjJ=r
zf!J6{t#r7aH{k&?NKSDk#&5j96TbPJVS{np at OLEEzL?EgdReiay%}vo9n@%$V%{kW
zufnA+RAOAtYIFqx_pi~OdT|3dmH0#1{kG{B`!9?9WobsJdg+P|1*Z67zK(dY3+^_y
zYb>E=29?glvJM-NFqT4xK~>K_=;VHn++iONg;0D)7p>17adjOVM2<@L*31_zGy at iC
z-IuGfQ&Z_Qo-hMXI2V#HKmOXXO83sykI8-lWg;faNsF`%fp at khY?O0V935z8`ak6>
zU~~l_W$sG#awyfU{*2-I-?)M_N at agUKK(-Tl)%6CTHv1(6`-_0^v6yveHr|AOI2Rh
zxcW_58*Ofcy1MJvOUaEq${tP7h1`f$1hClG9a(4Gr-Yb}GTX0NbGzM_y23BR3W&r%
zaczRU966f^^eOaeSy9q;`Q%eht#nsgXZGL=l6rVkdk~lQAJXhvwasjYOK8Zqu7K5%
z_jadEFz2MK%M9ahLN3KjWE47W2(*`rfdoT~hb?V at Vl29Zh;$dB9GMG-?v}70PqdAr
z6B+BWMZD7sZSSobH8I<-ljnh)Ua$%n_ at tMTBDLttX)l^)r0?JpHkcYhC9*W3F?;0M
zNX=T}W$IUo|A6c30lEz^(1Yb2{}0n?b%h37x_#<5O%eU^w>nsV at rJ2JdM?91<Lr&R
z$6 at 5@J?W#DwG(A at w;J!oBkd-hD2Dnl(U+kQ$r|!`FEV}QQD&NyeL9 at -^*;JNBwy;^
zPb)Up2lH&uS+<%Z^EUgd?5ffkne5+pt=8Gd-Y3?tUh`k;rzUA!BwJ;INnaUAEz%IA
z at LqoYgI7F#$#O;^?>9}35)dWu+?jz#RijKFzhf$K87TUIrSR>9qvCQN at X@-sTh_hy
z+e&YZ(p4t+#err`U9ed_S0^@8$KgWx(7jvOm}&Ij&k8;fLUPK1ltFZ|*nT>4t^4v6
zII-+qiS|~1=xxC5n4s-?@&up~cxSe^R{hF9JDGm6gTMTRr%&R<%kItjE7e9D*Q&Ev
zY=Q-Ztj}ZIe2hc^{m<(Ie`;cL8_1!gHiLQ>1^piFR-upIUNMK<3Ts+fqIf!B_fyM$
z_sCblDEENt{f@&Q+yhC{B=G>MDxZqX(@XN#{4CEZm|r6c&(G)Z{C&jqAvp<5)tnr5
z|9p(VRN9aS&!8qS*}r=3x6Z`Y`zaqC&-swZx4 at aHLxl`#N=3NHdsf1Qx^-er=*!;V
z(bxkY<5i!-#qB)C2KYo4H9Wh~;=3dqCC*vh{F2S~)3jUvhr6EL9x@{s3%3MY$k1A%
z=8oNJ{aSIcgZECcJ_z1)B;pp|@1CUOj0_YP8 at Oi*%-VTB^zcF;!iIWdp%Ou%$NC4<
z>Hk;8HEx?xY#24wyKMo3&=X~9h`9z5+cM+xQJ6Mfx>+LV)(Mq|i(u$xB4eg#-~3+r
z-+*l@{^TR7hDdx%eZ+7ODrglU9)sKNIe8%A0YD{WJ-drp+U8cqenKi>v=O>-_WDDM
z+vSTzff<8(vXYg$ya;W_0(rKUYmgPFZpq``@zOa3dRcDZf`6q^5u7@^%q$?Mep0(d
zSdTZ}N)NwGz0SNc?&DkE;VoSdy*^k_U=2B+5quVVf6{D22K!XDwn)F0Z(R*XPztK$
zGZ?V at rIW26D-{fX$#`whal|^AJ6<KPAi9#_P$X?K($;^y)3hk6Eu7U~jp{fC4LKhJ
zoUw=)ztbtC=53Tm+x$MZ^UG6y-c0p<`TWS`9^L!3DFk_uflkIqUIvfGzOaHyR at qvX
z7PXDhy}G5Tg~F8H?~8XYgrsj)Y>CnJc{wZU50is<Kj>t=H{h8gn|u+|Rbl3>Y#Z^^
z6Qm}@cNTzcC+^0Gd0eII-9(Mqs35d;d{9i-%-G6pSKIx1RHe3p3Z_O(s`9;ow4`~_
zxPk0CdEHB(<e?m^3Gx#bsnF0&8MNJzt$fHDlj*v+In9^BdMy17)J@=2((f^SrY|bd
z*dbdpG@=lUf^<bSz^Y_{W}%N_#)D-T1$cKkM|EqPPobI{cCGtKEpILzvw{}9{5qiV
z*`$6<YNkTb;U8_`sE-c2Ub-t{D${?Az&agVK4w{y9kQr<81l^F?xwm%S&^D=`ojwL
zUSF9(!s=)zRT~4ofBk1{^1Y__ER(W+v!e0$XswYVxP8OdBIILi0`Kq0b1HaaZ}D(}
z`k3CpbugmOiwe~pb7~7-^FBJGzjW};>6bvK&{l*o8{S7nn07G6z{S|U`Dx{gHgn&f
zXL|8HG!6Y$yBU}i6Z<7c`V<xBu!x?$>Hzk^7*8A9+tuvWw2!Kd1b2T0%L+CtA-!Ae
zLn`O`TDwN_9!(_IyY`{0biYZ#Ox!ZGyQ4>Kj1-=eTobl_Cu50zUahzkEIEhuU5Mks
z;V5(gB5_RO6wR?hx6o_f5o4%d>y3{W|0oP;j4{RF*;|T)R-Z95-+?h?IHn3m6|OuH
zyz~*NUy)ag6atJUV`s-Y^AEY3qe<Nyf_|&d^SPSaksO|BIYJjx(z7Puep}y`@7OZ&
zR`gXqcqdQ!RS1d|3Bt_?NmrCh`Dc_%-@}zS=UV5erTeMI|6g#+<UDuCF==l7;6zm0
ze55`9`sqU7ZPj?`SX|Ul)wsh at L1}l~xqXv8vzkre2^VfoPHP7_)0Q(fHFI}Wt2h0$
zTYe=6cbSY=4hTmL{08PnJE<vt7VnAdsKgiW#&=G9(Fe)S6<K at gWNgp8)H(4dbBTE2
zl!f;$cT at ybLz3Vx`jBA{+|e(SL*w*!A$TL0d%~3yBZ39vfRH;RHPn-DJ&bfA(*eu0
zj})Y{1GBiwwDqzvTF8|1+2(C(T|(!&oIg!_^DJ~5Etey~A=G};I^=}5E<vdQ-BFYl
zUv(uu2;R=@YlA<``l6ur8lr3~kaEzw9TdQx%h<gYP(-mYwAa>s0;ufW108vihqe+6
z{-gGTZkA3pW?^A&@9;n8-DSsVam^BT3>wK4lG?aRF}6Et6iEU at O?D&5{n{gj<(Vht
zUFHG51X={pbWaihDAJI5NoA$<_r}E9=<iG~Z9t}(z)scR)BUaFE)d2VeDNgnzkcUL
zX~8Sfjcu0kNDHRUXO*JMNINFpyI&00Mc4(J*<EeES#VsiAJS_T(siQ0wGN~iG2#&k
zB34XyFvM&T(|}n~2AB6YlvlN-e^LFQ6CYGURM^!_eO+?x+#It3GNy^7ddjILDCyEk
zk5g at 6hHTL(sl;4e at H<XdBI(_To5FPMpBEB8&e&i;n%%A`J^_tZNn6GUj9_-L$_7et
zjnz9|f)*x at OD<kTWPm-}V^)@CYIi=9>%wky`Q&ODRG)^ds?0p|9pJgKsc}A}D+q^k
z1?mV(K}9Bp7|d?sy&LcMPTZLMv8U2$x^B&+GRL<pU91o%Gom%PWvN>;#KKXe()#}S
z?9ie#i!zH}vH$9_73T#`q<<~rN~`1Pg$gUkqiE4Mi4~;F!TMyEUTvfO5x`W{9|n%V
z!tFz&kzO}vKiPQU8Nz8Bz1y?RGZ8xph269MM+%Lw-WTeq2OEdY84fK`u*?c<GI~UZ
za!MFSP^S25nQ<A=#GT%IFq5TUJfTP0EzYP7 at K5}g-gozpXY6W{@IZq9WSGYt&M2K3
ztuN*I*cb^GFWvSZYzC|Cp3ZYRtyVUfIS=y1N56Bj-AUeAo6RvZFl^pPJZNP?({G at I
zHfu#p$6<XIs+b7wK~X(~*bsXZmsDpTRh!vh#OoiMN?i^<GcHTIe;~IqXNbE_){ImQ
zu{xQ4!|fGC<xzn%KL{);1EH-(k~1Z~wtQzo{sjQ{zJU-((r*RvzV}>E$){*s;tcI<
z`qTFlFRxr%$k0#WqHAlT5BsKS-sjbqZ#s_W%~U~-nYwXT<qr9t-T2r)E0^BLhqGPD
z?b{E6aa_asiI%NEqyOdn>@nxo;!511Xv>Wz!a*`Kvw{Xngi4~sI6bwf$}R2d;qD7?
zoR{_^vn|+`_oq|qPjH(C{J$dmDDd>Xe^6_xea`u--ZepVVUMIxaNalD+eDf~v2yEp
zwd8sGY%ZjWpp3dU+V$85HMAU?N9Uiq0tU(!?^zJzLh;E#eP+CzNcVce0gB<>QT++>
z!+08uF6Km7Iy_DN<hNCKkDmp6DgPS-IwutV7eh|2V^BruU%0`wwPGJa#!}1lW@<g>
zF=6*#T?8?umiS4BFAj#nMG+1=c{P--Tbp)YG?2MIwX$L>8Jw=mGMqaQ=L(~{-u}%9
z96_3dD>rhctDE``#<<m%+<qFqC=dghw%fHdF48}=)geq2b_uH|=OG+Wx%H4ge#l&X
zWD#~qxwY at 7zUx$r%-|l@*a1o-lDM+pcjYkn1kmaWa-CUV;je+R+Y{{#pzGLlRsx6Y
zFt%%*0Zg!tU#g(GC%$pyb7c~Kq42Gr9&XQvnqq2h|6&tEnZYMAN0!rb2v4*#9_`p<
zRt;@;2Vol}<A_SBe66=>@<l$|kNgU3Zo!Q0q&;J1ca}T(znddvlLGRzAuQLk`+mOj
z%UeX{54rJN?ORPEt?T54#Yx-vH$oXqszk2HaVv)(%rx(BNXV|?@r;k}AJfx-JWl)`
zBR^hvWCq4vD4RQ}DL+u~TOIh at tdEhpJV+CPd?)Fv?+j-y&KJaO!V>R6;&L>&8LuUF
zj=cIQA?30~n1O8RcB#{}YKQ_Cj0f)t8z)DEdyL2KC2H5(b at I=}M^LrQTO1^VtNcJ(
za9E2x at qwpD&`4!d`;tm2=d{R&o;!)DQBFKaBj|E3w{n2y2v3&l;V1It|I`9FKdPk(
zC(*PC?(BR}j6L%`E7V{={KOQS_=72*HdCis%#2A;X&UtBQ}J|t>3F?t`IHFj1X;sv
zNICMu*92ro<d1Jox!EqLi&w}w`+(hT<5g-7ZyTF+b(#hjF^L`M^PlI-BbGJ at JHb{j
zO9#)aiy5y91oGH>RRW+NquLRs4OtomlJua-FnG3X(VLg+vAf*LZDY8}cvgPm<QkTq
z(*jCt5w<;jEYj;>p7WiHr?ET6<}Wrg_Jg4};RDMXT_#l6J@;<1lTCuzgu6X#bmfy_
zn(+&nvmuo6uSVbPJ3O*sVqKm3lT|2WCqAEn at jh545Lx^OwM5eSzUcB7JmW9W<-h$w
z+87XxDwNI;HDUsE8do|~94b;AFa^s+*oh-{*#PO}X($@GYTGv}6U=nD_72Xy>Qbly
zH-!FpXmLzmgCB^%b~RP#DYc=q1<dUoxzd?{=Jxo?S+K-IL0_k2G?Fc`ckUH8>W&yq
zF^ix4?Rk|v55y9%=#Bh9IOVVHD#I$I_ff<X8)c1u9BXSN3i?aKvVs>IXq}dXFx2uZ
zfJs6nC5Un=vP9wqZolea<K1oyS5Q^S+EKeLA#-^njl6P92v~0UQnmG)aluEPGF+71
zhOsapkVYZ-r?}4UahD!T0oD3p7lUdek!H}rYrM0k8%XQc??zzoNS&_m1rT;nE-p-l
zUR0p-Hyy1k%9zoR)yaDrXKg5~u9~1ni at WD*1a#}xZ28B#C75S at G?%0lGT(x7?kXOm
zIW{!bOK$5Ofq+TSiei0e31?U6*^pzBLJSnatevt1`9d7&B+fYc`Vq^o52jv&Hn#IY
ze*G<Vl<}=)G$JA*fCwoLyLfqKVow&Pvwp4|<I0d{`Ml=l2%dU`_S7d^ng>F`IT1aG
zKN>ct;ZoBsZHO1diaJU+Hs-c6hFb)A@`VPSc}|r$IHBr=EqHz|%pB>ChLr|X!cH6s
zaPv$^gY}fU_=M6NuZIGu<QN|rFTEPTn{XA+E~Q~^T6<SS;;i|;zxg*+H^oVzI%Wlx
z9a6VTqrSn`m=1(EUl641<K`L+MAfqjrFQXU5)=hQ>ci8VG+D}3rrnnws>3DX6dsB7
zba+gBuoV+PpLdh&a{HBm{ca at y<mpu%5$JdQQEs$#{oV5I=ba0C`?eqn<>c*Y6JWw4
z23<uKJ(d>GaV)KO`gdy1zRl8=mQKApxBfL?jJPG7a2V}7lQ>nw?&#rEz-7B8sTsdA
zn-Yz1v>9?Y)oaVNMW%GxXvoSyzbz?6u+>`J*?KCi1C(nVj*dj~D`rqNbe~-ZM0LSZ
z%F|D!{de1vxf}3f!Ik+%?Q3Yzu40a&UCsJnCp3hpMuH$QOL2<+1H|b4_+Eqy%}a*|
zfLg9FuYO8w5C4SFtaafcWKY3?;nqEV<JH$~a}K0Zi+ruLU;_)^o<eD|crs#9vHlAP
z%m~k#-1RNNKBW_phoVOxilxml1?6=PmCi4&{LttYsrDpX!zzA19HkG@(Gs#z6U@($
z+&gez(VlYCdB1ZPdvs!!e62yVG{D@!eqmOUk}kY#T<1_JT854q&Sra^pt!4qLrshf
z&v;Loo6<Gm3Wl#aw~s=62dhqUK&3OMuAgxAU%b+ at 5g|iI1NWaSu0hpPKO%gbQDoT;
zSoU%Du9c;m=y$CB5DR%)G9K>?#o+0^5=3HT)+;7Ym<Jfog0W4tH=a9}_EGDK(%jHu
zPk2L?sSeNlo)e;Yns2h>>COxBdAZU8sHS|`;O$PK0f)?Cfs?ps?-H1?OC~-*&bC3y
zZnW(jj{0QBh8 at 8pm>-43>N^TaVe$G$w-d{T*s01^>$1i$ugJuQGioBcJSG^A;0=*f
z)98gwI->K{fiPOm+%V6kWSXMuFY+*;k2 at CX<zu9a%|uT)EXqWdG^3^I*ZeeVi3-is
zslqBOtPi56W_Q=aYrx}rKaGF0VhStN=uTENouhlCkX1cZ5-vO#7Ug9W7VFnTvGFW3
zsHPY!#Q72<PH(>O?u2^DD`38NwofbHS<nOyS at aoN+ZK)E6S4mC%gAf?>67NC1w*?q
zuVrD{M-|vt4HC<|j!Xq!eMVCX4zqO3)niSgp(qD^g}j3A5{IMu3SqGZ(4SiK6#^7;
z!}%59db5WF6Y>Bv-;b9DkIVsIwhsZSiyqD}ank}xdCT4kK9X&20vEUnr3~KCca>8F
zsKpf0X8#k`61(6a$=2!3Y3SkwKi%*^lE0!^q{};;<$|f-^pe6icegsO(UtE5U$VCy
z&xf=b!OC-?&3lZ|A>Ai%5OBD0oZ<b#q|r7%y=PL-*Rgurkx5uMUg-CZL!-O5aes86
zqKi4^p;6fL*XvkEMje%8_UMUXmC>Pzup1Q`vqrY}obFiXVB8hIvBu4+h_%#{1fP9Q
z<E=c*M2%bpZi$eCwI_dS%B8_WT!Tu91&k-$O?894+C)iUl#o&zuwp9^lkr(&_hT2a
zp_#JKb&`<D1hI$Cxg+)v5$=i_xXDQTpkr6}{)4Yi*VB(QAbGT$MS)m)c#Dy0 at 6ULM
z*AOE0!9{*M|G7=29#CmWdxR2h;2M5#Y)p3}H9EwvlKEu%)lpF02mZ9C+FC^vq*Nz=
zT441mP@(x&Vxh0=Dyoar*X^`D1oymllCK!Vm%~g7p2qkw;*@$`fLfs+(9d_8kx9@{
zJnG{zDoF%FmrM7^zD%}y-GcDjLBivZkEUV&Sgh+N)kuPiJY>D&L~DGx!7jfk9Ql9G
z5jR-XfGv)a;-*ZVxU&-cHTd at Giu--rEI5%G6B=yVdje>aRi`qbjY7zA^nA=FPCiKo
z%GKe_X9;HA>B+3Y at qi=;8JqGh#DL?^n*6aG8&VÐ^ZiobBEm{s<A%s_LqF&Zb#k
zD=b#4Z6^_6O;%aasI%+|v>KV>u4d=+@%g>&Df%ja{osbM-hjp0W9Qu7tAJ+Af9gQ$
z>_KYpvBhhLMd_O5zC!0zF&MtUd-Dlv55IfhIy)4)!BFS9{t-N)C$E<cP}FFq51G8u
z%jWdY0I6zsg6Br0!u)IIH&;H;$^TvPk33H1HITEe1=E^`tb6x_N|VFnDTVNYNYjS0
z9t-MELnRB=Ox4LflAjMcS;K_m*FIBf9M*nFxB%Iyqvhlq_r$F445hLL?Kr`z!4*IR
z4sY+<<hegTgIl@&Zykidxnmq=MqPNT-_$QXOg=!sd_*ZOjI=f7lv}pQFDw#k2y5J2
z(&pP;)Zpf8RytjKAyd8fW5RQ*p$MXJ)eJiF>o1vou0{yJSfA}S9BGOQIxgkgRy`_^
z<~a54#0!N)z6SYt at pBtTl(-OdNh5nPywRdE-L&JN%Q{leJ3XteUx~9%59d;Fapi#3
zRD1$CXU!Bg at Ft?B_i1*&(%Pqdqki)jX+`{HE8<~{E6<#A^z6Oo{5hi)KolWGIP6Aq
zJHm6U_Nce!Z2NQuw%WsBT{qKVQg$dBkNjIo^9EdRxLB}|pLn3biqKM`>9Rk<d9mt$
z*J>YX|7U2WXQbR^GD=GBZkhXVE?OkaG`V_vA}Gf*ucqs<Y)Q7)R};TG;Q{^<XM*MJ
z0};p({lAQz2fgdm)#%v^G#&>*Qt<4ofU)!23M?1cc8Ebzq0<v;%?34BpttjJ1~3HC
z_jDue{e+_vYa2`p&R~IynwSX>$PP<bmUh72{MvR)Y)1IZUi4pQkq=tt at Anl-@mJ&3
zbms45>y}z&)|(2RSb#(jf<O7?e_r{+3EBU}+42bu|1TvZFS{Iu40=j+5zh+5YZm09
z7s{=Z6IgaFM$u1e^<(wy9fYI_*63S}C_^#tNzcRTah)DvJ;b=tT7T;Z^2 at 64!uRVZ
zedZshxI>=|KR#z_Z10q_g?T{oVDOKKxs+r+zE$&)71};%|9Ui^$oDF3;tGM`NFafT
z?|`~z;7{z~*W=2HJJkhNQA%I{Xt&)5<r&}Vi~W{xA!NqUybf4Iqy)VIBuN4T%6kGQ
z9fGw#R05p&Ss(AQ1JO|xvxOD*3-8Q^pTNyHHP?Q|L*a8BpwR+f4No3}|9NA)le)j;
zb8r=lLW2?c_41sQ!w8c1D!7=TTFUF~O%pd##2;k_R)Xjub6$M=qTQj5!eDL-ce%K4
zvmi!X5Ti~7laY{CovKOQveDt|rCy`nPGSyMlex*))CaXI`ZN4Srj$@VI?*<Y#X0?7
zk^U{ZSr!Eg(Iw;Bu98Ql{GMwaPVEt4+0SQ*yq)C*_xe0M055jqoe0E>jdTNWEur9F
zVhxWAW%5fNUOe=`WN_U&lrnW_BfS|fx+4p*6k-~6;^hHq3K$2zwXr5U`4+cO{7mK7
zf~TrW*u7pTb0X{1ro^B#p0^8aEr(5a$0rM0F)?FOG3{#Y<zs7mWlP)*T^SJCkXun|
z2<Fl2R$2fX!qm{Kr`%y-EbF8a$?c?nn_uG1?}yH%=(KfGp}P<e$l0H(x38RiTCM#g
zTESHR282EDW|oVG90+XZtDv&{F}mVn>}488yV7=7n~6 at nPC}rid(|Tz;lUMsP|@M1
zV`x}W!?KeSQLX&C8{<DilM+DAdd{R`8?o&F=fN8PLdN+JL>g~J*mA{^ZA at +AA{0F8
zqRCPx`BlMASb_eH%Y0?aKmRSCQUznh#E5(&fwxMd1+5=`gD#XQEkdN?u8DvXQ$aTs
zB;Q)&#fT(O!*1P%?$Wox at -4P^^D_c-qtkvojcO6~kAy5o<8sWz7<*gs>giTFM!lI?
zN%tVrI7Lc}%AucD73+cTAzjt^r!0mCwk1Xl?#L#K{bFq~*UT>Vn7M7}bbHKFQ9~r^
z+o%e36M7Q--lqanf3>h8xBb;^fvQ;Us#u}h)upfO;yXvc<9Xj%%m9l%ty)64{@sw%
z*&@pt<9nYCX>CTIK$)(IhT1A2*7g=S=xPfLkPcpHhyYe;=c})XF?1oxo!wi%lbAzn
zB?(-BfbTALHYifREgFTLC8{E&n3S_)6&l~?_}mjCryr|1;C2d}LhrnqN1eccRe#?^
zquNAcKX8_yph9QMR>Jd=*C0C6eYnUfpVES<@kPQFRUHu`n8Qy~b1JArTS%Lt6U;9*
z$as&_8Rot!P2QdmXmh9d`YXlIxNajouq!=aYvqka7|y=$+7%$tH|7&LD0N}1g88K9
z{o|azS?gZK<7dLO)`k1eDsK-<MZX9H)Z#@`M*@#F<iL*l19m0&le=}hM~Kr}*}<O6
zvTtVWk~-#^o-r~4J=Kg$EhtL2eNRmv3Ns;yU}+s8p7K+ye(If&<1RwDkGp6p<9jZ{
z`^;O6l}_wt_GlrJsh+jux_n6w+SOIRt-G6_;u=k%THvP$CteSKAgWuaTUXR;ym1S+
zSe?DTt%@8d7jr{xO#02BW9UQ5Mlz39oE9>E)T$lwuzU7htD^E14js7Wzg5 at aCaalo
z5<l<!&SN_9YeL}isL44_v2%^JGqkXU3CU)+1=B}10bda6kF;lQGhqyFn8Yp9+!x%+
zsC_6qFL)C&A#eo{v!fDO73O6K&F!rAxAKfq&fyoeSzx=MtCB8Cxv>rSCU`2^u3u&O
zgDV|Ok_jkUXu)=UF{ig>(06iOW1CS|)_$`@_wZN%z%ww^Frki3wjDh!vd^WC%I<B)
zhz at uSsm$^3Ojyj&Rh4x5QodIL(lW#n<1ovovmA1Qk-|Hqy4+J!-NhgTRr|7oYarL-
zYP7kzqzAEpVPG1U)3ZCV58gYSC`H)bn*7LH6wI`grs2J{au0`@HT&F`sx_JM`f<Jv
zorJsLwuZt99X7`X>iUGFr9)_pZ;xA^g;CE-F2C5(&<C`t>SP)AiagtI(It>t_tq^6
zH~;yx=d-rrjGMZB%=x&?=eLc&U5)m4r*JzcD@%uvj)LywY7fd2%gDcrp-lt{Z+PJg
z9-0$*UjzdXu8jOK-#oL*%V?=5uUY*JEbdHjkLVz^lOlZ)YFZUWU!8nyX3m%3v~P&8
zc4_nKI`CQ_WfpN$T6o#Ks2Pgbue&9Zm=WXAk|M1xBCJ!w*`a4Wy`$(rB|>cK>vdb}
z;JKccLdTa at B(Yz=<*+;Pp+q8>D?j&zkDR#8R>BHJB<#dBb%CDk8Mb}UVyfMpjV`Q9
z{lTA!muzjZB20@!Y}Jd|>c%6wSp}Cq)&s&+ebY`KbS*Y4v at yB9q*~<rBQnvGjm~`T
zq#+;?#0XDh`2R1qY2e<(7?|H<qNNUPv=BP^v3DtI1T3)omyrLLP~l%D{s)(@UcU#Y
zH(wmZ7W+V<6;<oY8(?{=;)xvU{6O&LGSjZKL&ex~ZT3F>WW7;OB^!Zlp*)=%&W0GV
zM+}+=zI<Mit)HKtRBPM`70g`f$R^eV5Y{H1!D@<{Ju^-+*buJkpnnQ+GzRm1&_k?=
zjCZyR(PI3u$-Sd at ScIcKhvl1_<~?t}UBQ^yrPd*&qMGK2g$h=B%kvznM_1(g`@ubr
z>vMqjRL3Z{n=ZJLJ20<i#rox=uvJcxNLy9^*Zf`WvRxBH`$zU&;3e_L>*M_C?w3F3
zFpfP-e_bE0Sw9?U37cH+kCb&TRF^XjC=Hk|`#){QZP*^<f{O(mE<+_<LbPD1sB*?w
z{AXdr$K#q06+YLBS!EU}I%|<96}5M-iiAZ)<%U;$7JlQ;v`X!xUadApHs;J#E9MHg
z9Sz#&y9FQns50~8C0M6%z0?g4^7Bmm133&0d(2iuP!rfQlsE_IIC-xBr4KZ7f1ONp
zF^_3V4sjfl^`FG?o`@c-AqRo;re6l>{FIe^hRg~^MOi~7$9a;lpH79pUP~dzR5zTj
z%JTGdZ%jb7_9H at JdDO=x#o7m|U_DN3FG3rM(C+LIqRs7ra~Z^|ZB*SMdy1 at wH+doE
zaEe at j|6~EoNm>y3;!dXcD`HZ5_Fj6unK>Qh)X~n}RoQWUiKI*4zXjZ0QqsIBLY29q
z^>3JwNDopaN-aFtKUWX>4=25hS4>HW+kqfPq|JNAbq0EdWi*1iv8~^30hXb~=j2t~
zJ>&#*cU;hv)4uE4E>v2ITCA4Al!6Jf)`!(6uZX?6Vn+#0oU*2oum#)!2fF`TPBSWB
z2fZE~v~hseKM{q1<cSAIO2L>n?jMjx1JKv1dSq~A=Ka<Ed`t}lnrbe$z%nYh>-UC^
zR}!sTCbJuPk1QBW*zUWmbPk at KTgs9}R*FPSPDG2ni-QY)bBOQ>htFN$>-l(9vE%l=
z51;QQ*b{3R1NSsP=kV6 at 3K-+)?_aNM5ATyNP30g5_k|MeA5R%`#Osd3BfA)Tr&m(*
z|GY()0x}B>$nBo|Ri1#_z3pZ0x})J#dr^z*mxB+13|RI{9naK|l}Vv~J5jgkH8Vt^
zY?^#}9!I8>CriF&W^1yD?c?oF$z5$9{V9A0$!CF!*xIs<R5B-llIQishi7iQzF6w_
z6u4Zfe7JE*LySc-z?%k=*!QVlGP--IdZBODaSau;cB<G+R^k?bYlzlna1lGT0iN2A
z3+(zahfH*<`FJXj6up8zzdP~y at HB<*fqLE1?)d)m3<%9&UC4fP1nl5o_yyI}uDA<!
zqBxrNaNaf#xN_3*!!x5Yw}G>xw;xNdvD&)L>rzIS8MFx0zsQDH$@6Liz3*)D#F_~J
zsuUqtDUw`-v^6%b-f37s{mzIlH*1iENykS7d^yu_K7X)$c5AH(VxV3ZG~L<+Z|>V|
zJs-C|JaQxC)}GA`>5UR!ug55*V_uK at ty4MX_xXxh5K?Kq=h4AyK*pPa!w>R3V1~E%
zt!J;9$EHOz;MJFVr+FU3`fJqPomBX%k+3bb(i@?EUn3m_Ky7Ixic?;wH>y6o&R{)B
zzFmZ4bu|q!kcP^=k(`k~OvU^&1;OcxQ+B}7M?bdBAD+7z6&B>>%$hLya*(wlvsJKG
zyG`|S6YGV0Y&B<^_F)=dAVIWH$=CR3M$+aDPFe+~3*j5DHtg^!W>HRsru1Fm(h5`6
zOczX}vUmPWODZ*8Pq!>K4xkN3E^8jM<so at 2N6}rEDKGHWwHbaN6%Gc1yljllz6P2u
z%@2Rq9ec+F?Oq=zKnp+;as0zT;MDIG#P6}zr7DYv^k7{5J&n^-OA?#&tSwUcy-D9|
z4RjbTPkeW)EXTW1x~8E*Cabq`uiBV!)rP5CsqC=ymAkb`?|V2|8sBp%i7A%J2ai at j
z<Zd#03~NA9Un6DsRvAZ|O3P$bUveqGH(rYqX;;1Bk at fbQi=TJ4!~@kkJw(dx at R{pd
zMiqU}-P_$_yw?kuLK7}L(dyr+R%QS>+Nya3-W7RA>2kM?NViQBEl+^&*Q%j9j7f$?
zLT0ALdL#DXY`2qmGxkBJn$7Qt&^Pij2llVfSkkHShX>BCxF77~Yr*hLw(q3ZPN$j^
zZqB}n&~JOt_bsbKn*_z;S<WOyO?x^0@?j)VG!=Y~P2YVt)>taQJj%kQ{K~;k(b!<?
z1(%%Yjs8Mu3dyCpS4E?%9Jg<7ODeSnEf!Flj%0Pd+0zkYuPJ_jNnv8g|6$6`&Lfn^
z5EPD8Oo{?jFi_K2ADvNsEZ3n>a?yBDPV~vkn~sYyI?R_(QzoUHGfcSAB`lhK8X9MI
z>Ad at MQD-mbD-qyjdRLRuZv<AIS2xMF<C##tVbG+-k(c*Y_$re=TD(T!8X?P(MYQOw
zxvuaoyIldby5o(vFWrVh5s2Sd;eVclVpwlbT%?h;D>yf}*1T%?l<REDkyMTPl`xl2
zw?3!q$H$((-xA_{)mgMquJjq=2?bNLx6#x1&vm`mZ;!1L_y{_BlyC`CVf}j(F6UE>
zwi64InW&Z~L(Q%f6f|!txTV<3N at t&Wd&)}<^*tP05cOd0LdB7&k&eQtKKloH5&rgJ
z(H_8PfqOBM02}Fjs3Yd3IBID5tA<(~Gqu-07W_o`&EQbWk#166MpwBX#Ucbezc20l
zeLabv<NN0liXRLbGt~qo70 at c<uQx3(07;)L?S5|aq?ysA+<X*g{iP;aYpQYJs+Rdx
zefb97%V^H!oaeeM#TbI3w7xof#3HMq)+dQtrbwNH-fF8?@T}P*E+p@^4Sj#grm?i`
z$vpX;1#p2wB>wif&YfH)UZE5Q|K>|gaXLz^vP1b?1xy+*+sj6B1QIS>dcYVhy at O7C
zVx{mb$Ia$cTiMWdAS!$`$K0gk%Tv{*wB6ghv!+Y$`;N{JX(xAhevD<0h|fFhJ>PJ%
zrqsVYY*0lvrO at H03IUHfBaJpz;(s#uY4*|!p4PKMrI<IwXH{zrg+*o5B|Ob#;1Q-J
zc)qTr3z6k|dV^c;asRMRQ?ynWW64MA?yjBy at HW(CE`yJF^`3w0*1m)w&?f7-nKq4{
z^W>DbIxk=Bcj2O6<j7sw*)exBw)0||L{kFWsX>!P)i_#pz60fNbr{bzd}^e(f%D;4
zn?r{Mwa80fK^e3ofz#KI&A;+v&LkC7j*zs#<sWY4YRftOK5s3qd;`lluLH`DALuFw
zy$R7aa(Qy9ocan^mO&xkm(e7yvxmi6N@<dvI&_%fr;nGUUZ~44qc-c9-c2w54(_=T
za`A5Ud%6BEoHqxhZ?d?ijr46b734fMX7cBZLZc0p&&#SY7m=8j{OuhO>UtDOY6pG+
zrAp!@*$W;kL=%UOuajp(&Y%(~Ohta4pTBAsm67#O|DPmN4&dSiVfXlRpI5MPTo0=J
znf58xBu9@@mcGXi*9<<E!XUo>(##}p!V3908NbDylc2g-W4A2r)!Zs+DBtV7gJl<O
z!7(#YZj^aO>FyRUk9;l1X7;Od_8-R0B2_7RN1)wS#w&B4kK%N_s09>ABj0Q0rEZ(&
ziw3;Cm}P6#|K^<kgV&OabB>zBd7Oe#Z+NX%4;C)Q(wHV>-Ik`l`Cc?J*MUa9INkGx
zQ-w*@&Wr)k$vywr6wJnloO%zMhSB>x**B!`mX+>4<2|*up#4dTe?aF5o}ijYOs0CD
zngrY~;m(WjYLL{l*PSLkgMZZiRN!!jPUj)g=1Q17&zo6>SMEG7%LAjE>{c3=o(a+2
zW#o_CDt?>C+m)jBgY64#^_x1zrmXksdS~;E%<k}NgJ=6LX~n6m^~r5VxTz0H5wTVs
zXSmNy$gSvKsnLh0sGimm81TAf?uhA`O)I>wH^><?AWS^(SUS8jSR-7|(d%q-11V%|
zy7zpn4S%eZbN`F7w}8qj=-x+PO1e`zUQs%vQ;<&S?rxCo4rx%jl$7r77Lb<i?(V(^
z^!xtz|GTm7UCVVmzMeB at X3or>{XBa=bHupb;%(XIbEcLYObrLk9KG^uY9qxRtA at 1I
zu8G?Wni=k)P`@J#$l2SMoAq at K$TmkTCma;7al?UGhB!n8oj`YL<0_9!DMVMc$XN>Y
zHE^oH at ed%PvUpVwKO25QZFpcUBMXR at Cc7N{!(y5o>D9+AE!uqFsZ$<Q at A59Jo>Wp?
zsYnnM4;G~d33FKro8EuIMoi8Xm|(#Rg3uc8=CZM0m;d=~*7Q93dvXwU9|F>NQ8tn&
z;zg$)h{yJ|M1DBWY!UT};y|I0NPhAwX{8@#Tu7Zhx$I1#pe}=RuHu59G2leRMuxX|
ziQSwP1)VI_nfwD+^u?|51Ki>gcd8TL30@(647TP<JlbgR;u3rPgFj&5k0d#LTxAx?
zRFu6|GYxu1a{R!eTzK`v?k41j&}bMYi{xl3qJl*rXn%7waddWzwCHO;;+e5b1)W|T
zNYm}9jIjQl!29sbr^>t1RD0nCONL}gvl5clS(C75ucZ_k%jbF0=6(u2j=4aoc+(e~
zpCXE2M#P=~S%GH#0ZwD!u_VeiaQ!E?j~tm{Kf1E#oM5Gqf#RMp0 at XJnHLzlQ5Os>D
z-62?~);hl_<tr;J{m0mqkdcb-Dj7kA>e{TUOpRt7ehcOuyA2@~5en+$7z~$Z?^ts-
z=!x=*2K!P;3+8<5=o_q8xlCC#s#7BVJP#0$Jb3AGUF0#laF4uitGBh)YfYA0>pZLP
zxx3~yrb;W@`bx{^^G#LCBNtYnzbntea06ol+)E3Z;tO`AwwJSEmsC)(ysvW_!oD&^
zp?nuMZuC59(Era<hIEr%F`6bufce$9c|cmx>ye4oR2fbLF*PasB3z#j%UCJuKN}!;
zb%M)M8`N^B1II!bzgLlk6m{%6jQ$C|B~k{J(0vs82t-|-(z3brKZaHOrk+&z3Wf<X
zTi2JeMv)}Y5c`CTNHq7`o88SG-A6p8gW5vcp;4KNSyF=<6jPe;RzTh{(G7jjWJ+~%
z)(cqg%D)67jUTo#hp|F5yF73(VEUX9m}8lh7T#gQ=_Rmrj39fGrMa6m;!c7TX;N~E
z+)>QO`z1Z8A2&H+mdVmTiu)~AjGAG4GEh00A-5UX)6-g!lMApB-a8In%f0vxrSyN_
zw+Oo4Ck%){#*tAPaq`xwWNuMkUMb-TeSBRcQQ3_E^I^mfbW4A9O$iXM_F-vQ1jWmK
ziI^cbj`+)IH-1t+Z78UzWrL~P6NP2?82kMjyR at 9fabU=A!+6Ts at L$0>N-%}ySTXSe
zOX}Os#S^92R9}B+ajNu9ttwEbn3<- at Z8VJ7Z%#UX8+8z2b^a*}p{>({C8JPS^@E3f
zGUBYl4NBY$3Yj;d8Foh{K-<WGK#k7nZH+~?#=eREZ=a0s_z)aG{5;)1kW=YUp|}wZ
zBC!}#Ra7p|oJe_*1pRjK^fsEg%CcFE6+3!wbKd3CtyVdD$!q?<_~4}nEYT`wkXnum
z+}#N at G&FczjyW=)&w*dqQkwUB at 6o^^9aNNGsXA=EaA#Lj8B_J~MGy(Zc%G~b0#>l}
zu2*kK5k3ZtRy2?py*AU4MpfMcN21B(!L2oDOQH#rbubDZ3{Uu>1(9V|zoo|rB+DH~
zV;JM684%MSb(Y-hL65YTTQBhH{?W4??aX%ze1zpFLkPVi&QXJZD;6vw|9F7c6ZJej
z8E_Fk2(kqL<ZlYQ&FW&ayUX!1gxBMZ39wT*;poY7JJfumGb+2yqDMFQdC>)KF~s~1
z0vmoj_9R(5!HXj1?Rb3Tiv_Q=`}d*~-QC@}oNuG|tTA~kdCx>~|GgtX@#T)`#l at b*
zMdEZG*VBqZ!Cw}AU*F1>)z$_d92_KQVFM*U7oYzDLhM&iS#@>b!^1;@7P6qW1)v8n
zudcqRC=~d62^sb?Xh5r}sfh+NnB068WD5j~zu4aA>b*sIZV at zah$I0HFSq;>4}gr0
zM)m~`Yr!w;8St#n7=TY at _z|eu`t at J$3b-~^=%sAn!0GkBibQ|uBqPY<*FHLzUhSR1
zs1}i;F0oC?+^|m-R|CF7?x{S&JnjxY73o9*#lQAYUK|wQ+3R4zm*z-;9+ at RatZP*W
zixWQ0;jU5nI5kG}qIzq)AL<->HCIFgQ-z`ZkJ_$~QnkrKG|gGB9a>#Y<^N&&Jo2-d
z!P&`fXSGq%+dHUAHg;xlR4KBl=C9Wd^qvekF!?OuV9|Y&_Gjzwa6xSkJ5Wu|8yRvq
zW_Nw>r-9ECs8vJ_*Jyg!?NRbQ?AxQ$nYOpOH_98c%=MC#HU$H<lEi(2cjtdnbw6s4
zM?9J=J9Tz;YH82lZ$SaMRAnqbSa|nSVDjHwe+0>bKvVpW&`~B)wtJUw2bbI+AMg50
zzT<T!A4N;A)0x(dsTSuAX5wLTP!i}K%E{@GP33aDNwz2!l*+I-bf6)5clLM=!S}R}
zIe+IAn{j0Anf}yLpk296Rib(0jdsA>#l3pP?|onDlFSom-~3#=FkGwq`*GCZLyONI
z|FhY_=sr4#5Or_I{7Lv}C&wifj1~HvHj*g}$4QPK4E^{K(G!KyhGI<wEgj1m8^a=_
z6&yz$=4y{J7rbzjT%dfG!YVMbF%Fw)yt}Tx!nf3U!XC);GK7AfJ79C0N`o=Gdb~g#
zwXQvxSm3_CoI5(UZj5lcy8`(zIJfkbKFmd;^5gnGMPG^67oFYIbJvw`WG+~*T^18m
zKiq5#S!-W9FL{L>Xy|+getkStvDmw?eG(UE_KK;kU$E}1zht=fI)!@NS<Pu0Mj4-4
zzXk^8%Y6IKm`oQ1LFOOhdtJ(H3 at 05ocnqR5mxZA1d$aw9S-G3y at 5%|orM{|j*x==u
zdaScOdU(5|?mjxK01D(0s$ejjZu~|52x at C^p(-^|k8<|S6JLy!n&pK$mT8RGSx>p2
zZ9Vh~cAA4cX2JETY|c1c@}5ok0n{`hqowqlqc{F at ThuVNw!EtEth6V2)Mkcb)gGOX
zLfuLWRVYENPi()uTU|DIH5;afo>EJeOo<vw`%VM^DEu<3Ilnwp7i2u8pnLPHmS~&d
zV at 3h`4If3Zh2~~0DhiKlRk2b}&3a%{&hD@}uLrIYEkN`<RT>u3&bC`duicSH;te7V
zgX7W3pF<s|3etE&kre7U_(l%0S-NfdT*8X`fWw=*5;mu^S`ecCn|y2RUGoydc_()!
zNx#toI=bgjbzvR#?AM7L`Z0RC#)kG^-84r^x6W$K%n;XxPkI}(43eWkJDm9-9!s6C
zYk-}2wj}>G5iZ&giKKHdSGXS4cUr=xg9EhRr<FL8c)Q{(P*N?9)+UQJZtSiOwdPwM
zV0PKIr_=5eMNw;JtvqV?pnm3dKHg0tO96ss-mN_*2GEmQcIV^G8sFi;D>$dtG)$i@
zCfPKQ)Nu82g1mc6lP5u~%~H>MGU0(gR*do`dj)PrR`g-rH%<UT>pW-WB>taPX$#xu
zL$da+raQ?|)!g;tT<eCn_f2wTw3C~tSjGMoYN<}~y_febXl)^F_KshGnxM7LktTu#
zi>f)_r7#y?1D8S1c}o&h2(!#k*^5ZkqT_w%Nj#C5vy=I4k|0d1_pVV#sb8YhA}ckt
z=?M$Z<5JwpT^YX3 at q(-9|Dm_gA+FClA3PG4D()L-$CPb6F5%ND;af8JJ~S>23I93Y
z3ceYtm6d26&O=V9r)KN1Ezuf!I%IHm1`Onh?k#WZIu+l|eh|kNFHkGpn)vUH7d9 at j
z;ORl<_3G$-erhYoQ<O`SsAJQbD1ObRZ?)B$lM18!3G|P8hx6V)tp=ze>PobeNO=-L
z9=DpF(vigf)3APrJWg{WXykUr at w)SDOe-Buuv5!Udn~U)JZjZ;{<Mf at U~)BgUkjL<
zVg5VlLV5X0WR8xVhx?;+kYJTj<FeC9{<PioNhhyn)2a3wW+u#}Bp!mrQwhg1VBMm7
zYz%DmyyKlcaAw5fzBS%E=1mu_HsYO??XqsRGUO(m%6Wp!2lRXW-Tg~(Zx##O4iE+E
zv_UxBZ%JxO`$p}@V01BF*#^^V)*j+ at oaHezh8m8G3A%hl9iMnQg9gDtp?+j&8&mj-
zwm8xa)^_R`jShea`iQy$v3t)G;2XSR`k5#2DO3uI<m<bGY(r+D%9-|SG*74b2ai8e
zp18cd?IRiF`0fBpXQV>4fi{c>K$a<jmj%uruFYtlzgw_ at IvOFL7Wqn-usGb!Y5NrA
z^Wy-Taj%_hXlp{dIId63lpk1}CK4xd<16dytek at F+flo3UKJcYH9Z2T1(v$!T#g3o
zg0Wzhg^TyYmFpAsET73FG1Ot-?S1+kVYaRo4Tg`u^0-oCkJMK11G7eLsd<o*a|A(V
z?U5`iqM93New?m=?!JuIvG01gx4?j1xaTc!6g at 6V;0QW9`u>r}0I-YNHZKcxx(evg
zamxaIr8aT%_OM$Lai=4|lKHI`i2Mt>FnZ=Y5gsDJIPkk-vemIAl3`C#fLWT{PW)IY
z1KB%0*;Pv>j?gqk6)P%q00RqmhChP<p6MA&k5JfgSnn{kmdc7j7LV2C- at +>;=mjG!
zmxMZan00Nx!!Wd{IuFmE3SMCT0ry&&I81T7509Q8o#Jpy=c|X*`z<!&;z(uQ$^PHX
z{wOEm04Q*6e(^P2h#{_#%ytjlRUSj~`c|JHNGz=kxaysSSi$QPTV054%!2Vhm8r<z
zp6e0d8=jn$?9#d9G?nlC at -3kz9}^BLsAcTu+gt+?y>C<w%1pwGH0Wx9Vhv;bX7p18
z7ab(D(_B$;t}H7wAhf-U-;f at qE$I(7yAgFvGTi-<Q+RWctd|AX5Vqo!{K-gdUd2}r
z6&=dV6ARN{4>kE`LJ{6J>`u2pDf~p)=n-3(Q!<g1MCow8$}X&$uNf+uk<nCjwYt5_
z0*)eQV=Y3VPUuhdF$RIsq^L03!tKeRC^{Qw{N|h=8$jKK7gC1c+OUYUe2tN5I`sdr
zk`+or+g%XzDg at 5%s|cl<?0q_~Y981UADn*N&dT52j#`trJFB6_Z_rLo=BrQ=tMHAq
znj9XTmh2X#Op704qD?DB<W+y4%MZtt!>Ylk=&FZOj34YDZm`VqBbird)kCRvgl15*
zleo>f at rF=d5wm0)YKiH`E}cWd#c2PDc(18$%BRx`M~+3T5K%^@H*^Zh-``!Jhx?8P
z<i2JUYE?1X$IAr^9MB?kZS9$y&{C`MTa>}J>*qihF1;Seu+Y75Z+HI9b1NIK#32wa
z-U=ffP6i4OCNj-TuQ2b}nHlN2(_=Q>7>@i&6%_v}i<`RV&wj_j+|9i<TTu1UcbCK0
z9|QFAlA_9scDGS_Z)^sZFrUY;<I5P<2E!zxeP+}ahWKd+$q26-iYnS{lx6UGbxl5)
z1S%0_{3o%nXs_Lf*-k!b84rl5LH(9&wyJS^Hfh~d-<ijUDj+iRbr~Tle2=Nb%ngyM
z at vR&^JFFO5yK-oip|C~H6~k9(#?w6_j+$$b3au1Gcv{tAfnNKL<LDnlGKx%|f_K=6
zL>vq8rU?;ng3MnkG_+vTjH#KcWT<yC<wWmGp7H2dw`lW>sN&ot^;ZFEG^|d)HHYtE
zHBJwBs-q0to&*h)ySd5RuwfPEN{zm7L`waoN0$wZ-5Ks*U%$#l5+C~ntsy<ufcFr1
zS4RgEo82)O9*Bop&#L)e*1YF(OL4Zk3GD-t=x>Vg-Hsh~L1R2P3|&Kuo9f&JVRi!N
zKA~t`8Bj^G!NAtueZRZiU}BKP=174Z913HkS#}mHI|=sm0=*Pj$Jkbtzx8EmL0bJ;
z!a4BTA%djeWMuH>L1~F)E>3ZmNq-c&%xBbC2*uJNeLW#!;1&-lzC#;wvbD1{jcZmL
z3ejlL`3WZrCG57y%cRJy1hdGCAsm(siSB at 1nw=@J>sZnN&(%qL*m_t%0dv^LG}r`t
zD_5w at 2)+XE>uFPhA#!tye~y9bRFt@;SC5Y#O>tpS(ze6FJ&7PKd)Mw2^b<cAh~n(N
zxI)0;^L<l4r0u+<u%N}KchMu#{F)af3|&d;5=&vaeKQw&)K1 at UdTy$TOdIHM9<F{!
z2vh4gF}!`ZDDEXHnk<;$=~IA5djlkC)Jj;W=XmFJg!#yc`e!?Z!d08XsfGATfy{HN
zfBBWf50vg3H16S!GI#g7P)7F4eSv=^4HFACVAQhQ<4Ff3SKNph5*{qoEL<jzt%hbn
z)FP7F8-=sTLS+*U;iu^7D5p!6tiO{xS!U_)Dzz{-<HFO<HJMcO`QzR$kZM1_!W!Cx
zRdfe&zm at PacNik<*zC55&~h{6utD?OP6sW?O8$~>)eQ_&gHx^r1`SRq#e~67;aOsi
z^a1JN+REjO*e>Qfi=DtYDM#1$Bq=5&IgyDTj6FwIm@&M33&L=~f)DldF)h0>{oQ1>
zn`%mLpXh~Cp-L|~M at 1{_m+gc*)}_+=ev*Hxa0yWu!Imwz8_(E?;P~t${rj7Qr_mpH
zM@^PFF6<^(Y-#%>WXik-VGpXW5zE=KEYCyvLLU?(3y8Wb7GEZ$)yssesjX#78Ps-S
zg>x-V8Z-uQtJll~2cA8o?H at TZamt>!uau0ETi{VVfDx2d7 at oTBmk-e@4B?SyfvR~=
z>y(!I6(T((H%19Lxj=BDYAjjrN{<F(J-4xHcjv-w$KNf+Z26f3J<rrOf>6cLIQc~{
zPKh1+NAQPiKgpV0!z=Yd^;#((HS0P>kM*rrGU$U at rl#sz;axS=g?DcX8|70lnoAah
zxg}0>D~uPh;%NoO(yHizvCNE1zAE3*UvDO)`~IkM;|#1$I2ZUBy4<+K^;w<xfU>Kk
zcyrVzr`?|t8<K{`LQAJ4wG`1`xp=LCv&xOI%!#lN(pCm#!vH64NM$QvC6rH{iBGMu
zC<n8MI#;=3o%2_AiiUI8$BRldr3y%Cg&zgfEYd>#eH&ZsMi<-$5B9(w&1D?9-F06$
z`KL^1dR+uS1&G6|1<ogeO9_vu7d!VNoZU at oSLvicn2Z_-ll=->zT<1TJ8b-m^MNz&
z>qiKuUp(-?;Xky#fAU5Aetv=<5voP+SP7FiRh)|k1qX#oRG3sMO({+tG;X-!&+;&>
zsLPUKYAib7H({=ac3-B<oIN$1XF(aV24 at H9qSl{U^ux??WDmRX3r=iS6{o<?n&(CD
zHNM<(F|LnUi~&-E at a%W6xanoD#qAq)nn>m9M&-rd6Rgr&N=%`Yrs5cXuw%4+vp&YM
zT+h_&Yt>Gi8EO$xntoxC5oXtOblY~6h)Hu?OTQkmfL?BBfmZ%K<r*K7Z)9(J!O>I)
zO3ly-L-!xJGo83L%r7{T%Md4|i2QncqS3<)G0jes=`g`sc&7&UL5ZQKc1CERV#M5$
zF+;8SHm&@zUi<A%q&mon8nW#6Zr1q(0$SJJ`fdC<i4RNo>ctT}08suiO>h9y1Q0Y`
zhRk}@jAWuxvEW20$~xDx%|cAGMp95UPsDqZF at IX25iy|=tbBL!gWtpu<x%muSsJ$=
zQc;S@$AmmS7*m-EsK_ep^)G$>3L*6zbzpd1 at vZK&+m>Qc at l;00`OxO~I#Mhu%dG8g
znD5EJZc4&_OB2GLtARB`nCI#v8aWNZEg=;SQ|FR$!?%A%O^q5+$wBD#pWeVH$4qAF
zkUYNaml;>T$fX*Rrm6m%UX=fl^1J#Q&X`<}g5&<3nH)P=p at ItFdvZp_`vazf9%&}l
zQd6P%acgDPggT0#lEbXHwf8$8<H4pI(p>uN(wv9azj}{g<b9e0?-;c0N4ySyVt|V^
z)J)!QSC8!1AzIj!xSJHYm*@zAa?Oq=6gNI2*y3Bw(LSt6HfXOfL)6{A*4XduR}FDk
z{H)H3mYY8=K}Jgj(D&;XFHDg>TT1(tr=^XJ0kBUWEGn_6190AX^`Ij92oaXz19w9q
zPTc^7x;TO!)=7gW6;{2c&WkIs+|DNCmTRs at 820UxofTU6GK-|eg0LVt3pXB;CwQjW
zkjQgbbooN>*NzCx8t at e+>@LwFFach;pM$8PxF1*p?mc?^lk)zhg#&NE;^+M35^SHg
z><nvSQVX1*Ec91I<w-u%0eU}*?UjbvFd6sx?n!;-D#u{%=t}YYXT2cE8R8TNtw|mQ
zvuAgm-ooCN$&Rph*O`YAu>O`NEw53_KTu_VHr9&4w5t-Vjd(B+K{t_w2&r<avq%D>
zrDOaO4aDk3#g$5)^~Nnj at 7Z$;w?-Q5RM{g%DL{Z5)vz^<L%>(%M&IKLD`}}4i=aKq
z*6lOyoRBBQkZ;1pzscU at vgq}S(*Jx$;Wvti0H`*h#F2xf4_0^Z**HAhLzcbMV6v=B
z*Vwf$Hw#zI7}-Y=&QMWs+d67?L&Cjd$`2Plna6h`$%;YLuyo1fZWnA+j(7vW6BX1K
z1ZRl(h1XQx at xAY_BY}Z&vT@;)w3rY{cwRD$P$F^-k>rk9hmS(-q)UPCxx<G((Xx<a
z(hLncfsjQb(IRIK<GF4H(DQR0Rr2Iz7i3y4mDEeV{7{v&VXo>fDcSjvlv|e&-cDrl
zMe!FKgxuLL!jrvuSUbp43*}iV3!M9VzwR1kG0N>^^9?s)h7z4c22gINhstDwShdmt
zv4|tdB}KW~hy3cKRQw`@r-1?rwuJ3C<w#9V*+Yg%D<jWxya(fY8>~cQ$}07`8R_xJ
zl(<KQ(TiMGqvFGXi8IIa-NZ+{qV$i2y?PHEuOhXjca#bsZM}GFPB~{N2_)}K2kpac
z1B}h`^u%NJF2YU_Zi_uE&Bt9-{=A=4Q at 2J*&~&KtdWBI(l*JqrIx7A~6}fQn^<Mg(
z<58fc0g6rEjaRACZ+Kx@=cger*`BgL^37G0v>!`KAXHnf8kkbOVF#mxd4h^*;%ad0
zpLG9P7s?kVA1)tF6aZ4{A=*%54qF`5e92j5ZrX$ltu?tULaW-tqJHm?&?mJrz#(VV
z10XPZhv}EsE+rbhAsuLP_o<T9V5ZD>)VnGVCpUK+Fmpt3eKlbJ8?*^kURh;r0#P{0
zt+yMOw45fwW;A!Fwr3Y;gje?(9lw-Gso3<34zsF<?Xbv at KJpx$mr#Tq at 6*jJ+|`Tg
zciDx%;}WZ<S$v&YgzHvffrr{y*052vju%Nk2ro<;sr;v~q=4Z#9Af64W0ncX7y4ZB
zkKvuMjm<|aH2a_(FDR}JFGAjZx&FqY$Cd>?c9Gj{#;xO|F<DHhW|Ra)H*C9!Wg{No
zfo?ATF>y1t`mHI}*W_%3WTlh<PAZ<!iS56~fak?4 at NM8#*7nwS;YCa)moGHJR<^0K
zBmV}3y$1eEH$M|f(NlQ;;UZpmF>M3D-*_R&UJkAi|K*{d`KNW(p#Kn2|8F<Tlfn1m
zofC5SqsLZny~0D`4cL?6nNCA@`RKB?-Ccs(QU6r(7KsO`S=Wl7k5D|oZn+b+2QI7X
zDz*=8&=_`&A{91E+yg7{;TBBR^ds185f@#glaDYD_Q{m^8|L7EM~U*n9mk&I=OzEW
zxwJ{ofURbN=Sd0sw<+Hezf*|=h(6X*PaxxsL6su57XO20I1gehxcxLfti~U+Jr*oR
zcg0zXItrX at 9)B=$jYkqUr>lvfeS_lmsq%&lC2J1?PHzAMYmVEmv1yy<Ixfkb60II6
zRGK|ajY4Dau3)2O+A_?aSaGIp8+tA|;YPE#;VNcwFU}RU#0H>+NX0ScF?sTUP9;SC
zJ8G%WKYW}dr~OYZKmwR0c>FfwD>|0AAFD)GW#$XAkBTH$r|~Nm`?No5pTPLKp8Qn!
zn-LwZd`q!ltd&R$VPbi7C)cZXtkFNg#REWf7D#b0gnEtxiGGC*`|HHjn~($fR_Fon
zKG0f9e%aij7_RZxY+!L;XFn)-olX1d-9-uwU+^49Y~7g3Ca-Fh`;5!FeJFz<KnNWC
zebsE?`CA`Uu+ca2+NxkfKte50!a~$kp^y{X%6#|+OH`SyhOY}oyHQs=RV-?Bf94~_
zVnaQU7A(rfbUWhj3zTIW?*x}-vyL)X{G@^jn!vpX8MP^3Z1Ad=XEYKPS{2$(!k6mp
z%>*HhRwDh%d{nRWkEHr2AMb(J3&E93Ih63jlrm^-b<N8)h1|grS!-CdG)Exzk>K&_
zN!a%wKENE~drrSAH;Q)rD+Y;WM~zQL;^)->_TP<Sr6q6&9TQ;|%mmKWD%3NP41N=?
zi9^=m at JY?!4x$qO#Lc=&j^D0`rCP5VxtvJ-ZHy4H83k*m?H$J12b*^0iKY_iJVopE
zPBs=MQN!(GZQ>Ome-L|%VUm at XJ%y$s^T%G!g$$*qsX1l|zmP&4=|d^kV=d6*p`I*C
zL=PvP4&j-Pq2%OO%HL2yn6)XxuxiSBPC+3M(9Onn5k;BYp_4=7%q<3j6B^sI#@dku
zwaZ^LH*Qa&824Fz7 at kQ_j1omk=9GAqQ2OIwHQy79Ggh(SEm+c0AX&a=(2;ZG$Z1jK
zwGMXA6|F%KXB)}4diqCaWIFw&GjixX7q6Dvx0V~OmK(h2T48ZvmR&}C;|Ccg0<3nT
z!Ew)XmksoH<?;^^AvzJre at 4<6=$aKXy_UO~abMtt{WlbaWq63&uv%%7AqGy+LQ$9Y
zq2_mL<iEV*>o90dc`U&z<7Pt=R*#{^{gGu%GRegi2{j;Q6gMU@?q;Rtry02$)*M<?
z7Po&@0g at VFA9pIqh3PH-0lz|;?^r=9q9VyZmg0n~#f`}zEj3vq?$KmIuJrzgBnEh}
zk0PqV^vBRUE<-gsk42l at Co5IkR1}93_bD9`*DCXU;5#H514nQA at ZH)qllrhaAIqw0
zh!}TLGF!|TUV!tTb2Dn#Hx$jd<SJrVtg^g>EJmZfIj-LmxBo$ZXkl<>c<w^qn;-Lp
zv}V0iG{YGr?xNw%W{xWkbaJv#0+2%5OiORXdo(tmBAyHmlf=4GEv?+kq~&mx{AYIc
zV~eQx-P1QWTPH8j&#ktT(F6;=cpabhyK>2LV$VDiAi39-Ur6&wp7dy%Tc4q}mFcSU
zfb`Ui=9Q)^fQM=%&VJk?p{7XiWw^`0Hq^DSYqJjpd*&7%Xjppt`BDK+J(hrnJ|}dR
zP8!+p39%--Nnw#YYRTTzse2hU=;KuX68pyIXSdMs{ogf!ElA4JEGMcN+CLXkJeDaD
z(g#&3R+j-=V)d&24|{RdrN+oaS8!D{(PuR=DLpC-aJ9zQ&;-xx-JGan=t#0Jr{-gB
z7SP|B89;%Sv4dm59_u;GS#0X>q`Fha1abDT8UU~#VOLQitwx}TM7fjaNv$1<YFV2D
zCvJaT!9#-$>r?}$xtf)~v(513mfG>pZ22&>I1Xo3<d- at 0ifKWd%D9?pS~-L<CjvaE
z5Xla3TyVZ+U$2bx9sf~+8M+zA;cLK($$a{W*_uTmX^?8u+i+I6z~V<Q&X`KxPq+Ou
z8VqBth~c0PE1ar+k at Rz@4?68L*H-`OdrsB#Cw&xCvnrM3l6?Jdpu(*k{U?)$G3uNv
z+2Ea98)NS#j>nh;K6a5(7i9yIAh3WucL?gSCS7hueEPt&MiU?52Ov4+p>NmjZl!Ga
z{Pwa}fO at TR1GR#Gt{Rb^c$3%V7iZliZ(Xj=R%S++eWmk<>UqU%c_63Y7bOr91}wWJ
z5;|8Xw5zq<&GZqL951%3T<82z_pD0ylmWFfR$UAl=l=qwE5GPyOPJr0t8DJ#*6)bA
z^**iCL+j#H8x2~uE!V8)SQykRqtoS>zOsB9=Akh~IT~aPe7$l^vb#eUK^Ib?pKXA{
zL(Og(OHMsBD0hN)*}8tOmoLuQ*y>z0&@fb6VUXgy-wTXQWPT6?SswCXUpiLNZHLWL
z%g-{x$M#dG;qRUjEMIEFn2o?=A#e(iPp61okh_t;7hgLa>9{p at 5qET{S1V;op7tIS
zJmXQ at Ut{=~q{j7jDo%(0iH4OxY05%_PZn4F?o9*>EiwWNnfBHloyFdL&l@#PXX_I0
z66G%ivn{mc=JV=Lr$aw7b{r32bIT0jV-K^hYQJp^cm7!P4^H#nTl62bM`(Mq5n1;N
z2;N&F{7ud1DHDNo9cBOxY~hl86SU3eN**-!s-i_KR)#%$ojbsG_|9p%NrwU?T92nr
z18R1SDR;BGXS5wHPrh+;kImNSK%T0~FF_`kAK0eA=gz_Eb$qBar1)wYE-)4JgR1`C
z?6OyN at U~oMio{Hzi3L(BR at W&AaVzr9n4T9$3=;ieGqX^9#0{c{mne4DcZ&UNyKUC>
zQ?hgZFFD<Bw?#7*y4C7<&|#kq7jBdQpj~DD4`_#TLj3%`nuhWQq!On?!3RP51-&=F
zy5KA8#hJq>WbOlF0&(i~h&_brLGAvG_0YjC^KQ0W`r+m6R)LJ7<7WE64O}BwX0FkE
z{_(=?p`@{J^SI#>s%=`lS077yBo_R0fNhoIkNa_%z3qZ~*`XTUtz$7Lm4-bRh{Hxl
z{EZ3D;0c*0%@=q;-)U)O=XJy4_?+e23_$C~x2R5{3zP;L_iD9V#%Vr?UG38fGvE2p
z@%0yewh_mY;s_uY|3pL5qVHMS;LtuTDmgw%S8c{sCB*XQfz_(u$z_;)Em@?&Nk!HA
zh^!yMjc&VGAb;SVC38fbm{s{;Zo{Be8x&;bR*`MMk&pUbvR9&18sZh{q}qTJ$}7?_
zS|f44dBROctv4Y55){BPy^|g71Lel#whYx8EZoFtW1QtH#cG>T=OHj?W6-f)NflxE
z6b|58 at F`~+U~)8kE4_+e at cyPd$fM=qRf#oiO$AMl{!r?8-+h8>HnmYT>4EZ&Efb1I
z#SBZU@=rQQgmRwpq3ZrLm#I7 at e&$3aYVJIG_#9#ul~jlR!}~G!tAxN#;$2>sI?lSs
z=Q*tc*Tz!qQleSdAO!L320v$=0GTBIzu2szSrI!&;rt_2;dHPG*o!cIVy-{fI5Fbg
z!dYbQWy<f)8AivKCK84Ffvg#%4GLxLX>nQ;B2b#fZg%iZyOUia_c{U2-#V2BMi=P%
z0AuG6QoJ8u>AXs3S-I_k%&5O-XL28-K~r!H>K`;uSQSK72yAaUvZm_eu6M at AS*`0%
zdtL)r)g&hcU6nW*nsH+zg|vv^&JmI^4Ch+}il(!VS8E1wGoQ$~Wkko#ApB;dfTbYm
z&N1dXx+>t}4k33XR})tv3;i!}Z;Z0m;8eufS`tw()BO&Pai2}t6PqKeOdB-Bi`j<&
zL?`dtM!P+>J4j&h9LB2GSjr6?a9}3)FIQyqXts8Ex+(Fv+~T}GF(U2tw7OU$HAap8
z3Z!F;98Ckkx|UQ_AN at W=TWj-wGbG!c7LpqWu5v56=A~=p7oQBD)63YoIFO}c!;PtG
z7_{8&^#HyD&uDM^;BKqcN{{K&&HaI?>#nD7ljJ!=#S-$bK at f>)+cR#|k*G&It&D0N
zQ at 6MX*fu7am4M|BW!=Hy_o$2@#i$e1U$=;RP4wqTjf~GjiFav%tyqVqRA-(0W>!s}
zIR7hr)cLIx2<Hiz6y<Y$bV+%hpn}AzeG4T3$Ya=_0l8&RS%LIUuQR13g8q59L-~Wb
z$OhSf#51P8 at X!j^F~bbF9o68yq|ng9=Y{#k*7lQgETobJvM^-5P{7iUY-gtAmmU5J
z<?DPjq0z$z#Um-pK#I4x1 at e^2LexfD+{$VEDgx&z8;?r5#@sg&bn_%LtQFa}QbKVi
z at 2qr2<0m$PLzv3WC6)@L^His7xPCkLTh*^5yQ;sL`<|ng#82I@=wQ}LM%+0Wx3N*`
zUJ}bhTdl}n3_lPZ_6R3xT9C8%=CyKb;t@^nLG-W#{y{_2!|QrOq9S$Vv$CW1&fo19
zN9_|2>Yi6Hk=huIVMhc?8<YUkSwZzTPbEbRg972B&`B&2ROE`69U(<1idXCTJy+bx
zy`$_Zo*mXiHVH%F#{koro8i%1Y;0~#HSzFwp{La=%zo)D@~azD#GTV7qgKstcG^W{
z{oYCRZv7mVU4_$A4R^1hUyv)W at nC9!CCZ9BQ)H~b77LB2+kAvAv<WeqP`lFXmJ6{J
zZtWc{I0dFEFh<UkHx5t(-f717Jn9oV4VAc|mK;rOOoXUJzI~pan17*N^pqc3d}dpI
z1T~knK1VXN_z{srSF}!4jFPr@?C-BqTB_0%T7Xbe<~I<``c;VVFYC#bNf0&2{JZfH
z{AWQpH)+#BFDo}j2>n(>wb<{I*1w;#xSDSNcFNxb7qnCSXEylNv2Jg7UdCeEq4prZ
z+0nu3c$D?><6<aeEUYbmv+rG{K_U5n!Ez)#P)9Z&-Xk9Th*v|Jb&ba<&W|j>IsH*l
znY%l?ZNaFI>smY0Wb8APetAwW1W-YOcF!iy0^c5jtxrlW{B1lFAJ!tyRP!&5>1EjQ
zIkui1j(?Yz;sdk863#4piOR#aRSZhTsWfxcba`-q8)RH(w_=sb=ZFv?0u`ZPv%G&J
z%LL_<6vqA;f}<1GCZlIYGRL%IMyttj7g at 7`<}~E$aP at xXy%}eOg3EYQgF54XAF at 6T
zIF^PVe;MhB&%5FdeIIp!%HRVzF=Pm5jkfJnZrR=d!YNNmY~QW<W=@E@;Ilk at 4#y!n
zgwp$#u-d?D_q%(TRCgL_CccYH(dAsXfBh-=s}%LQt(~YGS0bDXD%nrz^#QK~ka#>H
zZX|r%GgcKTFE(M836Pu0g+Pbeyfl+ov<^!Ph&GwP^A8ImL;&&u?<LWI<Cy;gcm>Zt
z9cr#ZSB=f>BgqN+#GCYRMh8^wge(eyW#ko at 6$lyR735&J4x?%wA+=yK_!VScDV;id
z?Iy3_wD&JnDt)#zmT1ll%}KcsPoQNleDv!{(W|p1?`b=`n-0!Y&$BAACEg~GLw7ED
zo=ir2(s-WT?eEu3a`a(n6+eV*kzhooo|KMu)tJHgf&SayZT|o{f2+}9Ps(&s-Wv^s
zbY$wW(0zm@{H!mj28R{uB4uEB`2nrdJ9~_0CSfq=iq}?vL9;c1UFPp-fCYLer3;m0
zMKQ~_QpLH<{ssv at V%$|R-CetA#(5WMk<S at Ir8J#80CavTEjU*FYN>6ecByA>MlZdS
zbG%EG8wmnzX#ZtY4*Y9!Tcx?srZC!&V0899#dIjNINP#JMPe&nx&e>|u`P4l;rRMF
zw}7uAq at xqy8DPUg!+77tLc3QL#hdX{#XDzT0DC<yV8;Z*ZglTCA9H?u9)qX5&$*By
z<-v$~1g1 at PuS{fEM>yP-vN>|(OHVFEyYo at y)m(-O)u4_eUdg1<@ReN7pViaOqss-6
z#Q8rQdI!`FrT5aG<pa8&E?YpdQW0YN6&vpojmgJwEI5~K<@O_s5`3&Vg<!Z|9=xzj
z)(TcJymJK)@1MPz at 1gca!hsW4zAn%TN~B?TRH43d&>*=SOSNa*EUbp!&=6Fzl{Ga+
zDvsX-m*|G#0K}zUxqrg3Cv%IBSrm=^&dR-=$PC^9F~5b^l>p#olH>znR!+X at MK4JI
zJjI+fl<88hAECj^E%+rj!4>O=@iZF0o*~eQm<uxROS8<KK24>q2_RPJx6vr^oHl+k
z#BL^iMNU%lV`Br at 5u+rbhl)NjE3h#4)p*}-vj+<4<#!1TtSoq~xU&lG9J?f3%Yk0Q
zKH!^wm!pb~=e<n&OTGn(cu4Ler<bp{VTDbk=B>SCpE(1e2bv2Fer?#K_XBh6!o8n<
z;G-CkJzESJp65Y}*Ql~YJ?3s>7%v0YreJasQ|sTzUa}g_v9<pOw=WgcWZM8J*I4M6
z>cSe?=~o;$yPc0jZnqR{R-vxwo#s((F9CUAkH)lT67t&s5U3|ICiHEm-}qi;evW?U
zDY;O(mbmYPhUa{lB3S{g!@iW}&ank#7p1>3H9Rt6<hXB1wvl7&J&onK4>>@yVH+2Q
zi9;f3NKo6dV5XI%4G<3?$B3?rC%IUz3@`|Xmgu(~PBV5L#p6PXjj(Stl|&kR{91{%
z=r3gd#`auFD0%xb7>;tB^EF<3{F`4J+sx=pCaz?F+at8ZY6Tl<6?&UX)dc|myP65d
z5wl$HNv<$?+RO2pWPkBT=jRYDGm{9CsN?`sF at 0(Yj8ZJA_$xnX*0t-W6+ihu?h}L`
z_BYm|BeRgT&J9ek^t3_77exeLbIyKPpN4o at x{_te$$1yg_>NoU*o%tQ-#e=Tc at 4U+
zcX-Ac9yK2(!>1rNe-~UD?Tp1*GHE3~8}7Hy$y;m at QX{NGnN_l|hu&_)c>%vHSnxT{
zCN)- at 6t2(t=XttuL6?WxLsJ*ezuR9*v*07AUX5Wb!7grSBCs*P{skx*WuUVnUx^=J
znf)9^t3boAR~_ZrNp>d3m#UV8G at ADZi!<J?1y=BqAs)nxSbd4gjTdo*fCunqHx5;s
zoO%rqDsJfVq8|B!qA#@lGoO)A3WM~k_GipMjFb*}u$Vcn-Fogu(nF?TOtc#87Z9|M
zOSrWHP2YQXAQrxl6tJ8x&OisBV>kQ`{&!I$l2|MP12wcRS(`buQoa?P8o(W9diOAb
z?T%cawPJNSy78d at M$yYSBJD4<Sz#-fGLA%*`gi3c$~0Ih=V-P%J(h4E5+`(M1{=Sp
zi1<dXN_p+RtN7NfIoc2cSoYA9j#<u1;~_Eujx=5Tmhf!r=T$Ab^En~&f7d3mYkWRM
zaz`cBwW;C3wzaWAb$7?|4oGFm^@YtdX#b_4RJhuW;hHy-fvx19Tkr{pX^SB$nX{>d
zK;@yCJcHwIQ~6k}H?P0O at wU!%{ZbYNYq+({JA~~`uxKfbEB-7%kjAW#vDQ-&YF4w~
zsHeL*-m8Cu-qRASJw;94 at tZG}Rj{vef`#jIp9PbZ29TluYxiRJz9hcC6Hn|O1rRm9
zmpQfYtVL}!+BAs$(sN^1Bt56a49g5*>N-J8P-BR`!}fMsIlQkH=o3O#NJiXX&}s}F
zbY3E^B>N3V9VmQqC~4w=J2XP?Wm)&4dtuz8kvj&)J{ciP7y4 at tCu8~`Fq6dQ#rAWl
z4^k#S|G}Xx3>?yBf at Ey|-%u?jD5aAVVp>i(d#b4kompf;n0GA8NX at jGtFF=t7o$)!
zecHtUNam#ch*uC_QmSHw*3eLuEd$gD&G-kJ$A&2rNDQqPeKos;-h!<t5hVbe)=?Wb
zHdKXKB}842nNr5Zd(PF93Zm_?d*mzJ{6POpWP+GxR~v}Gg^QyZbbBObiGbpJnJvEJ
z8eL_~Nl^k27=9A5O~2_gM4iJB;djr!t1TR0xB!o=hjenn0wuH+0oLqx>m9Xt{JsNj
zD7bw)E>1b5#H`~rU5OjcOYpXWf&|EZDxbe!bVWF3X|~}U#Dp6^moU<1$#EPW;~9W(
zdcn5B7$`r)F#d!}rF?g7!&){R(-7kx6q};{vw{ery4Y7o8&iR$^Y)!N2ln3b#oN9W
z7~Mr<%!brrJC*rLrPw?HDs@{uLW}I_3eHa{muVMS4evlI5q(4bH;lbxFuJUevPDbp
zG^(lE26_-Jwtgpbs_>h>wC63xU$|)SYyFFF`#YZ_oW>%2Ez}i1j?mGGu_cYjuoIVn
zlBC>lCv&#XVie0 at JSP$_w6+7a=p4?IY&_dr`do3j8oetf{Q9yBmN+G6NUYP`==Wa*
z8uEkmofr`y>zb7t%tQx@|5VQqk;92>hYXT|CqzOlk@>K-i;=@eMk~@>t&l|dJeEGz
zzRBDOCypI!2zUXW`e(>w-va*7-m2Wwvwh)c0zp%HzF+!nKpL(>JLaoY877COJ8iYO
zhs~9BtP5$|M<^zd;=__g<~No|(A+IHq-0Rx#`jw;Az1 at h|KZ>WwdN}ky$N+knBuJ=
zD?T@&Fq$Y2)q{PgNF2Vtewo4vh%a7tg at 9C0&2*p2eua6mVCb*wu4-HuHNv*Bu=7Dh
zB-e{k**<WB at XcX!1B}i$+;ffkpPwl}CwP~dGa at GM*z&}LWpFMitwAck(wjW8{5 at p9
zaQNi(bstqANQ<*$e<_mz<zDRkp5R~jGTE-k!f{Geo>G22I6|{GA-y28;VjO?gtfOA
zVd+SZZ`Ta^&7L#Tkh2G@>Kks<jDwbEu{eiOo4rifdi7NrOt3-xxmOAf&7UK!ao6PO
zEjAL1l29jFu1^2VThjFbDQ{mQ`1O%!o8?QAqvWc+_IfN9Qq^W!EbYJDYrZu2>%Rt@
zf#Fv<G~OeBz#t1(W-yKKLhoP{@`!Hg1&d$_3*T7C@(aym-g88v3t!-Z?ZP=i)A at zp
zM>3|#Fs9KLDue?;O1fg(=UAmkZ(-n=7tL(aw_b;XZrDU9@!28&$eS at H&UFtC#>{zO
z0V}tD?)k~zoPTTZUpdF$*~RoSyZ)hsfTo`RJ17I>4*|I?Kq3*KT<P|QjiTTJ&R6dE
zj4Njbyng?S`58hyFK+)I#5dW{|B(W`=;hHomU>-yda^{L%352az~X>r$4;mhkl_&X
zx&@rLAT3?#T&~IdtKdJe3{Vq5YV%e$y=lJy?Nt4Ay$^H$;6Tsa{mw`w at E=5?23k@<
zW@%-m=k5Juq~aevmHhDF3H-Zx-~8VtVlXdNE-t16ivubifnOHVvEcvoM>OWMPfY*`
z9D1Me$4htplfXQ?vM0~d_?KV*=>dS}eZK#1_x)3^0HqP~|F_7maL+|{0D1aIZ4B<M
z%PXD1ti2RG;@X30{@ycp8y~iKWzxyhdAUBQ4M%=ghTSrn|Juaye{=f)tw7^~wq2FB
zpp{N|9%%M}jhO%5^`PFn{_dimjX1X`YZbWlKjA}QvHbUB0ePPcNSE4$o`t!?QiXhj
z_3!8oI*0qKW8KaPkB>-Z8Q{w1tipMG?H=B~(Z5VJ&{zK&NGJp{UNze~)B%C6@=%W#
z<Ge-GvJc)4>*_RxnDp`S&3!)UE>5{VuN)Sx`VRAScp#B9YDwbVbV>}=k6!Ek?f%2P
z!9g>u27Qx8XaCZ|%*`wB$7?Ro@~D>|@Og8pD5?APHB<;52$1H}H6~9wZ%6SQMb+F9
z2=uryd)M~07bIVP(`WJ&uXDE;H{ik(1~P;^MxCCynbVw+J>x5vV76{4;;yxssM&(|
z0g~xM9)c$n*S+gEbx#kLKp^f$13)tr+EO2)yJdaA8(iCTpS*vC_$(vBASsafzv`w?
zC_t?^khZefu>ADmMJz^aah572oPyd95KFR@*Oh3#YS1gRu9N{9u#Jt4+i>WrxHC1L
zcl1E6e9RYi&~@`W8UgCA#l}-n5B{X(usP=u`iZm5ceM-FS<VY;Xr at OxPiO~D1Ud`N
z{x+=-C`UDOrnTOvpzF_D&jOZ%>tlQLYgE^aZv$Kz8IAq~8bHBp)=Ld?a~V$~)@z-6
zM_b-rbx+Vh5we#gt0{e0z*&a(rHNFY!hI`%FV6=V5P`&WK!Q`up#JuA)BhZr!xSK2
zMS5iZyPv09QuJCan{cmHh2Spv2{!$XANELqF at YH8uGw%(oND2%S$FmL)nTD=dyC3P
zkeGZ1cXeOO5ZxQ38<(y6Uja_^|1SZ~R*W;~c;c|uRqf29zEUG5Ie(o86?E);)LHMu
z$<MBF#ZYLkcC6KOx+o9fGR+mU7Wkk1fqz;zK*(}Eap*}_p1z{zr`ZpYpV;6IsJ}$6
zkIT{I at 9I7ewgVy}yN6px%|<8WsZt$WbpM0dJ3u0`G9JYb`V?oRw&0a0!!&>EtV+IW
zm4^l4ayPjZXFmXm49X0C?_qZ*sfjHYmXs*@X5k3;c7<pZb)({Ne;?2e0X4){5q7U=
z_#@0pDf>SEh6FSg(zcMseRCA`HSgN^iujhqJ64p8SQ$iIBeU-E1H{AS1y6B(b%}P5
zXK-owa05#=;|~3_I1K0I;lTn!Of!6ZaOHk{bhI*e%%t4f+(&6wH7w#sa(JX~VuFi$
ziNZ8sj9OM{kIUT{+;j-z!pIJ6RQPva05RhE-l2uY>1J={$66paM_cge*}Cn$Ffo6%
zJ~5XsS|6j{c~>SFtVV>lmBB#o_}U+M&Nn#H at E<NVht1Wtepq-#)cBR;Y`a~#G2+O{
z6C}KA*|^ZtYO~Phz*YRmK8_U1#~X*L!~3x=%DoZ7Z^32 at dfD~2!duX|J>7lIpL7O5
z>T at txdm<$^>PoNeirP8MCqzz8cmn1<iVWdtayZF2o>)N79nS!Q9!s9Sz#Cmt!t!Z_
z_U^RtYK$X!+Hv;oZVeuue5{Fm$T-%Kn0nYeYHj0R^aOi(gfBe|7faN)-W=dOmZTJ;
zHbh;~FBLp`aXuUjz13M}_kLnG48yp0U at u-ex(~j7xS_k>yk~z`+HjMA+S+F0bqDiU
zfqHLSI~)IW+8*Vq^>k)ad#uAx<+Skl<{H2C=B`vutKB|^J7d12W at VxDB;hv<&n>+7
z)m*pJW5y$&@l{LG-JR8al&n|(8y$?tkf+P5iM_?kj4fBM at TI2`^&#(rMNyoi`=+%N
z?b-<bhs3lyyr=6%y8DF;FUZS}_a>u5tM^s>M`3$zdUDFA4-ZW`$`d9|Pm6*&kDK1P
z_Ig_0^lL-GI<)ag7gr0O_Zzb8Cm9XG4lZmek0*<m_Zyva_Kx)t{0jqJr~0i=o3-pG
zHc|b~04wt3h1kmJUCJ`NSvuD<gWAgQ&~iWHLL7US0c<Vv3O{0>Bapz|y$-<j!2eP|
zTrCHE0RaB|>#{pvwT4_ at k<KoEsCk=VZk^`CKW3WO4!EFYEtksMIRcwi|HeSoyA_d(
z+4o!HQUP})O at Sg=zKH1@?Db)l5w8|GoS`ZkaYsy9biHmr$_?dh0jIXE&NUS!i}mcb
z{j^pgZ1#2yqis2jm2npk at mIqOh$fqlEgZiIV0Q$7A-dlEpD_xTo!>N6eRTq;_l_h}
z<TP70X|t~v(FLjR9y<3_Xj+#t_}W~Y^DZA{qa`XBtQRDVlEikT->9%oOgFf|H*)Jh
zs?veHlX$hoP9AROj?RAe(8A#5V9lxuaV;)A6v!*PX%TEFu0Q0pEmz8#&wZ_77ixT<
zf0m4DHkbkmvy*=J>xwEFoyp6*JJbZYHhqJrBI#j`x1T+l8X#>6juxU$#;^ES4wiD{
z^=me3<My8dTJH|n9v%35Wc30TVe at HkM9IXApZMLc#>YkCOHt=b-=(<0#56 at URbiDz
zCnJZ6=o=&<lOg*1ts|*?h&nb*9=RDkXOs#W_)r^+B2F*f!+|F at x~!Rk2W4%$>ix}t
zAarin#;%}$<0&Yb5_wp(;*a!<Ql1P^*5=L;=UeaaZ<*h1NPP&#Va3*?V*10FG^er2
zM*M$X%M|qXP7j9+7vCvMwrie(*ykbUPjf)2x`yCS=n@;YCZwP+cjQtO6uVBMHWl at E
zRi%Nxo<9r}RO^kQSwu&zRObhw+8megX`%E2;tckC73z+V+g4G?JP<&6Vn&fMTs&RU
z&LC&y3Nb2S!nECo2J`db$}Jn==-1d+H<oU~sq9Y#K1;UQo`?HF({2X0X!-X{9Y3_@
z83Vs;dA5jrGHFuL6ovL7zb--mEx3VHiECPtH45QC1QEi`!=Yk^p<<?MnQGpX3cuFT
zBDc!C6Wh~#LDo_|=+c{Lku+k2PeD_TkZpG>YZWFL9KV;_v#?d?Q$mt&JDI6^YE1X+
z)LIKpcq#BajMp`9&$vEN>vS2L;<7J5%%@_K>0}-CBw-s?Nn&IV*>z!I`-BRC{Q?jI
zDCd9=a79PFDok{gh at Q=p`$Vz*4O|rk+x_qpCL41no?1~DWE#j2`+<wtcX%%#JJ7sh
z3ZidU0GuX5PH8Z276|4<hw|wnFNzHq5-+E;)kItpGL3I5llB8&kU{9?51X62Lwrrc
z0Ow<pVf)|<=7HO1YgJogl6BKSwj7Dp^Xac16vRR#23({>GL-zPO>oLxkYdE3zd#m3
ze+k(>GXRM>NP9?t5+7VF_fIWQl5?wfsvZ-DPrM64J5kMeJg!IJ9{3FTR{?Jl?$x8e
z!uUzQS*LO3Y!K1r#mVGHbl?iK9n|1Y6HlFI30?=hQ4lOBpo?l~e_s_2C8e%Q)NpsX
zsIy$@509a1g2Xo+OvIl2X7hzNnooHb!|PX3)Qfis4OjLBo}0iEu5HoYdp$nz6C0e~
ziE?n#lV6qlw3;7rPDd%j_}t<L2S#zO^Wj9CrPWHG-`v|lwXqgixDHnCfM}O`ez0*)
zj at TivFBG~M8GdM8IjMzEr9_psVGb18ybP!n{w0^SYPC>{FtCh*kcZIX1gq;>Wdi-l
zZR5|u+t=fsFuHcF?SEu#fWNw1>~fcmfn6HnW3;fOCPLZsP^GO*-+(mf3dMvTJ=NNB
zuL9vBBm^ReRhuW5oXk-My*lS9(81PTpV3Pfd)@l9aB2%6+ba2W>~qrVN-JS};(Zx~
zq?J*0%(h;`XH+rbsFZ6{z*)^_6mxX@;~Sh@%u`$cPU^>&eV+>|yPqKmT<lm~9O=+0
z=J$C0r}9w4zq=VSjN7O5f%715V(H7n1sd%kYZIUK{Q?J#T*Raq!i~hAYfIM+O at W|~
zu_J3?1Olpe$74x(IbooYpzn5rXoRuQvW&<x7XF48g2RH?-Xy?qL07V|AX&}93H>m}
z^aT>c%KR+gv%tl6@(jyy-qlMpm=5mN6BRB~)3Kd?wO3}ji!}pGrJB5)M=ITU%62xw
zqB|6F^2}jh2+~p3QS<+Ux3`X}s{O)67mc8lbeBpuNOwzjr*un7ZfR*yLJ&5gbhmU!
zNr}X!Q*x8ieHMP- at BYp?<K8>Q{o~v<)?nb4z1Q0BobNlI=b7`J3%GzqdG2^%Q;PCT
zZH_BDX!_qf&xW0E290*NTuRf|yO2L^UKEup+in*OK#CiR_!VRTMKmZpRl~fquKcpc
z at Bc@=^Zee&NavGn7A+<)=ulns#1b7 at r#6VPr}<V2bTeHRhvv;4I8qk=8{W}mF`ZaI
zWeMTijMiLF>Rqw2(l5ofQd1p7gteB!Mr-w3F-zn22yCj=$wA#-=dMksrva2f^8g2g
zDp#Pzmom7gHJEC(KslcG3mPP!F+SJAp6sh_o)-|QDN{0!xm at xMiC%?yv<ji%B`~;L
z&-ink2|$x^O#v!7zU78#Ia~ym(-v|!$YE}M=B9D0h=4TtjQ}_ at C*P1<%QKu?tf|jb
zN^Y*6 at UyNq%OU8^`!b-C%baePm-tj3F~T$L2&_K1Nq-=T at h5{=am3tex(kim`Nwz7
zRX%oJi}<9iH*fxB2*H3EAzKJ?fb}kz(DprW*cevT7>q{7SQ??}L!d}goK{c_I~diu
zE_%aKK3dkfy3pIzOG7w?U9}t(L1u-p%!dbH44gOaVJ)ZNUf2;pmfE`Ewx|`|3N4Gg
zqxY<<aSskfGNf!T;gRWuU+d?WEZ2R|tA8n?BVVtvtiy&7uO0jw|DIb_>Ap?^`gP}A
z at cV?e998fU;V+(8bbunE?jBzOtp|VMC?OXG(w!@|_R2Pup1*|_Qt}wBXOujlw7Yl0
zvR%$WbMrOWgv2r3cWx~@hu}{olEyU$VJcx&V`F5GK6|MFFkLD#d at c7b6@eNT*BB8M
zA`O#fMlciUo3$p~u&ad>T8tO0)aQrQb&q(|*JM>BpPM?8vHwb)<N9@*h}7{5{v>Ns
zAL*xmX-+zVnU$W-3s6%Y7Y<CD;gGDP%I%vKP;{u at p7ibghKjg#e6W%t1W7zan)j+$
z?HuG_+1JJenub^MibM>|PR(Aj7vs13O)mv_j{t|r*r-U2oR$WuWzK- at KI};gn;{hz
zzo0*MK^x_~Jn<&;RdE&JLPN7B3~)TXjN-lZa{W@~zGbAaBIE+ROh<vNIO(BEHLg8b
z-cTYJ6E^59`{XoVUV~~jT*Y4*OoqfPJ84#OJ5vg^M}@TU>dlul@>b`!>cnpU*r;N-
z@*Kq%PQJSB?Z9w;jO at BL_sbw?CnxQ$IRPzBaz&#<H;+QrGcQogvyIFquk0Aycl#9B
z$<Y^*1PGNUy_yn6F*68 at J>#xNIZ*T at mo9i(0xX8b9OCsH)XsED<6#0$MyhAC)C%2J
z at W(pgu2uS+nbT964!$mrMZo0Xij!TLq+1{w{Qzo2cTTHg!VrSlhcljiD$q949s<Mw
zp7GPoC%}?yeH}*o4&&FQKrww@<FqZo>ort}0pRwzJH$nXU?K2><&#NF0L}0*z#I0Z
zjU;@!-|}Gr?#D7Ii{xEw3oIhuY!buikmq5~KeLCA%XoX6xmBz-fBNB&stYW7fVpg6
z4BO5j*asIg5 at 9*OC%tEnR1*T%2H5DM_0miT?u~5fZGDVOk}`z(`&2sC13pJlt)?`e
z9Ds1ZH(M7%ne<+?oi~+>PmFWPrLz#254UnfgTu|~It(ITFe7&KS{`}Ew!m3#XB5S@
zNx|MXAw3kbS_6^WTZ@^+J5$x8>5;>7d{tQj5*9Dx$YdvNKVXP|_yJCm$zls`O-l>X
z!^%-KFyaar=Dkr-HftKqDGP$NENWl_WpOGeCr>P=s5pCT(dUIDzgqD>dj#@E+)9)P
zC+*27D+0*uY at n|XKS at z(ljir2h7~b7yy=MZwIaPXJEz!4;<U6)<d1>(<?oM?A?*@M
ztpPXj?Q8c+8LziYkaZ4M%+7-i<WKs}<-k~LCbK}G$!fYzM&%%n3A{2_#!~TKPq%%+
z3o|as4STb+mqq%{5aBChn}sDVF0dG%wQ4IB8e)2RthPoA+#J}DRW>e}ji+%HDUbQ%
zN7y5Kyug7U*l9*EBX%1wA$4?>r!^VYUxv0ZJJ*hoLJIV&uonAO7T`|y<H{K)T2Ch5
z{VLfeSTh30+$!S>xlN4cjq~MqwvGnoDdCv5d5D!6S=Cm(jwj>QcdqK_F1so8$q_EX
z!8!N(JIAk3K+6Tu0^{YdB`3jbImQ=w1%lr9TheB;XpF8Oykzfmxl1Y=rDiv136z#%
zYoe6AC6h|iVqw<@!N|gVB3d=(Mb6uwgUw5jOZrR?o_zJzQ9|GwM;btc)SB*2z&{g`
zh4<tO$?)bL3E*ZcjOZ5v!QEI at V-a{nnyDpBWTTXg+D?eM$mZjS9oBnAjd0T2ZXh8t
zk_`<>JlA1W6YNr??r_(LU<QcoZd6eP#S6^}`i?#CBmL!taL4ws#~SPwU{WPjVUnDz
zxREGtz3dT9p?c2!c9)s<ySy}Z70z%@wp0G$&H(C(GR_aA2H`7I8I%cl3p#M!^#V{y
zlqXb&6#4Gl`c-A at 4AEc!xdtdJw}%RzVOjOfl~!Mp0oNyl-slyp7$#-AwmB)3!kHFg
zpZf0h-=#f=k5VTN(Rmt(lyO(lFs*)O764xOY>0JOZy+-PycNrLk#92_YZ&&Jnk(?D
z+SsNlo42`jfvnq0o&BViOaDAAgu;lDMQ at 9;&b7}zD)FoG8KS!V_=!LAO7An`dkFlA
zewcBmclz>#oG$p!pwiS`*PI60lLC~wXpq&y`l1*R=YRZl$+EO>#+^mr6l>k1GBSXq
z>B<^v>Kw(H1q<0WcI at T$*`32TuP0>TyK??)EDi4cI+IX|HioRxkUScv=FVSFN2-&2
z9Nk8Z7j<#)UfPyWM?rE)ql5s$cj54nVh16+pQKKimp($zo1+yugT8Y^Um8Jt2v(rn
zryZj#`niUdMT!0GkCz;{x_2i)r5eUR=)@e5mzGWqc|awdK*HAXH60q{3f|lQoDfSj
zgX)#_kpZ^FP{o3<*7!(MZn`s4e4a0XTde2y{8!K8DQHWPpjRJzQn%-l!CR{=+WdHf
z79nEt(llQO(4&}|+pCPdM&?AFGDXWQhK=gZK~~Z{!kF94yU&>}!S8NRhc#a&cYrfh
zvRP|i^~3KQm8h(_w;ZPb33JwJgq+1*)9{+XZOuEIf#Xs{->8E&W5)J_frVma at nWdU
z+BKmAke)B^(9E^;E4W9?M=rFm*WoGrEh~R%Y3T&hnQZP08`5YC5pnf_=|Zt}B}(`T
z={epAaYp3C67m;8fF%Rbu`RWQkC2KY`;3 at q+^2i=rCJ*uFR<QP|E<3-YP4*1<oFBj
z&4W22NKJ#s?G3zDt5d?<?Ui=R4f$?$=hmlMOrXO8ag7*-isWz9!dY}%g1Id0v at wA>
z+~UO7gC=s9wFW)$UJ4*G0No at te6W0GpMb!#jq*{_q~&a)Zl{mm>1Z)h1ENI^sZ+9*
zG#*MnFQRw=hHKs#&khvte~KT>%*+h<BPL>!(q+u}7<&5p-*&BU*oyfiewwmsjqv7e
z#8(BSN%3b%?I6Ca)j56}x`vTE at L|IR74n06ocxS8qv=K=uscyhnx~xFUr)GiHVC>!
zyMKLxd>xTG5%?j!GsjTtOMPwLDbdDiI~mijBVyVr{$F8)(2oY<w3Kr6coOqkT!j@!
zy0_I9P4>oZ?zLLDu$Ue(D;q~;8V1B(Qg*rMPNRjhiESzn<qr0Ou9S`*(S30WGi7fk
zk=C89Xupec<@cW%rlx&3n81}|E1d!SD#pe=ot+2;h)<0<w6)z_T_KZ`+B&m%xZp8H
z6!GAf8VvY2SP at m#)xqM_9Ym)7#y=gbtWZ{5(^jY+{t7oB5e%_^e*=FQn}cy6^53JJ
z<6#K at J#>j5;>15kE_2KSeER1YBLHvrKX2K>06E@&-r^C)3DAS at 0GRN=0ZAnO6*YU+
zhhZm8OCxPzb2I-!zK<3?j8+~$Fm;gk^lM$j78kkI8}tLF$mh`vpLNKEMP>Q3WG*-&
zwC);S*?~7Z=GpgfrLA<$wO6hN&*YQts=Mx;AL%Fr_dz+ at pNbYB7r7GxILB|5po!E9
zlwUGTlsg-xn65vUErgg!hDQAHvAGm*$~+9i->X5nxN@}G`#crb6CeVXA+1%PneZZm
z(Uotv&jJc=`i{#EB)t_a?Uv8xlsQXj=-cVI&?vR@!^k;`YOBh1;X)_CXyGebO}ne^
zte9|l<@Cab0}s+u)~>Vc|0a at dZ>!1WNlK at 8Z+nCN@n!h-XN371FEY6A+#kky540a~
zhM<^%O$D=61sW*#s0~QaGvSMfjoVMwJoAOcefJ(XSd>kEn_-Z~V&LF1>V}u<4^iF7
zgU(f~j_uK8Q+EzXhI>&utNjEt?7~?aN_-%qvXU|;XVVzu0uUak%$$O2%e$UiRCsUE
zpDi-<j at 1QLzom`imz9q{&Zc9ug2<yo{-V*%aCDbAz5w=PlsA(nPFA;z0ER(_Vs<=`
zvBPIu(UuVC&b!YFEfu(9*$145=*3nRNdr<<IJoozS~Iv6_CE1YxqzlljeYQiF;AU@
zF*bz+!9H9~EzsbJ=y>*|-8zqw+zE at fTd@=*M=i+zBS)wMKpn(`Hg<y-LJQQKT_))K
ziVV9stc^b8KoCC at q}CUS{4y^8{dJ5`SpxkF3xIY!Gl8DjTFMT<AQa(~*AV)R2+(sl
zexOzekO%aBNs4^~sP`hIlBiEFq%niLL31ve9oH%&Lv$`^AAMQFy=YO9PYNAS%Q5%+
zzUjE?{+>AH`So{RE0k?eozQ#C`Ie9mygv_|BRx>8Ah%(s#qazcyN&eakBnoum)kf+
z$FKlv+F at Brn0T4Nd08hHj;x+QZ=i74^&-HskJD8ExJGGh5EpezfwpzEc^3Uq<NKIh
zkx0q__z`{R5o-^$D4*SZLx{P(!BX1$!`5*WP=r6f;btQq%4V7oEbM;$G=fCfrxr2V
z at 2UFujEpNo*H_6NUN{=$^!k|L3XAZZX=7F93zrQ2!)bu-!6G?cg9 at Reqm4{|wUc9`
z(!9jm@*^5rXpo>!5PYR$PBKmCq)fRSE(9 at b(>kutQa9H{j>gWF8OvI;+=XunY9A&G
zLFQC7a^qEdrqvPfxdcMj1a_&cK~)Vx_P`dwe`DbFwevPMXi9@?VZ__g>!q$$lb$tO
zl^YiKt4HTk7tLDzRCHe%w#aY}6dt5IsC~eKf6K!f!uNOCfa%$`P$W$hh1u4{)sgl6
z3REppEW-%}H3QL>3CS&+=ZNBSu0Jo{lafZz>sNh5eO>V+X%h3+C7@>sO<_k`dNNo_
zb=zG{hI*!fewCV+t4tfeUMh+Hgta%eK{j8;^<`UasAv)GwBv*UYd<FG?bBeXq~%BZ
zypF1qn-kQINuev*MY0;0S`q8qskfiB&~&chG<x$6J^?q32xdK-e-1$5P#h}I!Bspv
zw4!L`7ufAhm&*m;Ek00QSa{ddY7r{oEAEj;+h5{%ufD~~vj2p&136|{4Rc&^<yQe3
z1YTE6F-ijL5ZE<9Un{}DNfsCad)un)P}!(!ADUfK`FKCuwRqXV8%UA!lfCD0gp*K&
zHOK&Z at WoorH-7s8AqR7I3&n%J=lRUG=SQ<1+s8|WYX=&w=aF7~WPfK?{NI_yyK$~Z
zGo$z};}a<qtgbw?MaURslz5{=N)x;U$I;ZK2te;OEHfTQ6t8f+kyaYplOXp681gp=
zSO4M2Zx~s)(QMT?OmMp{MGP_oUoaPM;~f%fx=<XxgqE<BQ~S{<VD%gLCSpYuwXVVM
z!uQ6II=<Fo6h2ZCe5D;1E*YzKI8==ENCf|Fa(l;rgon*nF2yAFcG_Cp2MEAQazkY!
z(gjUm7QJ-yOU={et`iJ!YMc%4k<ZBR*Rt;Gb2bDS#^n9>oA*L<9rU0)b;SmqnsAlT
ze;sQXp6q|gJ4ykRFL%mfz*q21!Zae84AvJ5v;eHAok3(s*Z=`5U<Bf3+I{dUv(V1@
z*FXxcJ9-o9U<c}Fa2AHl$wGOZ;QE<NvIHBt?r8E_!aKUYU)TE$TU4e<(N3>g?pl+V
z`igPG17}-#@7Q?l9cqqbrKL}vnLUIn4<|eLkwC8lDnuNSvIKeH8#;9;2s_4!nEmAX
zH^Y<-yUX3 at m;T_J6)l8pZ at Zn?!V$38-`k7K%$c;YnQYcx<e83jbA8=0+OY4ME-gH%
zIc3o?{)Ur|zxVkuuhUmI6sIR0ZAW%K*Wa%~rzoi=p6?YI2&wHzPsXf`;sfbYiP4xq
z&#aGCvOg#Z|M0xN;#1ll`eZx)zSaEZ at C};EUdwsx at q4vDXM^Mr7H3fQv6onEs;~(7
z=5qd{iw-xgRSKbFzF}jhQ}qdeRQb4cxwj*#esS at I3IZj1_Go*A;XWWch3z`m8imH*
z-Fr+RVGUruU1q>%!z>vJaCN_`Jgv{_v!fIn+JY~atwz{h1~`|ua8K=B?<iESo=fkE
zx_G#(pQ|$i!lVCpqZg~K@~uozbRR-5uyXviHmaV~MdNAO{?lad^^EX|+zvQShMk9C
z<`!9&G>1-8)2^p@(tk<nw4QWq2cyE4J`dEiRMYm at 9w8ePmKi-VVzh1^1;#Np_$JtR
zdgK<k5ZByAqO+&h%2fbHF)u2oZJyp6&F}_&!RQ!gafYQK&KDxOim?QzRhVXZN7d*c
zysQkbpmbUtnP)ShN(m-E<zVZ|RKp5u3BC?N&}*Uf!PS)Oj$|U?yq#<g(ZD8%^_<t}
zd*O5YJJwFQRTYYO)1=e;Ak5r}19W4;lwugfZ~|Fx?-(^j$1hdyPlq1iHM`AoXxl~Y
z^i#C_D&`m-%`rC=lc4$Z9fo8P^~ZPpn`-oh#2m{Pb}g3XQG<ZRt;OQ~Jf?>s3{XTd
z%lqqoR{ywPED4$ZcL&&hQPs8vfuUckq6DDE;h1c8dXZsN<%?1IiBdkQRp`4l#mF`~
z1o1fq9(_T@$;Jt7X+BfSawSsI#QOw1qU7l0<k(I0d8Ps&LuIN`#L5BK>HLjSTaZpE
z|1qDeEnPpXhe8q`d^#7QSI<Z>ox0|;NjKS21md!G)aCi#QEB#m<ueJBnvh{WW^WT-
z<=DwNQy>AuDHX-cUL#Z?8QNNtC0BOmIKghsiUJv{(V78u!oU-JIWpSs*FT^Uq%fq8
zTyzoUgLOj at WY*JnqMjE*PBycn1mJUfYk#yJcsZz^w~DEKd;Ypit?a0ETT~U$yKer{
zUNGew7TZe(LWtDhzw2Ecp+r2rMD>5^+ggRA6KN%=d^n`v8Ah6q5lKtp4(QSHfDHqr
z;;xDd_R_ZzvLnB14GF$-I0NyV#cit at qPT&fZpBkv0&&Suml04*rf&VsXxOe+d)b1J
zU4NtyCcDRpD8A?Zs7yp;gK>h07yvu*Sa4@`S}x_IN7WumXgv=*w0{{rY>NsXd(8J?
zSc+lI-3_He$IEq)0%G-A4zo?A3OZyNbPj+?8U9-m`lPpCl$rrDgaJ2<h7zw?k-65%
z@?N3dTQKW$r9>9`8Y`BGQzQXbE at +%-YwA#OjCpX;VyVBN)^2c71pmhsceH2O=-D9O
zeBlE0YSw)zjH|cmbfKk?c#^OC;%eP5)VpTAk97VX{Jg9G at _8nw`)rm8B*@|5a50XS
za1BWMUu8r*#F}Th5qgmuYCp5?OJ0zDjpdGW*V9v=NhESO+)noQ=1bQCo|7$Ql#h`@
zY}y-om%eIo#Y=M`6&Py8 at 7w&D);%$Xz~f(nWP}~%0r%%RsKl~&+VNKC+OT4_d~fn6
z(A29lh77~!XFjh*mO${ZX&43*m`!u|weUF>78wAKk1mS27h`PO$zK0LZLIg+SHAS}
zI at pTWcTB`C6&IhTtdE-lit!@IOUI_NWAp}#S#$qW3t%uA+~O5#pRap5r->dbl|-KJ
zd5 at 7cg($gZWZ>5VZNzlFO!q5kJQlVKb)w~AtjNWi)GdhIw~m1f-eB0MluYq7pKeif
z`SvHNlEA-xGPUq^D9hAZN{@r~Fa{n at Jpu@-n2)@zGNNq*ju_a2n<S3edKGY`MQ1DY
zI|)u*?8kLf4?7GG7D-PF-bR>=JD3 at UO8VmLum$N<{OM5ViiYuKbzkk{hNCj)8<WBG
zyLVT^(YYK>25%4DJgFEI=wbqv3d?M2?|v&!e%rsOV-jS&;Gt^1wC%%hi`vu?u<jZq
zTQamVoiIYG>}{PqfD2EAFMZvqV;vrCyYms^mx~7(Spel<E`|<?@(>P}XNmL3=@F!^
zgGdX<$<qh>6uqwWrNh2mFKnM$*8j4``Q3t3GkNt=+hxie<CqDCb3-wE++0K=Z)a|r
zd3vyQTsSK(85H|DVCT$A{kU&hY>0+ at lt#PmY>5$XK)A~d<@(d{E^2^Vxuoe+T-;2e
z|2ML?MJga5&<WB`FE1~gSlP>_ at 34^(EbwrB^CpFY=3o9e68FG9-QK(j&dj7Br=+CK
zR5?CHX~DwAuBxf&#`%{riZX*>5%wMYu<myDLr)){$PlD`yniVq6x1ej9l*ko&0pPY
zZT9Wp_1OG;aQ^bnzqE5JJyJF=mD1x#`<ftDmi>SGKQrKBz3o5bc5L(e184sK_}Z`3
zWrhz at KDrV-`qC at 4r<TZHum~LYndHf#M<IQE=zTTlR2vCD?$7jRK{O#Pjm!biH}Mez
zf#29sAs*l2j(mJUQ7!u<U4>7;D>$)J{BkrF#$>YIQ-FCSqBjq&8v<+g8LEpDmqq}X
zyvAQ`p6o+iS}9x+`Mmt at B@pdhup0nZU3`F+r%D(v9gGeFFZBGqzT9j+ at J8QasAXO*
zD_Po{$XK~+)VFQz at gstpYzpSxeJvvw6z{BpY<p--c_?#SM518dxWfe0J4+4}z0GJe
zecOGBU+&*BT$SH&BRTj~(qv6;9RIm)yWHcOBG{w9JU)N%Fv`YQf2~u13h~R~Z3(<Z
zy&lk6gi2owlXhJXxKp+_!U8XznA}&7-?R<{w7k7-Qphk}Q}%%(P#ZIb8RH^~L=qwZ
zJ4c*n+%J^lza|NUV!KDmt~G9BbzE|V-FB0A9SLL1elxwUJ^b11a8sHv06L}lJx7QT
z62g313|%_tq`C?GcgmPwbvTLGX_Fag6TwqJ!tw<%2`<f?kw(Rr!Icqlfbg8uWL-7!
z2RWUmPh`eEuwVK*Q6q|9a8gu=7-IDYc*xza at H;mnHEusGnt9;n?>M at CaN_-!bpb1>
zpfs&}=%b5lipgC<>nbeU6Y%?R_tFqFQ;f7KL=(mI8&cyf{j;lety<MGPlw?w(~!IQ
zJJX|^Hs37X#d~|_GFre0*GY*f?bxYn6>GV9VZ8c!F}}cci3|cp-V1zSWC{A<CI2Qh
zpm>0FlKD-~dhp<S*S#Ns!`<Bw&E4F3u!HZKQ6KxCx}%pwM&<1^Spz)I$19}!O-5-Z
z*LBVrHb!iX`LG1LH*Bbo6S+6|i-a_$jlOsGd6wa8k3n?UNLBWD`wuN-T(Z$daUD(d
z$m~HbSod`Cb*&G~kE+s`oOwt>zeNP4_+?KM7YD^!UVn|VnZ#<ZoA3i!#70iKVrp0b
zNMJrP;lxY2n7g at 9`!k7pTlP+Xy^)B#`J#FQTBe%!wX}v8u&K!Q8b!|UjB-q!CU5Od
zI>m_}0peipS^F*B%7-03+Gr4aUUl_ppU2+#&Hs!e85#TEhTx9$2F=I-*do1oiIstD
zHsgqgd2ZDB^7_?qW$DaOw67Hx$rtSUqm5LjFV!>Q2O^5j%UOeAR8mEP=N^$%VwxEw
zz^|`@+O>+`fVOlY at zvTM%O*?BN~>JT{Z5duN(zTn%p>@>CRJRRS*g))Y1?7*Y3N}W
z95Q{B)UvA=&C)^OXDFV)0|=k%)&j0&EI_Gq3FYrrG$2%0`s*ULn_CSn`kXAHIL#$x
z16Y0W$4ar&rso at _ZB902xrk;Ul1lW&eq!22#?Qq|#fms`@X0v?(P>nM3(yV5wj~Ng
z6xN>v2-zkGjn<)MMU`pwH)iLccq)w>un&BO=WqJN-90E|xq}btaXP;XkT%fLxB8N;
z@$TmF%A{SR5gUulpj7p1$0tG8gV5T9LrTi~(N{OeS(xY6FB6BY$tYh&*nLt$9b31X
zZ+(e+S$T5Y-5|EMxFBZEctiQAyCIE?tkak^p~dfj?1trl=EDFriC<Wv*zFSsmynA&
zsFCZf9i`#ueR${lRQcC6@&!wl!{;w=w)c(4Qku^>_=vt=E1 at c05j}1KZ6X at hezRTf
zwU2vK`$q*6czQA5p}Ors>i38HW<4vg9CwISZiE1f3;6QNJG~E^`zqa~<buX`ewH)a
z8RVl0ZGTzH`Zy#^7EE%ayd#(=*5fRmBo*rH7Y73FMCRY1aa0FF=JvIPeMkrioRvW?
z#0$UTQ>1}`WGA-O<@|fV?^E~5^1u=U)6rIS`v`0I^~|c2MP1b-sNNGjI^eNOHy3di
z1(*=ES-n^p!*CvUT=VK7g?MM}n!h#>UL*T}rlxLusfY1WIoW at 6OZ7p`{7>c!6*6-R
zfOCxaezc;W*^rk0`T#7TXS>wNp!6pSy1zupx;<%CXXWQ_e(%^c;HGJ1^8ACupCD+*
z`Wy4rQ#P(okHJ&t-iwG0hMX&>Abc<T+2PGTiHUGVclIDkDx8M4h-J}bD3yu8*!yVt
zh%4|CY;59flh|*K8^HIxT<DIy<zkfk=9Ub1@%CI6QLf1J&}OgZy!Sqgh&`|?q<M8I
zAS2={aA<1SZ(Vb7cxL04>9=;Vy$R(ARBiFL&O5`mcvue9<ewj%ig)Psm4CJ5mCB~Q
zLIvk at 0A%9mk%`#bys{n}QOi8wr!Z?B!HdSf+0gjDc*NeOkg<i#6h!e>3nwua#HtF@
zlnv&J>nSt02wZKhi&<7aQU!#LqTmV;>B6EnMmqk2T15f~<^U~WzHW~g%mDSEHj=6~
zR_98xht$Qk6}y-jXfP+4 at 4WJzMt3Dz9ViA4d;3v8kI(s#YsBDGgFI+>)hm{<!)EV)
zu>vv#bmp9(Af!|{S<CQ7HUmbmruWL5Sh}Piv>yh{t}ms)DKT`LB+Zs81)i(JG3c{*
zb(0r9GC-P2ftv?@pV&duvhSgo4|IS!Bi3U6S#U$17CN>OTTJ^j_XxrDTO2l+Na>5}
z3!E$U&^JMW!AN`HG}!O-Jb%$5CWv>=b-`UtB}SV%NCOQFX=Wp`4iX4Wx<k2Nf3vdx
z+hJ|~vKC#~IOuKM?=e43pb#a|y8s6^a(c8zbLTmV0$ZkCgjQiBAW#RWW1YvuQX2^B
z&>?GlaGNizV=jApwPk}29LTA<)zajD4qP9Viq%Dh)J-w7xb)5cR at B!kKr=@HihhCx
zAc8&KbO?Hs6dzT-lCOsA5a at YPfvM0lFcq4)5F>Lf=9JkYh_KutL~eKPL^30@!sDQ1
zT>cr+QHKO1ciyiu(zgEBb$0U+P&32ud_T&*sfa4*d%W0P<UyTcLlE*gxP}}J#)r6m
zqoht6rpXwl1y67MPH5dvXLvzxUkOqNouk+_DjSTNFG>H){rQsXH=_%v9-*9^oZ3h1
z$o|2Lqa)-tl8OAKCe)+BYdSjM^BmshfOQR66f!o38yM at ndf9Gs^fN7Kw`<qB3mv$x
zOP1tg?i$X^qiea`G;Z9#!;HuW4!5>M0!ckOJ-vY?f9^=J+ilg0jSQFCqK^2grPr+z
zpld%<_&3S9w|uoT5U%&~pz(-PDi&}(9w5`3cd2qgel=UGc93O9>bk}Yv}0OTk_?-P
zq<3C9w+)==;bxzPsREyA6IpVB?Cdbtia!O at svA}9e$-wpXEq7)8;M+d1`f4r{9$wX
znbD`zO60f7B^*ZG%qY{QkL)tO;3JTOjb5Cn{p~Th>JB-pXo?TPH0UyaL|8ID-rK5r
za|>PMd~ZHcDU at tKGC2U_6RpPEk0KRxc|paa&zY#Cd<b+8?XBc6aZZ8bn_Gnk81PTp
z&@Bu2nWj-v at yX_H(}gf`$olB4K%&v;LnI|dvSiCpy?Whwdu$x65E!zq>A!74OdSmC
zb6G{d_rYd^iMjcBggWwt2iYQk5$ov%tc&?(bHLm6+ua~OfF-W-J7M58SQ{4mR^-by
zs%8!5#c0sR55x|HRLq(j>|VjZjnNnG3Uq+hN3bdAO-1|aLD0QWet!PpdHX#Dx4Zkr
zrdW_H{Q!_~$N!M4ET1^GNvGtt73xf3>Q=Ge-zPhD(NUsuu13wi<gJXwSHWGFMC^>x
z<=6b)Z`O07wPxg?H~J-}?rex1*FdMiGU&F<&3~Z*bujzwOC!!O9j&`e3uoU+j}d~K
zO6IGa%4W?rghwhzA%r;2Ou3^&PTwBrQd*W=D`UsOj}ojp`|pW`CSNa5GkA+xnPH+W
z4+QV3_4nxi0;+7D0NkJGO+-C9*Gc7Abj3xXa^RVx1`*~4QsHbS2UIkFP7sXPh_Y^6
zs!uMRs^XTG=Lzefy!_y9K74J+!O?LxX1PmSA2|8_k9mR}`JzJ!<?oJ%BYxp8+XN93
zKo~`UmI%{Ds!4QUX|2x>#A3l0g{pG_RQQ^ZrRTBA;;2D4J@`N`$NHO2-ixQA3{>Ed
zL(zJA8RTZaz4=D&Wpeve6Z6eDMFfakQe}s!EbloYT!kYh+~9qIy1vi!V_{`cI7jCx
ziW at j0Lo{wFcLE|Zw4dbo%gw~PDc(G=tF2>;hf2!Nyui?1Q at 9@+5vp~d1Y2r%B460q
z))xBAp3TE7-RQ%4^N8deM2kk)mGtd0dL~^+0UzRnoM_Gi^X`rW5zP29dhV**^!trV
zZ<zA2U({`Pge-}5Po41vtKQ|e+5n?c5whU(Cl2CwbPm7m$E|tVlDWW4m&wW~)}k}|
z^Iv5^ZuazXR`yH}UrQ=Ir3|WjQG6G}*dZ5*CUd>7d_!iKh`!k3&*Fs at c(XAiguwkb
z8wjGE(f5C;VG6(j;*l#0$<kJ$VXeK15(dAtZ}4FFB1 at n)zCU{VPp`Gff=!jxQEwTb
zkVn9T9nccBeK!w<uH23#);~AJsJIuko!vgCeE#CT^!C_txAk^R4_i%4^(2VW7Qqbb
z=oIP-n}~C1yQjSW8W!V#mT^%t81}CHu5MQZJJ2_zHkVlYy)RJ6pnvn{xUq<pZJx}u
zLuDuOKe^2Sb&xz7KeZ_XH$4b)G2JsEl{xY`DESRr*Qnv6P>E5}+^!&L6qRxs>#2Xt
z?}LX~fvaNw=JCbFQ64Vd4oth+&i^8zSDh^)o=Qw|z&cSS8ouQ;)vb6Ozz`MOGL`Rm
zhE63GC~cy!7QjX4bvrqGdc+VtaedxT8Njoz-j3aK(PBH;M|U(@G?92@@}Fev$uqF(
z0JMG`qME5xg-%%3W!jy|F}`^K+M-SzEHk*2;w75>m8U~y!PNEeX3^=40r=zC;Jg&t
z{HN9C$^CyB@!vc%|0r9B>CP)`0<raDqNA*6-+z*}|20!GVn at jt=x`5fmb5hV=>sPZ
zMp#b0{@-4sC5@#`Ry6jV?$NzuPFDQy$3*?LHkg|Z2?=?H-EzScv^^U3PsVu5{h#mh
z`Lmgm(~~h<{DIeheuY%P?-ZYZ0I9v6p<(yHz<?Dt_5)M{!CKdYMd%&|jR9YhgZTT8
z9~h>o7Z|7^=wXuJu&-HRWB&V>tN;0$4>b1wL{|I1Hw0dQ&fXcjbDcU^V%$L>^3bH$
zNA)?ArGA{`?T`~ArK7okPa<r<+~JaOW0MGHgh!wx{ap+BcL`iTOM2a^e at tm@^m8)!
z63bfm=6?Sx*D*`!Vd<)tmazG6qA&7h*2<6V#@+9gEVJJ$Y4!e@>OAlrF3CO(9M6KA
z+$Ns--L}zzL*w{YEh<m^EQ|_ns5_qIt$$1a5uQSA4!|d(2*c0A+_H!FrJOZf$e7wV
z<PJ8bj+uR^*$B4fUQF#yTfn-uJq$L`XbN9&?o+F&H{$Wc&NDVndj#cG0edBjHGdYy
zXkLh0Cdnv`-{ia$X5|z+ALT(!Pl(v9oQq()X+FCiG;eE1y5(M3TDLDdH$2|F`WCnZ
zj(vdLUqcwveJgu3z31hVwJ*U+n8-|+D1dI6+m7VbOu;=yTmM|p%q4^0omYq3-Urdk
z5AAi?glxOYk;O>dCpMwo*5fkmKloN2B%SJ5Pbs`SVg`tQC24$+PBuUBU$=w0F0gt`
z?-9>6rDc^p6CU%-vHVU<1_pw<BVo64Ki+ at tRE=95xkCC>A6JvYt2Wl at mQB~8b*Xk!
zP`%w43O}cKke|c<Nw--bKPOO#Ce7kvDjEvHp=u$PkvoXlj<+Njv|QMN;s&YNbg7Ol
zJ?oP4Geq-^*l<vJ8_V`MN4aFg!2#Yiq@$v>TlbcOTU&5y{ZrSw?PIFnZ%@2x?KTg3
zzen4~HeW%C?%494P*4~on?H|vf4BeZo1YvFJeK(fEqw_Iuu&<@8yd$~)@t0EroV^;
zkh8?+l;vslL}Cwa?b&w!3|?d-V3%zk8xxB+;*7~DHxXW7&Lz&0(~Ur5Pa*nQb}l6+
zmL;n!axKwoTVc{O9ai;;#AiqQ4?$kqpRMz$@Hl7elvDVYcBYfl)($MoxV(jZR<Mba
zE{G#bS@#|}Yvi#V%(=t|i-aZSlnlB at ncnrW;K>=52oEDIKW}JxJ>MG1i7Jajr!y9J
z>q1&$w;u6c_`>270kqxLG|7fDqq!#GG-7zz!lL#IK#OKHCihhkC517u9~0B?$<e$B
zPt;v`efq6I(BsT!082{j`?!4?<T@<->7Y;4S95|KxHo1^nGCYcvp>b2%6bH%8)u>X
z20}MQw*CxJUwGv5 at R7x=SX(NJ-FduS<X;>ULKR at LEN$+-V2cys4JfE}%UzN?*b3Gm
zN$vIzdMUdJCB3idSe$y7bIF?Bh at z?+VVie(ZBu=2f$v0dYc=|kC`&@lkccq1Cwxs)
z#3yRMoCdjjka(xMdy)5 at vSvFkSrF)M)6Eea#rJWQ-q}IBMMpwqTtKOq$xgh~t+$%)
zy>JM)GwjOZ?_$>^yQ8h-G<-7k7+9~unx5-b3Yys97_*j}OM8spAU!=X7GHGvHpVW<
z3|3tKUNlqOrQr<CClyUKPsUOCV{rJ`r?*N^-Ul6I;RR_Cb#t%!$ca7AfBtjHyh3E5
zhPWqGPDoexrEnfMKZEqjSXb!c*dwLbQwP|NOk-p?!t$R&!Z;5<4qk5a&=;1SkE0CK
z1dCAw(b#K$7Wl~`W7*@kdI<?Wf4xSU_ojEtTSPnqN+J`nV1h9=!EsgBMx37BH(^_G
zbhoozCNt#WaFChSITT8njYU&`j!4NWzrD5JH{J4>KxW9{;5=s7EYMmB^U*b~_ONDw
zg9sXds)&;Tzfkz)<s%OVgvi!cwE-?BCr-Ne#2ZA`91{!qbwV~LWr6Gz3we5{@g$?#
zF&S8NC#3|yPQd(_82C2E6Z_4KM?@KC4r`nfz5p>foa at T$$Ce9c3hDV$7IDPFvFz89
z#f_q}&u7L at mnwdpOCYOaCN@0jbFJ}vNp(Px$wa1kR!%cSJgRYUF7kNW($xaPlG4r8
zNs2w2Hlm2_wuW+uWvC<X_F9r9_>pRRV}0u@|9hsp7mz!0VRl9M87p>Or}Md4#lXeT
zz}IV>oZp(I8CPX97u>T8Q-*wtg0iUyAJHJOy|41z3fURWT*%h6EdD3MpQvT$H4|ms
z1)lf`Z%r~4?0R9JP5cpyEGg*w6rA)qO?FO58$&q@>(s)w?M%?jBHf0l9z;qDU&XRd
z-Qg>_lo+*7a_~v~JM<zb&dNWLj)!Y2eagSuV~tcZo51IP9lW~eXVZ0xB)*q5dqt!O
zW3XQ_g5gIQWRLUFcZICeh_vj;=%Gv$qT^WS_Eb9%C)+>$+7>ku8P!-u>v}jr7p$*2
z{lei^lLD}oE}Y_w5?Nc!|G6OaPJ{sH+Tx06>0v#Y-P?jLagX3+?gTF^zB4NyaPLQv
z3G&HGVS|2<VJJpXHq=}&Sla4K9kbps#O?4{>3J8W;WHDhfm#+3Q->t3kGb^xq?(I2
zCdXM_f2PqiBQ}Q+N!+Q)Cv}^2+7PnfEO$TN`g~0f8~xQeA^9F;fo)dn4lM0HvR#5&
zTQ<(5{fa*yaZH|_G>>R?!uJ)))ss?JYMrWhNyYlrd!@)^&j;(NvBeNc+2vu^$>+iL
zph;1)T4kj%qSo4oz~-qX<=z6^*Iue5du;HAlwQ+IpNxYBvRf at d-L<3YUuNWpOk7l0
zhcw5R`3qozBY^3j8kNYqJ`Y1Vw5Fz}7~O-P_$Qz8S<xW&ML$NIU8E{(@Kr<n>ewBP
znrlZg&}9|PrL|>rQqx9Y3#_x#3uW5!b)UpE;WZsoTB$n5uf2eHT)_#jMEb61URt_V
zTZ<k=?o=6xi at 0uXOpG^-4GeUCOlKR-<_&(*5H*k|a}39_*x%v~*(ImUUV7Slw5b4k
z#qu={$$?Lg2fr4<tj=|Ipst6E&t*ln_z+ET6?uKJd`~C!WP*_8=6)0?%UTVo#^$s)
zOt85x)jvTQ99ht*Vw75+=3utJrDm#W;^g5ADGSNnc0awUn<2Jm1$ZQn%bh*EJ#$J*
z=C-=y!1(X>xDbt&h1~ZDp_lmc&u)oh at 3Imeub=*pUy^A~_SFGum=(;|##2lrb0^ok
z`%}eNyTl*XW<@?BwsDu|kz{QXT9)e>yfF(@rK&ycD+r{r%<oj^b!wQoC?R)|sM;RV
z;<x!b{!3=$U_$E_7fg?UNJZ9Qh9^fK;MYEj2*fpH-{9QY=AAmIKA$o{D-i at 7aoBc(
zV!XkbV%zT%8y9Qt;ejz$ypf8Avr_a!E&n8|o)EDkXFUpVEiTEeE=E#aFW9P_J6i2V
zQ>vR86QcU=U%}{Dhzpig2)GArt;7rLGTKjuo_aM7ONXS9l5tJZ*UU9n-bj?;0+eR8
zQl>~FAyq{vEJ~*th#gm>o#?>&5Ag{eWg}?Q>{M({6(b8vj5Z3##wkIpjaeHE6(Rd#
zn$l!QDZ9P78{IrSYoB);W^Gy61E at iRXQ!go*M#$k$;f&pqCsCL=3wHxhSD~?ko<ze
zdSQQJ?7$bE5nHsgHhHcmf-3aWWv3)(j58)SZdHayeL?IAY^-#p8*^)Xv->Fp!(Pjr
zkN=JnkIm0bs-P=w*46?h!0|+=V1yqW!z;RfD+eYpo-k>bA=pxJh2f}M?wD{kK^7O)
zH7C=fh@>cFQ8e}(ywmc5msmhS)Aw25jrH%jn0dtM7*o@?HC(_hn{v-21xxm at vmETZ
z&h4RO#*}TA&ZF1gdBn$k1HgE(>*ST^@||b0{!dg1H!`GdwprT+!<92;Y~N%kE%46#
zZK>9`LStR*x2J%^1irnj@}%AqsFXDcg_ls%55$j1RXRoygy|mB=2X7sJ8Vw&TRK>E
zh~k{j#)XG94%%lmA$gd2TNJ#RVnkEL%fZS>;3kQ}9>$Ju)PlQSC+um4pF3mvLN3dc
zFcGpvTkA2UZYiwb-+8eBviOx~EFh1&wQ_FmuuFIz%cNsm?43xR?ES<Q7VorE!%5~@
zcEfPoK8X`u>hrZ49Zy?*TiELxWlwDt_+$yiDdXW+cV1HVMAWs1g3@@%KgjRR6rg5G
zG{jvK(^?o)<*a`Ci}yJhd|{@!4`&{Ojzui2K#FCtUDxu3S?i9q?FM5P)kJ>hKqqDu
zn at NNXhT#}PFs8+<$+}0I0dx{p4!Rk~v1GX8Zs_bgBC4O+z6z#!BXM`{3#Ml=EOK>`
z{aTOnGXv{lIcJ4war$k~b@*ao<iJ$nm%&f at 4zy1v@(s@{0`+?_E#+or9e}vH<b77s
zg|3?fy8tfM${o`5uIP1+H?tmtY@?6sbJbbMHur65I+#xTehzWvj<G6jXLxxiQ(KlY
z!{Uhy)k8zRQrKPFyrz52t$VW#r|>#)7zJ}bs(XOi((AmSRmQG|ySKFX at IjCuY9r7|
zINV?X`O5 at a-m%2)o|C!k9JM8rks~7@{oHnUWM0g4*0aI9&glc^{O)2&Jm_Ar at Ve90
zB63-+z^FSuC#RnV=UQt*uMf8RZpO`qGdqSy7oA<6E=hGv>lG|sfS=>Yad)CDK6_O_
zozV+v^~*0_B8yFxUBj`*&*E#Y;%t0JlMDdZc?!}JT38R*{4XgV<IP2b98bF2J{h}Q
z)WFHvH&<Gc8F!9o^+UJ3b^2O&MkxDAGpNqa=h)D*s|Q5PlldiasNAdAJ8`m|@1vHr
zg0|-kY- at FEwq=ISbwbHj!hXfoc~x!Q-=t&-eylL%o3y%ebi;nyN?`@tgBq~S`OrU|
z=u!#@K at F&R?EWlio3w`%e)%5k_UWjSz2C~=MNv05w at h+6@x;Mh{n(FrF0C_$@|UL)
zO$2QgmglF%IfVE&hw1?Qch;jh#65c68QUb at In7dzQAtRymBQ+Ls7)f2tc~{FZ&W_N
zsyHh?H)?L$aX~~p?LeQ8ar-G0?ux~F;*iJrI&h!BGFyW)sw#?;lZRaj#eldEQ2Q>~
z-Y9px`vzRIuY_YCfKY`fD3P$7`dK?HqBEV^jjHC=F$tLOB9`m6$U@^t*GhCyDjT!w
z-^CENZ3m3o`u8%=>dm+e_bz?pD{FwA1lYkTd8dR~uLEGVEj+{#R~r&n-ofDXcm-z8
zLAsvKw87Q?d*{}!<Ut-!y;j0pEs?>Gmihh0^G8%V!^WHb^*6lvPhK`VVu2!l&$02D
zQk35yF<FMh#6(Z7L9rI2_OW}<)PeH6>UOJrRpcs(vkEJrdZ{<7w#=BnC~t&P%~3Yt
z=v2Es?l+ at -B`3b1GtFMLZJzd}G!CHyVo|Ew>ziv?eJGEpA$gF+<Jv>N;xV7gk8TeI
zeDD8Z`^H=W1$usl?ABRr9bF&$c!pCRWQMKrzj2553h{N9D(A%9S7jSVse>(HEKyDM
zXCOtzHD>=mQ1$*l>jMuL`Ts$N_<z0(OpgXPSd93c at 63~LZ}9u0#}9p5(>|Zke6+ at f
zeaXi?LF?TA_S&AbdI`H7JWb1eDYqj_DURtrG8n0lfs*6ahkrtMZ*aGcd=lEWVBe%P
z&WE*{NZ4ar4D=C|E-D*pHI>fS1;`3X%Ug~S+DRO2%s~3-ChwOE8U?(Rk5?`V{h~_j
zGWL{~K_&^oF<uHW`U=%urf0(VF%9rOdOeZ5LHh?|1U&4?l$M62?bb<D`>L}CG4^-U
z;uL;5VkAzXKS3e;@)D*-!vprxUXF(GPgROl<VfQ14S>J=HfN@{Yuq5V3NqoieLHcZ
z$b2|UKOG*@?p^ZW1Bm~Afrm0<Ct`_vdUAu)cpE-sK>o#QLO?(QJ(=}7 at oE*Zg_}CF
zp8N}(_`$6j#jQ`txbb~B(LD)lKv+KuITm&>uGkehI0T_y at fFVfwuI@s5~H;-X+h+C
z;FF?emW`v{hlJtyI_{-m{YX2ljgF!(d0I_)hi~y}Ypnc*0#?j*&!&YacIlMYkZkQs
zCN5t`zLQG}wciTUjw&Cm((E5oMj(CoGZQlGAsqK}m4jZP>&ujlo70cid3TOJOHUZn
zyu2(l;yPZ=GcwhZ2cSRKDjUpSv84(pH;{~%(sG^oJl<P_ei>c|SE#J_qb|?}P=?O<
z&EO}Jqa16mOr}d!F2<P%MfO}zF3m>fF>>st9YxSHc_W#T%|DRqMIo=)5si+Fala4c
zkCYY;pAluIA9!yj95;<}Y9pByHcrfpSDG&>;9~lc3|e>HG<M<dT at _IFo>e(_+&qk4
z-`t)5=b~lPIVKj6am!}QFFMJee?1#(Ga=AY7*O7MA&j2WXWf0Mky}b3;qqcuB$~A$
z1GEg&UmejSc3|-r)pU1FblPr>L=t%d=4yO^Lb1O9jutQjFLYDta^-j;b4Gf<xc at 2K
zr3DS_ at xARpX`4La5C&^NcPT)3N%;kQ%qG-OOdzLZVU3mg)s4}E4Q}MxA(vyI>;~g4
zkBL4)!rx{F0=OD@#NP4=rIff_1d>}He at MliXh7YdHhGcmx+m}Xy-RNO*V;0S#`!DC
z(As+JJQVT1oGIW#s%=(It}1!9Ltj(Kl8XCRVJFe&*v!WJu%O3Fov2HrOr&9hn^Edq
za1||Z!R=+&jVxC$3Q<1$nxPQXWP-gKW@;*)=`)CE$}Q2SSVz>keE}4Iq7SjvixK#g
zJ+yL=UUid}3{)Du8WUD^n1{vo+T^u4^N6z7R)ERwZtmFZU839EShU->Mz4YCU2loo
zBmEAKW at H8X2-P^6Rp><TTGCcn)0$?FMLe>?4tJLX{%d~vM*-3A)14l0H`_l-oFy$o
zl?B(A+aA-yZhH*i<FYH`>ylivX{OGnEUHB(Vmm^8r`g#+MOj^4_sN+O{9VLZU+arB
zwlJAJ6I{JQ8V>^@TrJ2?A0cpG|JUSI4C01Q!FbOYx=0m5F#<I|(0$0v?@+~sjt7Sy
z<D9#ckWf#-N5jt-F6<8l>E-$2aeYF2DP)0MG0e@{!W}KCwaPkG$+2#h;{c{Wz0<=d
z;uZs%IyAZ%{l8Xg_QrEv#$Q=vcK;N}4|W)x;4F=gMQqV|lv(q&vT=;(^!T)ZxFM+w
zEjs6dB)GOWz&OaC?*M+ac8qv!@K9A;`Brfc{Vm0M!1X7 at 4&QdnojBD!(FkSJ+{OyD
zqzPv&ttkrVBPhBdQIBTSupo_sO09<KD=?fS|D)&h7I!5_0om$lll(v}jUGd*3)qWb
zR??Lkd+tXFUYW1WG?-?C*~X;(5H=yi8!(a6_tboCq!l*9)GfmMP(j{J#?=)vqdKjf
zYYymb>UCc``}2aP7S4Yvn=cf*Q at vwjer05pmgj`L!qe5DA+y$K6c}6^G`&^O{{<<Q
zFUhXZ{)xB at W~AbtJu#3~BbGdk_gNMthah0QbBYNdJMp|dno$HF=l~^}f*Hts?fV#b
zFN$DxyM%JuYeU2J2wWt&3HAsi7o#d07B93`;EA<?c<_&cy;7_VpTL<{{O`=GBLoDg
zVM=nvNQu8}K+(#<TyE22FVko^xVyeOo1^vjyDDZo31s3rNlx{nNzL>#G;JlCi2|GF
zDbk)P+8M>W>`*KQCUhs)`d10$A6P>rPI<9`lIxn4fR}CQgk33%TkeXo#0KrGt24=A
z)x|7`v}Hk-H5N_z4~=Rw37k}-nVP&_kh7{Blov6%7Gr&qZiJUzDv8#KB{#+>IJLGJ
zbiV0nCOdohx-AuC at uSf@4o*y^V~;p}9P#K4PtV&0Ii~j4G?6- at 9=>`3DReUbFk?q0
zRoF`Nm<+V}@!rS?VZkqu_!|fOBa?ID0(^Q%N`{6NqePMt+BlC;abId5KQ??OpZOt@
z2t&T_HOs)Gy?9 at 6+Yz{hsJebp-{w^YVShKD{D?k1J_ at JP0(()PjnY~f5wP=4VzZGd
zs+hL^H?J~MOt)n+wLq^rBuc+P54+q^p)%M}sgwLH$iU!drG2$Z5MRqduWks8sZ)R~
zIF~-A4*S&4b|U5H>*loQ%rCMD at zN%zf=-wrq~llaf~bYGwTZKX%q-)90T|XVBsW>p
zN}mGh-CScMUMxNM_#gRiUgc;I`()j*gf3HLNi$^0B8W>g!*ohm;isN?M>B;Lh9pp;
zaoDQBtZzOpcUvkRy_^+b+vCU(=fe{2(dp0W#8l%>dL&K$=xf;6%<qRar6?>b&RqHz
z3O=3$|1(a4CWuaN0fuRO{lKgEgU=LToufzH{}oG-k}O*~@jDPx!e5bv$tUHN3Nql5
z!<bxa!|wXltHW-4!XK%y^n8!ddWI#yAeF*wB0*ABYf#Vlej3+{R2C~Y>WR>fw*7Vv
zw926nhD{*uI*p)U&mQ*J9ytKqJLW{Z at z`}tzv^v=z_zwsU50+M7}-JtSZk~|V_N-K
z06)T@?kJLg($ucWl7?q7n-#<QdMM-DGzVh=!uOwa3JITUWPj%Oe=u0K02 at Q+sV13`
zIk(kY8uKD{xMd(m=<>C`2o^mKr`kC3jk^mam5i_RKgMw=AmTh7ziK+VD22hw;zlvI
z8~{#J=oqTuD9=rei1s~F_QC}FVs&OEfs$AH)zDL9HE|ZLJn(s7iPAYM2Z-567g|px
z_=iUaRwSem3 at D(h^LWokn~k|Z7DMoN!*^u5MluiHw#Qx+&%-vjCo(03ze;>l at K6fF
z{-|o9Am(#e32H!u9Yg9|9x-X*k7#axVUjNxmv2zZ)VdSEU99C&zNFPUv&p+Ie_W&Z
zE>hQV!#w%trYZnxf<oPdA9;RlpM1JD+*NbvIjH+qoTNfmHi6|n@(bE)gMsnuz4VMg
zg_LQDBI))CN|*(~J9GUlL2}27=IoxSsLd?V>--nd0aJgrhaW%~`QI|&CbcL+9Ujy6
za)Y0A5<AzmOa(QO*99x5SkXA$JDmp~t+WO11EQ6&u0-8t- at q~S(oedC<}J1S1K*2|
z@>`ffCkt-a_~RwNN8B$hQZVs8mNq92nBV%*uV`eXWvs2NJxTibIckW687<QlB5q`~
zS(=0-BEkLVW7OuFn$?Wvnr@%MoO}N}zfa2d2pvQSIKYMGK|`t_h2etE;~S%bSD6K6
z at vcGpWwDc<&A$A#vxi3q)^J$s#POxp_^C;bWf9-W<ldR5zrXSSm?>*H|Nr8?H(&E}
zcXD5gcotTBJ#@eP>rAuX><srg8yJ8<z=r{NA{|3R0+RxW%OcFc2&5EdFmQml2U#3I
q6o(pcQv(Bog8|SnK+rUTwaQ=85{x^2^X6VqKzO?PxvX<aXaWGiXHJs<
literal 0
HcmV?d00001
diff --git a/documentation/mega-manual/figures/bash-oecore.png b/documentation/mega-manual/figures/bash-oecore.png
new file mode 100644
index 0000000000000000000000000000000000000000..801a5d911f6ae43cd90e5f33eb7e1d98f5ae8aa0
GIT binary patch
literal 138198
zcmeFZWmMGB`ZhcW0xAM32nZ5NN`rKXlt_bggLIel4BaJ-bVx{dGjxYY3 at I_f&^^>J
zGtc;sbIx<l^Zotut~G1zVdl5@?7a7VU-xwpsj4jZ_~DC(007{z{0C`u0N_66EjAxM
zE~elNHkbhbXaVxllApY?4*U_ul#pzGkQ#7d*TQq(=xLMkui{XLW&x4a!)3umqs at -p
zrc=MV$L?!7t1rxk1iw&`JmmjE+hiZiO&3PKY+~>BfCryAJ at W}JeaKJ$qUjGoFyzK~
zjI1ZlrrDjpcrGkBUC3?Hd(zXg-}^cz<DPX*TiXxREbw>PuqQ}fVt2~QKlAY~mD`lu
zqTCC+=EIO%eoD+cRtd~^5Xa>Qa0mVm61&>KMBuOL)h4ZLzpjq?=9Ii^rw;Ia$}-wo
z>`285PRQBf(y}#@^5r{BOPGpGNK6w+z<>P%#Uu$f1Bh4N^3Gko-QgVm9^^-~V~NMM
zhP7maeEpx#|4(IO1!M*fAQu;@;(PaK{!Qu!`lpf7ufG0Ias6366YGQDtxio{U68wh
zp`j+oR-$A%cewv-ac}C2UlYncStH)^=e6#>MmgFh{y%#L+K00u3a3kNH4s9pC_i3(
z-$=x>j7m@|HCXc&LWy22K+DI2I3O)%fTN;)v<(>T at EsLo@Mgstk6$F9b-wx_TKbh2
zf)oAdh|>3T)Cqkuy9-)^{^u;L`5>pQNeY;IZ5z#ed|qg1X!NuHxwv>+p~Wh#rf5U|
zJ(^~~!AdpKn3?2bly2L;S|(P at Dg-?PL at yH}DR=?7&wc#GoqaEZmXj6%|1t at igJtO-
z_%j~|(UvAH802`TIQ>}yb|Kp5Znd?w>G1E_^Xuz9OV~_BU!I4;`#CjmX<e at BO?Wko
z+$x<4S-`EAD)~eEN;Uv-_S at Xc>;HSr{;ol at 7Kr|7VBbc-+Oc+QQmm^5gE%&$ewgAW
zDs~>cYETUXuMvg!1v(36 at u5hXv!4lAfS-at&?mxgwF$ZpyHL58h_x at foWt(#s<2D9
zVz#)IffrX5_fUGkd(dY|`10zB0Qp2>0^AMw&H5K#TAX_c^eiP<G19N_L*L`$%HRhD
zyrTt35^sug3Z-gdpFqIg&jR1QvuL}O;l`mO4j9`Cn_{A6j=~S`6UtU?%?Y3sGj$Wo
z7kCQ#*Uk4on at PpP4>J~ec^w^{1yzvi+<B2({e at hi8XFs1>G`7jq1wt9trhhF6}x-I
zwgPDc at 7mCZ;>i1p(iL*+0}9#}Qitu<t-o_Fy}-2V<!eB!6 at jbG5;V$orRy}(#&7?|
z%n!LpcADZOM&vkU<aa2-xk-sW!%n6VN%`Ew at JrCTw;FV1e7$`>a9slHimwL2e6N?9
zjXx+10RD8<3OKgUHKl*L>XASSpvq1d{?-p#t|v3TnLocC!aVPE#2&QT)o^s`_bYw>
zLHqKD|2Sw<hTz1a)9X{H14R0>-`zF$`+Q=|Q5kf_tjkE_ph_lII_oa#>d*dK0#<sQ
zIGASbI*sP<Z*U^7EkfR_kGeL((>`Gz&S$qr$QBYy(fRppi*~)q1nyoB=AvRob~B2E
zrSgdhkvE2ZTbUX0#;lFF>xC4Lfbb<s7X+Fv|4smmkfM_KzINFyTc`%#jF*1plH1&F
z{GZ04L>praCMPF<_$v+cqnP%Vt#1tC*Q}APuB`B>$w^DT1ZGDOPREani;KDu1?jcF
zt=-LW*OjfBT8_U|$$%uqRYci|I?t<YqhjO46o0JQ8h*M$-+)lX)SeBS4Q>8Yp3x^q
zU$3~itb2bYV#7EMdai&Mb!})*r?Wk!H%}wqk;qV8BWY%lYd&4%G(bPxt2SS532=Z3
zS9+oXp`87L6DKr4jf5`hRZvf!UNbFD%`pV5F^2rJh0XQWAb5Fy0Qnn8<&CEAx;!MC
zW9!w=_B;ogI`Ip%gZ^W%z+W_k;h2`#o=3OYb3ctN&F$N8UV*v8typvSQTF4FD8DOD
zUbsG6Dm^xfrY}kJVKrw8kO7#n6f6De2Uhy-?YO%iM-gIea>lqOBL##W8m~YMS%Jgf
z(ULbG57#FB$lw<<m&ELB2&_*VJdg at Sxos%eIK4x|FVUq#U5IA$z00X($H68VZ_otN
z-B;9w6H8umTY{+Tdul66#&?t_h<1H{?S{HV%=Z*-1;(QzUYKA1r=8tYHZS;^9G6I6
zCZVCGZ^@1^_{*n at qfYLiD&(pn(vJJT7waL!9Pl(({P|}Q$%ap(#Uk8|7O%eIa~RpE
zE7fN<AD1G?$PO3IS6^X_*ya_;OJ8g|Weu73O%gJ*oI9Iywg@|iE>EFZ$Ih1Z3Bbnh
z1gT_CIZ;G^`*d&x4EfG5^bL_Y0U!u{e=WDTfS8Pycu!0GLEm^F+^4b1M at niGRqfgF
zEPkqCjqg_IqZc&;1H&648V)Jl#f=sR1_se<Xl`HogVU*b^u#PU2Zg!M{>?}W7=r}I
zV~TcnZ6XRHRGE_#N5w5dQ@<>KaV|uTz^^N3tNUMRh^C~utFL at fUTHXegd1#At;vwu
zN*>^jUiQCz<SIl<`Ah_3#cHm?C9s>VIDx40weDjw;z;Qe82U=!=Ei$%V78DVq|X#5
zSaMF#_h^8|inQfe8~k-lf~aIHc318>{JI%+hjx9aQ-GDOQ?+jt-v&Nd7>R+ii)8Pe
z<6R+h*DMKk3Ya3M6bWN=k=_q#zAT?vO9&sYN;x at k7S@u*mMHX`mrR%0?;pw>clx$K
zBqF;R`z4kiuurbuGj_$A6wO|z?8LHfL>VBGI at W@B^XbwR88I({k=*dGuuXARgn3qw
zmG%zkY?G!&sqf-lWFL0=AdFUA=HKrJ?&%L7t&-_qu(a~5VZ4N94X_!l#aKmQ%V9+e
z!yxA}{0ASP`SO;G+v-Sa4O?UMW<NOJMR1 at 5ifYcjLI=U43|aBQ!Zgnh7UacxH at Gf`
zIq`2U9}WDq`{8{jKK{0?G{{Ye?!K5y+sE^mo>Rf3s-xbmtlJ&ecJnE~-9)B5!cL;K
z^yv5yl+f5^JiPq}(uFh|bd_7$KKUhQ?zLN3+Y#?e|LsopTgJBQ$@d9jzU2Z|R-Lc8
zeYJBJF-AC30^RM89m+}UcMzNR;%GRqrp{v+!d-q8KVXb at L)<n#_fh=G;y)S5z~x;B
z0l&5A4aTz+9JoGIj;0_Qe;)B5_wR0VVt3aY_u_Ii2S+QX)1;d``;|gw%AINA617Z|
z_Lc;8R1`CGnp)N|3r_X2pc%U3;RyR5|AmM2wT-Rqn?tuH4K)&(>k7*i)F!_y>`tCB
zVs0h4UCK>pF2fF?<woRq71zrdwbx{@SM$x+dF(m at c~oBj(;}m8{granvodqPevS;H
zCH%}<45?PyZ^n+h?z8!v0N0fAaDc4Y*Hq!4c`EAna`Uu#lcU~B1GMR at OH|=hRF1xw
z*TGmN(r=JG?K-s2bPlkxXJ?ddJ0h&YKE}`aG at C1vx+v?M>tRhg at 8O!TqdP~3ZVWF#
zplx1^G`JvwEDAK4y4`j1I{779)o2 at GNI(=ns4NXO=36wnZ8o-aKy!wV&7H;5Ol<_R
zSiaq}o7|cmlE&szLw^sm+e2-qHdVkoRqq}NC7sGqjAeH^4JgpWZouZC`!CQ2WAVl_
zft;PVDoeLP#5hEEK+ycHv}C{#G*FJ1$Cg9}D~Ps8^fWXQ_rwo7<gJemC8~jJLUu~K
zr1d_-qT_qmaT#*iewzwpO0s3gbLVb-#Mfib-)C=+JGIZ1)eDHRlMoEnI6JjE8ln^|
z)c)9g&gO>k|7yDw5%UG0i)YlLpq!V-6z?BQL4!sziaYSMy{PX(zp_)J4Qy^U``(@k
z#fdPw8KiCx_YD!(4}e~te&mbGEXy4 at N#e`KrdTF}Ip<dp7%O`7SAsKNqWzlxX=x-z
zZW&lC>F?jen(J2;$GaEUGNo78H;up&jKkKx#-g?x#l44hLCuac)QPwMVqak;clguc
z6;KsFPUK-Gb5%Kt`Xyf6j48(R*=dP>AJ;eC-juv0GaX1INVqcn+XF6;hGM}@Ow3D~
zYN?%4C}rF3cA+AiC5Iw9XG7n|No`EGXFeBTKi35Bv^<J~=Iz%xmWr#ncRQDohl_Jd
z8o<08sj;2+t3X)BRPhs_j|vJ<7AJH~U*Zj_L_VNww~^@zQcQ1<Y-0WR0cU0zh}~`D
zumw$KUli0&NUy#KL7Na8r=$&_g6)esZ{|f at EP{JzQ8%q=-G__OPN*>=sPgZAAB+zX
z1-zs=u%KK+QHxS at ic%AGow3gk+Et^U<f}3}fSw|b-CKDq0da9E0f?}bV<`p-czmo%
zsYmDOkVJ{S${bsmiO)fxHonDyanq at x-AyD8HkTHVqEp-MsbVD0TR4NrNx?+SqY}cQ
zG<Kml{v^Jt$`Ri*wNw*#Dsc}A=p+|Cn*M^J_7HPNtlvPne06fOG_LX`vJx0PP>dCl
ztw6L?)|+Ybk0hrH3%LG^rYCnUF<$fHMnPLziBAee3`5)MHRW|Z!a0j3Z^u3TTsb%u
z^M1S?c>MN0v>{c?^!>0Owu^WRF{?4kJIiK#ve4420rn~EoV`XFNjD`r4s|1DkmnPj
zl+CsoebiC~&9@^ryt;OrN2;($04qgH6epnUL=XdzUx(i2W<ELkx3dm!TowCtbw5|b
z^tpr};maxLXiJR^1Y$V^DoOiiwAHK*VkS{nivH^|o5*92S`EzpbbN*rND&|_#tRT4
z#Isd&*@{USSbqqwVWP^M^pdZT&_ at K(c9&W?2tFIFNC7T0A6>@vk`cUGKNtkY_2G%l
z7x8C|KzlRH2nT2`idJ%efb_NtK<v2c%p_5~0En=oefvwROE=ephtpg~v4?3xrl1$u
zHxc?A(8So$S~j;+4p|3O#VzlZ69wM@)k6s`#uVLhAOoWw4gDOvlsrJ+7df>aBdT3y
zeGsxpr2yp0jO9wMFG^|eyK>n$!^WAJ<BTbIpK(rwzK04yiP{TuOhvxo+FSgMSPS_=
z*c5z(zQ6mhq`;Mj#csNBx$blbVXPL*jd8$NTIMo7ZJ&IF?xCKQT-fZ_u`kUvA3pE8
zc!qNi>qBA)vieS03}{W?`6OW&W0y2Djyq0XH^!KI3ss_wyUyD5Ft_j3H$)97m5R+g
zTcOMsDCKc%-`1mUSo%=sAd%*?_pxB77z>INt$fc>Tw_{5T3^s*z3_=>{N&KVqrN5I
z9K)3`WgUBtYd?;06?nmqWV|WR!}dP|E3+huhgLo3nq10CJ at z?43duF1t|>_EydM-$
zezJR5WW_O+<H;g^6kp_n{#Y at FRmHF`SMoIU3OY*Bcg)v%#eAdh`%a}%Uaq5SDB~+r
zN8z^E(2;)*awG4K5jwpA+U0rU2FAc|7eUr<mbfh{u&2&j&IL<t=W^uArdYQ8Sn-T+
zx%H~%OEXd}O2h{uva^{`Bbm&sEK<uwa$<w%mS+|WKB5;2>8&2r7FI_!ZOFo(HU!;y
zb0Oy?qkpcc21^7)T-3|~94fz)Vokl}uWmAH at C5jOQ^umN8>6xa-Wfqcw)p0<g^gIM
z5g{%yg`lT=7U3>?civfvY5i$b;&IQR=9mTO?lq+16p8N{0cNp6d(sR;MM#4D|1c`s
z47P3CR{Mze52z;U=vuV;kGL2dW=~)A1phAQ6J$fXtvfHWtWed~pGzaHq#lf3IGlWt
zjA`(X;%T)X+2Aqg5@;=hEKjzhnp6Mbi-W}Bthnoc{(RO;V$60aBoC<W(!-Bq?YEjS
z@>s+6 at 4ymV_J4vG{ctO$2m89zBP4 at CKqaqchuyE0x%>F4Phuu6SSIu*U;4%s;t9Uj
z^yP0Xl1>k`N(DX&IHHG?`n{6HgNGKcUC}*PKgIS#*N(&8PF`J-9`)S>%D at F-Uf7qU
zU7<iLfMqZtLg9re5e{veuiCiFbshv)l6XD43wyQ4zfN8&rZB8rP;Wf{I{0@{Z92`(
zQvs*nJ=r279p2}J)EqvEai<96-juYmvN9vZhsaZ+(D%eRbg-7%+Inb(J>a=3Rm<i_
zwqbKhceshfQ2zDjTzh+Vs8%fDKxl>EbYNc#?_ucLe7I*+l=Eh>%)Dt|sOM$=PUU&c
z4H6&cp3Y8{q}qo5PBYVsfan&TIwCv|rjy_LwcNn{eyf at hD39~T%L8AS=#igR<g2*8
zNW?il8$rQYCAMwF)kv-7;1(^a4XtTF)lkp>98dLT9&7H8=(SPs4>e*O#Z{r|ocPdC
zgqphBBV{XzkC$Ziw~wOL4E&hOjx#ok4-`njpJrbK=zAdJ4a9Q%k2HSA1d7lEb9N at W
zI<m+=r3ViJ{&?&(+FeO#Daqz=4wZ&GG)v5mYhFK1&b}ofN?Yv8m^^2mF&^k_I<H0Y
zvAb at 5rSY6fkzC`am^sdsRvOt at xSQjREWd^B88rVnacPKMpp(yljVzC35p>%#Nxy2e
z5N<mv8(eTga}ueMBq`^aaFO#ab+wXJ8m}n+aPk=p0&(00w#8ictS7V?w-dCSAS8Nr
z7Q9A*%l6SVoI<l}jS2yv)AF?<(QUtMN%nInvf9KENT*!L9K|dFRA;ZpgajHi^R4rb
znA1)TrtW9#(fj$S5an<Vbb3EvonF9xUC3IV4)%O5It9&1$$0Pu%Cvs-P*J`-LY728
zC}=0 at k%wq}G$S4+q?fJQ>DGpuc`!sd>wL+2tyXcX$h_s<pjc<&C+YpbSrusgo#b0+
z4opqY3P)?PHj$o=D)Ju3Yj at FjjqLh_JE&`_5sQz*Q!VX+h~c<PJ;x81zt35mgst?B
zdKQ*beRLgk6 at Cq59(!#W<oY^ePXWfcWG{`9PegwlalCpJ%UutzW4RH17`iFWbg6CU
zmF?gt=X<VubM->>VaPfK7&iyzBEw&Z>8B`EyZc-?edXh-w$7?JFK^ZOSVB<JnJYwn
zw(*PY-j>>LldwOaVS?9&q<SJE(>en@$ArfI>F||>3Iq*h^DM5(UWF3%_Y$YqEve@=
zwQ{lAg2{A7iOB<i7<LwjCSO5)Jw=Ja;xRjs*hzY|&8=b7Oqin}^_!_PW;t^^5rPuk
zCL8$)L!7y$#k3ZuI!%85@}Db9F>kW%tK!+D66r5;MJk&7tLrr#5Zfl4lUka2$*}zL
z()UtB%-dUb>F|2elC3s9CV%f(7jY<f_3EF95{PM+C^Q{QP+XiacPedu;e&-c7xsxJ
z0UN<O at lfEhcBHpAI5E4K8DEE5a4IH!Q|f2#G&G^(?xG**Er at 4_amjwS^F9Kv#qaXJ
zWc6Kt#`fqQ&J;eOD^=8+c4!P)D%SOnZ-F{Ls-?2KKA}2sUQ=U58w2~7c8ydYQ~9DF
zI2&*uu|0H6-F(0{I;dTng~jZJ>#WKjhw|A at EH+A|AX|&K_;d`NMV5J8Pj(15iRW at 2
zx&5epNkcPbOUp8*;TB7|fBtF=;MYiP?myn|kL>006Q{ZNB^9fbJUg3oJa5_f3~O=+
z{U*~1k9&to?!i!??>?^=4p#5x%LAC8^9pc9_p|wGF)Pl{E?0_4`h(tAZ&C>Qdj*^a
zO}a;<2F6X;z$0e*-n9H-p?E*JE&>{dT)d#A)K=nx^v4nrSm88SRsvCTIuaquk+~=W
zapu*jn6AFc6a3oqAXYzYD-J{TWpUMWii_{zs%-nrVtV27&7cXFF$Q2_G6uuS-CqkX
zK3n+MU{p_G$%mMV at x|qr6ZS_c_?^<lpIuUX*xftNP at 6n2<$4Q!J5|_Wp}u-d(MpiR
zDdX0TC0cEco3|R#CrV`G`JysA+nO)S(k)`_bppM7{rhr~uuJ8JdCg&Y)uaS^qN<cL
z=1!g$kghnG%Ronr>Tvia^kAVr_Hf7EDH*2jGmZm=nTYJ7j1#JA{X9>Q8Yw at 7_<3%*
z4o at E|v0vZTuW5{Rp^VY78Z?k~gH9}TA*<Ymf`r;tr|%yf15k$%&2Q8gdXVQaxRuQ5
zj6v{bdhK*$h|lZFX-M^A2HmaQ1s6q~ujhUWo;<!PS4cwdE*?WWp(Sc46wBSknsMK%
zZ)XDi14*?{YewT3|N0oY&*^;abX<7!9{Y{>9l28nJg)6HH^=uu-|Ir%A-j6C$%oH%
zx=`8ZI5``rV8O<pvyD=+*zcn5O5=jHM0|M#RWut#ZAfe8Ef<&BNLA*LY226BXHy#=
z4suDlJL^ka%twP&nQ^WJc>$|uKy)9YC0AJC$ZZjR at wc&_G=nfX{x?5_VNV`c8%mf1
zvT4$a-<t8%Q!!o*a{TNVTFc#|2sk at Osav84a<Byd$gjoMrb6qcDP@^SWI={3UMO>n
z0r^8|VT;XG3yRvX;A*XT8vE*nVc^(jz|?tZt4R5afXCZ9Ul^7L9T!|+<%58%)*EiG
z9J#{9 at RXEmpE1gD{MJRXzTNq740`$3H*#9FnO)5p-8C4wdMx}Kz$Rl}@?@KUB5V7r
zDF*PkxFRx}fB8Wl#Ac+f-jP`4J0ZwulK at s#n7X`I&Ke=BUGsw63bs(DuagKJ&~E6x
zZ{ooa&;(^00E*T`rKB)xX%%wK?{=Rv?C8!mv4bR2=X(M*r3=+6dP8Mj5_MHP7GHCA
zT^6^z&24q+8{H!q^`@TCpsSF6&1GzAJU^iU)Y6^}YKxlL$vNNhl2~ZFh9PgKYX6B!
zVT=r!%o7Z(FZ)Yx_X<(_xdLa1v=GAC>$5NBOcgF+NFJx3)6UEW?ZqNA*f8cU?D}j<
zNJHYbewiK4%N3^{CzXHn{0=DLxEp0*4tq at Ch2tfg?tLA(NDAqirx#x0uI}nEJ-SrG
zwB`AYruVmT*^7Wt7kho~wnMB7?dO5475xPr7n<A&<78|1hFk=_oz(p2m;Hv+<^YOs
zL+(vVCO<FcM at Pj211%(nZR|<0<>hDPNvGh0vGB#PZ%C>ZGcki6+A8YJZWoyracFpr
zpD{nccXkQ^@2pL;Ry4YgY4c(c=ZKmecj#qrI>u%Ve1ZyQwSe&@(}R?&m|QwOVJG at x
z%Qm|zUz-Z{2SN$+)+kiX^?hu}drXL-kJ%XI!0BoTv-Yv^v0xb9=H`_uhaDGUwoc0G
zH(-bqirVDip#EUL+;i)Ov9S03?aQu)u<>z&UHqpQfI+nVonnHdq}a~oRp at Set9jVb
zxgX0?IJn;>M{ekS*exmc$t|<&H;?t3a~=Fp;)nNtmce?`n$0$*Jx)3ZEmiQ3!j<f)
zkM&cG1Kx0f3VUKynfWE`nm_17%GTDs%4<!Qv*}}|9|^WQd&sL9|Ak|VvM*dT{)aN9
z)|Sw&ft~kz9)&&WjKdC0>^$&ToEU#y=4OB#ZE*b*M{-yPHHH`Lg#ibL*eT}E{$?7s
zj&p-(MOGs3t{{Y)`%^%P!_$?V&V~ABe4|{IIaL%Ye9sNla0kgnf9#C#6PNh?N1=OU
zidS)fEE*J;+H~3BhXu=wWXk_zMW%{?zWe6&G2Na64|Mn3FQ2&gD``cQH1UP62}m?}
zq}G(&SHwjZq{Hu;UduGzAZ7UNMwcm!$!g=WR!2r#OLJ!OHD$m at 5TpKR&pA!6XnVk-
zT>Qz0zQx7+=}w<&&cu1${a9{SH#}m3DIudtO7)j6nH|Y1gNl(Pxa*}>c4)xZ$2G4}
zj4RB?t5D8$q~a+iA*=MD{Xs6+hg7 at TXn?|7l!N?G9;UWU(CvESM at k+3R-m?<{*4!P
z8|yYbHW$gm9!|;tOBEmJs9z<ODCh<6l8+Q`#cy2R_mYn$ZR=jD%=twj`uHoPp;Kv<
zC~OH!Kx)C<=fOrIg}R}Sma#6}N}ct)&^d6r->Mxi%Zy(>f1I~DT)~v!#mAmBqn-|`
z>cMbe2*ZQ?1j^ifujCi9#Hnwu5EQAqo&$e=Hn1Ceeix<!fe9=uEWFVE-YoBSWpoC=
z>8!dq$N>PXPvp<n_){&|M2{k3r#7x!j?T!^4Ia`ZZqiWPM8ULFy7 at Ez5tE?5>}kgo
zg%i>A?!&7xfEeU##wRrhA18~eqbH^)Gy2{*A11cY>ZPtJbfwW(_g?Q7KUi)i!Xq4B
zGz>j9<tKgz at jVEoJ4bnUV2+aeHo>JE)nvRcH}Di7SVf`{L=5Sgf=Pk4#GO~@(mS!{
zN*}bvc%?v9-3#>jnRScvU1Kzk&XF>bd;kZar5_8fy64|VDakKzKWQ+nzw9rs%l~e#
zu}6S&58pfNG!5rj%{6FwBT1>q9$Hp;ywMjfkE?EWmqO5O08O<9EMXrE&>(~eS6E>+
z2NbG9D%`5kSKugY#HHz47q(zcE_)`s&oQBaY-;Bs*H&PwB~6Qfco^z2VJOq>MlP5z
z4(bg2S!NrZEyBMOy%;TfFEGG%NBD>*snPN$q4^fj*?^@Oo2?1Shv;_sPEKTP_B36#
zYz6Y?+J$)q6aYtbV+obV_eCB(`1IV3S=5KK>TtpB?s-0E97S4dztT<C8(>+Ll>_d&
zmH`@h%Qx=%ai8m_Czhyj_?9AQYV17a%uWNJ{YwxG<4EHYpFNfuIxpSR4Y7`#VEXP%
zG9B=kNLb&cYMW#X_m6k-SbVJ6xn^*&(!d4pkpKK-n%M}6X~nC6j15G~t<B@#oEqC-
zw#b#T#*T<Ts;3fk`<=!+p=FHf+R4nJNqhTMDVd-)&QLI9o{Z$|{C~Ls8xlso*yxkk
z<G&d>iR)(L&6Bmbo~_f*4l}#%1;v*d9T(6v^TCbgoFSSu6pewMjgt2`oKoO)#<(jA
z<h{#ueMAI|T55a5f)Ehmiv`~u`+DU^WPCHmq)M*00wFFNA2sGVg}1EukvAr0zVb|_
z-9bb*>I9#Mam}6fI`QS0LlO{AIC7%|*xlQp*ZrykF<CA`92?B^LxOtyPmM}luIZQX
z$YxO(S2t=Yx3PmhzhRH#4s+mj>lS{+d%nR=z?(`l?SD;2a<=X>irnI|vf+ey*^8oj
z+j6m(i^^uiR_ND4_+$&tZoDY{@(mt$3okU>VryJ;1!J`=Tty1c at 5Zod9qW$UEI-mw
z{Z1Z`&!t6cI=b+nZ*gW%|NFJZp|is#JT=x<_H#9bz=fRv`g-Q at L{1$vZ5gL+r{2-e
zMiC%<=uvT*`O+zAV$rnZ7a0*RfRk__<x0taa#Ogi!e+Uzs{L%Hw7guy#@arl$N41@
z-eRjWd;Vd-6kaZ8LRKqz+&wJHn8S(EA3w{MrdG38`}ZA64ACOxo!Rp=|C=xp(FX}*
z|Ad~FN;Kv+T99C$bj7m!6R-`By;~EG*XP6ggslqB#coDFzJphTLX}H`l}q}jiNw2o
zkLOGlHqz2QKQFui@<s^}8jnxp7bo=fM0+}K(1!P39bvGBp+*{B06I#3LL8jQzQ!)>
zVr;mlOGg=CR83azAnd$?iovDj&Hc#52-!dNqV<w>#w7p!#EpNY;|Bqz#frWK=$&&;
z1IGBfFlo7YN`d&HK7wxlgGEsE+1X0u)JIJ0 at zK`S`5nLT;cCjB`r_4}mR<MbjXxuW
zr8bn|>l8hdRN>7WD?K;ZR7Rb`QIUhe>z8xuz;luH7AdcElNH;?-J3){n at ya*CGuZ1
zEgdLUL!x`W`LDMW)>!Xp#P(yp;{hystHns!=6YQ3PbXck at 2E9o(B#*pOHD_jT3W6R
z6m;}ldybn&5bbVpnP)c`Lvn(FHQ*^nw^PYj>F9kBHJLgiq+i2orw6I>QO%ZID-B&-
zWDnS at ig``nYRbH&=4wh at FUDt|^E822_36izS1aa~wv;qE+<E6lA|gf;0L84aVt#=6
zVf~z%y>eZE$`)DLp15dm*#4Dsb>o{YgD*_0=tm7qANVczoqyo^-rn~3Cs8<q?vBwT
z3;FIZpW|S0G>h1v^$=tUFa5R}w_B|zwa{mE8isbc4&CRS5|C?VrhI*&LB4w!Aa=4M
zp=ol2GcK4DOqjbPv+qJJYJ9(N0E^`z1qPvu%+nl#7G!0=j(YX}sc+o+n}C3+Ko&R7
zy+3JoZwWaiNs=DFJ5NzRA-zg?Qm(d0 at U!QS(bUcE&>@kA#Yjru!E?GON57mwz*}!u
z3A6wos!9?LCU33939kBd`dnx4t#Rm$^<7OS!C9ShX8Jrp at gUdCt5Gb<kS0*hH~{AT
z$xr+~cuO|Rg)Qop&s6e{+7DI$<y8~TQk%?^K~zANqd9t_)hz5-jY$~;q@=2nu(Fl|
zk}b;EUW(*GKpdw6hHNt4^-qx6^C!dx6QDl(a<vaE)o8wcJ8o1P#PSz|%_mgh{M(8}
z@%VF5qApPkX8%LBCESqpJ6TQM?%HR{Xq9kGk`n+lnhdVCmh-Z>&&osNY1q#M38!0X
zQyZ;MBP at f$%we93R!O$t>ezY-+hP&%fe{toCtuUNUU%1tduS`##Z74qf!dGJ|GYYt
ze{n|H#|iNB<HiqRH!nYKUakac#l%VbbQ;aIv^$;m9e$~Y<&KPT3f*J`MEAbp%`~bE
z);_=d<ksgaXyA{hTumkp!M+^td{0PK5-daf)8C9nFwP>=|6;4aw#{adlk-_6pU at nt
zEzEZDeB}q;`rG=gK2m>vO@)1t&>vXWTXJ<+JLf&e36HxG=j4K*ggJzXyu+B7UtFix
zW<OF8`-1`|ykAeGU}x`i#=U3T`UzULnmSxt%k43l#gelhnTg3|O_A{eDqrwcZogym
zby<r<5I;Z8ONTm_o_^h~Y(5t>Ru59~g{`08{M1q}9o)T(2nZ0}4n3<o>ThXXJ<>sh
zhI4P6_Z)ud+lOzW<i=at3w3iGlHzGfEo;RE4piYcj2wjt(3<KxiOKGlLLg!)?FfE5
zuFK~zIR|F%@~2QEkvGx0m%A}bP0!$9Shtub6 at TvI6d9^0 at mn4itwjthM@dPkz~ii8
zh>pT)A%%cFFZRA|i#|pYIfucfMRzAwKy!e%QY2F8HWHQc-&(>kv0<~N%%aXSeIb4Z
zta4V?2x&h|Fqz-ZPl&<PkWZ#36v3>PaJStQmqv+?XEMRw6i24T6DDV-9v=6nt#RrF
z-Ygi*gZZ(YMKGv-#+!v<GFe*U?n9BQS=f#L at eqO=Y%(GLt_xh_`m%d<9{B44wQE6s
zvYhUi^ta1SYnC)fr?0M_LkW9K1U(%IWL{K!BLj;$ia!hL{Z`p)?v`Huz2MWH(H|j~
z54V3s7vNuAlb+m>HcCwP2%p>yr7IPJ+Ti{t$IX42g8+kluO*+!;+9ipT$=WuNtgTI
zHV6)DuEzwrF9c@#VOWDXSn0M0?+Gu}pJbcjY=m5<Sga0J#|>u7jR;JTn=2Tp<hyx2
zo$2$;=QKsWa960cBBut&Z0y=x_!Y-T%NVS_fPQq1AI|t*@{?OMaCd_+E156NnEN$X
zpQ0=ZIYv&N-Tmjp&|BA at bUS$26ZwD|57)^rD_Bh*tKR9pdK-T#?jNtmOeykY)rz<#
z!&X{rKRl{BX=dsRtt(BP^s3t0^TczfD{@5W*hV4hBZ#z<tsQ0`@p4OlPNz`L3gl)|
z&BD|ubrp)BaAt;l=bA)xs_>%VLBXH*_4Xa0C83B#xxSVQ at v+1MU4r-SnR!s}<Xkj?
zn6YyAN`GA_E9J47na>OC?6gIN_f_eh2gtOglFKrG+uXkek~{^Ll`&!2Vo=pE7*;p6
z<yw~O;9t^%2?OomKelj8b1d#$s9KP0?T&4+7HOoN=bjhoiaRX^xN*=E1Kn`@53QeH
zM at pH>Q({o5?PKj>%UL>tb|gz|DyM|H5y`1AhX>reX8#T9g37nh9??Mq9P&Sa3OZMR
zTAy5}6|cT6Gyu{F+lyahTQbfB4Pk?!UAIlTrYORw&ArYL2&s9+rno3|yfER?smXS#
zilOkg5$4giU6%DiEWvEXE^e&`CtlANq7|ajF?g7B(05J4H|@v${?|xCzgL+-7Vu_M
z{;RypDSK~+lxafD^>?Gppp19gy`{m+B^1}Ui)czVUx({0KK&fm=LWhJIU*q3y!`%J
z)d*#Fj?i at bBFU}okj<95BA$gjAUtZA+aTq*Ja}IjSl*RTbVB>>=!I$9GJP)DvB at l~
zZ}`6D$#Z1ubL6&U!!T at swUKE3eDOr>30~C>`>ep~V6yq4i-vgSgyp5Ih0rd`D!hab
zAb_|v-a&*QJ9E#zhx4d3n_1quo!r at sN9B(nwm0JD;g76VR|(ovxzLeB2>?=HVa7XD
z-4_>JFIcxUb+*#D_mzz3GOPi0{dqhMM2aS6c`2RN>NyH5<vF8vdfdWdv7Gu-Wo{?>
z=5fgwMpg at YI~l7*>zmxrX<zQ0?@ImY;2_i4Z$fSX#!NmsQQK+&#wRpkY3*=W=fPk#
zhzh{;#P9Xx<}3q86bG+kRV;!w%JFUT8S_npgbdAl@=|Dz at mom}nU;xD%)Z7P27iQm
zl=&iM&{%bR$ppZF_4`i(Wu|m?Qmg8|=Vty?T}I(&zpjxU$mj>fFv2`1Dw--*>=UVU
z{}K4am-(9U%Apa8d^(#aVd~T!M?7JUpwb+<=M%7gbDd(N`+JkNX<yO`{Z}HLKZKA!
zJ+09^H>NZSZ)<yaau-g1#W2gBnXNre7?ID_p^@#fU2=4x`ze_RTQ#{Lz0E3u9l7Ow
z@||=i>#Rs%rYRsl0gs)fULmQhyfk=`)D)Ur+y(Dvb)-s~WLi|6*X)m7-L-tyA3+bw
zNVOw)_e7mO=Je7_s<WZs3FeMZAO}r-ePx=iU%u&~)!54zMi)gV-KkN^3bBNx7Suw5
zBIw@}2u&L?aKgn_?!`BRT-Kk)6a36}?2qB>KtdS)ixAsiq4+j&el#7cg~+qg$fF&y
zFJp4cYe|1-g_|@5>&<?lWJx=ezoP;QUp&&B=(rKFzkzMcvoz7q%m*T=!rvQGb{IL0
zUgAx562^%D3`fM3RuRr!zFJ0!yV9N$k`rC8cHHs0UGS#c|MZ=NLNt>`n%#*IZ^uH(
zZaGK8l2+D&83a{_V`@L)niM=qAJbt}=LR%V1l&aFXJNI(+i2e&p5K_<hIATU!QHUg
zcz<%oJj09LH1oXf^%t~&{%oEdBLD~EE_51sb$%fy<bhrWj-|P>iRRo-#cDx6recel
z)Aw2zBVemz=<+YQ3S_<gaF`3(AJ}|{P1rAHbqe6P9II_wi;Z5pOC#Id93rKbo=H%e
zoORDT?C%j&LJ%5vzh)W>qw3PC%HeF at c8lNA+hmGrwE#FK=S*XmBrJNd+iy9`-kRQR
zaB<MUdbHu6bIV8KlYX>t4*-eo|8)6=H<de3F&x8TIbJKIuz)1iT=Mq6(Ix*QG;q_y
zaB0nA*hbJz?8lq!692ZmRG1w>?HE!->$Bf*{^aFkj^<Mn at lc^YQEw65JTb}SslDYd
zZ<o~%Rf?FS$hqSgI!MfEo>$C!K++Cz8>Ug)`e at 7fW;G<y)<}zjhS9 at CRqfGW*xHao
z{e2_JkhS`d{AIX3kFiw<eJE{MYI?r&wMIHD>tOp>w>Ov)Hk;IS*K5djBg1yVBejlH
zFiiLK-XOZ&F!&}lWtFn-O&uoLgtH*hml~jDjDDIb#41`45<WqC)`X{X_7EQzsq^h+
zcWd9c=!?_PEqkt)idFEqYMf&)x2$PZ&qG{sJ9}w!^Vds`268F<k81X)`y(38H#tA*
zOmvtCuL|3KFmpxb4?hIZK7Fduz)AOpvnTbHy>2Br!K<R1EFBuwW(<6)Dg7Pb*99oh
zk$Fp{J{DG39x+O!nNm=GmS{LH at jW|%`8`2s?ZeWcu-+#Xuc88`!r#5?-P?Ppg;gQD
z*caLNl at y>RgfzNW6BR-4Xw#9n|A?+_Frc!kik51W3Jvd95V9&rOkXkP9ILR;c~Dz>
zenTr0IA@(c at Gj~{?et#iE7o_P%xX>W-X$X5dQ=*8!XgUrSw=@cCWgGDjhahge*e+G
zAS6ZeT_Q~kn at pg!P9kE+h!#gz<3lpBuCB!)?!AN}W-aZ)J at 3wEM-Y)i)ISM6$Mne2
zXkuAe*>!heh~hx9TFyjTi=p?0hW%n0QIHh{VK_EFC2wZKb^^bfa+y>@t_ti+`&?V&
zAv32lF%DMFmdyARXYXr?*UEOb-l=J|9UTPW%hmH`Z01_G`D~_IJo7pTYPQKKa~Bs~
z2e~p|c4*<<EYN6dAucAS#_G+e(>>+CAne4h`wwV=HN;WdC?Y at B(B2QW;apE{Q at _^W
zqCTibQU0lI^~l at rQ-6NTFMLVjnvRZ`fq|`-Q|%mZNo=QU7dt11nG5%GJB({xjpUCK
zBqY7servI+V_*<6VX3iiiA%3v#qO252n-iF68)J2j+!*6ivIfb$>sZRZy`UPDpX>%
zEJ8rcR3Wve?kf_9GnIZkOGz-Mkt+%QG+j;DHl4H<RzT&qhq%G`HZZn=5K;h!9IyWF
zo|ZPTVI=MPBU&m#$*8J(<!7SuRq+mqNe_$gwVq_cDn`%0meRi>CwU^D4y*I77Hw8a
zXF5(sfFz5beHOd8 at xuTe!Cuh#<GhU}m~-pu{?WQ4^vgboS!AWE<&du81Al|oZX!qj
z53OfKDK!Sl(myTxcYpOqH&SIkr=gO?*8dH$mSyg^r(lMgYTrO{q+9bUQ_zeV$E`l`
zi90#=ByEv3JxgIkE8K%i<o&_>=ZtEY$b3I8lq6K?$c-^I$1&87q2M=3&Yx>1R+&^_
zmO9u~Lm!rI**<cZ%>DcHG%fdm&vXOHKI~h(c2~ODa&g<9TJQO~LbVBtGB`0YM-QAn
zbCa-gq`VdPFIoj~=q-jS=;cL@**jxVx{RPNf>bWKDagoeEi;PB+M;9(4Txnq#s8!K
zl5oRTGSC`Pm at IFQSSH3ehmw|3UdD3(KTY$sMWhegLsQ038ylwZ!`|J^*555Q=4s>t
z79AwTlu+rz(FJC>^$@q_O4j6%Am%=Ry*XkUP@;_QuhnW|Vaz{61f4#_5TjB at v;|to
zwT;?wgldoa{g+(SZ;M_+8v8ve|1x5KV72f;K=>Pc7Vj!vQ7wJ*RXe&`XFHGWzbP(0
zQ0_p(RsrMETc1DCM3pV34l{&fD<~XTCNwyW1TqZq7;t!wnrADMJts?BcW0!b#Ha#v
zjFk5vzn<DnZ8+1Xc($&3iGl+LWJLU2^&AY0-;SrDCQJ(YD%B^eB60oB9`}d7BhiTr
zgO0w@)e%qgD|ERbPT?(ozfqc%)wkls^7KA!nS~+7>HrF!U?!a2ira=aIyvT5+F9tj
zxnpOdW`7p?k7AJl#Y4F#9=bmrOF#0kdXQSVOxY`l8R<Ktj%5>3FRRu>BHN<g5G;gt
z%wFwGGBH;RMjMUs^fO7KXQ=-rNBjuR^g at 2OrJ<n+r6}W&(a2TXWj|E?{qF3{b^i8j
zZVkgi#!&5;E_^GuvL}aH?qJ#{uv_5V2L)~8rpwf{G*f@)C)IbGq at VnJh!i*=P5Wz+
zxU{S2FF6?biEsilt at ie-YZ1=ph1+)}%&5icpTFj*J at 2%;ZbVT=8sRi|7il|(yn}O~
zs>y&{^q#;^?c6 at _A&8W$+CX7%==Wys(418x`(LP$4<;_N8p`T|B&Vk6%Q;37r+}(M
zkA__g+LkKjp>Q9U%cST9L~w5Yg)@cir2jVoq at 9qd>uPSJM8R42 at a&?1tuFU=kX4*F
z7fZX{;q9UehQc=@I$RFq4*8JGPL}fLP(7KwC+0)Gg9y5r0VT3?%Y<BZK`LM}bdrLx
zwK?S|Rly$|7Qj~*n5 at RXP}x*LwB0fENh3Jzt2y(`YL|<Lmn~DfqfW_xrA8oEF(4~E
zQ?VFBnde50K3!(wc3e784)3eoXc3|!<jYjCV{}XdCXEzvyq<Iy+cpFILONYxWGGt!
zu at A?;qcB{rYHP&ib0ZY|*tF#riRXbf7=BN at 9f%DUJrQne2Y-sMU9!I(&FR!JXn0MG
z-(A}gBesU5qZ%7?@i=C`)iv<fDu0a0!L;~-$*_wzTI%r77lg91Lp+yoCQfh^r=!Oo
zO|;&iX9?u0XqO0gD|w~l)Bm+U{!1SP=DU3sTU5EZxmkb_AbGPQYO=?RjJXq%VW;0W
zlc<`%e`nx3cPd1x5xleTuAV<w=0Ms-8gr35VTN<Oi;)BT4i?D#D`5bm4r!c!)G^wu
zNgUj8ppf1BUP$ooxMguMb1V!I9mBA^7YOJOr$OBq0|OR^++4OuuvIsDgGez$@Pc1~
zLXL(JE{G`LEltgG8qcLBH=x;fJmMchE0+=t?!>ULFq1|-P4m~<j4$XSWk(#Xx-Rr9
zwFn+Ru3Q8ZwH(H at Y`p-#qs at B}u<TDn>qrD8c(?Ug?KgkXY7^;f)6L2i5T|4&qYhc^
zkGRjqrgNI>)De2QY-kI*FWEg-eMbln!@WiV{aiPAfC$i9l*r{q-vd$Oi}MzTD6I64
zAoCfk>t-Y#S947OCj#%(dw-$`^=Aw)?s0eivO1gOpC|8sm1pRqSx)@%58u+$yJu&U
zZ9gyA^TT02rIoKW{TDA`dTUx~Yivl24l6x9U3JY%!Nr#c19?FH64%T502rOj#V)5R
zq4Gfg!)KJ^0*ww?cRR<njK*fIXV8*$XSPCg58#3iHmePM6a+{ci*1WeI|Xl%wm9#;
zG2qZ%sXflU!`IH#hc>Zuazc0TN?Z<t<DEYmzl6}_PKApYUY+#FY5s&{_4S>O6rt{r
z2TYjbH&%|SBtQNar1_tK*Ae9S3b6tA*>DzgM&5c55D=`NLWgP=?Q8TZf7IstHR)Bl
z<jx#U4Ng=^U^HywjYz+J5Jm!oi-+fed7h1(y$5zaKoJmms=e9N&>-!yJlMjLOCte{
z2 at J&I14adA?k;H%bZ0wD_~;#jmdhjxvC=<meLh1VF$x~mclxWw|BHVAqfZjMYmV9N
zlHe&=Fb2$;vz1X%AreR5xxEz-c-EYd3qlF``1oLU%*Lq~2E?ixT-%3ZloR;Rpe3IH
zmTgA76n|wC$XhoaKs{f=a6fLn2Qx-T00;c122CC#Q~YfVUaS5lKRQN&v5lBn`1A&B
zcV#n1f3#-L*pxeLfXF<)b<LmI4Z*y|w$vxU_OQgKa at CMW&CA&&%}ny>Bx;ZY0px{*
z<nROlBc?f;`AgfF*fHVX_U-2X`2QFk6Ed at K?bymP(F~_;)e&BDSw94oZ<SaZZ|sb{
z#3*3&^NmNSH0sdvPgQcKN(K+*A?TtZV at hzNffEKVdsc-mL86*p-txW(_{TZIglUe9
z{^B$)l=3dVbs2W!zbFFwG3*!IJXanYm5SKkv}d|&md$eiA?^BKy9lPdK=|!G?k at Rz
z*`V)Pz<knmOwEER#l#`E0!#nMQ2fgp{dY~&>JOT3jY_ml9H>W at br=S4 at Bj$3`~N>j
z{lAr)^+7$u!}$NS0{^YL+&ua$$xIT2k=$XNH=KJePUMRpuTuVRUFHY+ZRLR>4ZqHJ
zv=~Vhz8cAshoP#p@=r;gsoLS#PP}7JdH63X&i|^rInSG7RdVeeby|`RN~F)ncz_s=
zRuRv=XJwzH|3&ZkU)s;+__B_6X{bsfJw{7IBK_(Krl5ZjsP_i%*}t{hpWP=-qhfc5
z5jbETBf;=9Fh$C!awXlr_xPzNM`KRT{C>1-A+wIIuH at Snnq}+>ljQ&Y+mXv-?&6r|
z^mTPjar07_?)~fP{uND~j+hm!X=7xz4?`nG{;fOGn at Mt&FfuE^Kh;(LEoSXs9l%I)
zSF`E<{R_&H=PtOkf$wOEF_Zm|V!@CWJK^6y8~Fb}TloKM4i<EAO+E!!nBAM1nR&xh
z%&v18*4%ED`LM^ar$5WLy}cH<qL;^FD1$Oyb^Z=N#ZZet==^0SSJ-%T%WP)^w-vFJ
zC0_AexwoUazq77ki}?dbPl2<CxiitlRTNp)IlYmTZY at F#v~{c5qgYGnEfpLq8D}NO
zpie>52mL_}lV5n|l)QqTgs$>njn$>YgiB1x3TzbczdT}O`%=XDm4Z?Xs6eYXJw1OP
z@$8J0+CwF;vXXL4#7FhP|Lm#|xTzIIz~)<9xX+G8P1kp#Bg0#{*6&J0on4Q6!|a}#
z+W(Nz$mJvI{P^xucjO+Bgv!)!Tj$_B(=exlkJr7gXx?|TM>I$1SA6pjWMknER>53U
zfw?((qL_raxx~Xb#qLJ-&Jl^2=AqeI4#7*>%T^!UN6V|NZ-+^qLE(7Jf;=hW;*v~%
z8>sWhQqkRK6zw6N&WA{?iFZEm(EF8I<Nisi+R6CJA5=KxBwj#n^GnKjIn+<De37^*
zQ`LAiq}7A(O<uWP{8H703&v&p?{VdPI$*=*vX|^MieI{X5K?H03G{o~V``6{TjIQE
zYj%HCs~Pd|iz196>2=JJp4bnO?X#b(>;)~K#>VqK5u&yPuOuZVXL+DIF$^>;)a9k+
z2Xc~!9a%P{0}Cx~%RGSBZoHVT;}=q;N36x?7$)9tdiypo=rz)-2}qcl$J1p>-oAAR
z$zEOpyAP8j<x>VT3-TwSsOef&-HT|Lid``XY at 7f7p`a;Vdb8|5{x5)(w00$Rqv1`5
zQ=Kn{SmN_~WJ#0AAAUPg8%qsdjA&E(xewoIa&#anoafkqH`Y{~KhkV)e^*^S*gxr^
z^^Ya>FqL}|0B2!Tax=u;f%~|Rpy#jjVysImEeA~+u?)?>v=-r;Ct*4GGrIH5y|0E8
zwk-v8*{}|_efx7Z$JLNwmhmiz)KCfc6YFBw<HH)SnQ`h~t%g}hL4Ku at 1GsHI;3(3f
z5!r={eaohmzV!I#{^ObmSJ1xQ)}`I_FTP^sm4iY4+2(Y!XF^}$;T95Fh53dv+7aaY
zwvrBf`*sfg*fGyJiF2eB{Mlzz4WpOzQn6}9f5q)BJs)@I&W&DxsW}(XaISs$x=ZH1
z*@&6b_Ni(D;-i(E?t0g-b>0-q*^K)hYu|58lRY>K>VT?~qLlsZtJDCxtTKVJ<(x{Y
zp#<Z17H}?(vg|aB(?p*0m3Pj_E~|HWF4(Jm>=A9$ek^0h;#MqN>1^}RJh(LT(d$iv
z{;`y2I~i{4tD``YPm|r@%s!4Pc^^iABK#2oPJ*=e()Th|m%X>sA9$p46}K^|ey;h!
z`19ASs8M;$t`{QAa8+PVAh6(;!r=H at 0`ER`-Y{2m=*zDIZ`KcABQa|q`n||s&EN-3
zKQH{eE>-a~*<)V(eUdCJQ{aG{GFR%W-*|lrbmz3<9zHa&Cj|0>CSNfU{#CNW+h5JR
zqEdoUN<b0QN*J%e;GC;WqXw7H=U@%jjYUCht`{YTi+c|)1T`}MLg%UCIa%H5gXW)g
zqYp&KXSa2(1fvMtcD%U?FK76gBLw(h3wE*RI!jMr#C0nIGUWPu(?90}FN=L{jI^SQ
z<DSHtk`79H>K_<cTK6?%ZNF at Kp=P`sRQuo=fh%&ZQHi{EC~k7i6Tl0AhcyxSPs~yi
zd#Dsv(tWXSpANYc#8wR`E0ll9Dy1*brvC$42j!Uqr$RO8_8RjH54HISlnf(oT+CLk
zwIKp|oMTry+sDN%sk)cO9wHszyy6te=e*|m-Mh`2^ZN4oOQ~PJj at srbZeLb4Hmn3%
z at p~w}yI~}*cy0a5FPFc8Vk7q67mZ9|*||CRj(*?TqY>e>=>kY$m&h9W!#~VG6Pd^_
zfMN>Y6GQ&L`@HWJt^J`nXc)quU*7&msnN%ShPI&H$Vk{=Ev&1HaJF0_a({Z-O4=7Y
zQ?MbXHL&z0`xz?ilEd9|_?fgnc14*YZ)?0yCv~IJORg8~KWSC++F;V9N%G%g@?WNA
zU~;po{?<+jv3;peq_M_5=H45x(y9DOon}<2T54;Xp6+FInsYFZxR-8SuDQ%lff4>I
zMf1Biz8z60-Jkw7nX0J2RGtsfHuu4nCx7JHw7_8Z1-7Bg%gdTmMm>~KMbS~g278$X
z2yrP^H?q_difii<>R?CzZrG9fZmRQJAf`DJR{IBHX<xZ%`I^@tih#Fe7LG3yHR85<
zpEhRH9O<>)X8E;v at Z?l!qCd5T+B*R9jg0&EL~8f*If>ryn8x%c_9VDT2WNvRI<y?r
z5k9LgQk3%KPOwgNEw|bf1zmgzEnFG@@P^3<QBD*!Y0mS-^TsMJk2QC)3^{b-3zKa;
z+)AgT_zb;0fFC^4;~ml{cOy<Qbn|NGX-d9s+}52nOiQECp6m_hdXsWZ!wXfs5>+0S
zJ*l4{1O!-Mb5pc&S2Q6nV})i{$<shIL!U_GaZRQ?lKjNQdNU}aTCL-Fk4dZ_cPsk4
zD~Y}D`3g*q4WBiSh2W_<e<n9q-{x;batiXt6ze`O2}&|Q)2TJjRkG-J0_+Qi*Zmfd
zac8;O*u!<FjNM6?Xu;eHfNpoW&O5JgLU&J=!N(#-S^Mh8`C(0t<cOukP9^@1v)h+>
z?779&6wA?i(|IfP?Xf%mhrREPYO3q{ynu*EQ$c!B5fJIpJBWbvCcXC(s`QQxL at 5da
z(vc3KLqab~6X_5L5Q++f8hQ_9E<W$`z0dcq`DbR$KeJ}CvQ{qPo^$uvd!Jo?XP=Wb
zr%1_$>~`Ec?>;6v=|YDm at a145t+3^uke~)?!J;`91?q&5F`qUfi)>S&Sz at l`jWzA)
z`WQ!{@W?sqad%MP{jMz+#snup<|l_{qc;x1Czz#HQ9}hz#S!vX5~J6HirrSjh7l1$
zaxe+Tdp9zyw at X~&tUFJ%P=W;5r&P4WRlf}9Ufv88S*wpLA+PX4JT`9>*Qft4w`V57
zcQtEAF*Kr+BuADk*qhF(ynib at M~^HxnCaV(j_M4x=Rn&m5@>FrWnJu<9TuhD3qbg&
zT2FSc(qgPDr(Qb>89F}Q=aj6E9phrIbjfzUE<}A(k1c+m+EWqd^|1X=_oD{}1ia&V
zL|_-zW}ScyxoDoWLZGv<EymSCB?YXerR>s#B6DmzNbdYdOm|GIl9$JEEf0(497<mm
z%K7=0u*;c)&DMG)IRN7P`@a8nzB3T{4#(^H!-FW%ScX9d)fRp>!K)GD6(1!^Ho6S-
zR6E3&+<**KURcf5EO{XSYCl#|`vukhy!F$$xInO0VrmNS{fK*Zxbj;1GqEq3+j)yO
zuNZdrcga%F`-i1wd`{L8F6iKUBb!X{G=>l?|8A%GVJ75r<NatOnv=jbx&S<$Mkd}=
z=))<gL|`tHys(wnrht^p*B+X>XLu7)clS+<I`aaA66Hn|tZvcmK8h}5*`?sW!gP&r
ziF`C4!?vz>pxR5&BdX?sv01mivB|iiDBG-S_HZC1G=KObOfB!i%{Oqq>jH+V+(FXy
z`_+oKvhD;7d|5wKTa=o}>XC~1Hqo*1#uG;rWsEI>*}`pV9Bm8*qli<^4x|#l2vU(Q
z?Tg=mm{- at --bvN%6Nx`mujwY1 at eo_|4VM)Zs9x>~2trdkVmsku?Y}>^s-&n^ZiZJR
z(1h>Lu(xzq1qrkGJdTPjzcm;xwb-a6G`m17>+>|i2x(F)yAe_4i97brkqtRB#2_xL
zFhx6LXETR%CUlpaC>6%m#}$$T=!VtBi2 at pvzmt$(gdOqLK!f7K#gzEuLRkalRXNGk
zwKYrL?<#S{s9$Q^5(Qgnr>a>K&My;IDlEzx83Tfe66fjURE(HM?$LeR=Ff;ca9W0n
z-}&yXU&~JRiE7gG_!c8C6Wj+H&tHn;uo74OaFv7?fy|k;&@_*FUVWj*Npz3Js$nOx
zl6w+RJ;t5ZtxLmAd<iY?Nj!?fx4RW>`LOu2R|;`{-BK0HXFu9 at g|t+i>JkBhoSo0w
zAud-fPPg0Q#@?vZGX3f|>hD#wsg7jeFI<gDma$9|os6|lna_-88|W{d^iZw#iFA2)
zZu_nHN^CE_zCysy{RzvBO~ufQJ9hMtAcq7Abh$THXCvn5RfR~NU<ZF^^)|vUe7?7L
zUN6~dI%vKxSDbkej--k|3hAr~*s6-deEuEe2Y*h at qo1PrOf)KKalO+%H9j-+b0NPD
zQ at 1NwH?b#&xZ7IEaEVLRd2Dyzc3~#hm|m40iB6qVM*FKCp>6sfA#<NLUlATkdZf@;
zo4#V;oL8<N9HX-+EKjW7$k%NzRM}-ESd^0Ddgp&e`h6Vf3T3kn%rV{P^wbKRl`pOO
z>hQv0MfuThz at nkqsAbcBy!sR7s6xJfR;P-dD|^Q at Ziq)dRiXt$=>2FON_gP#`_eJ9
zCaM*@IFV%UfKk0Ka0cLN_xITCSOYMW)Q#dpx!mA_6u0$cK|rt|t<e<Uqvo{y3|Kmc
zQMydugPEsjiN6!piqWkO>M$pvSMnKAW5QtWp=KMXNHB$Jv?OCowTL7q!Ym9<nUXb2
zCBDg;F;DLTO2*cPKW at GI`Z+RbB7_oe=$0E$MQFg4A}}>IB|bDf8*|rxWIAEUM}S^I
zguc^`ChVQZ$4AzxLb}&e(o>!jh7Y^Mr~OKp%mp`(oGj!eBqaLbZ9P%I8_G#}|IP!E
zv)vT+Bd*uF-S6;(Gv$PFu^UK>({2*DCyd9tnjYaebS0jhKcXMpBXY=3I#`O4e^jMJ
z)vG;fbvvmT3pyEMbjh}=3(zGEp7AlQ9sS}Kid<*ps#P|182PpvZ%n|p(L+2<!&@PJ
zQB_ at pO(>BUzH|ldzfULzh;0XezHvns=>E+1jV{;jsGrU*`60tkDdgmKAMk%3TcV{z
z43w|f-cR)>wQY6FZ=tH><dJken9)v}hC>e<e7wABasoNQomzs4R)-#Z<#RZbC&lNZ
z>}r8>>Fj-){>Lt9I1WkzD5rUnHi7*?HG5I1hNzYpQZH}sFHk5E14FO at DaRbkRG%>L
z_8vXuuT)!aI7`#YOPa>3eR<UFs&i`A2UiMI&$;!9yB7THVm{`n at U0L#tSyK4AU?VW
zQF~e|)YJ+T4xWw*Q{QFn6g%|92ND&HY^rJgMkl_NeT at +S*2rhOsJ&x*2HmZa31`5Z
zk|fxJT(_}^!DVLjtzELgcVmI8cTyepCI!3VP_I`h&fae3_<Z|mH>gmoVGWE|JL6%V
z^i3h}@DyC{rV0C at 4dcT!^+|>&=5urM#AX?lN62E`ceXCGRfMmxb;HhykP0A66?lNE
zB)o6*K2ho*4dxs1vUq#D$|sWfewxT+?8|sZ;w(YhFy$Hf6l>-K|9&CSM%8%JLTYX!
zJl at 34??0#<5-HkwcoY-W6c#@(EavZMk6Y__*pc^svKdsKF2t#`drB&?yxBbw#69 at t
zeRffcxmk8vMOXj41=<25(NVJ9Hv`zrQ at V}NxPAUCN;myfRiL-5v~p=ueu20t$?YQa
zVB?}OQhab%GPLcK>-Y_}JzaG4ZkNR!nd$Tmb>G0{b)Q&a{`kAT$r<~T at r+gcMC+V)
zlRS~_8&(?(Y{>TCchONa<`GwE>FMjON4w at KQHjhiWZ+ZZ%-_6u<MIZ1_C;A+sW{HY
zxXStXSY#>qiF48FZc$wCI7g;N at Z%mA;}qS=NyhYLI4Q(*Jb|^g?096Up&<No^3((Q
z=o>KCC*1=F%LdMtDV$hU$;6K`GMj>aoXoV=qkRNkb3OtaVx{wvpUxU+8aG%7G^O~T
z>~K>fOA}?+eA`!BJmi|s-Nymm%vQWAxM1%&YahhFb}_$l*uvN9y1U<WokA_ at bijc(
z#NK9IV;qTk&y{AIUPVXST&j}9?KmNAb;_-DB1tKf-z7A0#@M^l$Sx=tbN^zn35Fk5
zIs76gF+ZACC+zHI=@o*p=^*_`*G|_W%PT&W7;2p`<hj|$TRCjWxWoVurd<WYZJTJ`
zqjfFxb=Pceo>{F+uQT*p57F7p>FV#JbM at +BBK{%npgQ(QVNx`-Vk<xB2wFRxxiXTc
z;2nFi at V;DoB1@~$*u^m4cxHn^- at U8cb=Pj0>lJ?wN~oWV4pZvpgsht at ALib*TaPwH
z7q&hDsNFPztHXnF at Ppf(idt=AcnQ1RN<w{ypvhSp7<B(|#1c6(z#~{w=sN+`6gaqB
z!FR@}2B9FT^)aO$gMGyJ$Gtn#WX)Z5gUrk7uxo8NQe202r at wf>gueZ=Yr_j*s0yRQ
zAiE!<x-9AW<dcU6Y~pP3s&_xbBfT#$)qXExU@*40zqU}z_fAV&XJm|M=|jFpm}lLe
z6sXKt at CD+7T|GUb6rUecB76p24A;N0Qgdhmbz4VY6xhZ?H0s8FeiF?t(I^mmNlU_6
z?E9Tb`fArpp2>kFF}${F$$--B$N;?e4RaX2&HiPL*N`;{wn%va1;lT{p84dF$lWen
zma<L+oaN-e16dOE72nj6R-oWsLF@|^B7na}D-Jy!OJPjkd7H^Q#XqyC`w^wtMsa8^
zw&jC at q|V9KOFpsDr0#?;<UZq%fEiWJ60Nxrmdr)5;G!bqk4Mc~JS(o{`uvG&4*C|I
zK8Un^u?*xKjv*?=Hq^3Q^fuh^RZG~*7FkcN4+aiN%WIeo5Bygl-pTKyOq|v=MNkKx
ze$Ayrh4l}E-YcBR;y2BpHxqr{aG{)6s1xTlbtCFUbUocPeOkL8UAQXWRu>~!S>lfX
zcxN{{l!v%xq_|Rlt>)$X_ at Ck62emg0Tbz=8OLnkYKw~y6 at gEPT&2kjwoCRaX-_(Pr
zI);r at fQpwObNWgrdv$Cg$haM6jQ~;DWXh#92ys{$QFY!|LXlC9(*@8CIzFO0etYFA
zIrO2~BiGZ}HQyr{dSm>$FYJ8#%Ofm;zEP>doEoz}CCx1xbV`>Br{8w!^^pQlzK#v#
zg6gF()miD3d<&To+Dy1DE`@22491V>Co4lo%mm?w#R(uVN~&@K(30&+2_?LgZ^aPm
zrvU?zfunYFX$32^I)OP2;}#@9G`5!ITW->JTZe&?w at EkW`-c*T8q}j7`^CmZZe<EN
zUkU3u<V&OXPeWu{tGV(Etj9x?M!wa|iqDa^l4TS?I&KX$X}d*;7iE@@Nsl-LIjvd*
zeM(C^F|!%OlTEMt5G3WB9$E;I>V38uwKSTasdVV28XQ9dj7Kjw6OGTKBbjQW)5w`~
zLke{g55JdHziRmH?>Glvlpo9A!#qQ#_18GCVAvpZEK2XYtk_A&d+t6C56*A3cMd at h
zNY^lYF(6JZPqix?pD00JUGv^_J#8pR$eQXO^RosE-wFzI6D+L84v)^`%I1$x89vAv
z^KbB+rOXTk$*JupY6Wt9J-R62D_e<na(a5Ik>!jUJP!!G>!yDy6`a&}Q7<Ir=IUju
zz`)+!n#VD^S;^U&s!cr_8LgGDvNXCvPtyuTcZ<h`v<l7CS#H#t&EM>i_7h&gCatC-
z)`V*rX!Wa)TLkj&*oT(iKOChtHFT?&z6&ae=5 at FpP^UM1yR at X_!7b1?eolD$1YA|w
zm8|Fs1bnVUwLQE=3SmLcDC$!XM%-5Nm(9xIV+RB>OWsa07Qn-iRhvzbPOiW5SnZSc
zoO}G2puHR^#wL0h>d`gy;|Zy;h~Jg3b<l`~AL8Rh at 3kb&O~!W@^&L|yZU^UmfBx*_
z#BL5pO7Bql9<tmc)L7GISR^x^s2Bb#=~MZxV|W(&_#LO>{`7`{+g at 4+s`2+k=H60S
zrQ76`2qdb)%gE8+1sjyNq{4B~?L<`3>dHD7(^jXB8Z3w^bN*?RxHN~OjfUIJW^QBK
zwqcJpktr*_s)^?|!OdsT%hC88nN}UlXCC|Nm^cVXWqX=tYn66vx^b}6YKg2&bWMGn
zKky7H at 7Nd=7ikp?oxPk>`%|+x7JN^l0ABC?j{WPTsmwI1sPuy8vLjV|`#a9D>N7;&
zZ)cWG6~JNB=cMvA*$umr0WL(*FZ)`P8vMJhW8A$8X81jq-WKM}THa+ at r_K?Mazvn(
z^a40mT^e##`d>ka4ROE+mBs?@rFysxGl=YM%@8TZD+F%P$`yql6!sHFMu>!Qt%PJ9
zncmgzG5G8-%Y&D<VFHqf2ve3*Gjp?{Nbs4MZ*Pr!_O9dJB$;&>iJp}?D9HAb4{~yB
zstl$ay at o}MOk_)(T}XmsvQW7TTme79mohcZoy$*9FTPy^Kr+Br*ewO%+Mg at n6ECjJ
zUsqYLZvwb~U9v<0H~zYMV0k6%uPYfs=KtU2|0BGVA=T42UtR1)7;*VjU$+^{FXyTK
z3MX=Ggwy>|23(mtjY;idhPrvh2(b`DqE1(1oYxWM`G>G#<!&Ayr<{-WcWX_bqF^(B
zZhv|uOvXnY$D&{N&HEWR?zPy-2-D+h5=8Zw$5UmP%hQShnR~#MDo=Wxx>4M==)>9%
zDDGU$l<S|?_ra%$<I3Q+x%@AE(I|K|3<`xB&0JM!7lZLLS?d3jB%3NZ+_t1065rL;
zPS0Xdv-DG(mIfoig25Fhs7gz6lBhF8_N+_ at R&VmWv$#|(-I_lxcMI{^hzFUES at P>w
zGHse-)lkP)7?=*ZFL9Yl_-c1U<J%)v=h<`v>vh}7C&%yhPun%84Zkwh_ijM@?HoX3
z*Ss*c_2Fza`4SvVE at tV&ui)?}fjX$BhOBd;R3RqmqWAi4c}z=V_>y(rhHN?mD*M~C
z>5YE6WD@)XE<Kb$OPW?I)DTtxd6wRQIk6+rC}F<$qt{<!?X3jal-KrjPp*%iE)%lH
zbANmH^ttKffSXNYm86<JmCxn%!jWb3V*U+!{k4n^R+goayJ%B#7DuPPypvq(AnkVe
zivQgKzDtH at E#S2ko$HNF1iSkdrcCLn*_`yzZ6G}wk){~rR;i~bW`1u`-S)zuxwsO3
zvY>fSPB*iKGgIf*uOaljes>M;cnV5NU6 at 1e3B1T91Uy}ERJ3$6jaO*Vv3KQI5LRnL
z$0dRv#+JHB(`bttK!_P`{@{D?W1g?Z$1+=|0O~n`?t#*7xS8op=ze!`Lt4j?L7IKi
z%iMZ@*?aAlMUEwP-|sIxHi7l~KoFT;Kd*bn{4r|bw at 3l~vCw_50jB5iYq??t^a==(
zH?ok@(b`8>2#B0uXG3YtGiN at 8GK{G8G(2bRR4C;6_30?FGBg}5DAB4s220162q`uE
zmMy{5Zm=6%`<ztoQKH&^QE}G42GTM5+4_~xVT#|5Q)*d;&y-oT?G+2lfo-GGJ}d%-
zf^N$^2&Ln)9rh<VJSeX9HTe3pk`51K>Yda$5+I^HWBO+VmUbUSLeQ&E{Y*D+exJ<Q
z=Y}41J_0?B3urhgCv^+e=DP%~)%s(CiK$As1oa~rW-IYU!s945%tsx{qY`L+Za+t%
z_CGItooHxpHAv+~#ax*-LUtGc23ej>cKi*&VCku8LvFZ_o0L!;UP)o?q=;RTtB5J`
zQn=2yS!jT=6Ia{gupn(16;JVjNg`PXn~Q?;;+|!#QNf at oqI1gAP%(2R<td}?e6L7!
zolyaVr?}-jTixz+gMsOqa*Mrr4AT%a7MVNa%K?i)9u_ccTEUOO1Az at QtA9zM0|p>G
zt5%p5PUha2wHIn{wLe%tD5 at 6P{a!rJHn?JSCZ8^z-0q=D*m%7jg9%U-a`MjR>OEIq
zwF+)_(m>h-&Gw)x7ci7(DW8qHD1JUppNH+hglT2R^C<Ci=%x)m%AYdWnR6F45AEi*
z&pYuRjxiXpuebae+*87<VLaZw9#52DDOfh`45_?v&jF^r^8A5<-W|)sqfVjz`)r1*
zZa(K9jDv?CEqaaRjFJwD2k*=NAlTH6hM9V;+ZT9W(@Ye~goNB#qs1jZ(@&QxnNNz}
zjMvW<LLzF}Tcp0Oz7*rJC*+PXM|`%GeU<!6Z^<3b%7W<e8GyL4WbTgPgZ+>?j40qx
zu2OSLe7_-+IsWQXr_wiaGJ2FHy<D#c`vSanjc>9-xBijpo92@{$5Svd{`?c#2p?Uf
zG1%-dg&Mk=GTLBZUVic(CT6Gut<-!0>e!oRCjq$<^hVoNp&CJFC*XnOp2Dlj)-F=L
zj!Pp7uNWZ$3QS^tjoG4(A#pWX=y*~llR?;`)FX at +bY61jghw3zae<&+%lA<y>HWcw
z;tI<?OQX3SI}LT0vPzm^HYKSDcy73Lr-SE|=*RnNE7|i8z98 at kh{;`G^>4(Ir=C|$
zhWz at VszV3madIM$`LerQOe^VrUDZx39q-Y<$3=`RGeW*TgV5ut^#-<lMs^fG)YU~6
zhdw-eaC?2KQsF#?m7f>#srJf-ZLJj{ARhE)b4a;Dyiz)pkX{BHNY;}C6JVKoHO-53
zDOXizVW7wQtY+;9)K3?38rJO67}1cYEfP(4*h`@B9DgT7rY*iY3Y%=G2-rGQLw;B`
z#(e2kBI!oyL<uqZ(qs77Z&c|a8`jN#Qbd*91)TS7mkZ~;)Yk-lK4xgINMTTj5S at z{
z`bn+V9jo%kWJXq={US(T4cd|+tJ1YEV2on9*ix$zeH~wv;~L-e4C<npbWPyBubMz6
zq%j`XOnlr%LAY;gReLw<R&}VpfHZ$ja<cy}<mRy=!PwYX-o}O*Ni3G4s?X1q5MNMA
zqHtrw)%%dtX`1SjCk5qj)ExAe?EG=_t5>uPhYxu(?<$)Sa{N4W@)9{nvGfndd6P3<
z&<C-T%5B at 4@w?+2I8i=y+GOWk+ni0)s{g8a1}&txNH)b8R&{H<uP at 3DEw?>Se*HvX
z8dbU>o2f at JG83>%4L69r3o<sWG<N~F?K}WWwz at P$uMj~#SOA))Kfe($)FB#uM}_c!
zUcaFK0LM$0J0dWaCdWPPAk+l5zhCTI*c+px#>E_#Hnm=15VlQQ&^98LQg+S7hq|9l
zG?uiue*MOV$UYwu;I+MP-as=Z9;Gbsc<wQy+)~AwUjC5wh>AwF+>HcDVEX7%`9GS)
zn0imN%IUHZ1X}B3P at xTiz02^ir0Wsw0mnOeTE8mHj2d)mAXd5wPU7hykFWb-3|`$1
z)wgOWLEZ|HZ`uw-%`ng-FySiOODx4^&0jwRnf43KHRh@$r3f-A$F!rHO}8;qy1^>G
zQ*TGISca-0a at azT+lMe=8^76^Tuk^`^S0xlql<$RGAeKKrg`9LVDpQt0OM8i!E!f!
z1MMtvA7W)|3Ko!Sn(vf30h6J{dG!}6aE%CcX6+Ko=rrkdI~p}+Tf)L`XNFY7hQ@{p
ztD-Q`eKTJ at 8r-_0FPsXgP@W%-S$U(|lD at sQa49q`km1 at JFu)}8nrHj)*_W7K#TrZW
zEz*gl!;>$EAG-!NGLkF(f?W+`mkuT4o|^OBbQ*`~v&uKI+Ff6~?vF9RTict<ovh-J
z5}bTvO_KZ=9v~=yU<)m+<dC}M&N7sKkP;q#b*vz$w1~rl>Dz}|$!3!MeMfV;v`9Nr
z!1(HIx(ez8 at 7!8(?^F`ZyUs7;f!FgBXaEKKtMg}dYm4e(;7Hr_o>}4iEEZ$HP13{q
zJ1C{)A204$)}mKG?}n?X<GkQ|?DBY at lnH?}-j-UT^)g(%1yJVn(>zuw0C-)7Upfc(
z at d15{X@}-s)cZ7{8n>6J!y_;S%6edl8_Gnfz at 62{<S(ON69e!T4f1%e)tm+9O|G1!
z#{V`Y=RYS4e{3fH9G<<AZ}8JwUn$;P2d^!k6rUMgQCFeC#V$L6G0U{VF}^S2Ok+w#
zcav(Y!gj$#rB?sr(St^Zk(!wky7q0yn%Se(jvnmWveyEB!rRSVKAG7ZmT#DE_D8Y7
z$0VqSl<(7rrf1^_8czlLihOW5Y~pduwT`d9^Uf5Qm>4P3DwpPi`E at c$n?++tFWN7E
zQbR^7!2np6uwubJpj}FM<ar%P&rde$^BPCFwxW032RIzd@>Z>dk9eK|b)8e|6aZ^_
ztI5e{2;esvf|IZyWJ{=d-J94vMzo|NrTtk?5~-}=dL6|dFYXYGWAQtEMMBcwni&91
zipku*?W-j}uI#T*J|Kra1`SF<0E19*j2<EXD`C!GslqO!Eq?A)bcWP=f$LKKNgGqs
zOuWTqT^-Bf^L6sKa2E5fM(59D at C=7QmJ=Osen|eB_~e?XLwtZDUZl0Q+w1HioS)IM
zsR?mhI9c8ZW^iy}r8ym7C>+C4E*381L6^3nH=5=xs9C^Uh+eJmY}54CF8jq7O+p6o
z;~JCBPj()4+`R#~<_Wp^0H1^L4GQpS<M7(P(aROc^fUmGcm?<tRkL`!OsLti?k52&
zj=F059%Bf^f at Zg_XPICDd)olVKCPZPH}!jg`?^iKosFz^^(_?ZQy-ykdHA%;i%@)k
z^9E^tGa_J9rZK?{lTR68_wxExdjaw)De2;;BKO at kU3&LWPpDTm9co^?ku=N*KDbbQ
z%0Z(yRdLk^Beh0jFl-S-VfCs at j>9PO2}LDB*-L)DmhSf;O-3v$L0B{c=`XX6TNYxH
z1ecQKyOb<FE<^d?BcooA0E-{Xce*Xsy%Mo+ZLh!j7Dq`h<(!Ey2=9F3sa?U|W(@65
zWd!unpLNMTi(wupd9O~fN-Y*4JV_bqZX!4i&IZ at Z(9Ah)7q%wbg(NYDlaX5MM7;M=
z>+^F4P1yGYmIcWAmUze at _fJpKN#dA8$|wbjt(fAq4HrSd{J9GrE*YXgmrZ%U6%e5l
zn$c9;EVR>3S(=8w6{E$}E<VGwxQ`s91dg^3O~6ZW?)c(dCi(D;I3l3EJqaUSsGpw5
z)=tnH3HLlGhpHR03y;1_DkHx8ElOpKw48rKYl;4bnU{&uDDQZHR)I$5XuW5pSm`Jg
zs!F41+8wBaO*I|kScKy%+*hlof1Hym&vxCHID%ngPEXe~({kTxDdBx-cix9f+1li!
z72L2l%I)wMoS7)>$_A$|V=CwipC?!Y4pdvEYydH~kwG7Db#T81u(02Hb~r<ct>C59
zHqzrApa6VI`GBT1HBtccZ3y8aY_MT at iAPwhJ*WpXp^V*H`eRG$`YxvF4xT0-cWgX=
zJSL;rH1#&&MzJ{YPj9uHSV{O9Ec>2k%}QHeC<R-Vj2#Fn<pf@*1YApnsF;D0VzDwI
z^OHs=?;ndzKUP+Zl{VW!XRkZQ6 at k%PIg(FWhf9nHO>GN~&ujllGO8?-%S>Sh$TG_U
zxGs|Iaf6j9c{P3NOH=XZFso$T>1k-fr_Dt{pk|hN6BJF&^w?INIsfimdA;no5~4T}
zwJ*^RC73?>*63q|Q*^#HupaAI!TKNJR{Vko@$-Wl&>RK%`OCqh`TGa^9#BNuVIa<^
zl|$Z3 at l_;zG6Np;jHdj;3+$J#50^|ayauuR!KS|}-~G`at|L)B+tgx2Wh}m!nlb`z
zG3a8fS*;me{!$DcF}ZIbB$d+}!(pulg-^1~Azps_g|BuTJ{B}AwWZuxV2Fd)R*FFX
zz7iJcDaBWv^(L86vQ9Vim!vH+1D8RLYuPD0K at X}i4)t_?Omx}u#2Yql>6M20J4CIk
zv?~aCR&=r;U+rQEcI>^Mc7~WMzI^n-eV5t?$c~cke9a{h#c at q;u-fVP8o=Cg at Z`wX
zcRHWX5+<ArXDR;aS1u+dhFD9lb-aiYOX1Fo9_U2~ZO(-IH8zpHI{wxo>+R)L2pKZ)
z7O4f?&3xAg0WhBnD=oQ?C*$}SMuV3+{lh1~-b}w-wbjkSuf)F{rA9}hGX%J=)%cI%
zwGn?Uvu0 at JY#gUppjI|=PdiVpcgD*?Xa(R;ANWYJ(j~=0^h-zF6f|E$tVsV5E1akW
z*{@BYs9Y2WY9ubogwKw5a}woceiOO$tsSsL93(dhbLYXB{eQTQ)G54a_9d5HaA_=R
z`10g~Z;{~(hZvkJTiJvY%6#B5voqF;yc#yL`mCUxWZm;r(|_1jT#!2x=cjIj#ShQk
zU$e%dW1`2}_Jg-Yfa!-W+_Tr(OrS<CaGee!FJiSb^}}Xk$Rs`XkN=O4o|=F`r>fdi
zrD_{vAXYJd$fasIn0VMoLaSlKD?G;xaB-}dIX$ZtE_A=2JrpGK3d26?Pv^>U!|Y>C
z_AI&sxt6-&gkXC1fL>2TfO*rRaWUg%WFU#r;h0~JO3wT|?IC`@=D at 9oW(~O~XdnMq
zyYHUdOCbvwn>ESwb7|x$Xra~E>B4IRlZ+FM%PAT5l6?};jH}_ze@~N-71ecFtH3n3
z-M2le2sEPNSM5<Lg`Oq5c}Wk~$7m^cLol1^3BT|f=KJc2Il{zBgHn+~;+Rk({ID at F
z_p=$u0b<t@*#ha~kk+4<!^GA+$(o$hGtJr^YX4$@gaNf4CZ*i8VDWicHVtaS&WxPj
z#9W&KO>b{c(i``UtM?3N_c>YHa+GU{<#x165^WTF!xydYH*zIoh>z6C^|#jH{sS{d
zST9>U-Ut_=$*b=`+{sUZuc|`4&I(Hp4hZPfox;hwzmnHw(l2JJlfH;&3sX0D9-sI$
z|2!3qrk7eD7g)>F8=EuQY&wzy!_NWJad&ud2j`I&^xUKi+oP+iThxF~bCujGJ;rMo
z#RbCIBi^VuZ{X;?6)IOR9OpKH8U_N(0wW{GCTL1vydgh#>oa#|Fa7;7gjs?;*WrU+
zB%dnZaHvWFf4FqFZYZSBfA}qNcgtUPb>7UW&s$IhTl`GdG^f|49pcc9HX-LXH+QC3
zrnjdcDQ1yk8Gr89a=SIfdenjcY8VM^no{Og$~Ayo)<|GsEV}DtucEX?iy=oAKZ0vC
zjEnh158d2=nzmp<j0qQ8i+FdKKASD0D=ycN;PJMdb@*O>kf?xi5t`W;k6Jtr8$P!5
z#Qz=OO|bq=a_y-+w&=$t)84reTnQuOp~_#N+0ZZO&4a^*V6b|`ah7>TBztq;{-}+5
zj;Wc`58-@*#4`!%0|(Zo+1L^uLH=J_7q8Uor>1V9)|o~T-%_Nk+_EtfXc9k~@z?eS
zWMaGC19_lj-s*cD&g7MXg2Y32UvvfO_!B<6UhmR=AkKPx!|e0O#1>w?iCv}}tY>VJ
zXRxC$eCl%&#A?=M1IElpQYZgat<HZ&`F`$kGEIM9pM%t=rdx{l1<Ebl6?T8^WpOp!
z(sBqf+x_wZy(IVUiICI?cf&2d+S@{m$ZDnDy}5kui*VGXCC=jYc?Nu at qHCJF4OkEn
zvgJ?CGLqeH6hx_4)Us4o at wQ&Mv`k#@K@=ZE(z9~?taAW5vAURYrQfsRB)-j^uHf1*
z5Jr3rK)wS3bY&HR8?8%o7_AMfBxuKSYezFF*dB0JyAlSG2l00n`;Zz_5)u-pl^xsA
zNB89ssFA|(a0PF_WHFM<`@F&X_MaOFUI_#L0$&rXV8;)Ia4Q;=b#=$=bc>4flmEu)
zjY)CtT;B7456Z914Wy-}f(KV;|JNIC at kIpu`cf3&>x0byU!(Y6U7XRp(c9Y#MjPOU
zItqC$1ZkNCZ{gzNqSb}b)bL-6KMONEJ5{W#tQ5po1tld*lapyc0XPwi at 9ovR{F(*+
z;~LKUx4;eg(UbnBAG9+kuXcl{yx|dGIq%nFsRY4>v6KFwN)3Kc8^3_}XGjL-gF(%k
z$9E+|&(lCjPQAE&{f&UMbh-Ut20Jw|B^EgvBM-dIKC;C=8J4R`*KT#rd~mP=!d2oQ
z<~EVj(`l4cRQta>iT+T51b3*S(ddOk?EAAd$L at PTM?U1tu4VblggS=;E-nz(k3PhL
z4|sR}CI0eZwBYqM;F8|dvXWubJsIZ$UBjHli2?=ySmy=Lx*W`u<~boyzw8`>*j*YV
z{OjhJz;l-na6m0qnLc0u)_w!f2H7=!58&j+m2qycim()iff^`8j&ny|i^7%*x9#^O
zEgU{K;5tNLn96_iKN=AHA80VOjq`I=+o0@=qd%qj?M8M{KbBZ~_#KyYqQ0I*W93s+
zb>UdkW at iO@YxPua%=>76vYCy2|LNw~A{)K9&sk;JG(DHPi2l;BriFR|cW%(xw?Zek
z80bz=tkinS=<@gZ>?>iOFYxOX@&(1{U>6}nM<H$&{xjIOk$v3X7kvUYo8!9UGtWv)
zpOuL-n(jUksI7B09%Rj2LF}{bOfs<ofDb*c49LnKMpwc*Ve@!xOBsrwZYVM}zQ6gf
zWbB>O;DLkwn#n<dLi<UbtET=bhp0>aVL+@;Is-B-cQzGNr12d3gDP$a+4qbGaYdLz
z1tI!xWBB(SwYr5QfpwkUlH5g6UDn{>r)Ba=CwiG<`wseYGI0o>U<)wNn at vSat+6@3
ztWP>QYN|X#8rdV8V>?<NH6JGKZ%;B}oKj}DLdKm2FvDfl!A_|u9uh6(u&cVhEsD0j
z*Z1S`fVP9jz*F!ykPP1g6?NBu;I6`Aqd}i*K+ehf<Jcdr=vx4H;kt9IlP7&lO+#HF
z7OcAYB91rZeO{U2R#F)=PH$$)J9TRttLqaYli)2^+{Bx8Sf)WOtL0_c{&fa&AyPKD
z5w!*blNxhKTHO5^HwNXClcFyyyAGv=1N4i2Tn`)_jcilt0n!<N2UqJMVis~eJo0Uf
zKKky_yXM0*+&QH==bH)u?cF6vX|=YOd`^Za$uXtCg7J{Uom at z?!bSN}V*kaLp(LL)
zaQ;PJ1K2 at nKyCt*R5%uJz at 0s}p(|qBVi`t6=H0mqB5uLsyjj-51 at Q{<B;IxVMl*F1
zy^+W+g at 9%xEw7?b>9TUWoay#!#K?(e<ABt&P3 at C1eS3TFV#}eRvoNWR>&x at G0PjO&
zvqwTQbH$I<Ztu{8gnQ?a9S&8y!Ntydbe0*`=Jz#_bq`Z<1IiG<RziTdL~&H~P6Kb@
zRLf9!%y9r-+eCepUOLZ1_7bxGgJxg0!k;^}=wF6<Zb-j-&Je$n;Wra+zq<(vix<SM
zS-n7IXAl%T^9MDG?9G1A-TO&w^wPD1RF8`x%PQ-Q139yki%0O6=S6<k{7VG0dRX}V
zq7`lvU)i7aZ){1<xyZiTY)^up8l^cjZyqNIa6$wXT4tPAjj?=vD!@d}VMAPeDYo?0
z_NK1UY|`OoG<2tFa$pxv%)?%cakZ4YZ)N at n+n~`+%LMUahnLG@#5Tth0wa0hRV$IK
zIdL`FiTM#H6&&{+<-z?jtMg^-V}hg|hn~fduOnjEOfsdBoop${yED$cqLNuI{UIsN
z&<%g*s}({zo3C&%VyGN4>^C&kx05aB*oT{3xzbcX7(+Pl0W at P(lsFb1Hvv0hAg4jk
z?aCFV*}XNRZf1T1x&*cpWfwJY-W+ at h|IK4MQdBKDH73Hs?tF at M&QzcA&z at ps-txl)
zXhMy&(icPAZ1)+X^EadzukWuQnh8zo=hcafHs<IB at ZuB`hat?gpRcXT at h@{gnRH!{
zX?pwzER-jb%0vKLL=;e3vi-5lTXHziuCe?G8Jbh=O%Rr`08~`<(Bn9$XGY`O7 at 298
z2dc-T`4}2 at L4}EhXvgi9N at QeBN!VFbH)S0T92Aa|Cu9>9OQ3R$G_0m-2Kl*?*lup5
ziOuDh+RyBC)CxksWNn|0wY at fLw4j&c;#oP@)Re34I=qK|w!08e_@$6S={g8zf2>&z
zEcvlk9hbcgxFe4}@LBL9x{x8n!W00hgZ>P&X}wgI>5^msB{uw+QF8p`Y4-r at OGoo0
z51!5+U5X9k7-Z3j)ULg={5$T|C#OqRkC9fJYecbos^b-v8ce>b%hhXLp-heTuS2}4
z0`{i*MU^<Z5X&HIb(h8yTwA3CE*d+DkJCb=6q0fpw3#5U%=LfIy>C|3J_+ at dX&f**
zVW at RJr8oEcBw$;Ahz|2H_0z7nSpx=aR9C`4H}VMvx}^62uMXf4F2~mJZJWn`gTx6r
zi8Es!cMqqPFTlBjTAm8KDK_^mXhz}MbFL56f&u|<PZ|eE3w_xs&4`O##zSPuVrjAw
zMjL8J&K>dBfc_y4$EiF~+Lb5f2HH;(wr at V4#9EP at m0WBH%6$^cq<JSVC#EZ%ol2UM
z_q;L#81jF<Qrj>okY#F5fPg<xX|s7PDc2j9n7 at A*+;yY+OJL-%Gt&W!!UPS@&oml<
zwmYbX*~9JYp;(kwY>R8{u~-o%!0P^N_r}}Y!qqbBZmwnZ*8yBF-b%=2?1hZw5v1y$
z&OH=**LMxUiSu*v?u at z6x36ks0MC)&ity~5K5kciCfzo5w<It05WHciIily##Uy1M
zg7%0$GclM$b|J5hHGTp!7M$I8s{?G0TN{q98F<<(;A`BgF}~Jy7=OHEJxjbHv6DQP
z;we2`8Qu*i@~bO5?38nW+S}bQPI``^Zs0FmxBwTd+XkNe)2dg`;<?M`Y_N~P8oW!m
zDUXO#bbQQ<4}xNS1XZ8D<4XKFo|`)>j(*$P5Fw@~T=?T8Vmq*QEWnJKIk`-nC&i*E
z<VnuB%stw7u{G~tjo?Yp4H4T139td>Ue7K`ApT@=nhFHFt?Ii`WuTc|%{P}Lg?>dl
zH8TUSnp`dOr#T at x=tS%8)i0pedo-XVP+Z at 6ThiQUc>4GA)4H?w_VU{ITP)<ASO~&6
z;u8CYLn?)+bDHk8bQkk0UMu6~g19=$4^kz~TOx;&V&}hrGwkKp4 at MjH{0AJA0St}S
zs&vu#?`=!%0BR;Krvnd1A=|GX)UE-8(t1yLyjPu_D`WM$-j0a1-b*~R?W=A}E1L<-
zB`0~6Xx-#|(V{+uwD{rB_-Tj-GnZHd?~Me6QG<%kUO&sKyB<t7lsQUPyXZK7GIs*%
zN~VY;LC>dUB*H)>u!&M#BLFPe?gHQ`V%a6~fPu-CFdDozmSE>_9$OOEv00+RMKi0K
zIEvH_k-{%|EWtr=#RR*z)>mji>l$oQU^RB~6b5cJ#ZTmv4VRqXcUAeEd$bI%O7)D?
zvR+c$^9W*M9Gl%+uKrS?27IpPQOC*J9;uiTV_bU at Y=u9i6Kq+E1f9uJ(WpbermLWc
zC1Llyohy{{f~&?ug`s-p5 at sK57#JK>akv_JbE|fJa6sr~Fp%QYO at MYT)@h`QDK=DA
z?)*cUDbq+<HC{31x|0C4(lpcayPp}SlFw+H?XP}D7a5rvY1xPtKixx3L?X{p<r1ax
z%cz?Sak2!QT6iR at s~?JA+HkY30`>0M!RAWGrX{9TL_eF;N(jXT4gV~%NXNyTy{aku
zDZ&*e#Th4S(f<2R#^A~BT}N(S=%8y%_oiF at +Ip4=Q4#ZV3|`xqp|!v-zSO|8<CE!k
z(IxmGf0_TuUpv6Sp8t at C@?MZc+%*D82D0cO&I~9`PGyW>j018~Y9=jOa`0$VXf1`X
zS~hs%$e^WA&F|wqp)*84d9$wPJCDVFQOBNZ7V2KcI^njaj?dRp+(a3}J5CZxFZo-5
z$~iQ86=}-(rf;QaAcv~j&<&tgN<9&?dCl2NBu0rn{OvWO+){Azc&9FNIW$GK(0j_&
zS at wNmmlTS<jl0*=ywP>q+#QUziax&0b at RqBak)6AeQ@(p552fhW3RhW6~(wd3X^%J
zE#NWOU@&Hg70lw;_&{So%S<ncKEr!eeb=;6Dr<t`=iYpUD9%q$rIhq4`nia%LD_Z2
zs6-1_q<3$i-EdmUnsH>TPmOwXtXf{PDE6Tnjzw2ytef4w$JyI5zmn0l=np&Az9$#g
z++q0|I0v7lGr5Fxj;wR&FAKFNR{j|yWzpo*LxQstHwaDF9zom76S>Q8)(IX9QW$)K
zGQ*F)h25-DiZf%;vn{QiK9Uwv+dX~j8t{0>FW>8%iOjd8n$Is at bsBp9*m`Ruao1ns
z#gTGl0=oHE)EnY}y?+%Y^HI?r_c28i+(|%Y7P{QemA{CO3ih}TMD!K)v2Cb23RDzg
zXJVr|<sZQ$-wQ_QR|YOlUNO%+ZUx<@n2(T0X!}!lJs7fkKe^s$yZ9m!v{}?S+u14&
zKAt8_bE!fD3CBi_;CkdTngOgzB>W5=Qt)163ao(+NDL0YHHvFt8lOv+{X$8#H>nmY
z)k6MZThH)a`LnbK%rc(W_ssYU0A!b$J-3ZE0<88vQgDV at p@6N^!l|J5wB7{2q0E`f
zpGS-RGg~?i&(MRBd at 1~YahqlLGwJG&p)`pX_@<2+&&ySanAcSpVarZ}`B>Bpf5oAl
zl`NQX`8 at h}dLR#czN;$g<EAcLPG;01ltq?m_5P{f at 5A$VYHE^#pCp#t282IK=w7n;
zsvZRqPfRkAiilEhu;DA??g2JEobjD(C%UU~Q$fX$fi$0n5{_u}A-BY^r#$~bUM=K4
z-|FCwn|#vmuS(eru>uV*R-z$HI1Z|<YNq&p$jJ$-TXQLQoin98*@QVCi9^Zyiv~Am
zQq?$B?<)2FI^q)(q)<x6ZQ|4zqP<%B-J7lQ!S~A4uM1&pv|7FUcXQN&zjPqXmELhf
zF=#nd%UA;@pVj!)>{F{%I1M-LuTi_JVXu^!e_C<Kg;Emr_5r*?3_i~nJVqY$fhEkl
z!P9KWxV^r!`ytY*^QR4qk2X1y8_E$wo7D}fI6q(3Z>g1-4oEZot9&^~eL7V=B=mC>
zJ36vcBlmW&o*UuIcxsLp-3n2-Kt=q&6U{OPCID^a?Jw{7o?~0n-dnWz`*W++Ouon8
z9mfXs16pi2l`Eyn_kuhO2b0pMW_hP-OP-QKJZ;wA=QunYOwxNE=t{XpSU&!2iQt)!
zC78ej3(alnEJ{luDjV*0BW2sTvj46HKn7%Q58ITRQjb)I(koxDiG%A3=PILII$M%h
zO8BWh)Mv^S+DG{icPb)Wz)EB8Vg0UPV(ZPM<#*_~+4e4Mfa{DjRekT??oC6X5F!21
zR@=(#LGBJp=^jq2m>O6rEiurhF85EbEo|X!2`awg{?z33HyrBgjDTx}Q}FN+;%EQF
z94srhb7euxqe%Dg$xW6G$=XG{wp-RwJN at tqMT7xO{oM~NnpXe|`#b+MpL932v0!hE
zx<XR$W-99S+u}ca^$JcX1*xvtkS^>PddCXZQ|MvvmzIJi7)DIoolKz at w*a)<GvV^s
zLZAC`xOE~0<lZ?At;?qrplaXxr)s}d(_asBE1(2}54(H+eCUK%sQc{3Y|yj2Yh(k5
zx3M*N{~6?4je;1;d&akznuicCs{iQ?un>OpKS;)!@NTCR280_T{+r`{@Xj2rK_N+j
zV&CsQh_uQCt0XJ%{;ek<f<d7MHU<0l)M&#+Fr{tk80MsY3<dE`hku&GJ0QXl*7V<e
z4)_hQ6Z6lc<gy_6J6L`BciMl6TY_q``M=juV?PNXmy({YR-`#lZoat&MiYh8e`VvB
z$mqfhIJL|(iVzz!jiamNNSkqFOwhUP)Y at vpOZkf|RV at l#r at w*^@Md7g6|5DVWDK?-
zKgY~A8#hWHnS9|a-z<VE2b#L*AN+K099w@{Eme3fBPb}S5WMw5%8~IwKqCkniT<;b
zYTP!q+QEs4&_-X#;l{&Y(d6TON$)Z7djRnPB5%LC3JzVyfcVi8#h)zg4?`OJ2?2ZW
z`YHBP{?%85ijQ2a*$BdPFQb1Kt3T=Z9gx1TCe$ZjtH&k5{@R7l=4|Oq0xYGkf&|2p
zYNN9Y)3rbl<!^2ZF$45R0+LPD&_P8zhT4x at KpKhE$3UAWczAfU9 at 4|k4j4>YdX2NS
z&68QSc*9M#&zmVQ5+Lv$<26kRnCH7cc*Y+Nn*PF*DIfS`Pj(R%I8#qwYfS}&h}}Tg
zAeT<Eil^-Y7mJIq_vQ;9=dkWCE^0hmoaj;>3wmyd7k at VbDLuTH@-RVPuei8aSvO&^
z`1EJhOP at iKgJo6SyoaM15a*n#D&>R(pWw;TAI_-!2k(C9{9~{jUVw=BmSaGc?)k?S
zhw~2B<>KMD?cXIE0e4?p+XIWr)2OR<3{&Wq(pCDGJx6cbQ5$=hE2hQD5dCzQE$a1R
z*os^_D+c~cM7QBm1q)yPl@|ZS at W%vUwbIH=!+IfTm1e(TYdX*@uWzo|(*bBB-IW(6
z-?48VA}dQ{Tb>f)*f)+~f87|FoSAd;wM~EdwQL%%ZKv;084O;h9R5kM10Vun+8Nuw
zvj1EDX}_S*sHwCAym`|M4OD0g+Di>5r#$Rl3ffsD?>%7EHC_?;wt<&^yg(kj_hNMU
z+rxU+(%?QhaM0Neu}*u#$@~Y{(o-4xfwW;orr_Ku^o#5WJPP>)pMO5l23S7(9i<j_
z at NpV_$ktkudNu7<Me-swpcneE+;(cK1WSY+_DX;S+(MPlJe!_r^k!u-AtDt(#oSVD
z(6^MrmFe|-EToeUT{XD!I=ir+;}0@<37CKIeM1DiI;nXmDFIc!KDe%UZ9GUS4laoW
zw(#~Rrsv#7Y^k<%i#U!R^O*ImK8L9l`l3}(Arldw#v;$qqCiccx~_}<FdojkY#;T1
zk_^^IoIPH2{AyS)<;zx{ABbgcWG`Pitgj{lp!E7A2dm7f7TY^*CF`$x_Iy~Jo(RTR
z{wBIK7|LaT^5Dyj1TwR?9|AQ at mHI_IGiLRQ)3h`+A5m)w(1G)o;G!34GY3wMFG;av
zD at 3WCicXEJ3<?Z-&|b?ti-M0)pl30^glBc1|6|gY@#18me6GwI6+g1|$_xe^TCKL;
zQ}HaE+z+;~bV25ty`Da~&ou;%<5)%{DUD5XQs0`ZH3bahL7#&-xP)^b_5fRBQ2i4h
zf5US~CiLP=T4%{P0->d)00M-UZx;P at HwNtsY$)pmY;Yg5Q)Sj1pt~;J&2pO+s3B<>
zHxZ<*<lL~N0=g7`O(HP-q&OB8y>=fztaf~wt*K(d`OF8 at B!64?Gr6>sQ&yM6vrqvo
z0sG1-^VYP`0L9pI3?F{z_9o1IM~>^Xpmq3L=n37MbD?dAv)a+a>amxL9(NZZYm?^+
zsOoXdaOjD~#ftP<!Np$Y`RD~^=Hg8})9R#o=1@*(psKa*rbCY;oaJ%bDM8r5s2fse
z{ALK41??B8L+7Q2*%nt&*c!G%Djrr{drz`9o+kA}U~g4*3eL%V6 at x3YCW*^s+jzoz
ziFO;8fKr2kRf5a!sc6r7!~;&2F4T7~e!aGv#n#)+mcB!lEDo31g`C76<$wVJ6)Jxp
zB7GKVHw%+!fw=Yt)trkToaG`74w^TX3gFUt&6o84oA}m_lMB}byE$w<`l6js@@zM>
zVD4;zLEgOS!9nKYF&W^ZI8j>dlydt~EhJRqYwQBtv3<R*Kxi=f&2v&HIdU>0vRX13
zzKEE69{fvfF7fOo+az8aVr2*v*&EJF!PWy?E1_pRC+LFE?E3l8FUgtbPe!HBJWf4M
z3Z%#P_<D2H`cL=RwiV~SBfD2Vl}{#k({;6k#QD|u2RmU)%zGWNhNyq=`jU2E<%^}5
zi#IL)hZ=i(t>;Nr7ls*!z!0`mQRszXo~yJ6t)=~^HS)$znOn at 5b-cEjVu{^1cBQE6
z2NNYzjmC|=gB|VPF1?I1)Fd;1R>!?cg$cYq%|RtD)w?KM+tBmxUsC#-ai|jEI4pW4
z3~cb-MLmM_%_Am7&_zaHT0*cSRz!P026wZyz`i at A#2(EgKgbz+$FSATT)IkPDq&xA
zWiV6dB7MUAH)Js8?CIcn$IcNO8gkL$A6SGnhJ-Hvtv!FFaWSxZu{js2!K}MUfgRkD
zAPDmrh4?~z_ZJsF4CLDpaHFo;2===+`~9K^0qH4%;>Oc at snWBji=>0c%W!0sboqdY
zM0qiq+|>2lBr`;NzM>Sd@~yhT1T$2&;}oo|4~;E$Q8*XH4>KJ&)ZpY1&T#V$l?4YA
zbo;Nt9BpB8uAi@);$JK<REOC3*Kn+Pj$~f+?Hq9~Lh7Hvk at j;T=z~(2^nWT4_M+N%
zA8g!tUM*3MWAPp3%+wP6tN+)&&*7BH6*CZ*aMnGK%*b8mS-v4+$I*x-ZAgWT&%r+d
z?mqWb8jIKUsV{w(K4|3hd+@`~5)}8a#l8Z%`*Lc!XPT`SJ!HRQ70!lsr~?Pc(leQ`
zzGGzZ7nq~qUh9#T^}|dv_QAo1vxOg1O#hsbp(o~3XXPhfPB>yO+1Ye8tjq}O*fhYg
z&Z?h;S at T`<JY2tu+eWsKQZqMagS73w`3jzMQ`*}os@<h=`DwrnM=Ah>8|V=Q>de;(
zFHOd4a5bt7EbPKQB;(kMXL_(@T^(ZOf2#BYx&9EfJKAz_)-fO3>L#^`rJFEIJaDP|
z&zXk6&guKtO at t;cfu_jZBxkzngChKTbdW3E_c4Lki7R1?Cy22ew1$*Bac{BI$+L|~
zPAo~x@(vr54KXfM>gb7ijH=!2K#6hY_yob{M&HeG0$8me&AL)!fyJVtc`j4t2mO8+
zsm=$EOL`wV|BIi^ZVV#}v9sd~u`O=K<mf}zkUgJ~*7?EX%Ej$&cJto6s%EK0EV*=m
z_<3E+L6eJrkoY3xzsoq3?V$CrRPIv17f^sI=drB6;?;%c-i{rTS!HE7l7wX*l~F?_
z8Fh+?#pjM~7`@ouyo{T*toBHFy5?4-LO{d9D(%pBnb?K^1q$NQR<|#chWM}IQ__eZ
zQWHD*;Gsa!{YT!v>|91pguwOyYFoOnYFs?A+jll`Zf9Azb!o6d@<M#>z4Xc4amMk~
zW at l|u4O!}0Ua+(ZR;WqxKV-jiwkfLoC!ujE{g>PtW9bp2Od&ky1j!c>iQP;ggGU+1
z)PZIryE+_;`%314Z2oj`l=1v|wJT5FPV>J_<R5$4dWM|~Ua+XV;AH!gV8mU<c*?wh
zL{@?HscX-8Jkx!~(hF{%#{Zbr<13+uAMrrWrTvNGl^<T3#Aaa2{Y}PcmbO%Nh5=(H
zc+s-S1~&IOY1t%5R7}O>>A^8>d&iSMrWF4Bz*_l1GU~EHB_jW`;;Hm6KX!i5fBm at S
zLa&L at n31U<sJ~FT*V^_6vPysTK!+nZG}%1!<aBRSzl+J!k>_7N>t6$$^FO=5r2YZQ
z5#xWTs|PC9hC(C*u!W3E2C<y6YwT-6jIF_lBRQ at E&=<C!Yn!)@Z`!+%{q6i1#zHp_
zW0q4l8F~UZm0=g+XQ!ZtVS<*)fy>7BqJP$G6P|(LweE8qi>0r at J1I;-jLpFU=WbxL
ziE-xM`5e&f2VV at M6v<=9Lzj+DYBr6h9FVg$X9WnOTE&aGXWg^X&*ptgV2Z&B^)(k2
zA&r}{eaO>~hFz@}-kXfx^kP}Vn`O-xIT44&+y8^PuZ)YTTl?NLDyb5Z3Mxp0lr$nD
z0)hh44APB&bPR}yw2IOxB9bHB3_SwUokQ0ELk}?Z4)?k5bI$ubpWbipC;08zd#@}0
zSFCHTy)Ies_tKiU;sShTkCep0c-q0rDu#1>!z4ode6Bt6BnXuqjLlHgvpQ4Y*5r*m
zgoe-K;qpI0;Pv>JWs^Z1=a3r;o5O<I9q~=X#dFT(cOfx3%?kd~v{=PrS5GLsxS+{o
z2LmmLlfvo5uA*ZP37^q|K3+V>Z$1IVV1k1753 at EAxe+zHXz)xr9&-ZTe&UC*E2dk=
z`w)!Lu%~SDDHguD4z57M{a%Cq2d0Do%(+sX99*7F7_vH)b|5j}6H8lHriOr)%ou98
zyb17gqs3|yg2nt<02y}yGF273yG`pc2}h at zSAyX|tVW|pEs!_sFbJYXZQfKD4XwlK
zeHK65L_2Na_agABJ6V|6T~0sG<#l`m{;?T;{Q>qIFa2YG5?6><r&l*-)AaB2R=}HV
zVck3fuZ-Zc?nw*Z6H9)>wtcdWeWUYP90kS65J;FuR?FkR+DX*#Ih5ru?7%k=b85II
z4zjCEwd-2oCNDUCW)-tuhlf|z-%+oSRJ3As)n0AbI`62BYpAiu`<$P_w{hU0Y&kbD
z2*UKAmHms1L5d;ZSZg(Hp9PH2!MI~eR9GODaxZ at b_8rWgBKT=LIZN>7$P-;CbbKdI
zLD6IgAGTHCt5Va8`so7a at WS*^&a4HP`fqu3BmJ|PK3_lm>Y9ignhSE<SeqB4ZnBxc
zLqAZ2K)C3GoW_gv5wap&NITeA*7OM#*6&=_Dz_pDT=oN}jp;wlR`fX&mJG%z))wlk
zM^W`$lf{EmDStLkRj-4uK=FdG3Ee>)KHQcu))TFjc;dH3v5f4DMZwGAJApXGQy#%I
zMb>#i91d(vUi;!vuWr0V&{~8E3JW#s2WO%=PrFXT%O;PaF(|kPJIZwkhderjPGRv{
zo%0xcPSfN6EMO5*KqZ4tRu8C`&Tg)4lZ{^>BD)JNa~)jCj~WWwSDSe{Wj;LNF`0Gj
zbOKTQ;v1tVJaQ;Co;i%fH>468XNuAdZjXe#{DV?o+2rn1 at c-`M(}L+KOe7`}BqjD2
z-5Jl#nmNV~96LY%%(#jkS;6{g<Fw_oBJYGA`k(INd_l0d-3e at z*xVGl-gPI)tds;T
z;p_l$du{$%Jm3uS`CQTWr|AwlW&-06XZ3$w%he1G4GTD)>32|nv4Aglu^!sQQqGpp
z8Wu2Sjw8GQ8y9Tm+C099p at r6IgOF&78)gC7r6d7fc%ATBMK=-R!rvjmKE7EpJ*bU|
zwUc^y at e|qkFbWjQjv)G3V^du^zAP6#R)wd=`Xhbb6a~gN&q58bYQ^i=kX=q*U4olo
z39K*$?aWwhTM;}2`!qx}?J%nj&v5S2X^uVFBZ}pif&>JBCU%-2i2i0VFV4az0eDyq
z1Hzyf>BjyAZ6CgC at MRO1#z1Im8+2Zdk*(K1VV|2b_|eQwA%PnwnuGYN_?$GC%A)6W
zV1&_Pj}h9}U_PgPLFa{m@$RLl-RBcImt*r9 at d<IdQ;73I%dCBcr(1ZUV|Ia&Il`bX
z2^Y&PA>{Fxx*HwT8?3z#nB~hsASB%C1WWD3E_2fdtF+W)??d$>&Ta|AsRIucn-i?r
zMr~v{jhDksgK=u{dOtn!9N6i=0kD?^ggnmLAKK{J45BftHptl}s0w at -GOLC{NTE+Q
z3~U0#EzD=gX?Mm9&?g-OeglgnDG+d3R#+!dtjV<8k!_vK$<EN6$8vg59aJ+&jV2j8
zncp8JhCS&caX{j8R93fs^6Em)W_`gu&ABE4sN{7CcP#6JMs0SA9tlg_EPM_PJ3nZ_
zRU+UmIZYl|6vgN7DPWw>R`Fy}PVQP6q4!iY1jP!o+}pTyX!yk>u9J03t`_bK??i)g
z(C7>}ybBGtM?(lUyu6@*?O!}s^tJ{Mi>hP&b|yhT=D8!`BqZt+Q28ynN>Fa1f}&jI
zgmhd)LXDKabyjeN;>qzJtadX^Vv!Zz{FuE|XCPGS%>?EF+5>M+%~sZIz&{$)GQ0K(
zdmdZY7s?&!R57%RWQHAmbl0?kEe&;7uwbD$^IS!IXy5TjWAzUINSH75DiS}`jvg~A
z;|Xqr%KS1QiHJqY6JQ0sr)>(8?L!Rr<FHwE^0GPj(kQ9RCn#^i6#Jh&AQ!nT0e-n<
z+!W&8N7+Uc0`U}okSX!rUPl&P6AgV}7_Nn-Lhf$U$&;RDHc-~-bbU3n>jc?|!`H0^
zyQLfw9J!<K^P)uhz at q4AV>8pyqEpXcNVj4Y0?Y*jo+o+lpz|2}%mlr#KCv7RvOh`n
zzQJPgKlX`g7=L6rxXWaB_urk9Zd40f^S(y3aLLnzVQV at -2US|-wB?`_Ju+hKD_-0R
zJ`LaHn1qyZ!xIqG6H&*GtDC<XGkjKXDehFVy);`IhgAdlSt$@K|D1d+9EXv at JXLUW
zc0K%dm-7uFOT<63DqFB>27xkhdfJ at wV{J#3jG6Tk2UEhwV>u+Yc-o(y5U;Ee<Gtza
zku?kr)aVB|7&<Pk5Nc;kMSA3X>J$`ofZmeUd*zIWfq4ePg8h&<;UFUvBsK78bi<&f
zXx|C1HG$e4Lkb{kim~{8c+dSo$WT3W7 at F=nT(N1_bx0Tvb1__N)ae85-6SuQE($~$
zCqARD1jIaZS#IQT)1l8F?S*$cL1fWjU*xXUfqb{V;*0KL3j^Jr{u+fq at Hy%U at tG{^
zG7Dp;RmNt*aHn_o)My=7`kLxFWS@<U_`5d8H%nvc$(PnWpw0fvW^>Syk|`ynfqW8w
z$=On2I6l1b at G}>QM;gq2qlE+8yQ#hEnFc#3Fqn7BKT<WTIWx!bA2RFRW)GVTaNpnz
z&S_Y4_uwoMISG*Rf`Y$Jy3r`&+au<6MnIr1K9f$(1C6PHgF+J^PQCTCt^k))ofH;9
zWYT&WsuvyzDh+$gEa!cy=!j8<KE at -L9fR=D?)Bh8rbBbTVDnG7`43InwA((-I3p6J
zL#HM*-q1%8{WY_`DV3VElFql#u6?c^FNNG_T?}JE58xq<Bv=*~j5f<Ne>~E_O``!r
zLVL6_3l)XXR^2G2rI0vK49?4^4bF>eida3LfJn&7LvBpqpWtpNU<iWnR?}TOf-}XR
zukJMFmSuIub%O44MrY}7Aj-o$jN&_WA&r7eV at F-A{>%t)&p^)`3u6MF98R7?g9FOj
z4seqF6C;q+qoM;3Gy-4HA$mhy2Hz#>=g5&zmfPj$VFdRqaFO*;vcd-%Xj9Zn;IiOa
z^*CDGoZSKS8z;<Y1B>j^C^!wy{@3r#<6+=a!ypi~lcWVEU7poG34smU5^t~Ukc=-n
z#v1pc5g}Mn>_oI9Uw{g2AIcw|74&VN0_3zk+F*;{f!r_4Dw{+mEvncgX2sieD{@Bg
z#UM^|M-iv+-90!VuSI5&oIAoZ8*#Bs9RC%XNl98JB>cZW%vGb2)(c-P<63p{hHIC6
zS?4T$B4>=>scdRbgqdb$l|w~)my^$$%3`oNc*4!UWtl&{q==!N1rxwUn}j&w#JQdK
z<zTn?&~UE`OAzJ()N>o3)k)F<13SR+Y9P7Kw^hMl18%hwL=o8DV01UOeoNnA)%?Q#
z)ocOjLv0>$0v%xtiW9yTW4rpP*f9q${HlHf^%e at 8((Xi?&k65#bI!!~>Br)Vl^tp{
zDwEIG!H}W$y6uro3{qEZZX#|5?7yn`6Ge!SIGc9-!2A?c%6-lOj89vSXv&<E9J#AR
zeCfB6d419C5~;G!UnF^jopp3Gv)@d`Hsn1wVezW?DfsC6QWx(fUg~G}ek_o)eG}&`
zvoQ&#uZ|&2RIUyeG$|MVT}_2LY;WB7V}E2zYPEt4GDAs}+peV_%6r<1AMQW!%+9FK
z?i|wIKU<4k9h<XCd-_AlePv8+WICo5ES#BW>nF^vh9q1bcM~eDU)tGlCn1McT$*Er
zD^<40@(}^|6yL(>x3Im6)Yk>Ard;-iE*}W`<0e`UVVT62tVJ=b*NEX$AD~HN=5ds;
z+g`B+aDm4lp_+`semv(IV6i8gCVHAo6ogA5&ij3{5ut7xsCd(s_0dFb-4S^+iuF&_
zOs6@&muWbn{fW{COK$;#ZmEcPJ_s1X)<;-NA3EKA=(T_OVFH=)t|o22%k^o!0#8+q
z=%lz at gJu8Hp9yLnFwk=zS*ccNf!@@X$Wcb$hY!bM+|~N`gbSK~(Bf+?Oqc`i;8B*h
zb&BcjM4iDbLGXLS&E|Z$&p2n^X;><ZM1W&jk<O2iT^^-VdHwO^rh;$S^Wk^~cKo^*
zBB~N0%S{|&EtaBbs|DzQ#@GNkJHv=8 at h)xQYEqYjV~iB4pBwTBOBFQtf)sxXP;`2Q
zMeU50zQJEzePzYVlc^^40>iQo+Uf&Ro>A>6goisbtKi)@ZHZ!#c!ttAyH6(=j-<wW
zHxX*TEY3g=HHky;rR-4gcUMyYawv-Rc8B+a2`{R}{O0IIDcUfmtouxFIkVTxv at Qd_
zi)AvW10UKyS1c#{B4EscTX!BoYj6MfqP#a|M<47-+to485qT0;ivcNiEm*N?AkoY9
zjpsDY)mONYnGA4G?@PIESgIV(U?wJJB`?o4;!?~+ at 5O66{CPSLz#p1DdeF-<earBH
zQSFlhrdmu7O7yg6K*aC)TmJhS;Qnl0HKF)*k)@NKy_IPgBo{h+I(200zgm0uy8FG6
zsHS5pD*5AbK0y_8<4+UK(XA6Sp-E89Tf5U?Ik4vFCq<-6Lbvudy2O^t+aQi=IpBa7
zx$G_-O8I(j2_JT_v{bm6gj&q5k>8}OSTL1*^(8DEAGSBI0UQSL(48;({6&kGC`Hw~
z>RS4yLYWK7WA1HPgo%M*LR1RJw}qfHrN5<kIq)sHUX*h6^d#})ml9{%kdG)y1x%%5
z_h_>^7HIJ#x=Eckbu%{nKD!8Wm<F#tplU8Rsc14y;_iNnl!@MGaO3_sAt at f0KYkod
z6rvLELU`y7Z(`eMgQCh_0S|qk3#V<zw`c4 at 3``s|u|}U at rns?X4>Z!1 at n(N4e?G$w
zxD>(s(0C$3O{!;t0;ql9c}Z6=g8mGWq&ERYE+3>dxaVno;KAzO7s6xgDA&eRWxpYt
zV_OFxk?>19_fNl+msrctuBdFKm_ITPxT?ak6R=mtBg$2S6d{gxG*g_C5$##EL#(t}
zc at g$MI<uxA){3GK&?PkSKCKgG{@1Y_0Y4W?Zino&#*Bu^vA#nt%1|-dgU-Cp%{u+E
z&0I^IUIsS^tYer58{-t!p?H2doG1CeKyPk-7x)Qrqyd7fUzO~AJez#nI=rriScw>z
zebKuuX*^?4-~5GN3;M`!D*0aUSp_K|yo)6L*p at ffrZT&d19~M#W*tOf14tW+;F)Xy
zUxzgBvvY5DCXUk=!AG3eEf$t0)!70Tn$xrV4FZ31bm}x6go^C_zQU|cq{PTHUrP()
zFub!{b9tU<@s-=jwlKW~#~TQ{|8w3jOSryt^~+hG5`R$aIi^*4F-Nkq15dK4>_h&E
zQ|uTUX1jlDB>t9HChba3dRG2$P#>3oR!6By-#>c+j+eeI`6@)zo(d><o<mbStlf7?
zco<d_{Y|;XBCo7=5rT6Um%F;CL&u$biO5gj-l}l=EV`CJr1IT0CeeEzZ^t+n at zWWY
znVa at _SMsgrr+Vyc1Sqz>`+aW-DOY5VS5A@^edp_pPVJlr-#4eaH{Gh?(X?LEsZTb&
z#F-qJrJH_DIVr2Vh6bB9v4};=hvpVbDaOR9Z4L5tCG#if*#(HmCbahbxf4^{>n42I
zmi468oM9_xVPD{ltH^rIoAeH8V#V2rQO(PZNO at n$;?4pJgZ3c!<5RVYy83`hnoq){
z+37b<x&1jxR2GJgDWhioG@`$;RUFjL=gXD;Iaa>m6N-S}y4B|tVSat-<wR$$vl(z{
zBA#KBx at q~^OY3$@xfce?==o%Lvqb+HMrNvIv|FRFys7ZRb0f(yuY@`rfAd5Xv;`Si
z36I^cC`8}~K3;8Itx^##9LAJwP4@=!7 at OsXLr~$6th4oq6;Ss&Y=ag-cY4c{;9tQ}
z_#v6V>Q{nCj6_NV?|Qf5Z=h8}K+&OUTTzoO0#$!pbE|^#5E?6Zdo$PW;8J74hO`#$
zrM-Dgp7$s(;^fx6IRchLCUZcRa%6wba3Q}a0paU^kYr at QC|^7#J8_ at 8jp~}|Z);`^
z_+{FjS8JiKEqVj$=I>0!SSqR?hT2leSz4T+Kk2*|?6cWMXP)dQ9cYQ}Yi#DpbRxea
zQ(St5+=7F`JI>X!ur~AioHBezcYDZFJ<n{2ne{mFg2-3Tijl1z%M&pg`V=;KonN$`
zY4FaF(RXOF2Y-spAp1>jW4d)R&>`{Snd~{z_Emu9l1Eb^7Qc`^8 at 5BNi)=)p{B~|`
zTg_PB at S-~sJ1gv0Q*HL5+(tZVeo@=l7xHm3@%}uVNe=J1vufan__~vq;vnp$At#l5
zQlFRdKx&I%D*hN3>IkTe!o#0-l=l<v*S0>oofSV5_n`^;coD7_(ah6nZaSqwd7sd@
z*4?I*c0>&%=!fmCYB2cf-s|<MrG*xElcY;${ur;XY4d&gg~4NVa8AeZa~stR=0TL%
zk7pbuBfPAvoF<a7h^)Yp3Hx?u3|TOK1shkssqP}&`MtnheptZAY|{gu-RNB)tr&&H
ztybxuV?mqyH4q-)$=!tRl~o(!kn_SdU?C-9R}J3IIw(BTB0#+)^Qt>IaU7-CCcsIL
z`kKhHc at H|1J)0kcJ?yPeHo`R?CEGke>tZ&*z9bKWi2!m{fSHkKp at X1pP12BC^Z at zg
zE<Eww4vN{mUY32gU^-A1)B8}Hi1?da&4|s%l3{660#>h<KCw=@$GFbi3=8RA<IDl4
zjW*nl?$mr)2DiK$9<IrF1Fn3e=&Z9nf!ZTK`dWqLtc=H_Johx>z*o at hx>?)RHc3+W
zQ;p;MxXe4qQ!l)Ea*U<W9!CO*$A1ilU#0bw7wU}#F*w0XI*x<%*&|(4w<0B`Fx-77
zo|`sdTtd)#teAUj;z%40EuYgkb<<z6Xc~_S4!fb0>~gwD?a?%V$rD9lps&64cu|XD
zGnR1p*R%3<ssy)%Me5pL at GxfrnJG7>q6_$$=WJV6&2uy-6e<bX74 at m}PLT9 at 3yZ1s
zbo4m}X*sQtRWGR6n1eZdia4)PO)*c}7c{j3)g<;=xCSyu^50t(1+Tbk##~`FKg)vc
zjRia$=zXw{5k#K1q_0PSc>S=tm9nvi^~go)4g5SZ{MJGW$EjpdDV{dXUEja2RZ=Aw
z9c-8zq*y%ET*FY0tMEEtCw$S at Eu2;;UuF~Vz(80x0{p!;m~;x^5b9}$Kxsd9!(=}|
zo`Xe`?|uC7CeDFSt1xMpP3TkPL#N7fWpP4^;_&`~)h7yUeijnV^Ti7DM`-PR*4Jw}
z=$sl#;B(TJuUx-$L4Y5hw^%{ct+*ABCq+ at u3VYrdaPS<kOA#pr=?4INt>~c|zpy|R
zz2UT!)ivskxkhvI6Ib*2<_M|Z8iExwztB%N?;Q;O79J?vIUF`fQp?DcQH<gYqGciv
zS*AE7T2N{|^`xy$0=-Ox6uAl-Lu)|6+Pa0SJj at D=q`-GswmsLLuO&Vs#)0Sk4X5WB
zHG>U)VV761lp};BU_-K0_e<;H5qPN=WwwD)CpqVs4~gCmPLs-ZtMC9x;)Geg2Wd^i
zvix3eCoS1Evs$2 at JNK@fL7W(1_~?9z1M9e<&Jki~V at mM50mOJO!e6RXRV{*U#uUlv
zakj`JgY#ndlp9|@?9vWL5$uSWPbyeasJidxQdEUI!;>O|GVM|<E!!WW&!z#^L<a<i
zgD;OOV6`z#(%*UFdM(QPNaJ<|@KM<UZG40GM81&&WT^1@)ly4)k3Y)UR2YVY*D}hB
zZT!lvDL$X=T|onwgMCoEa5ev-pf at g}|1wh9gtD2i8uw>)#KxC8>8`G!W~}A5z=(OW
z2g;Ri(ER#NwUR)ZK1>&Jp8pj2R*e at CtFHJ^n6=ZYj0S}9B7AXmue4RAZExUDi~14S
zeL##Et^F!v>HL>_*f*>OYz*or?-}&#OCye2#Nt^{>Dty(($dFqD$LBpH??`Ne6#O4
z`}bR;BO9m*rpc^69)lnAeYQ4eq1V`n;smo{@1An6-U(>L7n_-K<y{7;;K6h>cDj<0
zgsPZdFSz79VaxACgQ9shSr#|v6~FXWTGQ`*BVKRfQbC||9j8(}CZLi744&>DE!gsh
z)CLn&8R?S5lybNn9b2~ycbOz~_~V8fn6+=9vX%&5s9)|0 at G;OwW}!M{SvovpK6!Vw
zutOpLo-lcYRAGRzzUQAS35A;JL!ldDKLZX9BrgE!3GBHcUbaIwZ=JnYKi`HQef%-y
zQdv9?YPyJQt653&KaLN|eG&{ywKRm`Ph;`l6iKZ6xqW}r-V7U>L%yO{S{lUP%p`L?
zk>uXUAS!QD$?!fm=|oB74eq<ayVRVTsZm>Qi|uZ1Em^4Gw>Rnx26-Q*P2~Da+;g{I
zkO-^_Ymcld8mit^sKp<Cm+o%o6>>En2$8#jNy9N%8N7RE8(@0+x{oj2yoLpAR6!K9
zq+);Gp*_^#*Cgk(I)(zh59s6bl`1 at G0uee;t~RG0<I5+*1n!57>%+Ucj}g}wa^vT4
z4^GfMhhLgZ3bUx*pD09YkC$|9R-wL~t at Erht!v{T_mVh6jzU;DOO3*z^0kD44h7zK
zOx<USQ0#{^JhXY$J5bHk8P at dt(>R6GE`J82ZWflpGvrYb_MN#uuVN|MAjc)+v8kr)
zxj(FCu-=;*ce212*io6gs72eoYQ`)dNjp9pQB5(i(2)uolH#M``SStxsQ}di;e_p1
z746q}745YS;1i2bwpaWmwz79x$D~UgqqhRJAttfoXo&+s4;%`)|KUOYV1*U;vkxwd
zh6&P#4u#j4_*{getPUVH?Am>ZtjnjSi~|i*!YE2F)B;~^76zmlxsGR8N4*Ztt;B1u
zMhXMK{q-T?PKZJ&Vm#YrE+}f*-#y{rTxaV%X<|3CS1|%hkoq-CGl95__MtJ<Hv%E2
zy#$i4F at mh6HkF}WxV-5aQb0wRsR6e>(H+7TU+%m+w&ZS{0jkz8UkrMCfBj at 3;X<D$
z3V}z52?yWrB=jW`6N-B{(=QR$11&XHxv%BM=dYmVg*%r&DZequk$L{rM8 at FyDvm8E
zjpGITz(K$0@!8OM_TWne+y3~FaW70x)e#!nwv3;t9~(3w1-do%%Sp`{U>2oZK(RRi
z)w5SBSb)^@4}xL!Ji>0*fKdYp3P2lT7QP!x`z>G7=YFs2m`}YkD9NNe%M&rt-Md at w
z^{{@pJm$!NP+J3&|9-R3dmP_}A2C=k0xQ-BpOg1Ppq%p)aHahH;L`vxrD}>Mvfdho
zi4MCu)ipD%=qSeIw$n^<cS2w4qt8d*(>gV4ISs<B4o*Dh;W>88Va$n~lr^~xyUItn
z?Jt;TWu2qUUF7dY(moGob>ywTOQwi7`#fU)B$n&c*$?f=nKki=F1kLs&teVZHgq@~
zaPXa(Wcy?QCyD|Z_mxk3??Kk~&zNG&dYTY?@-pwr_9V{SVzQKxT@*uttFRS!8w<*c
zKMljBIKwA3#iuE?=Tj#IQAK*juS5km&4NfYn at +kztYt@V1XEv%)_m}^Qy(SFtXq}K
zU+6trB17}rw0%+uDtBKnxz=A2cclxmLixwpm(rlk%Hqz~hV*j*9{Bv{budY()>Bz)
z(QDhVN&8)PKg?!U)VeO&&Yk-qK!TbPp#@Ojz}mDbfhc-8clCY`?>CeNZ>{QX#1jep
z;Hup__gSfYm}xq9H?FDF5#JeK^m^xNM7^Y&Fd?ef$kuHa)^D6mfjlNk{z&8qdFa02
zzH8R5HvtrEH)$%=`ReU7{5}Sm at kAlOH*654CK2;Bp2#nn at t0kan;5kTZ()OWA$33c
z@#F?J*-lR^?M3t;vXX6m!o66mOHnpey>?eJI7d9DPDd0OdUM>_g--%Z7EVW}k@%-^
z_ at in4|G-M7>z4pR<qE)Z3HYp$24puEDg(Zp^@#DD-d~Jn at 2d{%Hs42LOVf|d2#4!?
zrS94$+T;xgFgPUDHOVMe at yEL5b$}myBzjF9mQ_1+*3Gl=vhFbVWrrA0PC|J-2Jc{+
z_Q$chp>veVHYlGi at MQ-6Wei1^o{8P3gXRbhcUgy*za938poFooZdq-nkLxD-M(@Pn
zU_KuE&{K-<-#71ldbrZrhMxa;BIpq)6d<(tL$9qRV8b8d(-yY7vc6#xKUKkX{mI#o
zaIisTqiQ^Uq;^=AZ=K&k==IZQCgd_x>bKv+zOveO(PPI(qLx8oI37KB^;N5-t!s#U
z$f!H-$3#*~TN+oJC3uwYWx!VCU`ghU{66cR5m4}4leTF31G7PCbG4;hc9fa3TJR4n
zYDYHwf&R4&R+^B3m8Gj&n|?90+J&Ff9zAp}8tI!^^#&Ewe7Bkcalvur{b2r5v()Ez
z-%?$*!{1Ej_d*Ps at l+<U7M84>SQ_$k!qS%Q77Wa^pLTuo!dlI!&dIzPbAeUy-?QOL
zao6+<JILzho>{GwF~{p+yr~v>M)ws#N44H#CGD&8Hvl8e4?B&M$J&lQBNSN%qn*_H
zW^Znce?u9-+~xCR>{HZZkTa>#pt)vM{^^=@#hK=4(7>42w`L9o!L)R^&+96KvG;aD
zuL=!*4s5RNs4g2MX%l;5UIP>QE-U^EzCyuXXv;0AVO`#79{ALh-#u<lC&S9jD|~=<
zlV#AxFb({7S&k4`l-=lo+rpi_SA92`+slh-i9=TIq+WnY9yo1j+7K%ahiLkU_U0vP
zS>4+#LK(P$9E0*!jSBWrQcitJsgMWofEpegEUT+UySR2QVP_+#5p#+Wc7=s!84lr>
zMi^j7u)8erpJtz>)1pIxhQ at fs*x<5Y%+|Tz<E_xKP}g?j)65_a62&shg|U33A*N}`
zo!NJP^V>fB1)6Dj%WkR1iBnU)Z0AW+5WMK&cF=&rOAH2l;&-dbAWLoF>Xwq3f>*PK
z44xBgu3&&MMo_P2X@?6`#S;C<c)7(<wo7i_R|VN+s^Q+-I^2*fR)xJsy9Z-g(jB%a
z0P6 at vQ)4v9F at UdqTjKFtb&>}z$q}DnnUStP)-7m;UqQ4UYD9sIp8~I!Xtlf7b#e}i
z^)TVnNvIr&jm_&s3jvUo9eD4yLI2s1N%%6T4}m8<C0-4^wgVksR>Zb6=|cxf_5KM2
ze_3o8aMLgH?- at Go80VJb*^b?F at dcWxX|ofIybGI0jNx^Q!M1+Tt%hMl(EHiX*x5Se
znY<od2fv^tyC_94y3{UH4Sr=H7ez*x_U#5O`W-dz>1n~h6CB_X&hQ(Oy7C+5k^7LN
zWpGj#a_;PY`n>0p4I`?XC%v$jdKhCE9^*9aRnE4=N!YHw-DKdZi-~VTLnGW((;vzN
zuY6 at 7G;jAuPjKU)^Y{{3Fn8%NJ4r~lG}q!y;$TG#4j^t7`Bo#%?I6aeEJ7CoN2=YV
zdn8`{<>>Q=$8D6SB$R4x4`pf$OAW;Zx;E8rGCvkDdS$xL+eVZV*VYQW{j^ci$D0;&
zi|x;t?sp~mJ680h#C0A_MG-Gr`1?81EJ*h+BeETj=>|G?X-VlLJA306tAFTsRx?Gf
zOq+<XDVqvG#&6%Op#ZwR^>~V2jTJ2D>tfg>rE4Cm79R7I{-7lC*1mG^k;E93X14Ed
zIcJ(43ce|Zf|_rAR`4kXrOKw{B~H2YOo5u at O}Yxd)J$(a$6SZb??d;9%7KsUO7N#K
z;5<%zgE&q{MC$rc*9K^)s%>dvS`qRr at i`_ZMCs18KFI8kQ;@PNfTR*?`gIV8f9i(!
z?*Myf5kA|q&t~^_QegY!EN-;uh+-lnplz=t+w8^Lti at XG#ap%xZgK3lxk at _b+g0ZX
z>U23*mfbXFixpwyOX_?t34Y`Wf1Soo9;QQ>?^A}gUUo}Yn_Pa|`7<N4pzKnp at 4gtB
zyr8`R9TV)vD<?;lN7uf04h`GC4K3iQXkwS+R4r;Z{*^i1&ealiwph8Qy>-itDQ11O
zfUGeUBl at Vx)lic>wvy_Xj7e{5sQ2b^3kOIs)p>fS-@^4#fHXOjAAHwJ%if@`(zR at -
zjHXhewRmct%HG*gO<*@{)tk7*n$$%|R+D^3TDt$kW3?-9%U(FB4w-YY7tN7 at E9pM=
zLZ2C?oA1fdf{S!7DUVg$G}ts8O}zwc6{V7dloUb3A)Lm#)w1L3iQDT>hkx4oj|tIs
zYVX63_gO*htGeLMRXDU-Y#Fo(!wbbip=VUK#3acwXd?fY78v8rV<^vPw{@t@(0yDp
z92~MyKs)HxXtuBT_6ibvX$Tq^a%JtS9|rlxj~6FlZ)VmDh{SoTDO|s2UqPZQF&gP`
zWWhI5ov74WuG%ET+ at lFwI$GI5dfB&#g)ttzn7ItSOK5vwBS_jfTHSK(Ig&GM<O^-+
zA3ykN{@9vJALre|S4p5t`c=S9JHnReuo5M9y<84b7>OWRD2-EzWcGXSG0h?t7i}5B
z5wxqLRb4*%#39|U1B`YaJ4S1nyL at 1zt=9iYL!o9OqR3u?c-KvnG=3Zr36+6;ll*Hv
z<R-APcdSyh|8<2T#pZ!6YG at LVi15%j at vK7|q-ITTVa9M#MlUee6$t{<{pSz=ecbq1
z`h3l5%_ZRO&`X-^!4Q?pls|(bj9NJ!l39fEaLPQA?~m%WaX-86VBZE2b9wVq`Qamy
z`LE?<3S^I>a|)Kk`Q#<N9~J6Rq<0q#UHipy+!7Y=pGXz^;2GIYVam&|(;Nebd-g;d
z9%j at 4vjhK?sKOl at -hj_{+e<W_=9lS{5%JeOOMZ7+<R#!ZMhYD3_Yt)~i|Z-oDGXX0
zp3Q*dYmLo=j~5($IZf{fuVSONK?R2gR?Q>gCht9ZbQe$lZ+@<WcVPG=ebh#fNw5iE
zF^b^D(9PM0&Aqh#osmIgZJfX?BEJ)3%fIby68h>Rn{+9?G8yk4!-k7>NZt at lL{r(#
zJ%>wc?>QMGK;(wSiCpbBT%yFzQZG{pN*G!ANLy4~50M{dw4Hq84%myNTJRaFZF}1$
zOGF?qd!Jj{jEB;{Ok=MmZjX8p7uIBU$*xG3R=rY^kq at eKH^6G&yx_rwX%tSJoW6Ey
zHFtVk!QdUyv>@^(Zn+QuqAMkG$-E=jUwVf6-=CyU9Eogu{xkjY6=!c*7Qt{_q{UmF
z`bU8M>zl?UR?pl2_Dmd5RGKvOL?N9}1QV<ffNd+Jns*8q6f}?ghUobh?ld7 at c56VA
zOKS|z^LqYE?|(@RQhOQ?M{6~?^}3M&F>M9M7H*ZT5ML%ksuD at TpY3w9PDD!k%4QF~
zi(G<epv`;)?1$gIw553KZgV!r(yl{YUHy5l*V^foe>Fp- at Jl&`V-eWTfjlD3So`Re
zgW>mLk86YKPDx6t-&%BRUh17uZPZHrSReq{yFN_b?7Tr+?bv=jmwO`jm+>*3%LHjJ
zd6C9Yz^C}LSNuSv^<RRTJdyJ*k+ccXkmwkP5C04bbfpKnuv)2`#`;amZK?9xRANf}
zN7}?D(V$Py{y^kOO@<PxM-?v%c-NZD432L-)(H6J2>X`!_j)1bunFFh<b<>d<g94a
zKF)a0X_07bTQfA>JbG at T1sV3`4UWoM%0IpL_a7Vs6Fv)xeNQkCeTtCjkdScwV(!$Y
zkUv_ at -z<J_(b#|g`Y2jIcm31Uoj*~961Rx$LbW}`E<x9-an|(7R=@7G(hY=ZJ06RR
z<(QGC8(&jPPQ#=g7gm*Y-f=0S21;Cy(ZiJiW;a}R{LUPXgL_vEC;>;R?p41>^2Wbl
zq;AFa$8 at iqj(_VO6Mr?eU at juPu&1$U^A}F+6i(4y0sFq at 0nE+Bz+L+IPP%9qz3>LJ
z<$-gpd#&Kv8SC{X5l at GPK9-PyYh(kk#bLwzF&e*2waU3tcY!~3)i3ur$=K4jCIG#C
z8J*t0&_oLaqqFu=6wR^1yG#N>I5Y`apkhTM=y;9<-Ua8ZO){D<Ixl5QnuebGOTPD5
zDtHs{e~BwN3VO1HKdiwUA!iN>Nm`P%bJycluh3D_RIi|B?>}f%<=9T)c*Ez^rj|e{
zXK9S|yx%@I9#=j7va-ijC7{8C_3j7xh028_Q`_*W)^yVMm3Oa+PR-f7Ia&3LL{(RN
z*SfHTs6=Vq=PdE(Gv^pLR`Hl(u0muFKDzWu+;KF&mlNVBZ~wJ>Ti|G3(uMNQn5x7`
zq47+#lU9_~`<j;TeC|+wML|X&QMNlyIrV`-16KU(&@OV#k7NG{u;b!lpD;U34!&)4
zlbvLiEMkJ(Vyu?NSL5irgabQ-&z!<>>TmC)y^G~ZHwmJZb803VNOfC0lt^#9uCSiS
z;cn(yP!+V>;4#iWqPJF%0UbV at DH<^_NdayCFK8LZ;VZ^a3kd;u^}nR0q$Q$9m%jJG
ziAY5^0k~Jmu^nrC?a7myN<}a;Zen!~QMXlLEQFLMCH*V0Qb|exf2AqYG%y&z5Bwrs
z88t at kF%ol6BS(r{<?XfQbg9PeVRWiF>duLYFOR1)*S_EQ!KLC~)lb0)Fm67`Pl>Rl
z?Pvqavn2*bEH~|IOwN4myIwtVl2$Bn{4YjzX-iu3i*{Sri|%;-`P}|s|FCWh^&!hs
zqh#kReD3|x`0KhmXroV$`<*$Q=Y5JB|A#9klt1w!`ly9b6{n+SL5K`M<=7bT=jW8{
zv)8lvLrw&<HKsjL4OLs at 2uqc}mUOxRQo!)h0B(M3=2rV0AwC=cBRMxmfP&5iQ?zc9
zwUrSt#`v662Ytv+XXSjF0o4aJ<EY9T%}VhPse7C3tEz=(xoff$lqV&oofh9z!ueBK
zElYyt*K6=w|HaiVell_y6-<&<a(-9A<X9`+Dsf#8?ogswbDlZtaV*~^<8JiQ|Bu2n
z8qO^|HIOCh5cu-8yy^{!gMpd<_6`?L0`z<zzdG-hjaKyDB19Zke}et4k8ZQ`7&cI3
zSG=Zec^V++ZtH8+C at Hrn%^X9{OqJK?-WdTnsf1d#l(bmiODF0Q>#-7fz3 at k?_cFkU
zxRpPaTRMF_SSqUgc*s0}r9C~b{->?6zEc2wY^1tt0Yx^X{8mdUFj#zPI;wu@&C^Pg
zzRWfnEfM2Bgp%N2v-k%<vij{oe|(MmN*dm9 at 5hrxbn_>Zc@%Z!eT~IKsnu0GlsbCl
z#El8%X0XGbm;YOZ8!A^+J)n_wMwsmXPaXC|;(trw=}Ty5qcyp5P%eJQaH5~09sPro
z#;?(@O>loIJK;oz);}$3CBP at f1rcAyA5lNf7g2r^UP=S343&~~CXzBGQUG6g+`2tU
zy<<~6(mD)_^l7K}>h=QAm3J$DA0J$lwwwYOnn^@%@b1$nWvU6Vg$y7gpxHrt6m3hg
za#jA1Sq86;2m63VXGjx<NGqlUCatgAU5Rs~LQ7^>Dapujjwd_RbvRFlx7ag4NUEIw
zwa8^5nWkDi6QMGzxHyQ%DxMz7<3DI4v3BW#3n%F2Tf+Zd)g;t at IVzl!svBa@{+${9
zEeIb2Ox8Sl;IC&@@F at HO9ZLIy7y4tL?Qydp^nOCf^>^2&m7ea38ZNNgR9FA9olm_#
z!s6L<iGS1U`f*i at t53@!opX)UEjr=!ffs;<P1BuRd-t`T<=2x#ql~<t2Qnx^!fm_9
zGH=KjG&_!|v}7peP{Aa)vcJZyS<`I`w2WyKIl2fJNZfe5XcQvPl2G)M$iha*y}7XX
zcwVi6=f!PymzKh_)Q}ehQlcuNCPIz>DRy_ovi`QMsLf1O1&t_IDxk#`W`8l3qLFtJ
zx-WLo+)Z%m=X5oU9=FSSOt`^RyN at faZ;9}bKRnTZ9dJaAFSZz&`l%c=YB9!A1pMI9
zX;r_hX-~~(#}Vsab(4r9TK1-Et~`Bs>(;|Z)NE}oEN9bnj1vY|fV=I2XYz~>NKEHH
z at MTC(v!D4%R=<y4$)x~REGnz`0(3hAQwO8&Pg)xqR{8S+OD-hUgoCpG)gyrFWzA)B
z)xqzgPLOXxgmA|&lQ|yK&1M(U3z2*O>0yG|>{Vce-j%S`lm~WWa7A|={@tCBaKuL;
zB>Zt6=|oyv)y&6^nsRNegOiCfKdu6XomS8P72jxp`9?q8_aRrVTuIK#g3ZpdiKS3o
z$l*d9rk<H;Y3&${93vy6^{LO{+TUr>D91Rz^1XnBE3Q7*ihp1tUN5$0-VidiOnedD
zN0ih{)}VhSYDMLjwV~AuQhLqFbfL=1+E+D>VI^$NMI6A&*=^&J>0^t^$puG;(1vcB
z3Pzn(XHB<;RT6;g)G~Br^>IS(a}wgn<ARM&qY{7KbQ-(L7Tb!}UEVLx&R{<dE|NuG
zEknM^S^Ka)TS9(1Sym?j{616`XZ!;v@`+}Rd$^w4+1Iit;!HLyYP9pZs&>e_hVg^G
zglR3;U%da5DH0Qteo<OjTH-3768JaM73QX<Us~ZFA>fuBq7XUGFpcF5`#hKD4~wn>
zzrF|xfz78HJ6rT`v2I7rE02+c$em6OTUOSnJzdEq9Dw~xp~!%?@#N7B2E*q}gvrZO
zm-uzRN~b?RO{?8*00$o&Xu1V$5 at ylb&tQ=KxHhqLRB88RA`6Ll)snwTMCt&qdOZ=>
zKX5d7o0Q;63#_yr($`)-&K?e|t!^tKCaoa`VoxO9mx!wp_N1%cb1;?P*r8utA=M`f
zk&CzfZswV6r3 at _D3v+YYetvhkmm9bmi#pIJ1B at 4*bFLSTg^~VDBu}i|`bLNwxjUEQ
z+H49IW-ZOg2to{hf67=+?+QKnF7zBy^!AOkVVd~7R4plB*ktuQ?XR4O1^E2r_SMKo
zT!h|sL2uAN_JUHwl|<t9pa*dzb|S62jspRT7OfNk6<3A~0UC`QbDg`=CWisIRU#@d
zKTBVy|BJ}gr)$U}GHALDiBj%~bAC6aaYpqw`TiJ2*=ds1H7nJdkZt3c8-w5cv$zHh
zDIFUTu^HR9pfptW2d9IU!c_X2v09XgsY;89TesGIC$9vwN?L~W?Wl+^2qC0j-Y+q6
z33vco^qRRcp3rI?Cd{H5&2pVFmEGrF9Qi^yLzq3eA-f=DlFV8eVCt>$oX(!l`wxE#
z*=aRf^z?ngs+cP9 at h|2sc+ at wmVFjMXsc}=DHtzXiDaixd#I6bsYCwL6$&Xa<a8S1+
zkK2~_TbB3RIAgABYqxhBUMGTTYv!_Z#50AyUft9iP=C};blS+_E5}h;6R>bhMi)7!
z+7$m;^c_iXj!;;zZxim$7pTlJUHtn+l)6g?3Fv0b>D5=y2#K2cOf>h^qjvtp?&V`{
zwmypb8k8 at Lo@S+Ia9(Ist9ZCxy^H=5`NFa90xkLCq3^;KQu<gpt{RFdB{{!96BqF0
zLP>w=s<2d+3`knJL%qXI0M|iD^8fr@=)X1+66%-#JoiMO>A$wX5SG3F(f#*ACnG{a
z%k)DI*ci+dd3WJ7^hN)d_<C7 at E|S-h#zXcMtpp<;pCr^c_?P^XqA#57Bq4odAX54p
zOjjfIyab*8wJAf^l at PC@fSdn<8R3S)dcxQjUP<DA4MC^{60ZOGUmX9xa}*8Syzm1?
z7pq95fcifue=$aY#07uFgt7}iamYW{uNG_(M10{a$Nv{21QA{svD5z-Y&cx1_d8r;
zKa6FS+O-evox5P5UiQ&{m?}yo4N1`?&(Wcro15D^3na)haH77V;#!W*2e!+%*l4Vr
zov98F4 at rsDZx4Ug??put?xPHU_}f~{-{3y*FX+7d%YzYet#0cD6xw~YhvCnkKLmji
z)aId|@#OZx;n at lzjx=|Y!*LAIlX9EyAh_OdL-zBi8gA&*9({G(7$34PP3qILd{G63
zxVpLrZwaC<uvAAyUb}XU5V!rA^1l;e5#IqJCcP-Q?(grPNJe`5KN`5Glj!iiD>8sA
zogX6z0ZmOZjS$&a3S|<yTh<TtgFYY$5;#y077$q28Y`-?c~T|=^_YM=p4V*Y at r8GH
ztIyWDt01%3u13B|x_ABZD@)6VNXsuJPl*=V+KAt_-i+f^jML%$?z2x=A0jB%=+)mz
zm5+}Ufu4&ab%ibyp!(dV!ss+m;l}H)2ZWP#8?6<SD&Pc?OHJ!uc$?RJhR<0R7_1O@
zKPD!a8ACxs1MAfG0rHGT{jGoGqi at bL&XSWm-fw(-5N3gYOZLKA3m*U*hi4*$Lw<ck
zpWJ>ytw9`e)uO?y-?k!|5T-XaHe3b}u7?{Nyo6|WVN-;Tpc7KF)W(D(Af}vqxnBO4
zeUIG+8q;tU8eE at t71V)WgLJPh&6nNOHhx)-B```z0SInm=vMbw4`lY%VBQII?5MX)
zkLSW7UfeOJ(J8+AFLZkdru^HBFg&FOm>3yX?x5 at F8u_Z4j{JgyIVK<=*zeyT*3KQ*
z4R+68l!{~XzW7*Mzq_#OLc?C7D1EMfQB`{9-zHb^kU-I-K+N#P7S23dPivxuoqmXp
zf8L336}F^wLhORK%Iks at ye|nyv3~CLWVx?9A)+ApzO2mMG%Z!x7$x?J0J!FVo2p*U
zZ9rN|Dt}Y+?#1LKyjnQ%nM?+uvAj?{xay!N(XC2ub(@nWf}qnU-=nJ7vJLNW0m(>f
z at sMgpsdO5ObS<IE>HvDJExb-qQa(&52hvNCrM+6JV9Js<+;m|o|K)lZo)U+I17BGz
z^c}rHjKKUZrts_h4k7&{(5&}2&3x?p(yi|4 at B8*19fN;0jbt{m{iXo(Q3!!Xn$iic
z6S$D7 at pC{#bT~c^N3X|8Yb!bo4{eRCE6msA`jnV;8}P-RAD5?hTd!Oc-3>JqKj-ND
z+;04Gru7X`k#M>YPq8-x$1!pS9!Z&|3#5apisMih7Ew1Fej-eqT=Ig0VAsG+hfW8_
z?-X|0Z0(CG5$;Em4o5MXqD~deH#R!x=Ay6bcj^eFb&Y+Zd&q6@=?OpbW`*ab+-YK|
z$MH45I{m1fi&!zNfW9=5v6fJ2e?s{1 at NwV`x!L)9`FDlyXG16!H*UX>qs`QQCC2iY
zmV`*yOk>mBoRDO%`4NZsJE;=2;MN3xLKHtd8uQf3t!w5urf4Y26pMUh9Q=YrDRX`G
z4*Kl;ShTVUuOPQrYZ)ZA9o{?k{>l7F&(ZLv_~-814+#g$pJOn|#}!1ARCV+82P9Wf
z(h4^+OXcKko2IvRs+86ypb{a=+swLobzhGBG70<rj9>M9Ti;`~x3^bPQ6Z^zb@`|W
z^|O33dpEY7n%Z7^G}lQzsev!l(v#cnS1y617!(^aX at ZtxD#y?O1d2Zo8f#*@4g8i~
z3s=VoIyqDK!YO8BMVP5Yj7>l6%MlAoCTrfEoDFtQlb+swnXGABixuq%EBTfD=ht-l
z>j$i_#F;Hbn1?1uX`nE&idG=3709il&wTyjcWx(n!W30eA5p^?DT!T3t9|GULM^R=
zo?MhVx{2(0T_chBlz<3J_z~4(ZUITAx9%K)Vw4e`R27|Z-rD>uTI8?cXdg_A^ZTjk
zcfa01>72tm3I98X33rXFT~0!KhPe4^^4eK?uq{u#gP*QUzNVo&F=Jf32zQ8!80ARN
zM=SS?4s?~W5D(oKk8>`9Rda{wYo|Qo5>!+NL^7UnXFLmA_w!3ZvxWC^Dc9J&w&W$s
zT>nH>(@iUqer9IMFk&H?mqQ-XdDvS54aUmUr~X-xronsKQhIuNUd%2!7C`${u+V_U
zOJ!V}1trg*dN at ZAG??A2AJ%$<#-g5bqv$r6IOO}+ at 7o<l;^N{K>$r+1Pimw+4cw3V
z$i>B-)wGF$Vd?rNqM3La2K7iih3gGbLC42GA at EpXwI3fdFE9SyB|r)S+yC?c at RY79
z;y4a?_R4yR at A2cuB4StD#tPo(_i6wi-G^!K%WhBDzn|ND5956Nna~bhJak!_ncaN9
zfjRy0E6xb1sN|YK5liZ{R64t10T`nXAjcWn&KqPGGUfbbf|cEz?9UhMpyXKvKOK{m
zXmpv3hsCG$*8Hv^9 at HM9t#e2;26QP`10$5W(#lgR(ga|cL9Ix2LPpRFBV-C=mq|io
zb)Yu13JM33)gSN$b7kn8=lLEp+SHkCyX-R^_!ZaIxH$?@Uhf;4 at A_ZGSGx8}ZqNH%
zZYw1Qis3<YeQwB)6G&NArH_vaRSSr+6M1CV{g6B|{`IP7du{H&va)!SAM<^E$n~kE
zGny%SEpHV<D at PKyytmnrKI`e~>Po{74rI4A;a_S5M!C$T1RjU!aD?6HuT~Pm?{hR-
zN%S^RP(Qv;lLe*9Tp#j0qE2Qp+pCm$b)B>DGrjP3qMZk=+)EyeWqkN9$w0_`jMTha
zdG}_ at ye|`z-3yQ6uN^-7OR5A-GUOh$ydr3FK_}mXs(tpi!}ctWQ6|6qBVf^<7V+8_
z`79 at 5VSHy2oJ#aIk}j_Kn7lfwiNdGZkCH^!2=F`R1f4S0#;+5A0)ovg=diMjxu
zx3=e+8PEf9D_ at 1*_zQdQ%7<nS#9IcakkHWHE=-!3rHtG8Iy at D%<F>83KK8)9Vq~(;
zOZFs_@~c^rjY`=YsVxMe3=&pw*pW2(0u;Z7BQ)69E`q=^Jq?I}8pQF4BjCHxLWF5o
z#HeJ_vPtWpfsgC-`{JVV(?)3vC#tQ75A1C%0gHr4qL5}bpt2_XQ;h$suXxe*N75<p
z;5J{u4NdOk9XE>i9w$)N%y_myy02u?w%=NNb(JWq(;{TZUfJXkZ$QHwuS%!kZ0{^>
z^5E!N=m0!2$b&^;FHrOShw;Sha-r+M$12Vwm|e at ETq)H#1N_=WKH1y)H+mXYZn3y=
zK8RaZn`guavvL~&y6lrL2 at cAoVSm3s_w;nZb#!9F%EVJqM2eS+WU88iGfO6XO`dq;
znm;ygf1k#E16Ez*j``!>D2NNPeS7!ztxt|xR{_nu7i1aze->6s>%TRTZg~g2O^Nx1
z-QF&4gd9Cc(X{mUXKA(2DQo^RvMDZvJM*eTEt(*!7Xk<9x_CU1z|*`J$y at H1X5?@(
zG?;zB9Bdk>Bm-tB7`;7fOSFPL^5I<2=EOYPkpJBj7y5|BY`Fa+C5_ at Hq7}h)itY?m
zT+Ag={2Czm$TxFpJ_H`P$Aj5t5+>|sBrFp6ttMG!WMt?E+SXhm4<n=^{A!yV+h5*e
zb`_%z<yDfO{Dj^A?(Uo~E$)jpPnQlL4(NmqJhKknraXD-z$O!A6#>5*K at W`_WE=Ff
zmt|p at Zy96*{wyA)wN(cwX3 at Ril#U|w at k?(`1%vLt5tovydxc<?X5}b-VeXLbs{(-0
z at tG}=xoB0oTFz_0unIBroN?=~_3|7;@5}7#GA)>R=4<Qk&|Pad at sGO$tQ?It6Uv0T
z4N0~wt&#+(^&+T*M5$HOcV_mNC_ekMMTW3B5g<O<kyGvN*VMg9GI00-on|e)9x3V&
zg*dC#CiQLe&s<-0d$Gz&o7>b$7EwZPyUFRoM$x~a2Pk<<d;aR=!+XEyb`dE&_?W>K
zp-7AKx+T^bwr=;jOqi1@?yvl;x8(vYQKTUhvL3>HnOoAlK&z+0Cl0x{=jZIdu at zFW
zYl2+Bb+;pLaC!i$w=Srm45>${#G>Xsnj1W$toi#=1^&+6Pfx0DUjm+nJe|4sNBGBU
z57f2PJ!Iru*3ByEc)d^Jqrk7Lhk;k;z&LgegH@;LI;M5uftz1bJD%UC=-<0yn#i+L
z`xdUyA9}w|L}KjH71-jj;_BU-H!#ch7iwXPDZhzYvTy~Q7n$N75Akcv4ji@`srV2a
z%+7|QY82%#qaa;CDT5zoX0L>VhP5u1NLNoy8D036{6`y}+jDgi6w at p$gTJs^=^KrF
zuAjPwGN|n*gFn<UJ%}%{jBhNmBct@$z&sM_%gkL0AXQ1e!mdIH{c$vXM9i%w!)S6;
zCIvvnHZK$=RdpMvMO6-7gZTU1d1oFwL%Ud*-Y?p?zxJGx&4VVg;F6}k$YIxuoXJNh
zSlh-Ym%e1;kGpP+E%3M?>4~AxWr|L)n49d2F&`}^7GeQqB?(NC4Z!T|+2SnOZt3zF
zp3{3MS}A3;0v4$vO`s}H04$ij!^i>g2lUrQ>@5S3`*I^1gQRYnBz!%9w&B2Gq02XO
z)p&5lSSss55pl at yYf$ETD@<<5o7_-f>6ev8wB?8U1BVME36%Cn!1mUrvUbwTffnHI
z$hqR_#oUuHQLbtO7HCE%ko5j&^;Fglq5nhPSN_$}Wa~EW8r&^F2*KSGoZwDyC%C(8
z0>L$cYw+L}+}$C#yL)iI&HK*GIrq%D^AFtq at c}k_ at 2={qWzVx}tpYI9)%uo!Z<wT~
zxyB8p2 at 2GOS#{*SQ7bk#Esfe`cZUHy)2R)+LKVei^GS)6El$uZV1Pw6nMMPEuFZRQ
zJg0bVrFaBj|D?~9tn%fh0u6RZ&pH7S5d(E;iW6pxB<<Js>rIsFgAIi1u4pp+v*oa}
z^>zCs9{ZpkL#|{4wnPK2_o68WwJ9=`scDeq at i4a~PZ+bW6JD!?Dd|#K12?EVM|p^6
z at 9f@{j>AUXVckpX9ToR9S1Qara)*Qn--CeMnZv5C6!t+;C%BN$ia^;Z^cCtwN>90{
zU0;XQReCz)9=)|=FlM<9>HthA8ZA$?u$Xxr!14CQ%={?iFc<;Q>C#3+oAKa)l}!~F
z?T{zozr-UVx->@qNU}HwDGsjonnNSS{T*ko&v~}T+o%GcHoxqSBB|iU;JK;xv)>#l
ztv%6)e?y7P5v*$Q3iUF$)%AK`xB}(kVt!PqOS{GB7?}9vSB(l7FD(>u5-kc5hQWOx
z>N*B7*)5Tj%yP9EjU(wiXh`=w0^nqd8-#f#fDyfz4Fx#u!_kcyDJ`+j2r3=k*6xh#
zZ*r%twdMWsLbweE8$s;Qf$IwTvH3OX6u?5>{jm#I;35?ui$NA2>~P?FM<Jie8%2sr
z0=va>z4?m7+pFdtz3p}}FD4Gkpu~-0>$W at +482spD#NsjQBi`y(CKQ+kIWTJ at boT5
zXFM!`vKg-}?7!Z!6!vsmhF at 7(8P><cly?951apHh=!_73fnB(r+4mIX#{ZPN<&N~=
zlJ;Cdud}qv4TJDaq&-LV%7~x0E<8ji4=bfD)WN~scAKBpeu3FuiKL!Ur1zsv16P!$
zz$<y^wa)7UM(j{nGxMHRjxB&f`%zh*2K#v}WnOG!7;kI${PBvDOYIpBg0~i42p|DS
zdW+MEW0w2y`F_1XLknifkrJ6PFRWGAek`__ at j!(!zxrXg&nhdIDk<8b?kz;K;l!9N
z*zB^i<H}(z$k0({x&57Bx2?S6u3RPU!QK4G#~=466 at A=J583V{E4drJfj$?1Fs~X`
zMP~HpSlY$OhN~=T5rUqFI=73^rVZ3V>#LNpQ2LR^(&+V8Le#M3rFX!nmJQI`Xg+G>
z_M^{M=^J})dCNwAuupIq?&CXAxACvF8AQ<D4$dU&8cb|o{S=Rd*%BKYWx-Rr#VkPW
z`;?|PHA4JUA}zY)!D1q{!~uV#upJOjV&4u%rnDU`A|x&aXnEJ!5%2BSWb(^_faC}1
zFTl#+AgY;}S&S6TM$SR6xqEZ(-4hMsj1U`jUY5L_nHju_iV6V<iK=&ABKf+BBaRoh
z{R&rOs39(WL?{Lx`Y}sV+G=al3Dg&F+uX%gI at d;z9VZ>Z7X2NMQL^t)Mk_v*0Fd{4
z$D0lT_}aG+Q%LPIo{*UMmMu~2dSj%`fg}n;Vf$BlY8Tk=7-ZPLN)KJ<I2P`M7>0qp
zeav$>DYaub4S7L1sW@$oXxHDgCj%v7m~a$|MH?AfIWsp3NnIOk`)xw4y~*)e&kJpy
zcy#n6&Jp(W4{u9AGpBLu9nX1pG7oD^LwwR64xQMp*4%^IjUuD}mQ6cjD=E>j(~)p3
z+{Hyhn|vsnqvaLpAyn-eKrs>!eQQudaOSHZr%ng0tWckT5s6B`k?>|t5ZI(_1*w1d
zuCi5<R`%CG#%uvRWQzpA38q5%*g0xxY>v(aYUjQi3C_#-)bqZM&ykmxYZt8SLB2zM
zA~aXjd|#&?{L?|`?=O7fH8wCcecYY+h$(S9VmK1#d1F at GqD8Rga3aesA#v+qGJ<#d
zz%&$s8r}rs#+l{C5~%pZ+t^f0c5&fl&j|(|;3|T#ZFOE=9_#GBx<Jar;VtZ|>_4>d
z4hXbidF;HQA{3C_-Q6Ga((iYjp2|~=6auDCR{NMo$Hx3y9(Mh at f+^Vf=zb%n`ii=@
zy02q4?;Up4Mf;&et(UD9kFd@<Nx8>-bY3l7((|6Xck&3C9E&R4nPCQ+Sg}}gnbNWK
zx|<E@<b5}Tk1MYN5fae6Sd(P8pju5FW#J*%3t#(7xrnniL?}dnm at 3C_JDsi$cnc47
zLOmd+mYFuPDJ}F(6jBXkU`rL7%H!Y*z at +A#N{GS`5&c?koKUlq2g1;P3jxE&xJ&%C
zE>Aa~y1+KVdz;@|SBvYMB_x9EJ)h)HAN)UN2Rk0)GHPtTE9WieUXBwa&uX}PpTh4Z
zf0F1#kka3O9J5rhPr(N-y2Img64eZ2-vuo))@MR8CI!1{4_of8?3Ap@@kxp!cR#?E
z4NsJVXuvNxJ$L=&SMAt_^|xazokw at VyO%7kH&nL|f+sF6nS}$vOn$;a%#yJgX?`Yb
z9*O_NSDd}UV8G3Ad7eK(Yu<Imy~Uk7X$RjwV~5mkeI?E2Ig)HXf`uO;8AN+1E|q+U
z)8*kz062mHluCH=f=g$68f<Ad5Us*2OG-=YmSqSick(j5=59!MYsBY2xW*_n`$nX-
zX<H&T at eOM8+9^+oZUZe$tK*yVvgDu<8;zluUVnDZwe!($JhE;?X|#n#O%B_XI<;Kk
zv$Iw|mrx`)xMVthF1@=0m1wscrW_56pkSm4TWCn0^pPoLYY+Fy?g=N&S82nLG9 at 5r
ze0*Gr=7)PvZ`%$}bYOzSOIi at __$U)B)T2G0h$JGG;d<><fRTg;khIHV#UXu6=_1yi
zeOPYYrF6}(#Y;b41pVLC9V|P2+Tmk-3f)*TH&IEqABJ~IU6`|$o8QTJ)A6sgd-zxp
z449mu!S;DGecd|mHs7%t8r6Erp@@1{?g%$C+u^N1XJyATLPK8nDe>U6Ov at Qzh=Z6<
z3F$Mw_Zk_f=pW9BmCDYnHswn0N)gD?!TZ?ds^!3=bHhFizCQN_7Fa)ZSE9RtGf{cP
z$Y{nw?I#={>k3t%iihHjed?|g<imKK3_k6N2^^zx0(f|MnXN891Ss=Zc{+O+6WGjH
zELmAu%9o(S0I^5PR(_RjM$5{{`T6ve at W#jc_ao at V=``{A6FMkIcTV8s=3 at U5qyFuM
zoI}~Y>kRz at 1djKvd6WyjrNo`<wSrCB>LQehln1}N8yG-9{U&b7l-fGciG%&|&@183
zZ_J>J<#rt+H-XZ+y1i at _ANn|P(26+UUQW<LwSM2Axwm;^U$<!S at r>%j&LX(+620-C
zvk^X&gNguz at feT*c{w>lOH1UhU%&qO@*n^X^ZJ})ZOygrFpou$bb2A}!TWHIGa@=V
ztEENX$tUySWzYI)<JF!tAUCJ?DN31H;A2x&6sc=r&^Kj1>m}<Czg?BJvPTYn9dK=S
zbMx|sK0f+BvlRtK|3phcudpue*$Dl`@MI&ugc3ngEbsyE;!$Agnrx&F)2iK9id{HB
z-`4ARrqSb8xL+;%Jlr?p{{gMVv=8qx0%xFOac8s}5gD0TQ&Y3^2%^Vd9B~JZ)dy6D
zADfz*{(_IY{-5wMh-PQh>!u|nh;R^nhgwPf)7cpaLg&kUY~TI|<omBlfb}j8j*cW~
zzm7E!fU^vGo=uFJC8wea40qr9`g*PB1;f4X)0eZKG%XEX#>U1w`}@?-oEU?;o7<J{
zMf6$@v`E8Z)X|Y`Q at Fz4YzXo{P7sM^Vs`iRTrk0dNVOr at z5DvQwoxZ+mSbiF{GM9J
zO=OUL;F#9n2l)eyB)#eyjL+|C-A}3h0^ZBtWnzLY{mz*rW<O|ZwkEQhZ|M1K-d>-s
zgOrIUe)``m6Ijvsui^z}Y=m_+gNx_ndLZp^B?S!uZ$Lmy-0^%zkUD5+#<0eY{%0;g
zOx75^grp=`tf1knL1j0-U%}>Msw#e-d}{l_0VBvj{EcEe*DTVhBR?Iu@`IE`v$aGg
z=6}&q;8AA^iiHKRc_2tJbZno2X!#%A-Qi(*?~6$d9)~s9n@*(ri&DR?X??%Q-QABS
zm0Ew(BE;bM at PEb~zi4P^z(W2U2X_ziHz%j{@tFsqg?eV|7MT_sJzj)|hiif}2T2dG
zuV74{iEVPJehYfqwgZS;&nJyIUV)hg;D10egSkU^??Dpe8wQ>acl}Q={S%0{UH;OB
zjsz1F+-O=hkGi_VKly?5m2<ol*f<5O+P&u3ZdlW?>YO=5Eapfk0PJsq!2P8wxzRud
zBdF_5|BDrTKMHb7#|bZ2#G9p8qCp8fqS{3Qn&i~&N$6$_dVRR~vGm|E+P?F{*GwW7
z4zz4=80qozL<P{PcVG5V9MHbdd7NPjNtLCY4*M6k at HbCfu=g7UkeIUu;ZBJ{lr~M}
zdm;Ez?fa$Gu?Nap$DT2h4Fmh at xD<)s$FMzwt8Y+%TZ0WA9`93AOny)`;{J>J_?zrh
zp3K1jP=CaNp5{TwMsawD4QIQ7%Rq+#H3-zvX3eOKhDewvHx3`$1{RFLDHN(e443Gy
z6UgNYwGNalAYDtJ^38aS?6rr=>OQPgA at 35Sn$-&UR`C`)j)+x8E(%9o(h^6&XV&}}
zvkst3fhE7n95V at g%a}E0 at tL`Mz?3zli5SHGz(f_DAOr0egA$onS#1-Dc^%ME?0o>s
znz7L~DvQ>^iMU7SgKa{>(pTC-lya*1eKee2lRt~b|HgMZLqS-XWl0dSI<y_<6H286
zwP<;gbjq~FG^b|5Xhu4=IoLZwhAfcI+i2UFlPi&;B)*n470azJeq!ZF?DUc2s?~`i
zQC*j{uU#n9hE157!Gi~rr+EU;Wh2o!cx|X=DqDr|AeCdtS+#aqi=XY;&}+2l-)D8e
z)uc4z`qM<`_fT$_R{iKZ4C=7_c6QnAeiG|SDVPN(XUm;*fLHF8jelxDOe9`r!J)ls
z?-k2f(X=GuFH5^D_$;2_{{An%`#nBDfDdF83o0AU^XQnNlbD+Yb<&QRv42`e1=D*0
zgDh?LW4$u*ow{vwnoZ|>IWQ^0()c;{r43$q!Maib0pEudc1P#K@?P{ymt%4Ysv^qs
zVO>q_fR!7XqzIA-c?U%M1q76ywmtOzd4wd{6&`8<)>m98-lsa&#gXuYK)1KNeG1ay
zn2rZ2Jl at WY;TjK57iDWs4Hy`1{Qmb5D*zS_2prRNS%$D3N+7uCo|mS3Bh*@}zk|DT
zBDU(3)anrVC!10)Z)SbOBxu&;Q=c`S*Jfx(0Io;Ziitnz2=&p6<u-f`oAr}0NMwML
z%slumnsX_RIl(ZSS%LdBb)Lh>Kfj<?Ui?z)!8?1k43!W8H at 39)sd$X4$MDPVXfLOZ
zv>Ucx&%<N;m)-dXf36mv2E<hUvOpb>3+pf|MvQ}oEYW+*Q}YC<_|jznu#shR)@9Pa
z_*cs2$M6(K;*v2ACIERTph?~#zZ}k$*N2}3oj+;r6VdKxL+-F+<SLH#v58M{v|ysn
z&lR1NKH)8=zK-NKkznStPJiY&1EA^X1^OaP9sfqw at 3JFFk-SldQmwmZpvV7+zmm}v
zS$iHO6rg*w+H)pw&lJux$PMB|Ih2hy2c7t<TpS-#5osqk^HG66tQZj_2v+YCq^XfL
zjHwrz=_dq{Um950ja-bP)DA)e5%0mO4X=#O_+<ZJ8bFy<hz531HvPdgh5}?nA at 6M!
z!1Mvrzvx|QfJaz3`t;O6r`{Q9)gFXfo<ST?L3rqcFM#F@<WQ#XTuC5$K#U~Y41;`z
zA!KM0-j4#XOGYs(M at Z(U5Gl5|%3{f$J`iab3I3HU;qW_(w$oh*0~}>EfQg1z<@tc<
zu5HL^zfvm!d)BW+0C=hbiaP~#O*PR0i-&Jnb^_j~m}K{n$JcB|sMl%>5*%4#)1f-F
z;Ui`&n!fPbAzZx_-<*k<qP>QOa$orE2?cm|AxR#*A%lh1<0)RlH2MnD#={IF{k0g$
z=Fs=PY2tDKV2lB4Y}ozHlxHk)>pjoud1 at 6)dgz#n%wW=yfRR6!W at L(hwOUf&^dZ>P
zL%Mz6Qq|g+g?|MfDs|)|w7Cfw=27oCu~*)Nv9Q=(Ge at _B>7F~{+Z>K84S~`U*X{s%
zxRMfC^89NIQ}n7i)86gSt}#n?)_J0_8Tz3Q){@^8+Q&`QvQ61GX`xoL^sw|~*m1er
znTBz!&&1l!lxnjR10v- at zAxzcm5I=Pjc at tud<`rloB#DsCooy!1Md&3W}zRRbZS4u
zsQke-Y6{PM4SXYsmVl)v3bkx}q3FyOrO6SdDWGLmFWqUx+G+G*<#;MJq6afl0&9d=
zUB_ZRfkc~)Ofn^snvgk39gL|3 at J712vehCFpI7-GSuM^3KltcCKlnR!{nkG9PdAWm
z*U{<Bc^`ky)LjAmRq0Dl=pSNktEIXPN>Y`h*tEBg*oFL0)q%{R|7PdG?3vv-aTj^e
zw!W5h9-5X^J<gV?CYeM1zw>$iKmD4OA-L?X;~;h!qCjWw<9m9EQxsH9V$1TJ^y6&)
z|9GU9a4 at ZKolFR;XE%QiFalWw-Bi444p2Rt at 3BcqNj=b`hE?C7ze;CrIS_HD)oyaO
z3yAALqkT5(M-e+oV27h6>F<`jRfPX76{A=Y;E9&<6S`KJiw at l<!ep8Br{h7_ff7F5
zSBNc;peR5GPgy<IXN4J at a^)BC>B}0MxD%|}YhK#B!>aUsp4V at Mmg$jT at ir}RX$YC=
zWsxx2{TcUs$G8R=y)*oA0zxuId!NCT{u7oGS+&jhFMW2feMHBt`ongIMrO#Xt7U67
zTmo#L$_r at vOUQl+J%0k-IJZ~9g^%mgYOLnXF0<O}4IT}ZzrC}@g})#yDS*ePjvL|D
zGZ;%@1m!i}HjBfnR*_c24Z&s;&yz2(_i6K=o4l@!j+gY;bLvT8y at eC%FGMP`t~Vas
zPLCSMDK$|90d_+Uavlf_(c_5;f|+w|CizEx2n at p9pXl;jwjI8uh;>rqwdIc~y!HTs
zJo<7oG-!%{v#EXr2t)_`VR%lC>Kga=*HrP*Nq8Vz%s<`N<B`@|{b4LnrZ0s}`frMd
zB2vchQw8l;fF;2twIyNt+1tUu(<AVsD%rM@!%g8Z2*clQv^`NiQ1;X%{hi3Qv1#^9
zhHpZ(e*Spg4`GJT00vln?j)}qX6zVu;wcSSTy^V&VSr^cGn{2%I^QSx=!rtcfGCB_
zwK}>zMGcK$x- at sB<8<SJ_^#GIx05f8kGu!IS0sT=rK?%`$K55Q4fbpa?`XZT`P00R
z8hjtnmu at c5CnhH|OOB8ZJhxRg?2QZV9g~nSRtA{Qf?3_1!RiFe{47Zf<a}{10d*{&
zFfd3&&Jqn78JQ@)_EDs!v}asppV<G2t>F`-dp&Bz7i2%%gon3cBLs09*<?~@*Jz)B
zi8+6o^;%As_`<P#6&?0u at b!vGZ^`;*(!Dcz|NE$Jbl{O^G|zf0(=;{d!fP}M{!5am
zI*S8dHthx$r^X3Sp4{Do%Y^R9$h_{!?~8Dgt}e>8I-z}z+`0Q+`eGZ*{14&eru1p0
z=lMD&W+t64Vh#UvoQcIqUCCz+-i*{tmo=uezMa;0)1xOGN!ORAl9A)TD--RIfQB%;
zmNhm;3<bQ<Nts`+_DZ(W)YA)6Ca2t6+EqARY<g&Xa?|xOM;i!DO at 2aep?mO71(yjV
z^Cev8BY+hXmt$b%CfV)~vBeR0E}1)D_)g~jfLI5x5O`=8+Lk6Q5i>vls@{^@H at 1Kc
zte6g+XlfdG4ijk`YrRmxqHn1e0z#ZEpXCS8aI_IZA3yelH&8E*j3E}?-sQ1IC%X!u
z13L4*OHMmo^6+4P_ZbgLJ at Pr11A)Pi{Lioz(PZ<naN9)RhETEBW at OA>C at 37@C*^(+
zbA8#CMT%`Tqnfrx(kgxiBvzA5+^TF$#g#Yy3c&Z`EwT}kAQthldto&zNq=M=RuNww
z=M%Vn3upfboow~`emfMms7RnQ+?6<*n|)@XQ2S~s{g|@hSNnddX4}^Ai~Y}1UMU at O
z9i${UPU;O)T;D^*gq|fsjYFB?XE*f&TUY&h9v|7u>-%|l_`wSsoJvBR^y$-UC2$Ue
z0(SZ<9;aAS*i=b2rfBmBKMv0L9IdoSG?(FQ1k at ZgSx0mSeq5h-^8LDE36S(cnDMX}
znXYS^e+u8>0Y-0yICEY_rKhh`)NF-VAlU2mm>I!!dCnh>oNa45K((?9EcsgaD401S
ze;b00(`W=TG=z;#+yv&_D=I%;EcSoE^BQp}jB;(-o6*sJ%N1YQa;CwiSmX;2ahm4Q
z?Ayp#s$|v$b>s6 at GlU4pt6!l5%@2<S+aN3JeSvoF1ROi74n!Gm+MQ-q0_MnN at k1q9
za2YDg*jCqaluoUNbInNixi2hSe<t8gU&p(SLD^STQ}icxKfdO+aE5N}I-~|j4?u)A
zeQ4#hM)YX<FvJ!2OyvQxcB$#tNB$am6b49oWq1#_4$FJ095b&}_T~p3b{$=9D{mO#
znI=|OYKl8jUnbIBmpO0j=ZczOn^VX5S5srY&FfO1Whm};faRki1KzgzTO;!!zUDd=
zF$YO8S|+=9R#r2!-t@`|(`7gLAzR|a{I3V3LN2TH>DTT#tzU}^^oQYp8G_NN?N?Y)
za=?&@YPmQ0<{2#v#vZ#|Rvh^h2Fv|XaBfWUWX2vIgc#)M1}8cr+Zs;tdVK=#E+9{*
zCY!5VmzOvuU8hEiL8{TP*`Bu{BM+g2wBOdy*?y$hT%d{&_b1VN*}UlL5w{L|5^mnK
zw;%x$`199g?S9NoI4JvtNhX>yGMl&684&X$-QA%;h|hT+cA+8oJTtN(IsCuMYia^y
z+s|{jLCmG+_9nv at A#F>&$k(?qkK%Q|pSR<fN-1aMLU1F~R$Uk*eeW_!O{449hcaC0
z6NNAi2scrKSA&fNU|&)12AuRvFP}rVGN(E8x?MI=3toQ#>}_Az0L4BpX5<X#j<?NH
zw|nUHi?!3k)zR$`dM^0(dWzGez|tJ@%(E<|YB)-t#;;W#_2HLFcd8jP5nxmFX1Z%%
zqwC=UYxkeO8#({Eri_b^FVCB0Hgb6xzPX7jV3&RxANpOA<*C~*m!a3h&EC-=O7IM>
z=XO)CamO^w-MGCig6em(KR*9!^|>#EpRaccY!@~BZhK{NpqVm?c&3Zjn86Mtv<Wz4
zXaEF7ps(1#gV&#~Ue~wWRx<y*5dvmR|0W&HSIk`cel#%dr;(9n*sEjruAWl>Yg!1O
zr6<g~A)h+_G(_3z>^P~jqo=GHd3fKwwlQLp6K>nW*gVoNT5~z)_61E)cHI(uBn%+<
zrjjnM(cae&$pdIj8?pI*=X%!a(6LQYb{YD-2>uVgw~aOTm2{d~dfi)ZEA#a9T(q?H
zx*c6Hw#}y6qOu}sAwu>NNWL at wrZqo5wzET*=`gLMl&1TQ+vBgmf-OF)e?>kFrogTI
z+9TEIO!G5?XZIBb=_Xcg?%>2(IGpgUQ^Eu77EZTO0io_w2b5G_U^KmK`re9sW*^J;
z(QM at b{r2$v8UzyW at 0WE=(rN(A2$WF)>ETj!ogd&6t2v8I*`~HA=SN10T6WGXJ_XOr
zdNH`d;$V41H|`rX<JimxmY at J7h8{PR9Ogjp4T?z-pIZwH at 6+<uK8)+)U1N!+5?$lH
zWZCJD9u$ISs0k_(6}NLC?TsZc>@H?thOylmQ`g+KeU{>r?i8!s2%477 at 2HO8AzPN3
zTo(wXQ_1mCReRd{P~G%t_%`DH!s7E&o_0-J6D!QpD_!q8%bW42-3sArAptn3cWWBF
z3x#CPwP4B?$D;#oAB5lEq#b{Z7XS>d>J-RdmZi){h+Z3ZHI9Ij<0NaU{k?q^h at k|!
zNxk4 at n~Vjd6djQQuuE&Z_)SW__`tbc%N`Vj`GfAOw?0$A!4hn?uI^!EvlSUdc`YPI
zcC5O4xt&V^#zn7k`5+!z;PVi5)NYg;e({;`GPz^RTc(c%Gjnq-=g><Ua1b-G*2}YB
z?$X+A9XjZ|<776*cVpB7WA11p9Ju|i!yiyAJv`79E-IJe`G8uUo|~J`?yuHj>2f`x
z42Dw~e3T?F`GA!(_UR_i(&uoaA!{u2Q^=g&>v#ApELVX~geE6CPu*U=*6AzK4hR_R
zukla^NmJaRTNlQefczpu58eR$ZPAtKH&frIfKI|+8t!8Eb#y=#^=UA4>-M63_1)dj
zPq`5v_=~&vO`DN={gks~hY?SgRI91YAtx{C7|E$7GDELBtZ#HUP}f3Wc6|hR4Ss|L
z=nB0M0sk}ZVBJ@(3K>lvk@!)Ie(!Uz`xW#r^aKE)-fu~)ea^y|$mz_<C{ie>;Il4Z
zV?E4 at vNtq5^r2_=!0ZW8WdEM<?&(pjDro6=i(`tGg8wM^;m3_w(RxSLag|YA-Von1
zbCN>YjXeV0As?A(1wEgh(0SfG)m(sN1S4IFk}Lkq0FyCq`5R at 3#tJIli3}7I-#dW0
z%E+!W5HvbcPBH?HP at SHvua#4W|H4}_B-TYfe{Bl(UYtA#1MKg&VYY9>mu{52?h$7t
z6%L%{U96dyjZL*(0w`mLlO1w>lTNHm5e^N<>}oXEp;}8mA9a#f#gPmBn$mPWvONCe
z_3#5~B+baQ&WpX2R)4%y0oh(b7=7>RE6kEx7(1WJ=9TJR8WyAkN57KEir=E<#s!0%
zzvcUg;=)4bQuzGh$aDb)2C$dU0JnhxheMM4t)FM&JhWwEuNoQoMgaMx%Ma6-*x1-b
zGircGYw<nUT-1D7_)He=7Z;qzpZ2E9^j8Q8+Af=uzlu^_9zuOivl!yc7WmI at x7C$u
z+E1fm6R#SkSCZdn%sDR8so3xWD;#F#xg;keu}l2tzT8={-nJz}l@*~)J<;Vg8lCb?
zR^ko<o>acl_*STI=qh;J^@1<&0gM;k>`^aL4EfurAHx*VM91|En9WO3at=@bsB?wq
zr(3xH5UApYBE$lin9WaTT$XW9M6k;fZu&(JNb^S<^c0g3l8wf0Yy^Bxp%rk-Lwl2`
z`oR=ms#qb^NH|<r4mNJ_3J&`cH at gbh8RA!h3%nw_;~7Fr673PAu22F_a_YWE;rI-$
zow>5Jf at q@S`gY~rP>@7PWHRBUj- at 3s(3}e3Bs*-Rajfbj+bI-hmEaYlal%831lu`v
z<&9S1D-Nc9n|2-DZ(8ytxg>3&<}&d(*X#<tB$+2%azhweLKJawieFe#v7lpC#32ql
zkuy7}7n)OXSmP;K$kG)N5&-fkX)pAH`M)uWq_4a$&J`2a1)I(}%fZxHU<##2sA at Hs
z5I(y?ZUcY0LU;glYXiA+qx&W7CUZ09$}x&SiGcXS#YHo$^V}Pb=;$%)D at up0Q}rhr
z9WS(2wJNBpWH}P<Cj3ic&lamG3oHoLZL29#k*O0;{(gzdh~9w~GqoA=h`-d6jg>+X
zKH)eSgF=_l at wR(Kstc+1z~S2#7X7d(9YAq at z%>UjkD1qT(rF1=b84`iYok6r!_7B}
z^}Kue2YMttxx|Z(Z9YHzu4zVVKP-mgc@>Uwy91E7XI=odc_?KU>H9bL39tBErCTgM
z06iZNxL$9~9C6+cE0lfJ-8~Z=6Mm at Xwz+iOl}U!sOr7kMQ?HdaoBPjhZkn2qnH`>M
z=Lvgx7iuXEGjdlNJ(U+0ay31Kv at M_Vc=<0RW!-PW{=(?IAiMaW*B7$rQ)lXy#>eG1
zR<_8A?&vk*&~WA1tmhK~u)IQ9q3c704?u)9!G}f7?SJ7_FgXeR<&@{kE;JFf?s(bU
z3uaCxEqFpg!r4VOXvo*eCU}UObn(N>$AO`VFJ7tj+8N2GH*j- at Tyr+Z_!VbPzJq7@
zH{njchc`PdTP-tMZGZaFhoN**Y8+gr@(wa5g(U9|tc$$9g06w??~CD^fbH9*@tb>J
zp>~pi?LX|^^y8-&e$#r7cYAC1B-;<o0g|r`Pu#q{q?SW1T2pU%nXOvu$me(nBx_dP
z){>zij*TWyjY at Aj&EK^GGH9nx#h*-g5YuViexd1YqeuRk$WSCIElGLj9YcfkWkZw#
zM^cNuXg$Xo6^guNYWpiz)V8~7nw~f#fd~bGcypP58KXbkm;3_WK+(5>S;V77PVFH*
zSuvz8is&u`^<gHx=Kk-c<FF!37EMDgKYk}^htir*c}IaG{&usqOsS8G9sx6qHa6^Y
z(Jy$ak6{#`i`Ve|*}<a%+$AS?mwG&D11?@$PdTXEVtPLsdBF{Y+C<~ff^ZrY?*--H
zjhoVjTksqS;Cg&1>$uMqkw^>!VeN7$QfE;y_nA?2A at GDV98p~baE4k9g)ARr(P3BE
zqwm)83E^e>GR%|8ah4z at uVNaarC9~k)?5kowl(o2a*iByqSlGc34@@Tk`7gZBJMMx
zigAvUu}Nh$XdizlfU)D04QOUwgBgUc_eD?YE_s4wkAN$4Qwnfg^(jJuyiZJF_eY~1
zq;-R$0+Yvvn#%<BXvSMUP$Er9pJ`e(iWEg(z5&vhKgo1J4D&<6=-WhoqQ0cnrYKfq
zH<&;Ufek<mTFd9^M at +J3i3_$R$hQ?^Y|STmg~%hK!=@oppd;R7(!pPBm`?rq_b4h%
zwQ_$+mU4jM1ZI5dlN%tYPm(ky!e{WQkKQg={hek}z)m<G3845+nKv-AFy!JC>v?n9
zuz;HrJUI9JySUJ^{l244I-{fh!~aodF^Ki78Dt_-DyWvfn4-bGIFT0WW#cx-S>}!c
z6_Q+=J;!IqA(5;vzg9D-UtTM!Ws+I4kk~Uf8Xiv-dO(XH&HhYuT at Ya~$Ypt5a_J5u
zG6WqMd!Ol&?#O14dNv`TAGTJu&jTWeY!&ks|9p<&-p?T8l_bZug2aZ~@7m|*)l>v!
zK|tRHgIA@((E$&Mpu|KJiGx85dWZP=6Jn6Km>zGmJB>x&Qy9)_>SFDM7VGp24(ADU
z3<vl8w{AeIYL4M#8!>PjQ#xyE9r%*03Ev5(wf4tF+$sPWdpA_C at X}O*yW1L|?<wYl
zkpo-RK5xFrzc-&$eMRpxGU^Q0eR?zz^QDU{oM$n!MFwu$wNxh=7{0S{eK90nfm601
zK&K#(6~&(}{LJwqmi~7?W&bWBv_D|POV*b6ecaX4R>-b+1Rtx1crzP~V4rru3A)`E
zh at p(Zp^$eHL*G)>@EW{x2K%qn;`E2PPGDjr2+!N+k%oKzJ)EKcG at KG*APLK1X{$p*
zO>Cop7;n_r5py+z6pMg)QZX#~DIPP54hv=83YsAjzJk(>6eH-9t5#bPHFS(5ani*;
z0zhaS6F}MfMOT3gS5tJ*{CPL=>_K}D56NVUAimXd%;B^8%N0FJcy>fV9;<}$5AU<n
zOg@$(Oc=W?y}k!ZoK-Y{>h3R$<Zn;XpLxXBlABFB8kvqSom|inEF}rO10QngJ;|4b
zJW#UUtVm)yWM2eDZ~_mh0PTw+&rZE$g+b}I#!#1a?T*g)NbGOzVTnVh`n>{=RAyI}
zt$kGaN7M9wI(C0a-2b*yJfT)LWeX?m-8Dr!_G_0Q>V=uPAJu=B4G<Ao1_$SVj66Ns
zhXlS%jUTT;4}#LQ6PZT%UXZ2E-)UH^Ao%QTABFs<Db51`olz1M7yc=)D>m(O6#DG+
zfB~tl*2XimUoZTF*N=^=<!kq(4FUTV9<ay21*VPs<|RRoICy?{gZ_V7$D=oYhqh-N
z&-MZV>2LS{IRxlEYLNTzk8mL6`73TIpeS}9!v0-Yf&dCostFUvpY1%DCZU0Mlk$ui
zM_UZ1NAw<NJAkcnpHX}8%HL>o`e!ZxTi$<|_cO-)e98Z(+5Y#@fidF$DmUQP0bRvd
z-bfH|108i|)7TLZBj0 at t*}CrwxtAx>s4*P;Yrj)dI}t&(_C3=M{Z#4CChq}j=;kZd
zO)5u;ZASv--^kt8^K<&2sw>Ok{_$v$zXD^%)@X3y8!Z~ZSsiH2 at He9pnxg#qk?gqC
zN)6`^91ikgT(GiGqgWyzgAAFBT0^%d*su&v)zWj>$r2aNBgavC8I5__!&a at 2k}#T*
zD3UU*|3|i-xi*4!@ec}pWxH#k9~iHzuck`0?L5(B^x86ghqm=p^uJGZZ}^-;5&ka|
z7^C;~yE-EEy+4(l*mueQ8D>6`7V9ID`;%esf)9MPCst&|#$6punsmYW@|LB$R{G0>
zR#fJ#-ikkzT<Gl8VL82}aeM(~H-ToAedGnlfa+~pR%iD6DYvRWXdRGD4J?$I$5@&>
zCwetc=7$_H0)lXziqx+M9rNaqGI$j@@1%)Wy^Dcv0;<ng89O}NdOz%bQ<A?c_|vpk
zc=az^_TMF|<FBWAf6{^Be)H$$@bIwCn9*YTa(s8wlgsp#sMQnLRo33sH7K50e=V5Y
zmtZb#{-j7A8Bnh at Wa(Z($y1yh?5%{CnMDki at yDsUQp706K`=&Ljbu2NfJw^bJz!H3
zCt4GN*T3iU*MyNK4`7}mAN{`0mVnceJrWdeM}U?cKyoQw at sgu+#0B(FVmjtccDJaZ
zE<V70elN)vH5&}`;BY0!+|!nT(ci1&LoE>+<#aUD-SZQNJ-sy9eW~|<lY^j}hrD#(
zcJOfTsAYA at o5^$VuZl+(U$Tp9wSn}i#i`4h4{sVhFOY>F&d0xZ58jQ60U3I4Ls(h#
z2id<Arl3MtgH&^%vXmq=FDVH^DR$N~r2oLh3~J~qQlv+;(oy~P_D4i!2*!wXB&uMJ
z&=CrU5Y}y>7-qE_en$e<eOA8*InzU=7{c9q>8O^WrEvRuyF}H`jVQk0+N_Fvf};uv
zGQpzU7N!5S`pGF+X3i4hD|E;<!xXFT8w%{I(#YJ(ka~zJ+N>tx7YhZ7FJf$r{x{Zu
zd-WeLxzgO5rbdx)b&(j>z{)kUYPPjZh?+1j!Dq+(a4$Ow3Q0x!ZLC<r1d?E`jHmkI
zFHs`s=HmP=^ab=LeFqwZ<&lo*TpWs05){d?xnD3c-It&f7k!SPAxRB_Uzj1^91%Ns
z#MpL3DdOCq`ji<^rK2)_mz8cd$6-dyt<&J5QsjJ#jf8L21i~a~(tPtNEHAzXiqJ<@
zm`#uGa!aFAnF`{2FG!3NPt}@!!HDHJZjs?Ks*(H>%kVM4XM&!Z3ZY!d2KCLn$5GjK
zX-y=XQ2|bSMTBbIexmg^%s8LMr7svl`iL*(1nk=AjSTB*n7T8BPLA$$1gxXQc|)q!
zG?7=}doFFB{q29#3vd4tJtih5MbJPvI2c0Z7 at DPdIXJA|3hZ6DEgo6krTPfcBcE^y
z6uy9hR10`VP{tg<SfM+`5QtJ}eHv4w2#>eXrw?-Gi^_0M<f0x%W_?^^4mOtRmMg;&
zt22ZVdhsnsMd_NL(jd`8ph8LFQ1SE6Idv<0ikNRh6B~%i1qo{8=&yf=!1KZ)ZL410
zC}Z|H6R|=`dyfgAc8Fx9to8U%c7AmT^uE7OP!7n9$HK{=`XWn>i=llHZ;Xs8+9RP^
zF_$dggT<oaV7ioB`2Bd%+%ihiEcdnO52_2~_8*M~98o5+BFdG*I1R!)5wopXP!H3(
zzORm8z8Z~^xU8*Hg=Sco|6I`Su}qp4MehQ;gkvH}wbSXXOd|orQV8z49pyN`)t`bD
z$6Pkru?bKzOeWRD16j*P;Zd{th1ro}-G4)?D$^h=!gg)Vpo at 9UTYYk*rNmaCwz>Sy
z93<KyBE$f3rid_Mu!Z`inK{L2+aYDDf*Af}u15MjlIIiDEMK$IN7PFtQU7RGvG1#<
z{3E27_k^Caw#ICcCKGyi6uHhhnA{8@!J_w`wA3VWZzoAzPCX_}4am=<O1(SHBMYqg
zJ`Qot{`6fpzT^5|6)X!dv+Hc{>}=A;Sb;Gg6%{qQ>x>9^YG$=(_5E06zMcyAMPhpa
zNB|<Q8V$*(VR2A%$1r;~Yhm=%D!p~<BY(nCKu4{AS8e^oB`-2&g9W9$#-<;CGFmT$
z*iC~DhYAy<_YT5(Z3Krvg2a~*6XhHd>V=#^BcAcWMo4V1r*#9T855IsOH=reg}fRn
zRsG~#vh@>#24jmty4vrzEVQD8&`dwI^n5wY?Ix67+mj=xn9eWz(_C%GJf6WrNXTA6
zmuQY9dlJS%2y>=fblCt}y2B9RHyC{=Y=rPSK$+4zP_Tcy>M}?ZM%*ZlqH-{h{F3++
zY-F8R#FyACrEw5a>d1!J?XAe+l+xRK5sJuO>UN3yl!&@Xe5w;z;hIbYo!ckPG3c-#
zKDRCcaj6^<fYX$aCU293-s{5YVIM2C?y2iY6Ltv at 9jeVD|K{FG41}4#+LgH>)roKO
z85KNsALOhi0fnP6bLo1fS?<{zsgDQB3XY83^u at R5j+gxFTfzf8@8;e&4-sAA56Y`_
z9bGd0<lf19{_RL8X?nS at MqSQ@yaB=GF<t(}T|<N79Umlm(x>`nY0piA)1tYyu5JUb
zaJ=*JNGR%9ElXNHl6|`-*+sQbEnm_lf^D69pW){u0|?`@T28c$wL$F_AHAKGc#!%w
z-FUY=kOj1Mbcj0hr8c{QV*apy at 2$HX?e(BGKt3&$eVObd2b4`apJJ07U12lorKAF7
z{K~J%zqe)+q=m)Xrjv+>#8D1F!J0^mE#L~McoXN;!r2e5I|@Ww=0rGZX%?WWjjvXB
zCwMfWb);Y!-&amlzw%dKiFu>-7zBgT7c3$Y#5jNmE9UtFrz?GpEgI9YWFR*l&Oo(@
zK1*{N9_4dBO>2T{&Y#F2Bk?bZN>O2E87asg(wj15<%-u7$CYII4HzSS?$?HuY5A?%
zRSH*AK1};C(*YcB*`gnjDX`z8EudYN{h&yVpft%zjsk$Lr-9FComqy3w!fIsvA*&|
zaG}D;3?g*5E26>3=!hjJ+MvLSofC=5di3{5XFqM>hH2<0u1jCPnd3y4anKT at OR}-g
zZvQZ%Jfsvv9C&e|#0`+Bf)%3<uI?TDJ}Wv at Dd9ixSuUgg99R*`_qd(lXPBrxE%!<O
zi#272T6z49L!jMxkrj;>M*ySEsOQyJqqY9{sZLP1i|!$DP>MM)UdhT2DT0;p(61I!
zSZv!a%oz-Gn%3CT+BySGK3z<eOVD9du77vDt=SX-KZMWC9lu~y9cB<=n0Y+onC}!Q
z-a?+Z$HTH6<U+jf+{3Y#($c~=k9*1%aOg?yxKKdNI*v=p{#B%9Je6-Q1z|twnD4 at 7
z&{=$bkT%SXXet^SNEh~tIy-Yh!A?vc85z+{zk8cw2yO}Qgh=g2(2HTJdAd2<h6V1l
z0wf1n&9fsrEI%heh=aLgcRpl|z`k8h_~@pL37#2<eg45I*Tm`5nLJgtZ8_j?>!G&-
zT<s9YP~<^8{L0gF%eI4cvmk^XHLTt-yxS;5;_G#d-z5Z<3U>ky_-=c$4#uAE<Lq|S
zvcbfjb%*C4qgSe=v0u!xlN*FR$jdFDHnUN?f2dbwj|+c+llG>ckZnOdY9T{h2OvR)
zt)oACbJh^yyj?eP5j457`V(+OXyU}Uh|kWA?fia*gsJN4vqWgJg<G?2e99DXQJ0Wb
z!7 at dyfOL^`-(WhPi_#E at G7^cG{23aJl(@bamXe1F%FG%YwLedsCD&c2con|G7wxd~
z$-QaaJtJBG${@W$5HM)jj;<LKBpagdKLs+}bm6c3?-IFtjIMMtxQQ${&WXwAYx at 4e
z6|n&_n%uTrY;GX^gOn`0EFF4D)5d&Jxo?{_Igeg{Zn=*)yNe|$O)G)u+RBln&$&uo
z5 at 0+&gKt-rnj7|mFmh_C=e+eYyu7~ZDb3Q$O-=3^{I-*J at hu(4Qbpyw(1*n}$d2-M
z9YTT`>ie2q-o{9mdSfEf;bW5G09N>?cG|sSyuHacLRWVhf-PR*@5f2jY{)Vu`6O67
zGM5G|T}~pSYFJ-3t6)!&dw<Zpa9XMLP?RiG>zP_ZB`}^L`b at v14DvX4v(dtj77zQT
z!%h<AM}LBJg%9ov$;fM(-Rd4-0ffXT>--T<8&6!UKG}HA#_^p&m#GaNj$(k^7|~R%
z=afi!mF0KND$ouOd7$d)Mu14y at xx6=Z2ieJ$n}L+F5&EDn5C!cgT7R5BWu}#4(Vm>
z`XD@(TJrjSbsad7*}U3kXCKlGa~2nw<>!-h{OJXQe at 4QIA`K}gTSnV$Ir8LzGI&WW
z&XVLbQO@|IygsY2)6)y9r;an0b`Qz- at R5U3egbOF9l4O2^h35O!aD&@Z&A*X^{0_Z
z64OEupmR`lu~R&-eSMX~?sK77<W+kbFZ{=aO?N~*GS4&IfrSCsc-1QE?JNq6S~Y%y
z&js8hH_%H!@!w(4UM!m?tL|T0SCNmi^R`~5{R{P10d^3QlR7MomOLF!MwpD2W5->+
z%c8WNssJ?=@P##zMs1El?F9B{IXPojL*48Shx~Rk{Bn-tnkeQXzZntx6n&O`?K6^l
zH8<7{0yFj0=8uLxw(#Nm+ERmZ(JL+Jm+avu3a3ITNtebS!&?}W0DCh-ET_j;4&Lb6
zdj_iGAVRoSw7hqfSO=Tp|E}jQ%7K+L@}~0_oZrL{+_iapS)x{1N&0*1tPg{lE-9BI
zS at hjnE<R+Bv*IR9tmu<NaQjIGuY}nU-sJD2oQ&B0xvjcdHAfwHLP at Be6AqYMq#l^I
z1!lUB_MmfzJck)Gcvi&g^ac%FJ^SmQ?)OU8bDB39tont+Bi5Vuo!B*dtv~pHXD|X}
z%fk*kQ%?4A%<#CxRTpcwF??OYn_X{X&p4jP`uR>`nND<W{Z84OPXvqK4lDS}f!b=G
zzJ#e&nA0>ex-M`xe${wh at bX@>--LykYI1JU<vMRc$?A|A3u=yR$u=YOjbwuvJ|3$u
zd*n?7l1BH=lPfODqn0&kwMSF#c6n37M}MC)UMr31Rc^zl37mT;!lOKO+|WA0!nDe8
z*JZWo?bY;=jN0!jF}6?qMI(2t4P}8{yyM*C3EFcNw^>(7X3Jg?`gwS4mF&F-8s&97
zFx_Tlex(+rH4=$u(Z9A at XK*fyLo+)v7bd<)c3OXxq#3d0^PTG6bG{m>cZukF6;uE=
z4m}JxrhQ^cn|D<8#B~#7 at Wui1e=>l`x9{~Tf&zPV^}NmWw(s_Gm2S1ry519IwZ0ly
zoIBuvg--dDMofkG+iTo!e?A6w{<xcps)+hFA;lLhQyutCvsd_AaXSl<6x{WxMLp!_
zx_iaKNkqc9fHDMTjHY6i<M+pL<=(B=X^=LLrWfy|<bhs-Y(;FDoKNrK@}4S0WUTet
z{1cf|#QGd`!tg-6wVnB`$#*se8FlM9LukH+rdU<7?=nczPIT(LQFGr1j+f0%p)eAe
z1D%@#WpX0WoQ#oQxFZvECq$^q`+rdge>|gf+ksO+xYB3Fsf03+&UOo0Bc|72pf at p&
zNx)ZqVgDYPQsZZaPMKRaS`JS15XFIz-M6m`+^aY;-;w_mgk0-(ZbNu3yBQf{oW<yn
z^`+ig)0?V(Lt}03$gl5~eKHR`cDI`1f7u_NxpksV-|Vkk0CA6*rcAgbs}Teg#d0K+
ziRsCw5bky=0Q=svZIbBS#!o4m%WXi+%{wVO9Qz$O<y05K8H7dCY4>wR;}A2He07}8
zP6>MA|8l7J(x6)j_gB*uOk$)5!=FY(4*{N~E)HXZ at k&iy{hmE41>+>WIfOZcdpJi=
z^uqmpO>E{IfxVFkJ_CdCvtDa67UstmkKioyppWPJEM4ytg#*wb7g|SW^)3sm!cX>3
zlQq1ZiD}yHx3>&tc{g>5mh;dM+D@$z#xNmL%;HHURyv^doe}B&R&9b_J1b<W?I)VK
zI=f~HE at 178LW)?%2#8aCZEFPVB3K8RN~kJnAm9CP-%Q`EM~k|=_Mate*(`ih{l;M8
z3mhOv(ed!LwFtsri15Z4rgaUQc|f=&a54}H-(2YeakAW-pYwGZ6nd%|tn8dFPKK=+
zSz%(JT6B(4WnnaaOdsQ{NYG9BH?5vE#ui`S2BF8BfHd9sk-V}5t)4yTbQJe*N(kCi
zf{Vf<K3wdkOI|#Hz=!RJ{d90{X7DKND$qPtLD7fulVo0nu1#_VhPMky%pVZm8(0%{
zO|6teJC`*X{Ce&05{&T>zvIVV?>wf&T)KTQImWfMZN}0?kZZnGR at EGh9#v)_Xk0i&
zE|ZJ*tBc)aWXReQK6&pojckicWX*1u?ij-2wD;l_S#kM3&11f?(0lgqC80WVBAemk
zj7jY4yV|I=tsewVdIRXr8F)42$2$1G)HeJ&2{3aS(-Yv0QFts*dmXpWlyuhCjVLR_
zEnV<YeBrydj+~#KEg at 8n?FvVUuA2w94Y}hT5`fMPVh~2f1!hSR?j>uUiSdLmXK<b9
zNeiD&8;#Ebkd5A^7p6!h1*8V`cpBY{`&`pfkW`(+K!#KGZ+QJx3Gsk$0aGPa5v)@F
z^!<1Qqe at aiI#+)_f5{K~W0_NBoM)KkNfbi at DN!nKg)PmCfJFQE(R$Y#-M|!mi>$x(
zk0+JvDvwH0AD-iX!4BUIEftSW+Pweay}ihj%W}&X^to59^_Eb$4R2V3(`{7F95k9>
zR?ANO1HDIX8Zm}+A>35MUe}oD;i_7A;zQPzNaKz_3yW;^*<Xc3hD~vr-QL}m#Z*ld
z8AtfvwD%_OlW_eEal3i*jUyd}nWdY1x?EWY<7|qlX6&6!S#(s&J_7oy`EvN>vh5KT
z)SbzcY86gn?DjGH5zZ3UGOX&`9~o$N=1)Q=CmzKUoOIG5HZwlXU;h!g?&-m_cIomz
zox8`kqzu}ThQ at yob}e=b#f!`B43`R*R39ptV}7ZPQmLs~3T<&3Ke;PTY#Dl<-9X~P
zBAfO2X_j|x!xw*_qxwoN-|)xx)B76c4Dogy*ix0QcGPHDkT`qcDqKKF);7+3c5Lw#
zCgo)hpYpxA??KI6?;uMpHH2?Q4_tng86mFK-#A>+utnC6^y_XDhHn0nUpXDR91z*z
zW};yn_%%3^LV%PcH?h``@&U8yF;{32hmy)POdrk~7ucFP&Gc3K-peeAHalTer(o_D
z*I`KOFNpS|ny<bv%$ZYu|DEa7VGX)pV!9p!v~im7pn2{HJ06?`C2JQ;b(I}dux<KK
z+2hL0?peSjp_`|%)ikRsLbMGT;l8XP?4`Kw9gIjU^iunZYq;<S**DhO)2^zqX}qpa
z9ng?r&kMidpC|16xQpK1Q)<LJ8XD%st_ct9Ew&Q0Nh=_2$fucZJSA9PO6VGWx at WSq
zyzF;a at 0EWV=QC47rJ#FuLBWZ^!rZ#Q6?+wE^Z3 at RdaiuDo^(V~a_GF-`fghIniEJD
z^a`r6TaL0mbe+GQ9!S|vaP_>$;lCk0IN&*`967n(#gdn7y81|(zA4-hu1;*Huz!6&
zlD;yZd-br?>=W*}$-W_67 at _z0a{lR0Y5Mwz*D|{GliZSD%AKIsB^X16OpRJ9s^JC)
zS1;ikV-3Av<~AVUtNMV37A=Q`+5uS_RV23ern0f($oS~<!{<DR=cpQm(avhw3ay+g
zG4~=E3B(p!I2HK?Hhj2NZi8~)605fC?+G_S$&HU%xF6?QrRQZ)PC2bVO)C<YKQ!99
zYCD_r1|=Tt2e#`r<2BbV at T~c$?K?eGN8P=?-eH@{-@*#d(E$>VQ5h-S+*7ZJN->D$
z4APrx$^|L^<?I<dDW=*%+q|Gcto_Z`egvw!vr2&<UEW$p`3W_8^tmkjEg{85ZXa@}
zP1PE8UI0~D5xLv(V6lO+Dheu_Ev~Njv+j>pC?RbGFv)3c?aJMA{<C^8qp at tSAkyWV
zA>EGWhraC?-DXM`-lEoqE=h(zt;Qo<T_!&T3GTOPxzz02uV^Y9$*g1A0-Xa#aFF-9
zH(?FoDpYVI at Q~cn+z0lA)4SEH5d#S^X89{??Do?A%K#VEZ<9?oA&XN>E^I at -vu=Pm
zKcB<G8Nyw}v at sT!qsw(0>~CEcW+wT_M);NT`sj<vmxEdbjpzW6f%P%7+*JhJi{BS8
zki(M4<LM(;&T+UosEp9g3DaBhG+^|O*C`!EM8FtTWvj`|tf-#pkX!tzHtSPUw{~GI
z{fa{2c9P*0L8<)m=^gW^8LxaK3T{%5Oa7f%lKYczI{>L~GJ)!tG)fmYnpYcSgKyzw
zcIMgmHSHpRy*%z)bfm5%%-8xegd}xHmMla^Jquc-gN0Gb#Fxu&*Y$C5- at V2q{ps>h
zyYcpZU9Xlw_EsFebnY;7vs&K=x|_iFqVIhb_**FJ{q5KIv<siR%Qr%In$X5A5;lXk
zQS*- at RHzZ+ipPAeUmu<4cs5 at EjkM!DU{=}Tw}=C-1Yb=NM(j_Wo^HOh#BF|-Q(^t@
zZ8l=$!oE4i4h!wxE^7R>D~y5K756^a(N$)g`_D5`Bnhedowpz~iCYjEaOlD~JTe!H
zR=IECVN*1EQE@|QnXS)KeEwl81fEsJ<Y8rS6Z_GM)R6yc>%w5wq&bTExlT(+0asWe
zY#cTcI#qmJnVOAfG>Y at 6ZO!NrDiq{y2`FngDhVln9o1n7#Mn8nbgN(THm!uq4H<#R
zE_lKdJTlt(`!|((O#^kSfCwJoJZDkEAGeI}+5oKl)Nj1Lx^!^k7l2v`*~U22I?g2}
z1MFLf^)8opIy?p=W{g$XHUAH9Zy8lrx2)?9+%32hh(Ln7yM^GvgF|p95NzV^Bm{SN
zcY?dSySuxek at c;8 at 7ZUsbAR5}Mnfkw7*f4g)%(1qrqQ*XWB-1?&0xV-P1d at 0D%7EA
z#)*Gf8;FqYYIRKH(Ql+GO;GV&b$Y^(17;bR%O40=kCM8R98%#xNxhz_E!KjWx$X<+
z*5X#<!#|gw!L*VDBkYo|u{wNk+Uw(biSp)C%|0RAZ1=Rc8o#b1(iBwUVBFJ4&f}?^
zoPo={ww0dMRckPN>WbZP2?_G at Rx=3#kdmCdc6c~=Z}B{S^f*V|(|B~WP|LZzK@;|}
zC0Bquls=WR=J6aG0Vdh!X9ww9i3%RS?`f8spHaz~{38SkH^7&dT%h^Dl$OQ_K>v!d
z<poN#av)1RatF9>=XW~kH)ldOcdAV<bz3}Or;bfMGgOko_i-(9m!7!-NewJiCki at Q
zeh^~+In_ at b2>UI{o%S_>jL21J)*IJ<^*0-G0r at N_?sl*UlO8`+;Pm=?E+ at Ur8Ff}o
zL(trum_$~1JbXVDs6=uZkhYZhewR)+US~9;9Et)=4T%lX&zpvsD0iV~+j7R8Msm?7
z<$Lz%C$|;5e4*6^vt`Gr!J at hx2om6QXS-`Ll7^$Js_}l`t(c{S7|2lWWHpFe_+C>K
zH2BCnjnVK#KP{SQCqCwI>k|Iuvq at 0ZG~o;+Q7wUe!o(U6K);w1Y&FcWU~s;*FhMRm
z4WSyslZjeCDBq?8W^VIJ5)9Ihs260RYIM_Jk}O8#)BzjaMzK`Rg()tLS`T)WmkmW=
zRJxXJqP8}<Yr2+6AhuPZr_tlqeg}T*0eT+yYtsyBV~>+V#!^KSYk!iCW)if4eTh5E
z&V)lmm9{;-)+~v(<AVut2ug^WhUQ-fTRi;E`@~9nwIvlgfO7}hlh<X1rQj;u1P8di
zn$fxO`#huPueUn2%uHaQ_PpNtyW+m%*NPWYGyVA79MbbsEVFPvvqmvqOAXkWI)AM^
zeR_Rm at VKAZ($hUL<MeRP!mEo)?(wX+nCWjpYgmkXb)oZw-tzDs=@1IR)5v+TS>gkM
zpcD-iF`8%jU#U#`Pw~<B)9OE=rxUEV+3KALFgm$E^K%8Rc-)it>!tk+TFpG=X6<O5
z>*H^)z-W_%ZA17&+lMc>F7RTs)H3Db=f(`3s;;scOU>)*qf+>7YC>z}Y*1bNhqI2y
z6Wc#s=n5X=e at Qjb0K&wsZFk)LXT0qk0)oVDs|oF|R<@Oh%1aXZvZDC6v8P8mVp&6j
zuYwVjm2PS~HN@<f8A4zIsH)C;=VQe8^yR?IBxQIHtmn2rx_uCxk}__WObYijLqg$}
zw9MsC;H`xj`U1j-m8MuG^BF1o<eL2Ww})gTx~|G#zGt~_%LO>a+d56wWa{EEf6XKN
z;R2-9-*va&(@$o?7<O*M+b2rcz|h!3MEtw1D8os1N?eNKN=rh}-fgqwk>$^7Z!xU6
zVPiHH)pz2dqX$a{4k_LXEib!cnWl;WX)|{nZtR at xgC!5bM)(D0xoFHD?FKuF7=TF_
zsjKQ@{a|x-yy!~#5^ZqRgnH4*vBAQ8_N?sJs}N^noodK%9C_DtS^2uf4Eyzu8K#f@
z+n!E;o_|2K>W##EhCKTzTb!tjVI9y`<f~iMck`wa-$M&_GqTkNLzJu8f9bLip6pol
z@^u&fvZwti9d;p+x>xVJ%fV8udMP5&^%#AJFhO2E at LyU0q^JrWzKG%_EemT)z0b49
zP%mG6kP?lHlM6{-(X=9kc+M2#taeWGPnuzc=zmG^J90U>`XLHd-OZ|lCnmn25QLd;
z|MjIQ85y=8L~QL9CtTt4 at Got7#+$MuYkB5^G4P1^Y1GQd+W8iKZ)1ek<Qppvuddsg
z1NOa`K;c(`m)lD2;o)VqMlJVCIr0q*54G-*A-FLC4Syp7EeH3YTNoa=yS5RJun_^d
zvloF|xEPPxP at TYya=Dg{xjDk;i&(d|ON5qN<HrMX_kb4sE#tz5S*S|`HxEbu=|Z`)
zDD`88XF`wLjtYlk>kx)9vugRkJ{2vG+Q*MjbUw2l4qPu022*Cg|4~xRCA0ihV>H2f
z@{a3*`<!cTt<bxuIeaFWAy6!8LQldUAqEAF7c4_!LEnJKX8eVPQnCBs?TQ-{q2AgB
zPeD4rwX;~}Tm{vMcGymf>=HC?j?4&s`h3L<!XX^C&rB*eeTl|_2h*8wgZYv4T${Vm
zvO`Ngp}W8`dJB)@puv;y4i|~8wmZqX)6D$bkMh|~T~OLCJ2KqRy>FqfYN6QH7QA&(
z6P!I~s=9zTee*yYx6*w*UUZ=O(#{<|^lL#v^80VLTC<fI;@zRTjG0#x at 8n4?9`#17
zevmuFuBeo=8suVE&<GgiSoSW^<&GRQBE^;(Z|`(jHGY}B3PpE}I2s01(jrphT*em8
z6M_!X!%}Vtf0&;ip_+n6M>le~)=032I~2>Xv0c*hkI;j)5p`@r><n3Za(0YqQXVdp
z(;Pc;r>l{IRIfYZVy)&o``X!;dSW|pN4`lC^5#qCF|?+p!$|DlNu1n}OweQD^tRAo
zM-KiS0ozQ)rE8m7M19Sd6$f6q#ch_S?W)FfTVPd2y>N=?PvPDOixXAGVGKDV at 9ixM
z3S~;No0%8?`%8OwtER`5+dwACmrDuP%uv<Tjh#?0KDF)}W8;$hq-03M3Z%1jR^m3o
z`m58!HQP88{JSUQ6^%r*Kdn6&1aV32eSNtZk1~yqu`gZ-e_LJp49|dc at Ww+W3jtbJ
zK}fYwPvHm`*gHIv0@@>D1ZoHF?{(S;K%dWrUr|qcutiINW8{B<Dk1-Fk&WidHu at P=
zZrv$@J;_n4xzpS&?oujuJz~LM$3gF&QH*lKR0{nZ9~!iexJ}p+O=|817i5Wxjj)S9
zE}u{^p|K|m5~~shP)Sbyh~7VU33V*lyK#3XC at eCcR)$QQ){a?)?HRiplqY7^i`b$J
zVQmLqkI~1(Fw2vQgi9oyljdk$nbkhrPgX7+Q5nX>l+~Y5OCDMs%GJ%-xp_dQ%e9>l
z2AYth8<)rohDoo;V)<U4&5F2Q61E2h`rTsQe}6Eaq6TMtdpr<-*CL;jm6I#>NKQon
z^MKZfnA)=|otDm69rqxH;03j3I31W%<CdjbAdMj>ZOTk&#-U0Z0&;T+jEvWNKdz0l
z;bqpoc|7)gM)4)|_mXp`^ZGR4MAOea^e5u7P);;!?Q^GqzV0{-EHtyBx;O>qs*Pgs
zdTGWnxrgJSR3V#=loKokLYOf$Uc!#us*}H)67(<qyk|d&HG$jR9mHN{LoUx$kIqbd
za?u~+=R3;x8-M at m|GwT}fZ8bhyGJ{2wS=1SkWV*XlkanIonz+ayK{bPA1Ax;rX=w4
z#WT?sS?T}ap&I|SWOL?N;Ma+hy}Hc)SN5g_4>UVpbl=b1IZtl*0J?4`b>@&(qKK-8
zxtG?yxtl-%-P11quDv}Pa4d??bRi}GzQ4N`aQYw at Tl8J4QWgx5(1TrP6;pOor99(h
zQ!YVU5d^am9uYcE`>KJWl;ClD)k982B(u)&k~jm|V_5lm#m&bjCNg2;_Bh`Vfdr5<
z`p0pqg6CF)4(n}QsI>rgROI*y)rVv3Aknk4o)&Rt)#`roo|dJZABh(v{}yrm82f(}
zF^_hN9QcftWpKf-LBE^I20uUb7D=j<_QQ4V{TVh+jStKr_HlTo?Gr30ZW4=MOYzuu
zj2T;GY3gb}{nclJA^*Kx$|`7uV#1yX9 at 9JSg82(cGfwd(2TtmbXaokgGH1UJ=2h&;
zg}PgX)mgtXVBIiDmj8q+)^@)qcBSKon!yuz8V*L)e7xkTYIgNS2o(y4AZyKZ at ujZE
zf;E`+ypYuR=~p*rT{uu<`;zXRt?th+Lih|s#>U2ZMG|KNqEHPDP+($nSSv=HW9s1_
z!PMLG1l_fQIO^mQ3<mqxEbw<6sT%xTe2`#716 at 0k1eI2p?$Z#Dr)enR7Lk4O7pxWr
z_nD0eg~uhxbK0}h`6kl;exLjgr6Kq~g9T*JV)O>iX}cVJ at 0xHy!r*$b9R>$@T)#Zy
zf$Iv<^z?LD%{9X<0{II}2gAz@%dQJ4QoI)vp}7Zr`sL0Gx_S}zEX)&0s+?RzInnCQ
z)6B~=Idv at V<G at Q7#}W8f20;7AUrk+cuk-u2e0`h at 4t2e5dBzH5x_v&Yy*)fLuy~Pc
z&L3Z)v)H)2gp<QELVXz_e-16ZM!B^Xc;I2|K0VztfBe>m2Eb$tzc^T;Y{9^N1g9%O
zbrT5BwWLqEe4BF6I~vJT;;#&U`Mmc)mZ}rL^^m8Sj|u$wl9QQ%BcH!_vgIDI1zoYn
zYM0&db at ci{|6d}xY)6!RyLzVd{I`Z*Y&$a)I at dpKMi*T5MBnID2Yb6UdkUuyoX5I3
zUJ^ySJ!_=$G^q&j>v*%<kZ5kHlW(|;H7h!FGUd*sZQ_#b{~`r<Z~v&L|98dN2GE*V
zVN at 9un+jq>FqogjS-(~&>gXK5kn#7N2~ty2BIvANI^i=Ls4YVDJn&3gjNc;!!o5+g
z7w~9p-F#zay<E3%0NtAU6akTlUN*=1`C4_!?d9~V5^IXl!hK0#;30MDC$+~~NK#75
zdg01Ts_v@@R$jj4En;_G#MKj$Z*UvVB#AU_rOm>$yY@>5u`Mq+Xj&~}?i9dnvy2G$
zrU<oivmzl=cWXvJBEz1t=r_Xr3dej`whuJsy!~fb$3J$CxbJtki~Ok#bk`o~PW$Q%
zge6`RejjWM=TZd4d?}t$uP&TDS{VH$*Iwx=e-zY59UIVG=wW?}+)aS2(PH22G+pY_
zWRi+Qclv^n$Wzt61#u4hPr^}FWPq2GQ!sO^j@|X?zWS;ZZRxxD2I>xxr?Gy3HjD5P
z_-JzS at U-2mKmtzWmeqFR@@u!ZDYkbwppVsG1i0GzZdO9H{EjM;uQpmEIym2F at qz)S
z at D90DyQzI3Rz|gHu=-K9`Gsr+azm=k_BH&w!IE~P+yg8Ifym>TIe~xpNy`KJd+T9P
zMyF}H>2O3hFyJwqsx^g<j*bX4bC^@mD9)E^_%pC01GH^D1p3+C*~i(j8 at huC*$ip7
zqle&ma*?LPwfY9TTE?U><bOy0xt&Idjpe+^OOd at DN|S<(V*Tj82q(5p4R*>u9IS5H
z&t_9%5hH{86ZbyjJ?3VT1ND~uD>Od_WxW(0i{nvqd3s`*|LfU$+%GIW-JklHl$5l(
zx!HOD2!1?ceBo3ZX4i~e<xu)%#)P%VTzYm(dX6n3H7Uu-Tl|6>`#4^Hl(wUAc-VZ%
z^+)a!_lc{W-Fm#nLD4{8AJX!q<EjBFiU+ at 4aUVDs!F)hqn{C_HSWCRz>Lq+aM+X8<
zrD<)>c}<E;@w1<jY#mGNCyro&yf{5s1!WR+6s=i!?D5|;=}m?>3>J<Osd%Pu*`ZG-
zLENU#2)^(q7G0BXogz at r_T3bB(2_KcX4xfpm`MGUE`0$e+#z`z+0SLs;_~d7$$zO0
zDK?leyLqWt<Dalxoo%06E*clKWdn)>X+D7pyEDl&kuKY&O%cwNN>5oXQhyTJ^fIiS
zQ^7N6H6pvSvLkX(L1$8$5YmqS9h#E#P7O#`>Z^QwsX23n-9$v*;-#!m`!Z3KDJPop
z398c`m%#rt=&!cXJbUYNGbZ~7jhAQJOLKNwk#LK&HIs-}81oKz5Yu~hg6bZ>SZlK_
zG+&ZtRPk}jY()`v5<yO_8n<ndFF#2{Kj=7wjhVP~5M at fAzy4YC+UVuMNo|OaY)coX
zKb_x3dR9Kq8`D6yIc~$*CN%%ejZDF~=NL5=?E_}0Xi at V|H>fwoj%e4$Z;8D~f(@u}
z%X{oNk(8?j76bFiEm(Wn#rZA6;B*+_vok30PSq_#EtNDq2l0a`sBiMETa0x`O1FO^
z###RE2<-9Jm97C+%ZwpvcO9kV=m3N%`($yAza=z~q*J^as$(=gD<g8~Z0{G=f|Gzk
z)&C`SxjVYKS^PiJfj=cbpo{f(bgpjeu8wA&fBnK{ZFxa)zpM0U^~kdl<hFX~;qpk@
z07V5btyva14C0YeU5EGv at 2Fy=s6Hsxc5vZ>c{b(-!>S#pzacNBpcLko3*4EFWLD(>
zqQn>ZEBJ9JbcXi7s=d3{O5Z_o+BWezBT|$hQGOko?q(eH2II)U1zePLZdB;`<Yyge
zq09skHBS;93STu1FaFiX;~G_aTVGg2B-oDGJd;tWPmM=?I2l4vEbYXjXfWAMtp()2
zpnFwZG6T-Bv~w76MA(x><pq5#ly^)M6$hb+|K at O?CQBP1s}BVl6;FM}&?W~c#isCu
zc?l&Xi)e_xm`x9FgfhWWe#-iyuoeM!#8hAE4zvUBTjMNpEs$5=id`^<eps0e_!QXr
zE70$bGm?_add00RmR7eJ^XDF`{%iMU2JQ8u>$#(03AjjP-ze!WI$hk4lMUS_1o;-o
zdS@?1z{u0d1l#go1?1sh1>~S6^y@&o4p-^Awb$f2UWVki_Hp0?1>N@(E@`klQnshK
zJd)Ow>h?>`Jzs(p72(=5+lf~2fUY9!R)<Jl!G4(tD{2QDp7&VR6|LHc3wO9 at r-k5*
zyoLO(`U=#Ddxu~#W at Y!=69nw`kn;e(1Cf66t@|jbw3)><+vdNzMxsg0&b8P#-s|z7
zf0r_7fL^;tIR6J<lc at l#ZuCT?n`-E^ej{V~QjjFjh(zqzQaEkAc+kVO5_)LPN>p3%
z6hSWV4&VfU?r+VGbLqG0Z*gG_UR5Y#IcLUV>Y_HQwaI4MmxQSdc{BNsisSmHUqtg_
zH?vA1GW*NVhf@~3`Np^{BE%y9DS#v`fLvfuqBzzCoyl<1+!12%6MOgfYZe|$+uJ)U
zmM=J;8=yK&C~$RkX;&rHC!<1cTjP8e)6wb=d)cgeDf~D{MyU}%d5d)(nZnnEYMxqb
zAYtn(=KDyTCo0bZ951uqwt;bAua1T!=mIAEIX??pm)29UWA`Z4%0p>FH}o~7u61To
z73F+^`m*X?Flm&sEWBQh)Ag<RMl<5OqXr96 at 4&2qW5<w-EcxkhUW;hwtmGuo4wB5~
zyd@*3d3`C%UdZAR%K|3u5eo=9LEos$7lrJSVOyCi)p=y3M5X$}Q9+oxTxkOvDs+i-
z!gu9}nbADEv|?rs%dw?@A09wZrGqs_8ge>|9?%M{4OS~(vYi~g^^?xZYp`Ny0nS5p
za`sx(Cihv*9l%rDK49j~=uIJItKniO;?zJO?BH%|Vsa+vviU!l3J~->8EAfac0JJ9
z*||{<NMy!_Zg#oaSE)$_Rw=M4x}kiD-j-XbW*(5B^fKLU0?-wx>gW^{<8Y8M=mxJC
zXGndSmlLZ+vbiwSTlxz`^7j^F1JIo3%- at TH-PrvkIZZ5M44O`Pw8!ZJ*>)f4C!~hi
z`dOR#Q|do??qNW+>H8%F_9OGGCaOB4f+xVhYYiCHa<_Jd_W#8H at AQd6FcPOrr|ZsE
zV!vQ66|VTky-7txdcC!WaWJqI5go0vl;BO}2 at KRg3sYAIN4N=3_Z!gS%>t)@?}&Y2
zw&@O*fx$P}D&@d4270?QdOq^u`<+1FfttgUrr0dg@}fbzWdoqNhIVqU71>vi=}Nnq
z`6>>l!y|N4j(FNR;y1<l7IObq#kXubxCE;RQde3;fS{a1+qT+45|WDUc5Tm_QF$<D
z8zb<qYY at t;idtm_?1FwZsn%p1Z441MsG#aGJ!_fwkp&ej#o+yiXX$U^>C$8cm2X>2
ztm^<%g0XZg^>A>--TZj|8QK$4jE{H)jfqgCAS#-GBg*<p=*{0lj22IfS at nuqPHfV+
zL;z2mHeQUKumVU!3eyx6&q}tV);;MZLY0Ub&Vg_4#NcZg=!W)`vfOPj&+%B-GVj?7
zgC{~;!Uo=H$@f4Oi*(ws#(JsPecEppGs+1v#@;+v5ZCU{mxlR3rFltlBX&bmn}5g%
z6_Sl1Y3&P$+-Qz6K`l4IsSlp+;XsSFGZpO+G9Ti at lNPxEJfqz30qK59yRpn+zSEo)
z$fD)P_l at ZZN7x|MZo=xsN^39P$2BPJ6NZO=#O)XcHzDU&{xpXMKy;hy%$vHG%a1O{
zB8?%EkQTz*!;?lg6F#2s^8o$>k?k108I0tE5&-y1izr8Zo}*b0WfHyjS~dTVEDac@
z{yKMpl!|)V?$$u;bW1FgF`@Pr8V|pf^U1?w<NP!Dy|shVmUqDHOgD_DzlvuBlW#>q
zX6Qd6IHCqB<e}L6JecFtXeC0a4nZ#5L-o&}OS6jd_*nY$Hv`2(KMms;+ze-njNJIX
zK?kTWB)N@!Q`LLEXEWgdMEm|t at JVp5>P9vV<4d8aDfe$}Ia+rSfMiHiG@%;BmPTdK
z&oIiLv}wyQkb9t&|CtdLMw|{KhzXWTkMW(Jh()_ at j{i;)aY5d{bZ=M74ICfTVSN;u
zr!)0hWpl67)3~~$>#b5)t|s!%s*H3N;ZT}Z2Uj2J7PjZJI?P1yUKvCVG4UV*MBEkW
z{0A-IcK;3h$EEp?*;Dd&4IXwRT})4)^Jn$}oTtxzA)4EDYOn(lRf%yx?y%kLKR5Kh
zg31g65dITdvril=bo<aiLtQis&wu46_&;vyQ2}sl=<4Mqj>r8(YFSH5L}n({AGf<#
zS1wD?QrkN&O~?0(C%24^d*=a5r3)a4qh<aQg3s{xl>$$Da-4j8U0q#pP=ay?7;wm1
zpuyiw+`%T3=meZn;oGdvZMZ(W4(`~0DS}SFM at WqH{i8pc4$t97M>U6wx+V}+p~=iJ
z>=J%?%wE=X{g^<Prl^345rm`9<!{zemgYtBi87X9<Cor!tMDu0>pWsN11K6yk!B at f
zdKz}3$X}zOYdoby;$afILEK6ok at cap1JIOfr_)e!&)4I4#GE++*0gP>WVf|9pzaA-
zy%{|Lhfb|^3I*W);yLtuwoEf~Y*4vG;(~MQVxx#jEJcX>4d!)_x`O(W1IHRFN~b*a
zZv_>0%<D5W-GT=D#km`lE)Mw*xS05frLYsYBTW0gEIua_Q|y&!(&8U-1<M_KuU`L{
zUD=`M84P0j_&T9KT{Ax|S`I~r(YF$}Fnl|QDC#>IZcpW_ewCi<+#kp`K;L(~z3=lC
zN*~a~ES*CA*1*0GB!Kr}yK)01$Tprm)u9}z7ks{U7nu)Tn!L+8i;^o`?`4XNP1 at Q^
z>N8i~Q8;q5lc#P;!TDK)T2nA1JAqTya{o`@%_I(NqwKx^&Q1Eq{fQ{m<C*LEwnt!n
z<>hImkDuaUgZw3MMBs%4G`khgooJI2cmkh at 3;yqofNm?U82$|tZ09>9 at l0>EQCXjj
z*4AaQ$_lJ%3LPPHT`EeR;j7mq>>Lb%8Ab$ozsJLq1Dp$N1Ya at ivvom#B$4#P!fgx@
zM`j}sN29T?RnU1gKYGywq#e#*ihT0Zvit?j6y0^EsEMaw3gf2n at wI-jL$8p6g~+XJ
zDdjt!ef&TQyq}BmJu_&)7Ck|BW+ZC;{w~T}1<Tn)rAyEQSzzgDV+r2g-p^(_d3|<C
zRT^1?XUpX-Cpv7Nrasi`6VyjVRvMnna!^?lmM_oDkg at Ow(EVhwnub;{XT4Bmr*i0S
zt^w?guX!?!nKx+c?i-*ttk(ylP at F9V!IU(B+4)B^YhDi*Yl4k$&3Wrgc=vn<$6B6{
zHr<tbboXo5o^0CB^g8Hn(-LuC;kB);)Yg5cWwH0#9jkO_7RMmX=E<L?yrZt0j-0)K
z)qwv|;Q0r5LxFz2-H5nd3m^x{H-WSzt6vbn=z8a`EV!*jXv`xsH2x;N4`>}o1O*y}
zQ=_M$lo#BpmD-y_Y-fk|-%YBCSciB><z^gMiww9~CDdnZ-5F?2PVejXIaAoGo}W!k
z*d|#|!i2l?4Kl|(bF`YnV_B9o9_;^I1Xw394#ze0Lk6G6s+fBGBm at cyf;&1iRuC(k
z>Y?nxIUMGi9?b~Y8!b8lsE6;Hn6fYs1P(fS+D;FwCm9l^*?ue){U??)Z2bo|G#FUY
zCiWsBo*)^)^y-n=VQ{hPnCLHcN~}wS;JMUD{3|NV;6G+Iw@*urKMcvsmOA6=Y5tbB
zA3Tc`#NS{FKc7M*OnyQn|5GgcFJSur5AgH9n01l=%>m|rT-|>o<^PS6C4ch|cKa95
zrD{B3H~n|v{$B{{z7Oc!dGql<@Xiacfcala6ng1VQ}Mkjc at z9w9nX2El^ZJx@(9Xe
zlIES7ZH4?j)jALiwQ6Pjt`yB1EoGVI-t6+k7JW`EnOjM%Q}Y~Kb;B->5GEFTB7jP~
zsrt8GR+`4H at 9Iz-EDToDgw*&Wg!9K;AtGY0ciiDGHE`=Kh|bhd%hgEc+z7!%TyOVZ
z&Me_}$uSIR8WYYu=S at 8W%B994690`_HN!rD`43Rsf1NXX&`kc-uU0i2whqr%db+gU
z^P>l>St9(tidzT85h|XY1Q~wM6bJ8$R06%3km@^b5GzaORsI1<iBLsELYc};^uT}3
zZ0WNtA@~XLN#U|B`#nKZ+q3Q6GhbLNF?+1e)rSm_<%{oNlnGjUF+PEKV1FKW8xi>M
z?BjLwrc~u~u&NA_X?2yaBQ?^|D3#ThaXT8**AixuG9pV&WySsp=0?Vc$F>jQ3mf!5
zr4y|3KJ1oE#2XhJ(%b02|Fmu(Z4?#10>QF%x4YdU4`O+8%a-U)S{3cYwhf2y^UA>*
zpyuz}ffSHjB1}-&y%N_{PqNFhl8Womr#0P4k#4;ovOaIG6=dp-$Zp=$H~{?7k>|TT
zB>wgYc9o@>2jKST;4e~`{f|q+0#(CKsRVd86*M5(Z-XBFM%^&my=fflQTz{|#e%M)
z?3p+fuL>>YT98MO)7H!m0VD(;19aX-yaUxWebjiD7yVRxEHhr0f`HJFw%-NxY{RkU
z517svFeo^s)Co2zG9#5+JG)yw#@m{#ch985@#d_*bOIde2t=d?hqU=%YT7lG2PD|v
zqCP+_UHE#BAX(5P`+n?izHl8I at CU?G`9jo-b0f@{+S4`5!^R?03unlMm*s3t7;Z*S
zuBvXhlEQ`dF}lDX=C<4vCPCd^fP{+kZ9<@RttZ8NUq@&ThS){P>?KD)LA74}#jwZ!
z!LX08mM&)g-ZjcgzFd|3z-*iN2iSnX?`K_hy<#M~^yvQcT?D*QXi!1^dE3~hfxQF)
z13r^R*qQF6SP>zq9c$hLxWY{{BK)f&&GVh&?Fij&dDr5cd3ac-fq^6eC{csgZou2L
zICQQ1*`co0SC%$+`m?cc-}h?4lvGrQ#O982_V;~Agu0&CZ;`-^to9_b8WyZ3S-I9o
zqQxF}diaQr^edX^Ib0w;K)*LY)D}BFav3xfgnxtU*@qkades(@{2_ATcU1$s0hxXD
zx0ay5jxMUodznsNC<`fwG)(K=2JcjiHuz(5A5U!VB5P#=_yy at V$L_c7{7zSeu*d?)
z=-7$EMq}AmZGGiWB1V at 3+pzm}S;!|S8+oHh3`Mx}{-jE at zI9tYrTDoZw&IwgzO(zt
zRa18C{FIUqLN&pe*L=bea#}|@yGYmmes}{pOWsm7>b$;+Kbw7Feg|XUpPdDP*9&%^
z^yzWj3Y~w7JOweBnDAEE**;ZkpXBm&<x&mdM}80RB%|3>bLiXDLC-2vX+6k at YNB_t
z&nM_$B#Jpr=5YnUq{x%K&<G|o#0W|z7QVKqIhy#!rmI#>wo{f|j+hk%2cRzmGQw|H
zdVfPgN<~0IiQGtaNS|k!3F>;Q^Iuv3t&zGzp&vXw2lFRsE1RVdu13Udm at G}yP`^?4
z9-3uXVCHX#{rpe;zE<M<h)x7(GN9~$y*=mxtYRi&J)a&2Wy#YTt$vvR6F9GU0p8qE
z;xGzpdy{qKY<b#kOq;WcyLs}cAm3Ge)KF*4Pn)kX#4f{;1>KN%^ENwA$g=F5--upD
zP*rg8xC}sRU4J1fZmO4-_Dld0o|*$!Z7E{<s7gsggvf??*tLxLwxA7=NCH=W7|<85
z5O<M4w at VO@V=6LrE?`Tg*F{MT?qC9$0b_XqNePO(K@=@f5~7dIuNOpvuL`*tk<ZTL
z5BjI>?wHZx1DFa%cFE7U^#W7Y0h=?<uR;n6w;zA at XU54P0fsPw_m+l~{I>MultH}B
z?k1t at ifhuyq4i}eEIBAVk-hj)A$QWJVt#^ySb`;LqEfA2bgTx9QsQ?^O8Gs)he}<A
zT6UlXmu at s32t_EOMCh>?vr4)nXC6=1%Jy|*Z~D3(3S(5)ijlM8Kl(n3V=-an=d>@l
zvy_sKY%(JT9SoNwKOo@~T%<4KZ;<FxHps9~DM$N*mp<E46c)z;+}q<8?h at VahHS|X
zz857w^s3;h7(w3UonK^(B{n;<ccSdIKF**cAN-?Q1PcT(pJU+@*z4A2*6P(7cv!hF
z`aGpP*+P4g=YZ=rJ>5TRAK4h62Onr{p)w^C$6^lU*#vQdB^g`6#_azF>-p%Q+*&KG
zC3=RM7<e}sSozwH9$r;E%<9WpEW*M$CKX!y9V*7Ih(*t>$nAC8D-c%bb!LVK-dUdF
zv=6P=ukK0-zUtwA;JSq-l<XKzGMI2U?naHW&5->S!M$LEWTH57*UHO9mti)!;MWn?
zzPom1mUgDQVB^+M>bS9{$J<n69Xo9f1AI{d>N+_S7ZfBsnS6s?e3f}}MH2RGnIoD=
z51HEIUHnCA-M)mivU<zlw!^_ at F%Q1gA#2KaHcHA2*_mBzz`t at u0^*o~Rzd9+Jf{zZ
z=)dnYek_vz`O^cWx=3<O+NwO at 2!BZ|WR6I%KjX)TpbqN!&Qa<Q{hHayW at H-=%RR2a
zQluiKS|A7$*Kgu=r)S|bZ|}H_)~Sx*@2H*~en7Puvj~Ao>sdt+sc-iE<5|^EkJ)D_
zSA54w3=j#NFeVSY at 6Jov_*P>Kw9a9L&Y1syJz(5G8qv|O3JcA$R2vhFXK}<)Yy7JK
z<5-MxB{GLOKvCKz_~kh8$h>7obK+n>Uy!o;1)ontHtxN0HQYz~2n_xR1Tye#l>4sK
zq4}7XwCIO#!Hx4JMHk`mGN8HxOCbk3Xb$5U;pjtfJ&rI`6FQ48OV;D?R|#1jqY`tD
zHNZY=w4MUcG)l^Sm=dw~z>XIcy(q^kH~KO?OV2Yq!2u;0LDN3|=*(noRMNtE1Oo}D
zPcTS^b70uL2?pe0wmtx%NBc7=a4Kl7uN*nf1I3^z+Z6^qrpRNeNx~q*PEG}tBRgI_
z8(t&tJ!3m&<)+^F68OBI=-kzX33ZMf at M~3*UQp_Yny;N?TDsZe-#4&82-<;eO_B>K
zNmRF*^_eWvr%D~qRHcjRsDz?G2rU-{C#pk(N0evae%P6e;B72%<@OEYkv?K*y^)84
z?O&L=>92W7)jy^`uA(=OS0=bEEs%$pLztR_IF_00YG}cMj+(PJj}MTN_j)|3LcO^s
zMT85{7DB;SH}y6-_o=fZ#*zJo;G~jBsqC^jRuMWn+;J>HN<0x- at Q4xo@LSL-QNq$;
z{-HNpf1cYf)Vb<vXq$9m2pTAyNHbt1(wjZWTp`aW5Xa|o3(U5gon<@@ZvbY8yd`5A
zq|1!=-5f}%>7hOCyXO}12$5nN9JOHc7vb6M(mzAB`W(ew-|e~NLZuBf#1BS3JSYNX
z^Xl?9-tOT1i7UGaOZN7H6usO9!8cy(;whzY^~k^_Z0A)gU6j=8sNQr-?66v5drxOO
z&}pibgo}j4!iNcg{b1pg(LYJ8(UuV4{Mc{5ug!uDTt{MKr4FUnFUl{A^=@>CFEpqa
zW849W!R(sR&=%qTN)sWFyz8kuF0?-74VueJs5J+W*Z&_|iOg at 0&wqu>px4Hd6 at CTn
zM&GaZhUAfb6`@wOA*!X?ba2qt?bQu2IIHM7u7d{ND9rjSik=I^NU*OKT;{Z~vAS2K
zjt(NJ3}jtdp#(7^q?k(@X9h2>hJ(Lg+)e0yn_LJ8Ve(}+6p2Sak3tN_a1Zch at ce_t
zePl-vdz)$>KF51{@(z`z_52-4Xj?3c_}Q7GlO2YrVQkxb(x~;qlDS$+AW6zrrKckk
zMsNeY?p+<nM>wY-TlO|0+u_cVW$~2dJ)tRhYW0UXYx}fsu<;9^qY)~=Dp880wjsHP
zImr&^bVib>deiQ%gAHtAnQce!M2j3{CP-P!o=tu6yt*_oVAXV`@=~)}actsEaUZ-*
zaEEpiCxEH6_^yWl6w|a8LJJ<0v>l<LFOyJmkD~${Ipd*M=969NYskPT_sG^zAky)9
zv=byAn5tsK6Cpm)jWw^t0yO^)9Qkj-TVwMEBpKGhG9D*4cl+F2JdMWS{k at jy)O~3~
z6S>CA3WzIIR<e+glCFWTL3yylE}6QrfX*mk=*Ap4$yh3($~{&&=u2a%5QjO(nUOcb
z9&#jpAf|y4#a!*i6}Gh}N9fq=ef!)xw0fFd_O;Z22OrB}%jg8w!kga36}t-}sYrT<
zX#J(+E>$up4EKCNxoW`y$6!Cf&m-R6g1fpl8H2#{bAW^zlYeJ7f0iRIP5D?)&LVEv
z2j3$X;-M!rOY8{w=HN9rAnpE6%@*HM<VBeHCltK1{GxS6ed>&(aWV=JOJK}$x{76=
zB1v}TNZdFdUQds6;E1Id<BlBJ=SHKnU}>=<tkJpkEDUf8H&U~=1#XT-UyeMS%OpA*
z at vmfXv6mkEJ!#_svSOOU2%h`%2|;0yss&|3Valu7U*3~551Yu}%5;`ENbn)ccs*2H
zlM9xI)^F-CjItGO5)lb at h9u#tP|;xq+3%!Uf5_1W94)<TU{}a)daLLO2_j)<52oI>
z54 at ekIRFYs?YSJ#cRK%Ei89X?bBtN2M9JM+cr6wHWeofCn2nHHj!sQ*let)&xn!l!
zlRCP6e63W)2-S+A1sXfW{$uQ96|tMrLPmG~kjP<eV`m2~rcgpVbqV(U=jApIzD4L<
zKOWR1&U=U{fZz1yuwK?Q8~%e*3|1o<_iNeGy2#!6PV2wxj?=?m2JEC4LD5+9H3=fi
zoV6}3OPjPBw)CVU1hAVyM3gSDCU!{qpDrqaG}EC!?!@_?1K-2d%7fQTe6?M_E<h<)
z%Uj_;!Sxh5pucUN*3%A?I-JD1AmG5Tp{VYAcza^h8Q!k{#Y<9DkPE at lwepMOQEMhL
zpylPcm*f??Jgi-rSB%v|;KP73DwNZwN`kj9Z}ki=<l{X?gPg<kqLaz)>iWn81&w|C
zPb3)$C~^GcA$L{OwJzNTLA+J>`4LA-t*k03Y6 at Q~$9P9*?Z3B?B<g at skD=P#K;r91
zdnN#9%sBajFnY)0rD!CkC;K}}r9@&Rh- at 9S8-i8r@(u*8BKUwg+Q*Q%xNo44ruakA
zFH1$;A@?JSQegvC^nfoAr3Y3IY|LL=nuu at DO>S}q@=bd)n|+hEQaT8HMi|L0AZAV;
zE`#;?QIPK4<!eWApZ)vCAiWi<nd2Y2|7jWDzIy_N_)bsvY~0D{+AZ$IP}yQRF%VG4
zv3FIG>alVJIcl*j+7W|V_BD5~1myj+pZM>amhEV)I{00hQq+DOL0_Rg>^gAoYF%Dr
zV);LjfxqXTo!I&Ef$!4j^4l`gl2OsynM8#hn?U!L(g%ZCkz5X{Y-cg at xhredhPoFO
zLgQnDro++Mo^J>HH^!HGcg~LK&UQguj&trhll~pA at 8|yzX1t%LINFZtC!TQTvPt&V
z5IH{4w&p9_*C<};X!8p7 at ll`YRG!C7_JQd=Z`&%}_ze1X{m&>b2G}siub!UD`=}d|
z*N~Et=`+WJMqgk1Zn;gb_d*Q~PsS6RQzg%abnSl-6JiD7Q`gKavsWCjfm!!dF{~#{
zy_b|o_h!F&s-Tt9=ze(V;~<B6;j<4HVQ=1{GKE%V>N^<1-%>C>h2)#Wg<gw-*;89B
z((ooqA0mypJx8Yed7X at pTy@w^+-)H at KZ%R_fG{bTp4x(mH<|RXxZPS+8qCr47e?M2
zB7{HRWV#m7^6wY|>OU#^0tjYPoI*v^g+KosCDnX984~5%zLE?ue at X<SJgB{C1?R1p
zf+gB%cOo4f<vV2okGYFdGjhe3sd8{;VokzTIUx!~^~chBQbR+C5{KexJ&DG>qgm$j
zFh>@J>&@T&M#FEQEXvWl{7nfNgj$jXKBh?PF5bFA<q5%_VSkgu#RF-^5BM!k6v~uE
zOisT_H1PG5yTc at CXHz`MtDG}+MhZ=~JF;kK|K%vD5P$5?L)X>PXRESkA_9ZJk)*Hi
zGU!p4E($+mJh at J!ILc*C;#C5Wk)=SwGbwM#?qL)2Q>inA$hgdNL)|#K-{$LdWl+r9
zrq(q7v at NHyNsaQQ)-~<%3h at Zyujek!n_uAp_nW03f9s;Gl3C5q;Cty(W1(!ZEmgke
zUKPF<<=Pv_ at ym}Dh{QitxWgt;J^imsSX at Lr7~cecn?-S8WMi!A(d(32JuVQpf%oW-
zkl&;(_aioXydUgiTO4$Rbtg%xGj5BEh-OK{Gn<*Q&euWREIx<SCs_T-oNjLUS)t8n
zjOVy0+!VX`A)1viO(B0Mh at LIRvTcZ9oMVssPmra{NYw|W$N at duk(&&r4SiF?rpM2T
zd`SIHp5k1?LKoUIIhU{3L%p~<@<`FsPz`a~W!;~dfKUbW^A at ITaeRX<%<MAaP$mn~
z63q5o*41yQgNdRCYHj6zdS2YQCRo}w9n5e6&H?Qvm+Yr17K8Y2gD%ZtsX9u}6+Nn!
zCl8Ar|5jU`Wd2==t!RKtZ>|n%!%Q1wf-SUnV~m?sq_zEsE=%j_T}al9K{1F<gpxdn
zg*{1Dup8f^(0kI6QQk#`yHszSod=-7s@@?~HezqB$`!PZ5In+VTH{1_xW5_T>Gfaw
zd~5A3PJ>kXMKq+YN%G_r5fc}<-}vMU4z}VAC3WU6h$rEQM0KgQy$PsfghwXjK)q<+
z6K8GAZ6kO7h;GdoR;;M`;KtdAkgqa6zk4mNfPEqTL1GQ<okBw^Z*=YYym68&gA^T{
z9T&Rw_mEoSL2}KdHBN7hmnUi^bT*wts8xdB!X#GJ$<Lf-OLG|gOBzT*wO<MaH1Y^M
z8}zwjCx}J+<gK|5CH_=phm}w4N#wuNWB5qnHG$;e_E~hQSi}9f`lEH%8k%vr0RfeD
z70^@&W0BpFVEuFkjjZrK&K2BqiWg%B%<N5WOK=w6e>+=bAK_yd&wiCbsc1?2d(9ys
zbGkc#68ig}x|LRd$KM at p<CEx<mFQ=)&Pn7Aff&pi_;P#B?ISyha at D!<)@GOFux#dl
z_xhoK)?VHGqI^w!ZGMFM?yCG(zk*Zd+eya?l5w_X39fxH#uRbpqWkVJ8y5-Uh`kY1
zqv>*&M4V`E_h_P5H9y at Mw^NbItbVD~@5rIoa`t}q-vI>AYFYjmIF)vt=sD^rQloLw
zDdb7fA$2eEw#zTR{OM-ch$dQ`zM-`&3wPLpig>fa%-AdR7QH)Z=6Y+2mktK_rrzzu
z+dUA=U at 61LP8K0kYW%y!s?ow#<>@hC(nCE4GzkCepV;){UvVQFkcW(d6#r-HZ<*^i
z)SF128_05Wb_fd8u?mv#cOte8P@#7sNcI8X7ozYmKuTXuNJvJ{PC{Y+!|M<3D+w at P
zmVeN_U~GE|Y&w6A11N>5ke}xIR|QV=UmR{YJ8c6dsAEwO8=U8UvQ7hO$hQ62Sp*YY
zV;b0mdQian9CQEvADaskjBMr6HR*I;LwTTV7yTWkt~wBGk?))Lm(Yj(1s6RIt>%m(
zFTJIj8gMR)C)A>PF%`~>$M~TbN)Wf#=EV>T$0m1FQ5Vj$npGf{BSHLiVS5+Fn?wql
zq1xfJI(W|S=O}SXpOEEuA~NLr&5k5z;A5D=GnJ$c1pS?(=zm9{o{vb}G!(|B{y0i-
zI~J`_5`R5>0{83<tLse~m2wOk+TA6aErmd>rU%-c`%h3?|Hizzu+Jv$U$5tjx~x|n
zT`0~eFXZRQsrp!4h0eQu?dsiBH(yHI4^QsG!1!$T-E at 4EzVYC2(*|R#j9j*R^*SJm
zo`X?=sx}V$%tGiPqmyt2dnVG|+DKNQW)s^`xkY_Dkw+cNK=)~IBi at 1fW9=tTnk$X-
z_eT)BfvQKomJm(@n;c^KO=tr95%@d<xPAiQ9l`gv(HT}p?p8XQYc`Og)w1f22}tt#
zGR?NhywV(Cy7MP*XRmy@;lz(jnObU2Gvq|75NK5w>_bjcsV?MSaaaiWKVuFXAgyv)
zdK&T3Eje{}IQ<r3B_#Ozr71&zGcY<$SI8r9HV6TW;WL2qT(&Q}FMr^KG0etC`{yIw
z14a%JQbx&V4y!y2#eI=^vuATelPG2UwnWLm2WP{dcu;XuJ)h{$^1{{QJp#V!!Q?SF
z?}&*IhOiZdVhLg&b}ebJA_jbx<?FJL$HIE=Lj1v&OoqMn?au2-99;&D4DK%=QSNCg
zj)ui%#{IP{v>XdC8)NoIFkn(yOBRV^6Q3Jdi#(Qqs(pM*oq=xb^f>~N1f_0^?$o6T
zb+9mZv at bht&Kf)A-LdS9C++~ldHlXT=?CgwZmu*>#mcLA4|GoU`#;L3A^ZiY#RS{O
zkM%=T280#<&dZpV$!I_&k$n7u^;xzbOLH#7kuuf+s2jiS094^WYZ|}$BP}PUT3TLF
z1Ov&(oV-sDk7$lbM3xP^u=KWzGj&iCsLTtWn$Ma(=~_m3d^=pAah;;`iMve=CjjX7
zzvGsZ>Zse+#$;z1RU=Z*ML$wY64BcrVf&rjc-VHSR_I}H9hzItchfk=44i_AE;yr4
zXTE!*{CZ+I^qUe7-!qDP?E}x_ at eg>=qd at 0*3p00M8ZzJ2u at rDy$lQHriXY+r0M|@9
zJM+WcJ>2TywIg{=tiTK0gU4mA#O)DzbMnH=K at rG$rtmro|F`9r4$f1X5zpVkErqxc
zQ>Ybp3-fpJtM#$8n$bFrCEy)%#(YN*cALp79yW80?AKkAydbhYnHjn`##%8)J8p|*
zioN`*F|TC1rQDN%S861}sUhpAwWt)zL^2)+BaN*KGwd6|*JgNS%%4a0&EDRLZKiXq
z2DG at WCY;q|Nz;x^XmlMecCiToj4%}L$EHAB4X>r at PgzD|BAAYjvi*;>GZ-y1D5c=r
zK<)2xmap0cjIVqgm68S;?gE!*_8gem7<GZ*d!PG)t(}L^S}IeumVs3ST*<HV+Ml^&
zwP8-xtkN_ksfx1CiGbCl`X$N6+-+~<JtHW=kMi+TC*?{No{j(k#lfH6+YUTnUdK4j
z`|UorwQMzgi;lT at 0~6+kK{#?vqBZZ*uXGBUFRAKEJ!Y2oDKq4`Lw2DW+bIH=#7z0R
z4z%i}3xq@%qeo;J8993h1NJiqq$EGa_$*BGuloAS`Mc>hl6G!vHj-vu+zr$7?1vbq
zNq`0!;@I7pi6J=8%rQwH(S7r)RI3eF$DU#%IuGzF{*t&Ed}fK;*mxz|z2Ub*oazQ@
z^!e}B5jTD at tm>ksy4xBqEQ8i%ynl88gVc;leOJ|^mkt6L1E%kEJtY&V;$OEO|LwfH
zEI|d-X)oym1OcX|XF<LcU&zs=<^?Lj>$+9^^BY|TlZNZJH<?0~GIV&f<`|ech(2uM
zDB$ycg^?4ZJ at 7r1iA`)8WmuDbRbUI#HJi5Gy_Vg`md?dWrE`*?S`ly0BF3lpI}y)#
ztGl+Y_nBIoQw0F9A3~*7ALRs=e;)1tH~IHavuZ{}ZcN6Q;Gna!zsIY+ at 2~v$%pb$h
zdZ9i02sX|{FI at lVLwUlL2F@ms8JG)LK&}4V!oRa{nLsB7X3N?K=7=E#5&2lIgL at LZ
zTCLMDw(s}v?7#Y{iCaf}BW0Z(+SzF0oMfBYzWTa^#k0T+BgiIfQ+*ad2PEOfn>4{Y
z2`nL+Uv*;1<wVK8D}VpdzNd$JgMMXtgtow-nw at mah>KmrZDeM`G+CQr(TZbne?D%I
zF6K3($#|D+x^M8eu<0ghY#lYVU~*7Ya at dL!onPW=7C0GkOmJMXZXL<9)LQpdh<m6d
zu-|AxGWNrEo=J7;)}8}O&xcFx4*f_lDuXqYq~v7N(kYLIuoF7_MYElq9nNPF_)w<D
zr_yhs{vwxu+ir5FavmP|p-h|2Zq28UW|KONuE7^O7`CxYi>|X>cX##qk0za7Gcz|Q
z-dx8UPUxDAk}pL)a*dX5XS;F)!>3-=kKYb-t{%my0H-N-QCAQ0BUubZ2lAs~o9%~j
zNBAJOtK=H%SyO`_wc*S2PgSk{q)I;uISH0MYY2)aO7v^zyHDY(wsNY at jBX7B9Ubr;
z>IH6`s+ZIsZX>ml|GjI)G4=GfNeptDy~clYCTJpSE6wAKGp at EQ%oxWix}Rs7##<2z
zq%}=WP8W4y7?hW2m(dz11Ju at Uv84A+!{pzH#xvo5M~^Fu;${f_2jfmY_LM;5{`F4x
z{crDemJJl3HDpA at z+*cbNF3+xa?y0-<MAo&TEErXkh&pA!wJh+thm?Wo#hEr_>SG2
zlF5Q5mQ{T(bA=x1n3!n+f{^s*bDFJLITpE=ZZ(W>YPVgHMj>93XVvQVSe~Ztl5h_6
zp=dkPUp(0eOn~>U3c2v_x39m329 at jl>Zo{LmfDCwff8g}Qju9<&sK80!9+8*<t!&B
zcVCJZa;7SjFjD^~;)^zZTQEK2^9YrC9c0KIX2=`_9(8IA90aoZay6ZoK at Y!U+CL7b
zFRSJp3scI>Rt?nGxi9S{T#E&pe!*fZhM21?<o0MhdG`>E4VEg~E3Gz;gKNOqMi0x{
zxbmzCYkMF0u at 95~gNK`ulse>YX9R at zbCyAzmF4k3jt_AwQ69(7qh>|4b4|E;uH){4
z;jC|o+~9&?#P<2|^)aKrYecvxDXB%4uuUKX8~^<#i`z9e!YnB|Fm++;8tm2@;8q<J
z=8FMZh8~64$kS1-+S%+Lo`Su^ZWGpV{>tQ_)o`EGl`W*zSd8Wl6IS6yoQ@?)!lp4q
z;}N1jCr!joeZ<AJ9lJWW-scAnji+Ec?<GxC`YX-mRQ;De6zbrN>WRhWsX-_7gF7+-
zcWKbYt~dbJAkfmPy at NpiA$jhE+ycz)^j-0)>Rb+#u|aRgmYd at zMbvuCeva6WD+>rL
zcPB<_Y+HZ<(swJtuO%5_PuK9g;h6ieaTpvO at A<L_U_Kv?a4rjZGnMro&-WM~u}4Rq
zIz?JvPp`!MtLCt;0wdV%J!>WzNz8-D<7_DWEv at w7*J6QC3~{f&*rqo}nDxsWO3O#n
zNsU)o-RK!s at ZIg#7$AWJMXmqzCvV6_Rv*gU_*KtGXh8>&02 at bypR}1ZzqdmkMgq4L
zL-T_iU#0nSb<CRgx!q{z2zVA8RB=6-DrwLi;&$ec&gYQf!+7Gy2Lu at KA%D=G_xjEo
z5AC_XO?+ktcdm!>w!B`*=>T&(K+6H7#|`WKMMUPjhoB$r)GZjX=!CeV%T-s+^T3A0
zrM+Jzk4d#zZ}5<!k<jv<Empo03XrCCC&r&hu9s8Gr(GZz^OZV}=h~(63uZfS$_E1F
zo$%(5R&|r3?7!l;Y7y9?9En8h$6HfsK9{G|?Bm`f`xiYVF)^6+XVmK-&X5uPW)7et
zqR_T{lmTqU9CD8T5HaYMQtDAos~ZkeI7-{6tPmT4 at c1e!{%GX4$(l|g+vlH84z+3E
zzQ-^r#3k5Oeu3}Kai3CNk21cctW{KeGT;3*Q=9Cp+tKe%c)opjrgtla2l2tKxz9i1
zOvn88yE)G6&;snlNPc88U&xg^7frFB_c{pFXfSKIsy}nI>m($`xM^v?15!VIL3|vI
zpxA8RSWZq(rZnu^Bx38V5%!A54QvFt2TFc at h#ZK89`>wzRRx6lwAr4d!xxJ`eE{!&
zrRq$fmd=in>*uBbt)%3pRwLhznnr>8fDwU~hzM9sgC8fE97O8#ZoY%0d~kQe5~=HB
znY=Gg!##B`a}YP$@LV#t2rzIzKFDePIqZ4y^mu+`c~ndC5FyG)vGw9QUfY`^jQ)jC
zSD13M;nBL2x-!%M{KpYiOrb3G+{E(f at cBKo2K*>zecX#G)2E+^fOh^FSK|D#uiW5-
z^NF<tLEQU at XCAYavUn&1dZiUE;E-xZ-zIB+;5WIW{1ThE{4(msjN`VrgnY at kxFx?P
z<#<K>*&>j78EMN@$6UD+tGSYk*gA%osYgoR9a+%Q$Us&C8fcWL*1iJH^XLTD6(Gs<
z-G8XrM5QOvUXuZS&Y6<Pn3$z#qw`Wk<7&?R<Pp*3uD#Yla62=Y^rzufqdUP`tO at jd
z=f{R at FER~8dGbS~(jtnNS5Ucaorf}lz-pb!==2M at 6F7whpa4FJ3MuJ_devv<eV at XR
z9;FtOx#D{I!@rDC%B47H^dxLRh|b8sk727h=6EeL4No$t4y5rAuntY>)=-jZa;c5E
z at x?@;H^@LjVu{OEu66$xb8j6LW#9Jw4vjPd(jXzBv@{4vE8Sfp-O at FHq_mQPG}0m6
z4MQ_ at r!+%%^PYHJ_ukKQ-`D%>_m92y+Ou4;WX5yO^B2djKF9YP-sCi_I!Vg9s>v)U
zBtH46#QtsR6vft++=!J{4H`b6X|y$475Vk-)|l9$rP=efqsNLXEPCo?7PKL*sCVk#
zTvY^({$=$@+eY0RzIidtxxn!+<{XxZ9eA8*l4%XNQ8yV9cg#tzc)9gnEt->oSGnr?
zE=f1ee#5MNzo98D%m at 3c&-{w10NGKWjoEsk=_7AoS~hr{z*zWh>U9)>`5(uSg!dhf
zW9-)6m_#~!8eve%PqmO-eI0JcVM<o3uMqX6SEKRGGBveyqXI!La#({?9FEjF?5u}|
z78w>rRjx1k=k2A+N)Arc;e4k|LNn7fpox&)kCbtTqT(|PEgkloi(;76sc$^f{e);v
zUpK2q-XpjY`>)csjPmsHx(7rNAv8ErDnN&1_xJ=nL!tW|Y%YW?SL$t7SC06=$@9^Z
z<_YeJ%UAmgE59~oDo}pk>Rew%f&B%-smd8wvA+u#Mq;F<rWlQvTH1_oZ}GZ!W*DZ2
z;K89DEc#@p!H$H1;ily-L6~(<fyS^3e%f6UbXX7}b^U^yXW0nji40=;*&RR}_!-Zg
zoF(-HcxlrXcC3pvd-#r+2b at b{q$(mOUnSPMkR6JDipFG<njLDR&(tJOMdio`5uFSm
z`W}Pz!#tdM1w+<cFzw6DLRFpJ;Cl|<&zAj-<=_Ob4y=e4X?EusNOi9M_O`EG{`4iJ
zg3p`uEIGs-emeGg>n}`Zalu#N6=}PvPJ|&zW|Bf{R(1dSTT4fm?3K4wA-+;}#<Ug1
zZG{p-YAf1OvjNZ*(Gp9<_b5G=x~S`WRO3Y<AF6zk8zhQ-N<`2mfHS2u8Pc%voQ%c}
zvbKo?aasc(5)j2W=A8+a8~l at TfyUCL19FNrSX15JnrURw`QKQRCusVS^N}{{ScWQ^
z0%uW;-1;mEh&L!5fhXR;iLINW1oiUB&^o%wuxbm_C-z?=@cAL#f)Aay^C6cwjNF at 0
zwSMQ^Njz!mfk^vZfMv?FacNx-Gt~HPFSjV)O3*{<^}5rxkA6cMyDJ36PZRA+^ejE0
zXue#rR|SzDeYA)W-iX)lC$x%h*ydUJP1A^@u-D}-1=)9bTyam>*jzymVb`vcE57ux
zEhB86U;oVBUVu0)In>#R7^<=BV|o#dC4z-R^XJ8HJE|jjeUpDyJpjAsVoLbo-5OOg
zn}~gezJ44Cv+ at u{WCVtUqS83PA-IBQmE*+z$(M7MG2O+;^}Ygd+In!@kaJgk5tMF~
z9nu#H-XI8DAe$f$CBTTUl?umxC7mn7#^MK|k-x$k%W;Y5e(h~JcW^}Yew(wJBna=z
zLPV3+iFV|H?Eu{@!hzR!9zWu!?pO1U3B{|K>vp9jC#j_i=m|gkjV1gzQs2-+(1e%P
z at 0AOE@Fs6Az{H at -L7pW;UNRONAbI}re9L`Z4dixlPeJjp{mScXLgUid2Kz#I!wPi2
zwTX!ds#jKH2>rZbkGj6*_Y5wty>;CG;B0CF%R>#k?`c40@!Xn|WF<_2+%WQn_vxmx
zTyghNFCq2lA?o)Ai~$D}p)`Px0RDC(a-uz?A368Lj*_#e+7Wx=1KLbKl5G{OVnT^D
zo0j8kC1aFs*;Kl8-3KG4bt6P|2S at E62OkK0Sz=y?_J?=#EP06mGa{Ri^L_4}ZvhJt
znB&;jCrgyoxP};hALcf6y|FUCBLHfnU0!GukXB99y%khIc|-K+74;`}At`S at tQP(o
zM({j==p#!MNd6j>j=W9|rvjXq%q_^F60L_lPk@^LdRev9W<D-9MAQ12{`0LQ1 at 6%e
zB&}JT?&)Wlaq>s5YV*QoytKWG=;=h{c0arUQ}73&Ht37=n8v}CZ?9rS%M!&}yZSeh
z$8hDFJmgQ_zD$s!er{;?5wBz9Lz<<%&9t~LU<D9VeXiFsXk`20!LUG|;FLoH^}8-I
z)d(c^r;ndFR-L%W14k#GSaYHuG$SfmTgb#Ws>$OI8C3yl_19Z at C6u#Mr<eb7HklaF
zi^67rd+x4ok1Qfc`(qXTH&G=kLWGlP1d)X_mXF8o;(}Nz1}FK^mtI&+NI*ZcrlEz<
z#WQ9mehI10u{ZqT!_t2n6RZfAL8F!;tg%idN%MrgIQ0iIK6#l<vNP6A&&_zb``YW5
zsu6D~A{6E7fO_(`6IX38my)yzUQcp-;lg}x9P;tFr_kFJcaR=;FpYRk)u$W)%f6o1
zD5i`(=&ZF+GZ|*|6N(mSHjTivo`M=@>dye<8uzbI)*SU&n}%kB?Q at IKbyy6r<o%ff
zYz1tupXYZMTBO_b;ILX}lxsZQ?lrA-d;Rk{tTNl=+a${)HcANR%c|cv3>+D;dU{cS
z25wiT%Y_VsrDpH8T2^OfR6g#r)hc7#dw7Hrvg(WQ<*$?wTx)@r$56-$eo}aqR&Af2
zs(P{sDdVf$6nzZ}{S<KHN<6(lxf-J&^!AZ4dDfA8u at B%JD;E!KbE)@tD#dz0huOOD
z;1vRwOk}~g0%OFBKCECdhEVEE#Dmqj;FnHU>`yaOHJSW8FN7p)bw-C;LVb$Yi%prt
zK=zSm1 at I!%-(jJXBd{;yn#qGA*UpGUVtEV}2UU&~2wO*5A_=%Gd4|-!9tLl6(d>7D
zy<&s#btHzP^%1;g`vC6KkXCRE0<i*?H-TyG)98s+lsS8%Wu>9S%(`^Dmmp4f4g<*x
zB?0KvPSJ%_UMT)`c!(h>CP0$8ou<DjIwHOn?sOSIf{;xMX|Acf)?GcjRwTGD$kF95
zDnBWv$+<Cg@{J9X!lw+qM>_VX)P{7mSo7knd#Yhwnj(n2shXRXyl+NnAorG4!NLMb
z(QqM6`(N8T2;4Mz3!zXa=U8=``Ib%c4Zy{VMcMD!Ki_5#U$+gH!f|;v at Wg`VBWUQB
z*9YovX*Y6<$Jj1;$emTBtx#4hHN)iyH=R4=dZ}6WG`iC><&MnD4<kE6kH5N(oJ>5a
zbmT*bg`-YN)E7PSmz2B5&Vn?_-zFzJtBc4Fb_-AP^E*ro<dbExl<+7Z(HZ!Lqc0v4
zL at a=YMF$+r_;{HyTfO^gn~FS&_4{q9G>r>&B2$*9T8!9NrT0NA&lqEDeSRE-c&`35
ze6=H0>D4eb-(ZpHdGAq)0lGa&dk6<wjv*Tn at W;H=4DLlCv9PgO#|n;ARhl1rP}+pN
zY?>M}CUd!II at y=Jh<fDWNQzrof6te?GD4U7VHmPPmlS;$4|uKsZgmFgSWz6mBD_@<
z%ya4TEMUx}&?tEMT$`}20b at 7oK_e^@P#6$v_|d9RaYNLXY|j=%dDocJQMqV$<-Z4g
z2$_W<nhU-O{B#VWfGl6lAPmyy=K8GQ(xqZ}G<nY(VNgDt)F9(rzd81~aJ at 9yyJ1XY
zS+%pea$h~#6n^*)T4o}3`PI at Cv9PefIJdail1Xlf6n?m7n*IB1cz#Ko4%bg1EcF<5
zcook0Nr!(E(x+M?vUoY%@O1M6a_;rPwAVSDj;l7P8E;f!+}TR!e4Ia!*}`s2Q9xX+
zJR}*c*JVqj8A~iXhLh`JOmS&tq(#2P at j~axe3(pw7x~0n80(m95S%%oR&!b!NYPzI
zcv%M*Pp0NU8pyXy4=^@CXuZb(@sdQa?Y^5{=%IP`B!od0Im$fOU5Lp%H-t_`Yoit1
z&hCiW$_UCC{F0gx?ts}g<CvLrblAf^2eXa4;%Tu~6JOvH6rzaRJFx)EsO3)Ks7~3N
zP#3VM%unoNhJn)exay&B1|>7Ebq#{}Z=5eXbqhBI4Vg0Aq-;5;f7c3Wc;qzKo1U(F
zKOVLI2czB(YISLd*o3A*5#4smfS+?oW#K7JZbzaBzQWg~!rhx`5AZFQU95*;2Ddc#
z>e)Z;PM1;*d3UK{E7-m*mp0^QOZPm?)K+NM#QJHe6j{rw>-YUWH<(F-FYk{Y>@D&w
zQQ(8}_sFptdTNR8>8?b=!aa}ee7Y&O?)Nv{F4q&LZ|EPzN;)s>J+3uUsRxMeOQAkt
zrKC5PEk36_hT$s at H~o&cLN>_0mIZ4*S6x_1#V_yE9!`9aj4?7I?9v(NwRKio0Kba8
z;MpUeBH@(dE44(2a6msCuC*!&4YUUe4G*ZL(Dg%AuEVrm6CH+Iern$apM4FiocrtF
zb^nS2`{elrOqU>mHUz1)dyx;ni};^i-Zsy`wQAwoWdW<I)POxNWU4e7fA%sti-IUe
zIK!%n)?D?purhS(Od3PO5f^5_cmzS4(*cOD)N#LYy9lfva=hzMK@`^A)|(QgsZ+PO
zA+(C~JsrlNxN4BSy1;{R{h~!$_y%Q#pMuACiIW8ct}69XV*tenzPEp at cc#+r!00v<
z07}dkho7^#NpTd|^IlVCx6u=W2u{BtnjOlWZ*&PCH&-y$Ve)>qy;-74F!+N&6L!*_
z0VhIuE|5hG*1EVm`1H at vBFIgTn+U`Hbj$2KKMo7~DXBB_*;(F^4D<D8c4PyF=hP at s
z_8z)^!R)lJd?pOSDwitEn6tgG#@vPLJ7|jeS at jcVfsump?jnfl{Q=*(BbCaWuFs8Q
zrKjMa`c-pKqS2dI5Hjg|83bTxxx7wz5J>cwB1xstxD29n^|~bOsDuBmM^?z#MsGkv
zVE=vRdYhFpU6 at QC#)|{eHEi;>F}kyG)U`nSrMH$?57uZ0Ex7FzqNpVgQtXbQ4<7pF
z7SH|!DdeU^N{ZnlgqIr8Dbq$+)MhCK=LXkvY%%-3oYd1MJhLGHCg#%5qo=vUbyUPf
zw6cf;708~%C?s9^N?+{)1e{cK4Gq~dBr?O2@$d-hQ&r1V539Wh#1D1ePPx}Sl%N7D
z%p45duX91;w#K9|YRjR-$&^n-kheb)azRkLO+~pSu0b`5D_#L4H+Rrw8v14f_T>0H
zLfQRl&U_OGXnF{xH4$M>(wxqY=IL*XrW_!2NMFMDkQ(jUz7LCEw^(8C;Od%U=hVx>
z>gP%-dw0Tf>dpXJO0dfOt`bE`4P?^t0x?#lChC&F`zJ66nEX8myaR0U&O`REV8Bt)
zuL;YHr2~WSZ+z}`Z}P=zGO8Vd957p7mx+~<WSsx*LjRHSreo}&rF+bbwUWbfr?{Rk
z<oY_$*K_s&$jzM@%l)8XbT<z<cUbN=`hlyQnwly~{3w5dC?$oU(lB0in+k{{9ke`9
z&?9t3+X{|P?ZdqNfGNVsx?{McnBd*Lr=X_;vV at YX_nJ+L5MV7DexNrAs7%7OexDR;
z(3e`6Oxn_uKsy{pMI7iJ at 8MLSjq+%S(6gaeBMd$38nHa4TViV^=*w8NHEziRFM{!+
zU6ibGaC@^DtI7bG%Oyl{J>e*-*ctJr=BVq~?wax&1z5}eTFo6CO6jf+7<P+<k!
zGFV}W;qg<zp5?t{sNE;SRh0>PECaNLGyZDF4=PAsKR3MusZMdM;WkZ%h>11LePE*g
zz{KsAluJ`)H`a0mQk2s$X~r+G@%}+{B5MP1jZuly(^3t35_Gi9m515S&(6#%G{Ja-
z{wwn?B%2~kEnzMVk-E}RMb-Xkz_xw|(utm4ZWN#BbV<#Xe0w;;&QLkX;|YlOsTDbg
z6exLuZgxU0fXr(Z6Nn(>*`3JDS9^fT0e>jFx7>T at h-PUpp>jiLEHv?Rv7O{^)OAI!
z%jB!$4?+b3xG2AjEW^S|VR_YR;|3Eh-&~At3?=(~?9%+_HL>Oz<S>G5#K|f$qwT8y
zk?RDYoV&9rUOv9I3Nz^8?#%1Gv)<k>+f^R(mi at 6jpSfZD&Uavgn{c#-aK?t6BOqgY
z=CkCP<I8!KjC2pI25wT}!buys2Cm5);Q!8zYa8nT+Y&*9DNAi#M88|!a00?Mw^xpX
z!aHW;tB`6YWA%p;4*fq0o~>L-B!eb3#(U=D-KMez2I1_4)VKtww1;!y-A~<3kVrf7
z8Puc90N?b+W`NMs6;dCc;@_3&(WF)rtJ5oE3?Wy|4;w^w%hvXMopEN|!qZ|$-jQUz
zL*g?AsQSjTk at WRQ3Ff%e!83B&-0+HXQL at K5U!InqAqm+KBB*Sac)5OrehwMlF0&8(
z6n#yTd_M^6y4GSU4I;@lhjn>rXQ$;yq!fT8+XZoH5i7&?T-o at iB}B+JVFE+8^ps=g
zsvoPMT%MTyj6O+|>lN`@Z1j>eWV at TPxGMt$Z6)&tAMPEdxdC_8P0L(;PCL*Vs-dIg
zwOwgb at m{>3vmVBaY{4MoW+G*(U_SU^ykVD;jT3gG)Tn{rL<_KIbm>m==hGz8YukZv
zKX%H{GlXRKENv8bg8BMSv&g~~Q&dfL|C`Xw+aDPfRh8yq%2W}q1vR^Hry17%8!alj
z7xp~I at Xu}OR`5Bkxs0$z&MrLni90SNqX$m^R!JFXO|v6Ek)C^QIeBPnZ~THzt?SgM
z8d0XmquiO$JPUrz7CSW^Z=0)VzbdJ)<KENXIRSXWl%WA37CY*4_DZAo$tfCkElX0R
zt}`BL24 at K*!7Bhjs1P_Hc8Vd?A}tX7h#?|v)>iYei<geQ%{9YbD;Wy9<<~4v1*auc
zoxE!?o6>jG7QCpr3iI`VAZ_%e+pQ*S^P5gRWc(u>XaZV()Njx)<-xPh?;a1PS at oPU
z3fuXMdwID&(bEiW at u9hSSWhr`3ervZqS`pU-*!DGT3z0IBhe`?{;|Y;fh}~mqk at 7X
zay!B!TwS3~JoKb~&f_(pUhMH70re&5P!9--3RP*4se^LNDU+9of_!{+U+;hd6pG=-
zJCxvFY^W6AupQL(&0X3sLm=ZQpPB5C><pGJ<ExPMq(L^YR>_`;(fY@$1E)HLfO1&P
z+=TCVfhm%vdh1!n+|B3%fU}o2UjvzRfH^DijHlT at 5ux#LzJTBhB!*srQ_;!EDf_N5
zgcxe%+APtn at n)%k<)Qif0iXulZZFyYmZ-ZJdfWp34;UEU7a$TLfbt;t4rY)wVh(_p
zI8stlTP_VGipmDA4SHiRt!}~@=QJNBZ*`rj`-|cSAK;TC=A4Hxg9j2|K!2oC|MeYx
z|M(q$fMd4rvWGxq5cD`jZMmK(JuH2=E(Pd)K)|r2JxeO;@jY2Oyhitv4Q0m-y^z1H
zX#oMkf4J%6o4Fc0F4Rjvk?T?HfYqS6(@l`>1|&-k1 at Zta4(;?$mpJ|(ud?b&0N)Ix
z)5r7%>>^YG at _ejF5Ai9lr<nid at qp9PTKz}EUhTgOd*A$7Glebz?7Pf4+??~kci7Xv
z9-QM3x%cl3{l5~R{yuXL|ECTNIN55e at fZ#L?PUA<pBnwYQYinGtPJ>H|8Fzt{<iD=
zKfj?zbKu8j_UAQYQ{x==UrYWm-MLBUFX!DqQw+dWx3a*t{m0*~x~BhAs_VZJr~k1I
z0Vn9f9l8PH|Ea8jjPT-uWHvLPU>{L7;(zKy|DWDa<^Or*YeNp~mYTaBZDaRbsQNh`
zIh%91?@awb&vHB4nNWUyNT*x)KQ#^Wua7M)?9nWDYYP<+vCJ`NhrwKbs=-=z&cWt)
zK7ceo;IRw%R|Wu|VcG4Mt5yFS`uoR{8li4!aX&$(r>9rMU++_vTWWOAy5nrtKfg4A
z0_0%+od!M<@TS|z#^BG5fd-uasc9!|{z(rxgH3HY at dE*%3OV-KckOfF-#JtL;Ct_y
zi>e1mSt=ot8(s-u&-BL;`k%WKATUaYM at 9j-!H4a3R0Cd&KoIyB4;%N_3}$Eo at l)1k
zbyvaF!#^l?OqUsnt4`kdM<%7yrZLepg-3Qf?_GC%jfv{{%V-qSQZgB?acw<t<7lg4
z{8-80gV#Liv0?t`!TU!xys+QrJH~L{_%ONg3*n*yAQ!@JV_G-x+0X_0mS%xbp)N!p
z<_3Pd>gACuq;DV9lpep&WBZ$|<w|?~VE5y2Anm(o>;@v%m9 at 7TLA39-C|*^dGwM}l
z?-!F+0Hae|8ysCsuk545;`!L+bwOY0^;LhWkJ?T2b!p`P6(<1)yvMM%`TlJZ`>&5S
zkd;RQ8_+jp;2D)?i|-5$W{y9)0$I=}@AxopBO7DvJ9QlHvws61<O*KP>^35?diD;h
zsf`CXJF&`g)omDnS$v)%mXr}h;rWdb-sMgiOY$R}N{dwUHa(rpg+}*VNzRbW;9P%I
zmwsVHM3wM?GCC}kjC%VlllBO{FY~JT)7=X;NGp*)&s?IxG;i9og$tG!uphP8_0P_3
zEH^Lr#>;)obbkKgem37Y{mo1lCx)dQY|3%~%@mNhf-s=uKBUeg15j$q&Az~+|1$}#
zvcUuJGiRzIeKhm9kiy_&Vd_J{+>Ox1L&HHc&0n6}=Zk-(c`fTQ_S6&4&&1yu;c^*A
z7*?pff+0JaI#fBZ at QC$aHpZR#v-3EqyM|Zl2(GzTT>H<bBl8#^64EjhGZ7j0RBuQa
z>PI~^6wl6P4bUk+3$Gi&SxCnCI8H*XY%%Yv5hy_?9Ij;lns at B=#%`#yzU`uZ33Ekd
z-?Zk<2}{+l{defLkmzS8o-1B0=6C(A3aehq2cFwV!-t~fLtl_CrqRunT1s6am*klp
zp=muP_ectr0UdsyZLQG3kk%jXrn^igM{m(H*3{8M0R)T at jqd&#s5N^|gfUriy6|B^
z6Jg4r5IESY*qtcUm{kyX9j^r`+SEC{l2`|}bSKW6p}=fHS`v7j3q6MaopU&mpMiOE
z5l#}`h)Rl)9xGT0mBC-$W`Sy6hsU>5%4 at NGaT@QZ<o{vY+5g+fnTcv2^TTGeFu!~x
zsWh?#-$sD&k3iJ at x36GGj*?0*J6BY*R5Fp0w}LJd`fvU7E73N#a#r8)5{t3zq8RIA
zVqjScq7~3a0qU7i^tk8zZAAWK<d8^`x1Vh8HGUDC(P(dAry^LO7?tXfJ{UF%3M{C9
zjmEsG0={1OJ?0H(=f3{aeZ$^E9D%nl_M~dZKR5oY8QVV199MpxuzDz216VKkcVt0C
zE;?3)pYJ%IK=~Hz8#*p)9&m%l$b&zolM2H36-%V%mlrygEkW`KejoCuB>A+ at pg~qA
zRdsS`RxYau!*jo46s~Sa at -}5%i37xWM7-i$Z|FVPj))X#{TF5LF;=<J#rT=U6lJ&x
ze&)_4 at 5;H965o#qa3rY-BBn9r;J$^8j`M9eiHwQc1Ot68-lF{zsj!WPS&Et+E8%j_
z^QlzTNJ}Nv#(TWo&ZZ6XfwF)+e(dlQ3l@;BplRVC&<ZpKFbAd*c at o9Nbfd@anv?kS
z89P^8j*V at 7$f~ecAl^@a#$lJeU^wt4Y32AE+V8ORe9tytsn5tY7zYlTMNO`{V&ex=
zyd;53gRS$3pa^BSbf$iysBXY1{bzB0H$Zl7pA{WX*(BHi;^z<1*R1^<|C&_&nYh(p
zgMQ;EL0a1d1i!t{|AOLBdahVb==!;gw_Z_EF$;5EDYp83Na#{cJ>Fgh-wYAx5xgdN
z1h2J at p6|%75?LaW38yl}DTUm~jbI*B#9yO0&VOEt{^r_9h-7Rey?}OM6d}ezf%G&;
zaD*n47oRa*_kH^y1~zzV!w2idk8NZ&+oP)$tSm(q8s_w1 at 6J&o6X8;tB$f=__hEHi
zH^yo-d&rJCnAl}#<?{Na?KF-g|6&0eV<d)IeM5Lc$=#W#<3_nbikB-&cr)gSHzDr0
za`A_o{3rzlK2;vymk^QQ2J#%6m$3Q;yP%}<S&eF<^Uw^1>yarHoA0J{XyrR+>lkPc
zp_PZU3P%&L%~mTJp^<Kgo3}@9DRlcDL-DxKF*`t69ZAT+Y0uQpcQPEHzGI^?&=?5U
zFCx{tp`0pM7dQks{d?FndbWnY44b1~e4X9FqS5K0W}-IVQx3wuC`Y}iW4&u*a9N`%
zw(+3J*&OBo;FrW=Zu)2Q#>GiJxA%iYpL?0mEV#NjQ7x>e?9f4ttz at M?o8ZxMl!iBC
z?RT#0<Q_rL=$F$oR>ah=CdL<@XXj_6h?MMQ80n%b-`Z3s2P?OsZ_t9wV+lY*@bA@^
zD+~0_u1e;F*6#8C(wFh1e4Ok!qr;`wpX(Am62rm!PGWGw61tvSIM at yQ*;uIJYe{Dr
zSN37TAvu_^k)w-7a|Zq%1`CCVzEgxN&w};)Hhk>sMR*A4yd7h}06G2n-bZ_g)ooSC
zWugd*FSvtW|5GnE<kmdGA>y6~gcF!6iHz=1m*R$VRF26 at R)g~qW92wwaq+XOWM^2a
zhdI17@?pCQL6f<hbssc<2M=GCG0sb<;xJy5E$v}He6BQuM{m=sr3wvfBYU+H3ig(*
z>Uv3VkC<WBB(I3|+9rJBI?Kd+kas}}y#$(nkKtDNUEqmx0CE-lZ5tDo%_Q;auVFjs
z7b%9ULs?1Zks6dO7Vi!@-mJUcdlA~tSOmmTM=a`;%NeMt=(*o<D;|6X*{>uPbJ9PH
z%23*IPMsfXV#{-AL6UIFs#~hKEng!e%pb|ALd32C=s34c`<?k3i9)eJ_VaJAytcW_
zsa}FE;^hMNPpe!7fMXCZK+1av3Qed!aw~ew(IK9Yk9zpLw093Uo}{!<2z4g- at O5sN
zJEyrE*<VoI7lb>2XS=eNz<zcp=VvKtX<2jNkcHsAb*N9<J>}gtF8C(cZu9(sA7=2g
z8IV2ydv@=60C;$LIKP5h))YUtcBUsAMy%*T?y6Vyf78*Ce*N4UL<FfS$G{$pC~}qj
zh at b&PaAQbSREc9sv1_5pL)+T6!CUD*AQy>Bb0cjP*TRDAmEbH(V;5!78P^C#Z(wl|
z);KWR2{H}}p at IBBm5iCrAM`xbcs}70Eho7`Xz}A^zz^FoFW>CS0juxKD4^V%uDg8+
zV+;}NXvJ at P9SJ!w-Q61FI=@d;5x?TWO}pBks7FW3;R2Lp03Po%?dWT*aZnQz$bRw6
zVvLe2DeOy6gLNGTO^VKn)r8h8cRU)2xxVvl&PS3Oi4#3vj$Bf33!#1~A-E+(H at Pe)
zsqVfI!8Z(op=lz|L?M=?jU+ at lpkYX;RNc6w at qKkCv9<|(*`)8*1m3H6G3cjbJP20z
zLtC|#^LJldTWqg-w%$}3AF7u(!<r at nve%Y;JW6>?EK`5j=597~owuAkeuQV;ofM)5
zs{h}lq~C)=zA#Z&Su$J^-|BE+)qFNwgeMVDV&=Dx3pTySv5<T5!%$G2EtM(g4G>rF
zP*nWs*O`6<;R~PnHL7ml7<HdE6C);4ES3&FOd1<kp7%*h`p^0^qQ~1%2sKEDqUgD@
zg*q9b>ma>B8+qBlO;7>{D!^4cnq^l=F+OiKH%j4dw#eI#kr)2G4PRXyE-=Fa<a&2U
zG^`Aj`m{Y(1&FAJ3xCwXEoDcnkT8xBtri3tGM{TaN(M5(&4rhcK&QyKQQcfJIb+gv
z=)YF$!r%=1&-=qCN-&Q~j0V(`@xr=?8E&quq-WB0E~r}u(pKM#iH8XIOIv~!s8i%K
ze at Wr`hK(0zS6LO!|B|WXu?$b)RakOC9*f?v-WLbzLLKDh;t~WPaeGzQ3N=SfCXqUO
zx3^^7K0UqwIP_2zKJu7W8l}Ja<bM0$0BB6}2~fgRgNSP at SA{=NDo2nfb_0;&z!OIq
z!FzapeXqyX?M(*tvm)G1JG-=~iD0F;d(uHH^eeu_`mQi_30MO6_5iQHId*vvsv+wR
zqOm+KCK5A8pT+wqT_n(P at M5`9S<PxwEpjC)NL1$QI`%lSCjBHzWpfJ&sPX*+tQ&It
z>~mYT5vDK~rW1d$Mj%pe=%RjVJ7eYn)9<fQ4hRFwFd}WZQA<YPSgauQRLKqp3|VF!
zly6Jc*^FK4M8-OLbBBoVwRuL_w6aT;RDs?(sf{^mW9=T;U7k(?5y?nj`!f)4j5$c?
z(Tt!ak5|8tvx#~CmK_Rt6}1#At^;K3SAY!L`de>b5Gl|DBsA-|p++D%h;zTEXlM%k
zCkRSbp|;ss02&r1Z<}5C9K-I`#g_nB*bO=a9=xYm<T!WnRpt!+WYyFVP^u!c2S2~C
z;-k{>f at ziUY&O)6xuQ at IPNYy3ba{ES`rUr}<s-wghJ68;kK73hz5ZF$e0yRB=<TW;
z03Kn)_h-2j0mpI-q3yzRcGSP^sg`zEZm$w9*Y=~zt`atReeQ8wi8`93q%tG1xRt4R
zJ0FlJy^o27ZoVMwVgcFjSG8{>{!^;Sp6~L30E?1i&L&)v1`y at _j=Il#d8L;M0$(i)
z0Kck~VV{qP9U+adKQHnN=?)ZO3Th<>vjq1C at 3#14O_VawKWaNEL)UK@&(j)xGa0l6
z2KV#^!#97W9so%6zuJMopL_;wP~JXw;m-(pT1<J9D*A4M(GBrf0>_}Tsc%#h at 4XOE
zfh-b5#ODe1B_#f1sHn0BFsrfepup?JaQx-Mvlg&5bt~IRu9DTeXc7VH6lTFH+aDz4
z8xirt-%M2BJFs`pSN{^xgEDCsEGybRXZBiFgZmaz5SrlfoLoU2-gkgp(mgllXU)#Z
zLPXz>+ at m^Y`762cpI2To2z4vU2r<Mq?AKZgpmt)GbgKS5n-_sCSNrt|fC=IKkLP=9
zBho*ckU!Q1ewr7Eb15un=-~P0a6Oh+sXhHFB*LT-iGh%)#lp<7b}fSNm&R8%O}3>5
z&qlCorEh$j#w3FT%uEf`<Gm+QN4GuIEdjSYz^>ygUxW;bNal_^Coxy;`+aM>OFnlt
zw}Jm^(BW<|mTAh~ZCdo*uDWh*SA#E86}o-=4P#wZaNi<@i;GLG8ZA~4Jx8WI^2VU3
z63-@(5vh`IsKDG%;s4%>UtenhXS<qe+60tN`wq|$o$wtg$N`_9o{pc+YDz|c!fm*Z
z?pzfPFOO=XlNv5hX^<h{a1XlxKuhWW=P2%f&6%tMDTYa+$9E-(?_dQQb?|?x7~3dk
zHnA)&Sk->JYoC8$sfF7>QeCd^eKD)G30A1;6Hff}j_J3Z)?DxYU72nwocO7nNJ;kt
z*{8g2ZJl>-&JvEsC2zLU*j;{KCz*xU;YJh)gwy3xs?!Hcdtz>$b$`VYIO8VQz`?gD
z=$!?9;xmW$g`CP|QLd$AtG7`6WN>*mxp9M`wWGUMWBbDDI6|0&z!&l*l%tT at RQR<W
z&f6L=R<7`q-ddsLpI~q6XS!+JcS>t-Y%X*s+5`JA(*CfxCMoxolhtb7cG?KBomlk)
zdab>gSCLOF1Apbe*|&$|_M{~eD$GrLr99*0ecADr9GtWf?S5a%|F{f#0U4f!w?GHy
zI$+!}kUsxfwWOl$5NXUrL++G(OTo%xoyB4o_H5~-n*nKX>O1%We_7u8S0~VRcdSSq
z>2o)YfEmq6JOljj^H-oo78QJ?CJzYMni%0GFMyD`Z~vY=NZ^9P66a`l1_ASwI3w+-
z>eDG at Z9fs2@Ks#15~P>LtCMIt<;Km!#nciCz)xN-34Ub_mxDEEL(sIWEn~w-g~Q_N
ze29U=0T#l^+T(Q`?wRjyrCQp^AviO!N5KQ+Y*NSoD9g5^QB`eD>hweKw<4Qj=NC|b
z>w)kn^z1SX2#!nl{b>p3xwyZy;dTZ8wO8@?+8n;sYU~dH`N at +)Zt}n}tEB${?+E+)
zcV1erW}9KUxvwDyg|T321UjToAdz)}ycx^TWOBzRVfZ7p3md-o4+bKp6?!ZFEjK~^
zz7~y)qeNkAW+VqXV+Mb?SYqQ#c?firV!tr#dES+`R?&;@-FC+h?h$bWkVCZ2QWzY|
zZaua%4=mNk^AX<JNVa1m!%C<IQ24#vqqD~2m!L*ZAMB`yQ-bE}omaPI)xkHECtM((
z(~}@%5J1x5OSIYZ27Ede2?MDb8Sb=QT*E9;nqCTDG_gi<;s9E8hh4c?k3;Vl$NZeh
z)yp+>Tno2=fd}Z~++Ckd%66*H_%*h6V~rahhZ_NLBcFwDqCDsWzjrGh3Q;5i#@=gG
z8>hq{+xDM at 2KbDi+p41rT=e<!%J+G+gVQ-NY}{X+Bv`b5+Qd~desN*A`5so)^TC_Y
zb+7naWg4Z(?riefwcAvK=I^WvJ(xS3!}`k-gO(txsgjlJGnn#^#^a~ptl9g%<gviY
z+3TO;lA!k)N6k;sVOBqv-6(~@+i0C}319C-CGiZr?~!y{Trj6f^t#cZ{aamytasL|
zo)jDuEjJ4XsU&cRi%p(VJ}YZ&{wUZK3J`~b#W!faQUUPK`G{t3-<gJjm-Eew*B4Zx
z<oraE?G{B+k$Fu6ptr^j&)^RC7a9hk=bPS8J3NrV-Gq~ccPq9 at _5$HO7X5{Ad!YtW
zs^^vSqhAd0K?YmkV55Aih86 at qtzXK9P1*piOls}(g|%Av=zBVmoJ^s~ZhP)<N4EyQ
ztqg8R^u3NG8ZUo`U0%N`UH+NS9B6P`Xx;D-7M0|Z0$g!br-m(M(PAebskKma*~EFT
z$@2n8_6dFJh3Vs_A|a}OCDWL_<9^hYaM<_Cpu6Ut&#Ld>!_qn|A?ln<Aq?aOn`8#;
zOvvs6V}R!tbQ2`*23$#O7wVmNOLJw=kwiYRRbJuAes7;d<XjMC^&HJqMn5IPlW%la
zd3v1P#!ln4K^f+a*t&FoUQ_FN!D3oLY+9jp;vSP;=~a24<vQQsip?Xn<ckBpM6{q^
zTa)<WG7|^K;9AJEORn+yM{8Vy&rFCqkHG`Pi&^MJiF at giIW<DllwEr5(ZfmsPVM<I
ztk(4)wczC9vH%AM+7$ZbTE`o|Aazq8EcV45&kJZ2N9_;(o;wn&_jfmLtl%dGnBY*)
zD{OlSRIe4l%Pi3aM(-w%s(Z81Vswi6f-^NWv-Xa^<cXivl3P<*@Ame=5pY9O`d!63
z!d+ at qhwDC<Vlt>reh0T_2CD~BJnGi<QB4V at OWYJKcYAheXmE#P3c_6xq&$Ek4)xS$
zFL-?+_rv8j|L#@c(9G7yvYW5<1LT%ZrwtSmo}u}!8JataqSgr>e)l0e#|15U9=w^a
zb2Q8H)kte_+#H(C@*b>T1=>Xf=rZtOHTiP!qB-mUe9>^Z at A~k}=j?|r%3<NdDct at -
z^7C4{=bc<$7xXQitUkvE_HxB|wba*DLTRb;xcUiGcexM8te0n{OF&(eej3Aa*i*Z0
zc-paZzSzLiRtSA^8+hS?M|{yHe8&}l<F;Sg@`Yy!OzQtY$Fp{g?&>=>Cfti}M0MEW
zb3pILbH#WMWxYiTz`6AC at j+=hBt&Y36%0OXH+bLjdm{i|Q0FZosD7;853UTMb8<Qh
z2lt2vO&6w)_jW#4BcX%PRr9D3PvAGIsJ_1VaCQszfsfkaf^I-btv;o!v0cc#bp6Nx
z`sSZ8_=IZhxYg|5VT&51KhB;!Xn#^{SF{9L>*H!Xy))p>FXf48>2 at qWnQA$eAmDSu
z%N?UCc>-s5nR{gxckcN>+toi+$`pIkt_J6 at r*jGP#lZ7%_+`R-77K~(g*Jtjv!8+0
zZ!R>JIz4MXCfPU`2N0H4^$}_;-$fxl9#vi(JRo!u5L>wMllNf?m*{sJRQ6r}E)<4T
z%0FqoW6{6=?TGH|eRg2b-F>mIx5X=H1OJ>V07o<x<G<hjv=m5o44=~H_Nb2Bb${Lh
zJS0)$IS3)%;{qKNl6$~Vs~TJne&65Wc{!~j3-Q;@>8j)|PA2=0ryaa>D80H{L!_tl
z22`t36BcaK at Nct;rk*hZX-rB3wyWoRbG7b{)x#wo%q=ldLhX-@&r`i}G~!@zYQN#k
zQI`O|wAmZzzVjVYJhsbg``-8xWy4Z4lN05WGo^PmVo{uOjG(8Ys8rc__ at Lgl;f(;C
zPwvaFA9#0ZK+QM%4Yl4k-174BK#LyrY6kqB+c&RokISHEHW at bVDfNJAb!}blvxZs5
zhO?`fn3yV2V{ZfI{fSINJxD!w%|S6tU%tU+3UD<l=dP+=hzDG1=I;*8fKFE{Ow3x;
z>$*9V0uefUb9UvTbIupPH)qng=zXDw<_nY}>Net^5W`0mpi6N%AdIDl*eciU#BT#G
z5tyCYb!1AY*}tz&uYz5RL0xSQa_#|FCByR(*24+bTY~!+2Kdqq=PmtbdP6E8THtch
z8vju#UN?I+4zS7M2zU+e{mEh-^fVqlpRKaOX0f at kvwN1QsjuFTm4-L-P_qP1{;O{J
z- at -+c4VaW)F)6Ugeo{?l$upG>qLJ+jvytNJXD6dew6X4a`;$f?NE*@=7?-loHq7~D
zIWVhB_!(aIjQC7*XRGT-KTBqWp3- at rS#oLOIuVwN;FDtSQ3iU(pe$y`9r(Iw_tUjc
zdBXZRX7 at 4Tgm8xr<doj0N+%U}R}R%HnUUIvjX*u%&G`IXN@$Ozq);_j$S&9+Qkfea
zdr1;-_)BSrQF1uImuHp<IVF(epl#SXyWqRTZ!uIjVLqKV{p-xit%UIHq{Ra6&pl)H
zOxXf`32N>N#I3&|&24^tLZvIqnjW_>y^u?N^gN(-i%}U=bJKHG<|v;+FLQD??0#Aa
z+ at a6}^fosUi14n9?kF+6*|^#D6#ej%<*jE$lnOEr^f6Bs-8aeqYh^y(CVoB6;n<z%
z`KU<nFuZkRy{w_GZ at QuhT)^<xJn5g*n9l=5ewj76#??ssi4YF^pAPIT4D6Rz4Ey46
zLqG-ZJ~JE|k;03jqS7QvF{|-0Q5jx92#1GQ@`SE>A+Jb0g(cvZT`2j4U54^cK3X(W
z@<*krW1V&9UVneUuZRL&-rpRo`eO^32V??gdECO#PnG?e8jB?-di|dBQ^Lh}56k}8
zhroyaZZ-6et!8F!Ln5e^`)4!_r>4Gw<ejRqTMkwSRx(362dr(Jlh>j8PT&2hf2&`~
zyRXtbOr5=|ad;iW&uDJ@%EGO$Cj{6rG6G)6`5Q?w0D*ugK7+ at ZI6hcaEgl&;z?24q
z%zQ_`<2YJ2?!7XdvSA)ltIZyZV?bnn-$;5gR?w;%74<=#oL-XY^Y>wrwQPFW)fv5x
z^$}qGi;7MLCnNKuoir=~qD(+8aa4qA7%5=8y#jN>g}i#n?k9#V3nj=@i_*nLOfGmG
z5>2OUqC?@;Z9ddc_7pKL&n#f)VjDHmqTPiovEFysKd`c^bBaeiDsHO*86$V9lJTH!
z*a^MEw1|VZ9=V48&NZnLqBpjJ=$}*4+v;yCQC$BD!yC^f_CpGYmm+}8nTsXJzqRIh
zK$(*LcRF^ars|(x45JI_AZ(oEwr{XOv>6C;uSZA|K<_ccT=#Es!bU!pOskC{rkZfx
zo6W-Q<o_yGNcQ at uB7j}i^g{(J(_TM!B_Pq&*pafIDJVmL2*Z;NcFr;Y*gcm|T!9 at o
z1=}Od6q4b~j9Wk5y&g(Nd$-m$yaOgWyg9426Q}_=!8->+fI!4*Kx~zYqF4cJFNCj0
zqM~V^Kvvmp7aPCyejG)8f415CvHZ||>`Jd&BB7<Qc|FVOPC at 74;WSs6>fO`ZEh*u4
z0C%By;~@?g4a6iWPqD}T59X%qP-D%t#o_)PwSlDw*Ykl?6jf6R%Me2f6?Nr#smqdp
z(@*oPIUx at RRGB8)3y2y`Y!%IM=y)&=KlpwQj!Xy5zTToE3Qu*6%8BZ^6S@%@%_);s
z^;6f;ba3x8`_HIK%Xv#`I)sRijRE)jSskj9Vi+Y0UH|zW$}ia$3`AJh?lY${p at dYw
zdsOz~;b$~w#(sHsHldc}GYa5a_3LDdXiCjnjAAtxTkm47o7*x{n!F5rwxE8|SO0O`
zpwN2Z?RXgQ6`nC at CeQLiiquS~(J at hNlt4^lAW?IoqFw|Fcm4o2D*uKZ{10%stjxN!
zqd`ZtqF;mhQju at jKASO?b#7;UeoDgCqUP!+f;W7N*bl#Ky;gWXgI+yHTRZOktUls7
zh9N9-y+Q>s=rraYKaXQZej#p^?HKb#;uR_>WqEWQsDR96)rbA}tcEk?7`eChCe7TO
zyUQGOGZvXO6u17^_4R<uxx<v8=C2bs=VqwOV$0o3g>(jBPkds^VV}IINf!Jo);p_c
z-osXdwBdSH=+N_=cenh;EX_Nppum1}h`jM^Qs;67+b6{5w%cdz2!mYsb_M%rQpav(
zC`BNz04>e?eCDl?7%EjjbU)H#AibIPnvY>^b`bKh84^W5;jDc6^=D?RDy at 7`Kz{MX
zVmxC_(pZ`XH>rrmhYk<8Un%$TZ8#_RBJM-2zv>!&ON-Hb7wt=U<$_b6@<7nxm(PWu
zA8CK=XUH3-M2IG;`yM65%6u<3d#?8$j@#dT{JSomLMV%cxhT<!U~xH-sMU;7U898M
z*P(X7*X5$tVRwD3Yl)gGjW*s>%1YMnX-AsshWW at jFD8vEY;DT<)hfLUNG`ZT6 at NbM
zUz?u%km$RC0U96iXQ7KAvZ_Y>iiV(J*V#2uKbL86<ES^8xpy5|{nnllHyK{k3cW?;
zvfh`C+G1%&`bj~~Z9d~%zLR6tI)dW)ubWlK!|kL;?6F-r`P at zAE{$j9iEMQml#$Ui
z-(~#wPNdL&5=voF@<H;!(%rnJ<8<S@*x{LwB{k%!%3;a`9jJ|+v4+n)HW*3~tmpD@
zdjciJ{WCYFPxJb$AasRjqIK+s9O)ql%!S7!Z|9!f)kHxbd)L~hKf|jKw*ovt+=oOq
zOoSkdKI!CYH<cVYk~Cry&jr}s#e)@vdv%aAyy46<P=bmJoN5<Qhd$y|S&|0;O~t~-
z)@@c~t8_FzOXw|@2u*#J6P2JvI>H&lgcUP~#_v`2Yxf4q{GQ=dzzG(zw$fKvfUY0M
zTZ*Nlo696?<I^xY1-%S*GQLtPq2^WN&s at zACSi>&zA5Gc>A>jZuZJX!fN-ZNMOtFu
z=zyVvO7s?4))S{)glIOJG<ckP3{}L>Ue3n~x1Vy5AJv!Cx at KhYJ<fzvVh&sfn_<#R
zYWb5SO!*u!Lg)ASXqi at CBBgizY@|oJ7m|GsOdm<TEE7Pr(;IiQGYjWuKP(g2?Yc{Z
z_FrQ^LveO!KB)I8-JDczfb!e*3EF}Q>z_<TB`uWKq|7ZsNXhRUgfHKClAV`%GQ$f2
z*qoZ$ksERp5cu|9-0#6&KTfFX1QkKFC>2qIfUP3dob$?L at Mgz_AjZyFb&kJj1j}G*
zDP{HEBIVsO=_}SlkYe16zE9q0hfd2w5;+8KpIhozGIxv3hZ%;rAg24paW1^{uaX4K
z=RzyI0)}0atC|AXHelIR)3hMlP;1$p%J+i-u;8t;XRZPZQXt*M at ysUUoswg}r`yki
zHZ=$9ZQDbYie5FCyk>MNw$pHh!y&3C3BaY^=EKnr*>(a^ah|GdTPerRP=V-RNUiqC
zpxTcOpAtaknvRqXdT!0wP;@0Tv(1;zs;F>wzY-;1aiZ%xmZB_O;9x;u-UI}F<sw?e
zgrE*R_~l3!mzp~ls!tk}u2PpQWp6?AP7nIfVy->?OREHTm2mbD`01R*@R~VFyEipW
z5j+CdtKi2#;#79CndURJN-V_EZU#gMoa5a;!C#0QN`npr$x7#>UQnc7ZexLys8K%B
z4iZ^a18mZ>+uK~U6=M$9gl0>$74>y&9scQUya=y(ZVThvbonQ;YUAUAdh$O(g?d)W
zPF?D#hCg at MI;`IsPS5UB`<rQp%(ky7hQckHs|^%Ld|Ag|K5Gx0HSZuFKu^r))G-Nu
zY^*W);j@`;u?!hTm07pI<gUC?J@#XYyg-X<3`nySS_?shsrb_0VUB1P(7*Q at A;EQ}
z&cbsZ30*6?fia)*gk at 7g+-I_jhO)*#YQy;96m$GoW`=mU#kmV$gXTtZb&Z>Cm{NHl
z)tFT47QEKiCiu(t$m!8w+lyJQK^#7;-%gX4mI7Q(1(V-k3I#yiKL5I~Cz!nFDo(w>
zwW@{G3f#5a#R1rs`Sdc~J?27CQy- at LwG9`(UU(L4YxNkZ{}k}>e)g+VVxZdxRAzvr
zu}oQ$2`$M(CbTR6#R9w at 6cz4`ruUvsnin+2sN#;#n|f79I5x$es4B3Z!i9d|*@O#m
zhc{p at T1r!u^T=oOrge{et0|>S%psxp1S5#_1KYr%Ok6zdOtR+$(XZGA#_1K_e@^%O
znFqR!Ql_jxySY?@w_G(132n~_epy51kj9+Xds&App>m4}amivl7Lts&73|WEAG5Bo
z@?B!nwN)0CZ3ZRDlgO!i9m731B9s!9 at VaX9Z?&BWa-x)ysAR6~W4B(HRHOTvBQ~j#
zN at w&KOfOVEv-gO>bT9cCK4d-j9<B9LOaRGu52p0*LO~XxZ}YeZ*hK5{L$%EYzXbJl
z&*ra$c^CAL?%`OZ8sj%aK#TEo=@6WovPv|n<8i;>xh2h>X2P?@eXe1HA4obwMrw2m
zIO3Ja=JrLcDA&?)5R(6TEM?KL=dFGAb#G6wVXr2a+U{WW-2GRMoXm-LHSC at oTKuye
zJBi1xP*q=Gi>4oV5HL+ at j?U1Y<zv)F0irg_Y>HFhU&A8z<Fatq>O_l#hq2jN+d!CA
zF#?8~doTFSd^7>3`Tdi>pWH>k=amBIwjJlqTX0j5VIXa#_NG&9$xP^RGF5?V*SHvd
zg?N)-VTb*4{>i?1PG-AoZRE(yF_G9j-hxRFm$_>Ukc5!Ai*hlx09lE39tf0(l?)_w
zk9alxQd<$V<z^#BJ{i}cGUSi63=T3X(_W;0-@{g9TBF1m>8_}iEYPpux!CTW at jXQ4
z#eNB at Z~kmz28b<?9`W=%2RoFL?RmI46}<gkQaJhmk6<2BhKH1zPsS3#w;nAb^ug2Q
z`%ID!KzW8;@3OiY=Zxn-B~ZznHP(b^j$2Q&Nxw!cyq_Olu9b3d^|V}C-|7M)^1Y+x
zG|+Q_*J5MD37;F*_Kwn(P1UN~<^XT<vS-7E;=>ImTfEDj-tkvv?|Ck4b*&!<H5au$
zunIFjgv~+g(U9Z_Z{~IXiFikWx#<Z?*N%gkRgs36lHos5W;6)cSWL9#E>*-w3jNJw
zmpXUA90p%8gRx$(=LAbR<wlc`nbIKW%T&jCiC^*I#bDV>^nuCSCdURDcUx%Ao`PEb
z0)kqvnx9sgQt^zmRy at PxLQTbO{nEk?S@*MmUsK|m#k!0<NvIVm8vAl;nTdmn*7mXG
ziAL3>2kPsRKJ!jZmCmjT(ap8_C1_pNjtv55+pR7X?dL-JZhM}BHL>>j@#wrKjrs5K
zCD?^q><{7{8)kvWsA>Jr#~_;h@#B>mmJBMdfA3`f$M*$(*$p}GdXN+kY#T|Mu8Z1$
z&7JgxcN$xN#wUx%@QPt0Ka{*Z9K3yAqpOs;nRtlYu!{J^T at ZhZkM74M8I5w9;^SsO
zrNB0tchKXU!REiO>;Lm|s8k6kLMKrOd-C<7X^;Ce(xm@=@6FtGl;9fU at txVn0a7d(
zPqb&<4|@CWl>$5sjwlN at u&w#;{p0`MHu<-h7Q_umLk&h_NF~OSvWldJM?(uRH-n^k
zmTui1Hx4>5ZD{9axSON0_JK{pb=ofb*j3pkYv|XMlXbVpZNdMzwU{P`KkND=z!|d{
z2S>kreSV8tr#3mo+s%XFgaTtwQd_Wuq$c9vYKmZvf0se0;O6%o{Sg=H%8D$-=y at sq
z^wd8VU$1`b6AY?l`eek2rx`5iH^7+tXZ8JfZ4N&c#LuTsF#30-<B)JfrH-fJkE<gN
zx`5Nlsun?^hj$3%qUiQ?*cSiW`>seB?8k`A==h|kS&vKwY!{33k`<z(iN}9o=p8<h
zMKz*k1PyQ?RzHzLMWr&-r1-Y2Tb7seM6e&&92O-y%tDPcdftbo8Y3jz(ZxX8&V?9&
zn=bN2X{&wsBWXZR2UZXRT&xzbsvM?-u&H_1uhaD6UFNXN6%ilaz;1Mwgo)0RZnzdC
zg-gYXxTlzD;$>@<u>JI=OsGjrh!Csm_5HWcH at ->)Rz~bLAop9PymAbXx8cF8-!|mc
zr+J6ZNTwGo{DXTHM*!JLKy+b8>#3+6br%|j7-4<RwV7r}5<Am~YlQlE9Eq!(R4hS+
zn>sql#7D#$VgYjfdH)(Q5Pm$$5<AIF-I4C__Z)U6F}qzOO^Q)s-x<{E92z3I%`P=Q
zK{2aYe!1Te)<9EgBI`qo7kyjR=>3|T-J at 7Gq}z{c<^76e*f*i&t~&@y{7tQ8{Gd?u
zg)WhcFL-Up=667%>ap&dT+Ts}>~>I1mCeHKylIW?>MPjvt`51iN{&5--nqh928?_3
zL(Ri3Nlh0&H?$OpjGQP+yfqFs7b$0zn?0jm?%$R#cK^Lc4uIj)@#O<>hHWSv$Xb<I
zTaC2Saou*TWU;lrb||&z==%<9h$jAeT+U%sd%(GN5M`KgUEK6yNId0ik#We5x-ixX
zGP()z#MM<%nIdEuy*i60WQnE6AXFl29nT(4EP9u0y<}GpEM@&!5CbUEL2Qf4Jc`db
zwVfrv#;lCikV7U$FJAvAzU=e$2XCiCNRk9Z0-t`>N(;k5s=`_MP(Hd-R#~=?U=>e5
zqgLwob!WA8BFPh2g3-&N7~yk@<_ahEvX3KHR<~BX8_wg<EG`R!&n-&<W`fqcSpp#*
zxMXLZcFJ&L8Rb=hY^gV&@sm|42W!9d6?DIpMUU0W?yJHLfV1}A7lYl_;s#G$vp=q3
zuP;$a=Va0r^fl&CCQls(r)|#RUWn(P=;PBk{Zup$B0dI#`Z<&8uifh^Z2C`5Qe3Nb
zm)yNvZzdP3866QLneW~b**BubSO!1r64m at fs~!UCgJ;&;><uvBKKr+RKPCYh|8ak7
z7x)yZn8 at Vhvz=kOeoyxs#zc4jI%_V{cPo%k4%usERa9-(o-ZC(=P@(7(XYkE%MAWn
zTD~bI64j|+41G3+9Js-CLHGrm>a-X>op=B#Qt;b|vPE6f|Dx`_qv34Z_R-NNN)QqR
z5hSAb7SV!`qDG6}yHTP?8KOpwL=d94=%S3?qZ33KjNW@^FvILyp7(vf{XO6F+iUH$
z_g;JN|FEok=DzOxy3X at B&f`2zhjeLUFu2`uv-di+U61<GqLu at 2g1a$y5kJrM(cLny
zsvs<gV(;%ud6rpZxwnlQ<Q47$3_%$mzA8*kkxfx~eq1K$F3-U307{jed>pJcZWHef
z_OHDqdpUk#Ig(MW2_hz*%<H7h4b1r=!22y!p$)zYi8Y<juleHZ&iC}g1SOfS9$iWs
z950BxIM;di(9CVt`W)0L0UQX(xj8lXsU&yB48f|5#whEX2<&1-Ea8t at AonQ~FF%Lo
zD-nY(4~Dr-W7_mj8=X(>xE<@ETQyM$y|a?duqj{d|HYafC&X1`<UO^Pw0tT4d-|N|
z(#BdEOb}5zM<M$1<4Yel{i<V94X*|!5I6ks0L9M?()t%F`VBy)@=O&w{fYhV7q~qY
zC~&-lFsH65Iv1gVtP|?p^!{9HIsvx-5Wf4Hm?GDtg;(kJ!GpfStVr|9_^A8$OzYT^
z`ACwVe-{_LUjz!s8COXrxyzTeJ9n6i`&z#uRvSg+Uw(O~+&#HK at y0j3anP|ITk<Qr
zY|Ve6+`D?Crs_hmOc75KGY>NEKV>Gi5mOxTH=zbTr*-U>pZ1piUYAH*)bTrg;NxH3
z9&d!ssKIw7VUsI3Z}q2q-_WH!Gnxf(#Ch%I1%n6O+ at -Ib6oM1!mVlwu>w>r~eS{p@
zCC_+_1Hsrn!2OXy#vf#!P4b5wA at m2>+XNV0F;zd$xLl0I!eNA<YO|u9U#4Lt6<!;E
zOgydxJwz!Znv62(2Ap(w>)Z~veNx6?M|g)B1T&gIz#R*{o9kBL-A!9%22>8do{~O;
zz})l4qJ0WrU#bvcm529A)UgWb;>pUE$eGkzwpXZ;oM2|T-yTWpEp^acrx)2bNN%sx
zD1#KKgoTEve&#=PuI at G2qXfYtBA(q9dLOys8Ri|UUszge_zW`XOKHY-tFOCP?C^II
zV%TlrTvD7zu89u2rai`S+-5Bauas>taL*e|&<rfnO)R$$29msKdRvehEzop51W}5~
zg9BEZlRkFI(y$kx>3Jz&i5_FCmfQG2Dp0 at P0jUSq-y(kQE8KaR&E%InUy at ylC_tL*
z2719?kJE2pF+Yc=s%XFV*TxfExVgGApmEn&SHBEY)3{rLZJcsX+}aN3GZx*GmYVMQ
zuXi%Fp5)3xAwil0EyMSNa<^|t-^foQ8`=av|H5y>9l4;G>$`cxH>#_qRW<*E)7m_?
zDvsrbM!~NrwiZ3yZyL|O<rG`LFw%?s9>-RJudk=AmUmb;L`G&A1QSd`iq|ZFIo at t?
zOL5B&1^ds~mBK`2mqo)yXrF9uvb=?y1Q2=?`Sas>CeUl)RYBm*a5o?1aq%x~<FZPk
z{ajRaG~)I7%ISI4*lztM0Nh}I&s}}-THdKaMeZ>%<b{pq;<-CUx|<ux+R27nf4pzw
zzBa~}h at BXv(VG?QnP at z;?OrDf8nq|>O*d)Xq*qG+F!3P)p+5(5u$198V$1N+73Hgq
zb|T>dNS4m}Bbvi(QauXxO<R1UWCYis`p=RdpHinSg%7{%XiQmFd<c{ta)r&JrCV-Z
zJRc#)eia^~_06nFEik|{j*<4+fIJJwdwIL<cP~Q3H-t`7o`DoKUgpAS83!qFVN+kn
z_lNEM#A$_gek|1vD&xQ9dNFe&cJ;BmM6Ff|jOE0onqd&K+`$~Fx7J=Xt){IIYgb6R
z4bT&B`)9t#*z4|$!A{ZB?|jz|W_I+f$U(sl%)2qXGhb4h%%<;50_PCISK%MeAsZ^=
z8I5|w0 at nfK?{_W}czP`3xTdwtC8~}bd=tY)yk0vA-4m>jA<Sq!`1TOX$+>H`hxg6*
zIaj)egf?eA^+zW-!?q&@tkr&0^ZZ6l%}s_5*yY8$CO`7IT^I|BfpxoE?M|pA^YJBy
z>kwuTS9a^Bwn&xr-L#hhodq7fT;zJ#G7}M7HDAndZABK{R_^Fb7s);f^0(1*S#Y))
zfUTTv#p9 at NF@buI7w>cV>tz1qaihK|t_K@|WZrvqY)=xA91N1a#!SaAs at rRwYK$MT
zfi~l-T4S){9-|-9);ec0t-!{rvSREeR&i{M1)r#vRxP+rY#Vbj%X(Bpoc$cC^{Nj#
zZq98wBsc8kzg@*fk6*uJOo&yua=l|=o`eFd#Mx8-n%??*T(lr*xzB;6!D=ZGM=PB3
z#@kyhot2Q&R!#QIFQ|cQ|AZc#(F1N((g64%IUSL7c3uwQmu72ywQz$BRhW)~PRZ1c
z`1fAyiYT);*Fb1nsO2|RxJx-yQ<F8h9Dr9heM?`)S$xQxIEpTq-t5wYj8>KGkW6mk
z%tUNCgbu)gptIBDcHo+i`FQTO?RO8m+3J4)jni^3M!Xg!yP=fecUIaNI$;+$$1)1f
zpm?5#rj`KbIq5%F(e*!0+Gik3CnfJo?n(mQz6&QV*&H+5vIgqUU6lO_0H7iN2ax`M
z1VR9M8z=4je|$>ie~PRB58^48uMo*T3gXXnW3hdr-w3_<<;2)TzNIqKuq3)e%!Oq6
z>6p^!t39k7Fq7;EhgWaK3urzqfT at H9^)9z34<h=|{ZcG{`+8pP_J;RiZWC%SB>jid
zr(n_wf!Su=&Lz{@Vmu$l`whb(eF|hUE%a{o7JTnna2raHDI!)7j9;)v#frMjSERAE
z at bAS5uEz@8Qw&t-?a5=Jd7XEwQU-rJ%U36VczsZ%8bZ77J^53vq_k>a0F}2`e>tdm
z<6!rvK1l-1*i=tpKJUe?BLn|tR**=ky7V3%j#s&%c}E&d-xC`sGWdl*fDsqH{2sRj
zPs&^P65BIA^<0JOZ}&9Ww`zgkHDprD&1n!whMnZVL>E1VhsV?>7iYfi#S+9DO9`^1
z!A1nJ;0BTLa*}@NE#;`74%tnYiZm%W`Zwm;8X`XPoowQC2T)XIiw;+*;sSLYx;|GH
zj*RfJ#cgTaOUqb8C|%~#GPw$ZeYru(pQ+;+5j=wQ%DivL2=ZP`PpDe6ynhP8{Hdn}
zm6u{QH?!PzhUn#pGIEkOnF+epJ5NQX*}Ykh$@wVKcTuJXshsxooyxkU?}`YvD2n!;
zb;;P^E{~UFWgc{un=HqAb!=e9*H+#?F9>(oz{sG8e!_0>>@t^~j5T3jgS=OhPyd2=
zMX(J{7_Ps}MHQz};K~V1-rwQwk(%+-5iVku-m@|4CcvV^Y(t=95k2fmp~esCO^M7r
z_ZcM?T_CfN;69N^3b0NQNO&xh$E_FWAVwX%6~M_yXh5Abemr;6e9~YI;^7S`slStL
zhvl>;>gaV<<ZC&j<#!6m6;T~ux68L5*=$WR3R1_10^NfagOBS8uB(TCe at ZH#IGK-R
z*mXP1(Kv5je!nq-?dBT!y_8SF{Mk)~O9wA3nK`XBF7t<~*-u>>SAxM3h35v;+?k^O
z`8`yqY|!r(>t9cv2C+Jg?%h0OQkb6@`a(AENzUTkKsSij;=5Zq<dMy4BKjLYSF2i^
z(Er)pUmaoB<u>QejVx?c%UJPJ1h@?ZEB~6-&r4Iog$gMft!32<Z_-1IV`pScW&Q`w
z2(^7k==bOUVwR5pFHtvf?bHdE=PRz7b|yKeJ(LV0+n0AyV?S^Mo0!&4O8=?gnP>R;
zrd?GdVzi8+gnWznCtgZBw|lmhYB6>FGJO at fFup=y!i;aTYrG@&5z*O at bez+jjba5w
ziW^M2<EP8n_r9Z(lA$}dy*brgIF26X6pB7H6zKhk#CelDJn=n^hgAMUcM*z=k<hkv
zr~|h}G~Q+GUnR?YVXBlhh_*MR&>LXqg?^2lt_ at CEjVqo{>NW3fQ_bv@|8!*q3Ok<T
z$SuF$kYBr4|8UIKf&GEf9Hv+`GyQg!y&O%}2g|$2Wuj`4M8WEQ`NM~k;pMBrli_#N
zw}VzqrZg60!3H<{`QLZb{_4ox82bF)7)qQjGr{-Fkq^(a>$1bTm_(6L1J{_VAhDPV
z4OG%X$?oE-KU}wdZLTKaUrGdKZqsY>$tT^kE at lt3`;~QiM+Z0&TFA)iM0mW#{Iwz&
zAq#R*$+v$6*EHF+M!}!a?%qXyp!C>Iz2&mJm-Iy6O8Toz?Ng8<>;%eqXy<M8$d`?n
zfa?d3T2qCjTV*nrU32tNt<RTWt);wI_|sym5B*;l-AH>`CV*p+#vl9;ciVG%`fDhD
z&=4QHt at BWu_!GT>rvfqoVt5nMbz0!Gp4wdR at 2}GSR2`l1vNLX&1SL{Q*k8=K&AL~>
zPwS{~m*|%ow$1~E28*6aZLLxn?370~%(awlC}SC^ALaCYo5A^qAmd67y37%Q|Am at 1
zEwo+Mh?es*uo&qgsdf`v)YQ06h+LS at MtS<V4xSrk0W%IQjz<~{*!sm at TBfvA20p`b
zLR~&%LTvFsq<IeoHRT!M#ClT?()(rH=1AD?TmKu%e7TeFb*6rAkU7MaqJ#l5>Fiot
ze6q)NP~K=bC9^y#&i at ij5`SHrD=oG_*5K$^_kPd4CC!~RlldjAg5(rZRX9D4vA}YA
zWn_W7n3<+guziAUETYH4eoIq8F);+IT~IT7qV6!F*o-?kgU~lm8Kpm~m at 6&3$-GaO
z$d0Ec|1tj at W+5AXI<3>you)9lnF~NS?(8__BV6b8cGxPsD!9aV4I<(VDfL$4ot6Am
zpDOj{s9$%_3U&TWyS^xky_5QssU~`CqI>_dgNr-qKO`>|rJ(ObSWp|TAGQ84_FZ#e
z6<3FOZk_y|xdmEdYO$p$#5R8NiBS4W>$_>}`A^ovuvRTBUN!7=lUBEx)qNj^R4OJO
zEJ`!tOb{$zq%9O-gv at My@$C&y30G+fe%x~cKJhNwaRmykhPv3EU(N~?cq`Glw4FZc
z$-~*g!aGx=nBum6Q=^<TPC}`iTP*cA{1Lrylj_c)6Q8rx(5FrIt)|GtENSzxMdc^&
zT(MP3;h$XQLnV%7fK57 at AX1e7GA>8sr~3yb5brg3tJd*Q1LL#<g_GYm{wn>UZ)24q
z8fM^z6S^J=&a)@z$;Vb=7r^pxs%H<22TvT3A(?8gEL||E|GYpW53z^9Q;Uf&F at nN3
z{8w!SC$b3uQ_`pJ at EJ3>9q%2g=TrF!^sge*9$)WRfm->5h0-4ZCAiYE^6pj7dO6EA
z2$y$Qo>kEQO#Fj+n)kfQ8d}kEvH8|HZfb^okQpNo=g~dRKD%eiV>Z2F@*F7l?Ykc7
zFI<E;6J<)CR;TLvd_`1q6|5pI=AMG|*E}}HDd!zv{mid&U8^IKi03ExecfxfA!ddq
zy9^HB$IsN+8mb at -UdpV8-=ksrN<4V%KjZy}e5&r{e0yT2?%zk8YQtzdX(m<#cWKCA
zg6o>`spps2413MGSHWR*^^r#<YlE}c^QnH$-$8&Xz9Y`T=<|t3Qib<FaO;WJFiQaZ
zFPLR|1;DJ1?z_Rd0xDpf;rma2Z%5~w at fuL6Ri}YigMtk|F{)gY3F)McK9BQEM}(o6
z74>KzzM+-N2MXz^tB1_rg|2X?t;57s$j9r4?qXR=S8#u|yr9ly!_S!d{u8VQN+e$1
ztD|5V0Ln#gNn{6Tg_6HbJY~>HH5)z3xbcIL$+ at -|pf0Mc*%cYG1ZCro7uMgpe7OD8
za;@f-C9_df)U0m1ebvB8lHCETtZ;Zzl*KB!0qym={<P2j{fO&lJ8odNfg-cSXnd8C
z-JJ^}znX6j?32Q)ZoRgRou(x}rJwvt?pAC6 at NxBVh?11+&kbU)BH<5COy)~;fvP25
z+C*i+Q|TR17u{Olya0GOH~`#A{mI=(kuNpYW*=9(<r_N*wpm+?mKt^}OHJ)&G=W$0
z0Ih at S*IlwgT|9%YP4b`IO*C{25?3LcU|&J(AB4`iCjRr%E7yazR>dzB!EahsxyE^n
z+!L~z!;3`b*tBy*JM$xT*tN$k5XWuPvv?ChThzse#Bx32`0RV$QP26=SD%#KwR<M0
znQKVoUx+N7VhnY(J-QIW$(5u!^9Pcy%Be>kEk#vq-K>>VzqZ`NoNuHj2`=io{IZ>^
z?>5yF$%Eswzb#0yO+IZ1cBV}FAZoxI&4#5~T|}}pTPeTWZQC(XY0C(r1YjJ5<r>CW
zk1HX at F~O&M>m2^J;@0kn+cJSmkM(d{qG7naua at K+D649!SW-00ZTiRL>4?;f1aNbY
zw}y-4<{${!(4|qPnoydT#6ETz`t4C`Z6^S7o7j%hLK!SWXxU=9;+Di{@QIcnV$qwW
zA!!W=$Y1YrXf at TPCtTFg`#Q_w8u-lZH+<p+YvWXF`z}UIka|Ii?;(hQ{x2eV5f-)i
zLw}(76jCm`{6dG4H5}UttYz~Ys56kNVqfF6Ns|?N8O?as>XSTnwSG%hVVZn)wfKkO
zrUT~%a%z+Vx(-wd!I`Y8l!yoQrz<O~&S}RhV*c$Xg&3}KgmCC_GacyyihSzgQ)K_B
z#xmSX4dFOQ*AFpkI)ObiD(!tcEZl2IyHgujKFupqNN7=CQqW>=WTf+oz<WmxILjns
z)&`d{3)th7j5sKX25X~T+;RRXS?pU428gL=w<Ne<8#%hCK2#x8KgJ=AZ+eV(>a4Ex
zPAN`jlp!6SZ9;IIVg-&qnq2rN_MP0HMt`K!$<3spOMceHr0%kqEq9quJ-18<OR0JY
z5m)Gg3uydGEWXFRAc?0klj-tWofl0b`G?^B|5bztl!pod%tv-!B!;{w)QMi;ZN;Nh
z0yCcCcdGtd3t)cZA8u&d;>Z+N3GA6QSqnFMaGlkDKH^Cxlj&yq=ci$TZ2-o#@!CD1
zvH>|iwV;pz>jeE1_$KrZ0m>az at flCSSV|(~H at lAP!ifVQG8CDQ86K*;mCM}n;;p>+
zhSi+bgNOrJ*WKIBwWqyo5XJnuCDZ*d^q()8d+XE{p+HAa7MDnsi|2pq2iyH1{H_=>
z1xaGY`$16+*ep2JZjRtr2}pUJNwEKGTw-#Cdw at Fd7!(Hrl<+?P at Ny_7fTagE1~FRQ
z%{MsYb#lvs{OJdov5x?;te8CB$Fq=^N1C4uzqAT*9e2544H17jZv at 1>io6_&WHP^~
z{$W9{(>rrM7RPlPvLw=4UxfhsQHA-(yqfH#WcZ)3S&wQy98z5Cjy@`9*NGV6I2pQs
z#gFoQ4zL*Lf2bTOCMZdxUDaY=T^9&djj>g7PB!Clq_#7trlLS#5Njv39G1Ph<4@^o
zDF at t^Q|^}FTOf*Sz3|(TYXQ#R&^W-XrVqay!DDd>_UFZ(R?H4tBUxigRa_GK7$-e@
zWb74qUi=JS0la<{cCFPGm;Z;HYs8I$?5~JPS6h-cLz~qPRFI8D$$yJ?@xIlJON$mw
zVI&!?`cGWLno&`Gkc`)&#-~CK%iP8;mIla||3zNx*7shkbmb9lkukXTlhKDJyMFjN
zg&19zMw&!_!3$>U at lc2JZrv@M5<>sC6d(B`vTN2KCF=rgj=9P|ebdQR%@3x+vO2|2
zG>wHhRE3%oSP at iO55qIxplJcQVi*2DV4(l%C;1yu_J4Ct`~OWk>Hp-d3}%D6ulu(C
zG?)Z-Sx8+gxnyipUtoO{H~jzcddX7NL$A))#8VfRn0)>SAqFM?*1=(h9F)S)rTJa3
zv3$O9DBeZD;M1~1BL at 6r&fl7s=2w?M)?NGZTKoD(<nv$A0g%uF%D3oir6w at g`{yMJ
zNtM|VFD1oYHx8ZM at g2XwoUf%_H&xYm9kEEBFMm$)UC at 8{56TMn$;*mC$#!5GwHjqd
zZBCNk>7><P?QjgbS3hDNRbif~%>z9wXWJEnHxK_v!SuQRyPjjh^3Pqw+>>YvW$+6F
z1dT%Pf0tx6oepOy5Tzj-F*Z`E<5$&P at AN3|ud)Awh@<QksHlK&>7a(Z!c!d4<tZ+&
zsYwYOs6k}qB9x%&*Ni}~#-o*x5rGHoxFfb6FaD at 7%wk at piMdZTBr($5<m=6S1^vZG
zM;tqNr<i|0o;ruZ%P-Lw)?-a&34Of#LK3mH+0}8~5Ax_R!8XKPv at Kii(G%B|o+HE~
z7yDm<DOY~@xs%{V(a!rR4$WmdDluc7Pf~waneX{6y*NI2l*T<*F=qdsv+rZfBUYr)
zTfV1BO5 at Ql_~;7{a}yl;fzB|@<s61yQxhT%=+H;e_E5>vt@>H0^|?WeRX*nA&0nnw
z-A$^X>6chWV6bE5!ZBC|T$44!)BA at V9Za?V5i?-5FZAO#CN>Y~0hv+Jg{HJoU<0xZ
zfdj at M|1|ruso+T{3u2xaS$C27FCj_y9EG+tSo<`C`Y8qWtToI$6#GYUdvy6x{?Ywr
zi6XA84PoKFORsO+MfG>v1&HOoHl$Ci?4 at kQ+z$eD8}c9Rn`?Gd>QlW5er!{$8No~Z
z(n at 2Dlus{Hm6+>kh`gxRSL#{JK1}FdHi0a|Aih7uXJq}FrVc0uB(diiFlP$r^FgSC
zT;>JfI*(op9!!?YF at SqWG;gizUU^j`ZFVu&|8yNL{`3m96jOp-u_T_u)3nqC`pE6K
zuG2-Lea@!BZL=dmUdEv4S}l>_(!vB$=EUapf$P#2jV0 at EkPH}i0|xGo_<?yqPcPA1
z)Qb(yU{;$cw0tc8AzXu<g1YKWrE%!BDCV5j2WFNMdcI=<nUqWTp|d-<WNtO1NoW8*
z>uvV9K<RAFDWL69>X*|;9$_I?rjw7{#mxp={(awGtJ+?in82<Nys5Vnvn3K`q^<9b
zcUWkB##Nhd7hats+F_(aW+$%8G53dKpYsAdZ{)sD8jlM9pT;L(zfPg`Jt|8l*WPeD
z!Y}Jfq>g=nqWHjN9teoPK_5%>C9%q$FRY89O)d#v-*+cocOPxA at Bc(rXUWX9+?QV_
zeiqGW^b+XBC^8i7B`z_^kcuyj9uo|(%HImYAGw+S-uolakg|H8(7 at WwHJrlqka(GQ
z=ZLhQiG(UEITr^|wU#S^O$6KK?H^>NXExa5l8>Ai)7}MyA+EHSV(*vRwvE!)5}izG
zas&Zdn52;g+7~5~hqwc9*7lo20ApJ&N#e}EpRT92^{~2aNW?^e?Qpgs<+`zjX!!?G
z`$o at JpIo>?kG(@E5{lO~wBnm|)1dl51v3+zTi>m_84~ILJGr|e$<1vSruRquQ`sr$
z&MT*r%K_1e3i|9a_}16cUBW at kzIkrqK?FUua*&#o>Sg2bU7$$>(iVXN+xuGhm28pr
z(q*W}#Nf}k^3plR`{lkME)+Ud=Cz(0cSBDBGNP<#)8B&B?m@}*=thSaL&TIE?;9y(
z`Gieow)tf>p!Dgm?&l9wM?FQP!3h29yNZ%kwmmyb%wVEj#C@`vEX%gdgI!&r8AJx3
z*IY+B)^$9c7+NF;(LdpgK_O~(?<_JdV$$6fw_S0&1WlgYR5XxYkH9v*Mg8ji1ul$i
zi2K3o6JVMX7Vn at 7P<aB*VDlZdG>*Qv3rD$IJQt#s5(azF_=~i)$9U4$(plHV!yEq8
z?c~^PyM50KOtTGtMy=+U&)br<b>QN)iQRqbL3Y9<x`~|4wlz#@G{@I?Z2yqG=4qs;
zDo<uz4BIAH)N3}vG^hkULp&%TaVWZdLfX$CJo&OG`6eCMggKcwheYA^1KM*y>k+Gc
z6voOH9u&q*T4&uzZJ2nO!<un^LpArelq;<XUAuN>*F{(kkk at WGp~23}9CM#8byxt3
zdBCx8`3_i6$8na_`0GnDKDy(h*U#7iWq`CrXtiHd%a5F>Agr#4eT31=r&TaV^-^9c
zxu+o7&1r{fXU?p*#0Z7yi20<~#|LxoJaV`SlU at X*ry3>YY#07+llZ#$q|}Jeun~Rg
zV?T8?@+Kv%@bW7oza7H|KpQl_WLo}<D9)NI2umt*Ugu?;%W_55))|*)uO~?1!<#=H
zIQ{Nt-e2=awPxhW at XIuDck1F64(|IyUg{;q2m1L{*dQ9n3neRKKs9##b>}~$t+x3!
zxzpxkS`M*;{8CJ989Cr5-Y-DnfiW>YvLD_{wsl$+eK~jeI<fXusxM at n^tYC|Maq;N
zBO)WsG6O4vi_qVKUd=l6`603I+$TSwsm5PR6*5#<PC!#Mr>L96ulj}v$<&prfA=hM
zX8?k32`e+=bo)kE)C(+QZ0%8=W`K7^u3`s->+AX1l#F}^S~Xk`9q~Vza+}Ky=$ZYv
zkhzL0pOfMpi)bRx#N{o+3!=ecowvhIdh#jF4a?+2)r1?ARP5Gp*d0X1^7|H*H6|YP
zx_k6F$2TLm2UpF(-GwqmlN(r1?hPVn at 6s|GZjQF&VdXz;=+=0KV^g(y5w)lk?8KP!
z`l6!D+qTu`yneOBNY=6H*N*!u*$NtUuXmzp48WGmy#wX!uQ25J3A663DVh7QX4g3Y
zsWkH|IksZS8gL~&0T0MCDsr at VKKsb}<&8D$^$QMSeVQ at BM0bW}O at 3<A)WiCjxi2+E
zRUI$C$UDl}jc9LaXzO6^s_jK$&;R1vTBfM)DpQgeY;2t-tca~l&dH>uLN)eqdtcPN
zj52)l%4r%Xqq##HUY}ZI)PGkso!`Nv85X(_eP_Okhf_{-bX?MyFktNi&44ZKp`=L3
z-g5gtt)-(~8^_4A$rxxz+GUYj!#T_B)g^TvYTQ?>HCf7!0?PhUTs&pII1Nn)O)M_m
zTWAkWY(TR3p;x_83DC}~IrM<uSx at OzSrvv#2byppc{Y#puORg^hZ6Ma_T)&i#_RMS
z*tqe!3AV!4jl|<TZCqGcjaph;IXbzIAkp^Ead2cR;gWUTZm at eis4E=xT&PZWIG;YF
zamS$~P3)?fZnyQ5`bS1ZYj&AcpNK|`xxX7EUh1vsk}Jqqm(h`44#TK0*puI5T3n0^
z1b-><<k#b7Ga2aj*-K$LRT=%>#s756f9gKtRN31r+m!kp;eUynnt`e9k8j)5#<gij
zih~)+EZHU0MY)FU0OgCY6#O_Zdi56jA$M3P?eAKmTCJJah+a<npw*J4>bAC;okNd@
zasMSns)d;-RdrkpssQyIOKGaK35gKMZ`F(TMdEKQ<S0aAL=4<4la at uX-QOf}pkbUx
zZF7U)KrZ+#|NE>=O%lg4xNbzDOX2I-b8PpaE>HeW*0-7utUPVT9jCQHKKt`enQx7y
zF^GGXUAOM7n4MpQk}@ow>XmZd_;Iw<o4`EH-IucRr5bvZ5x42|D4Ep}L#G|o0*Cs!
zK)e|weZoYHYOxucqDh~?s_igyK5EioRD3#O9<itP3<kab38*iz$bdGWD)}%)tcnD)
z>5BW2WH07yGI8n~1p5-YS2WrPEp*b0+#@7Z1c0YhL9Vh0(&gwV^<#`NWn(&~x at uy@
z<!op$O1w-M{PHh49!#MXsp)Hit<t#uFDU#gi!4D0p1Y5Y+ai|PORr>MoAQQ-dZ)-G
z3i3(J_qD*n1>?KMQ)L+HhJW80qJF`l6xxN>2YkE|SD1sEh-8x$$Vs#{TIjLoLtqfv
z=G($x|E)`)v=xE}cS~+R^7S;Vaep*AgKb=QDkV at iKym^fPjox_Fk?1h*@%I?KGnWx
z?BhoGHayn|s<CXf+um(ON(AA^gLX~%kCPwYd9-zF2VP;L7*tEW!=81n^lhZ+v5Gj5
zlAw@#*AQS}O;^<x14%pT>jHKW-{n{#nasS at 6>C?ZH*)`=i(zRzlwrR4vTKbosHJ+g
zsiFccwz=2X!**}hi(-%{KzsJvJg|d^;PChG`cer}=M^Ev>M%R2jk&|~ksj}}bG_!)
zMiSvSO;<w~_3?9(tbaADb0nyPaCw~s!5R71tb(y>Q!?+&sjyU=jysDxW^-|>$tzhw
znJ;3$@QiZ(P%b8|K_eZo=e?$&ekJ|hWt^o|Ax0_qbxGrT5qPssvxZ;W at -z41KgPy5
zyz2kBMa at n0eCD-3e5at`w*m=KE*Wpu0Gp at Ymi~|AcWfR6N7$C^z5-mrl@=MoUzH2E
z2&+#_F<GX~7f5o at 2%+ at XRsk+KE@;xtEumWp9l3RoSs6rm_iH~b_j}E^HS`kH{Y7s0
zXE5S at ba(a|45W=ND+vb}cyEQ(DWkzS>;~ulx(hjNtRej<<CNoNhq8ixfaY)XY4}+G
z3DM~8Xcb0B;QVgdpe?4yupXpxark5`dT8u*p&7p&ZVRlG)PO!>V|`E<1@;HVZd}Pb
zZ-_?&*mwT4)DSoeOD_>UGQFFRnlFU`n}?HxYA4LqjjMw~_<qhF`tCEeZf~h8p{BPh
zkA2qQ)%*Lu5NA_I&<_mgtDDykOFOuQ!*NE#%_nTH8U0XS4a4oZU^mxUjaeo9smTT!
zU+Gz5_F0R7AEb!*MeQ}a(#z;~(N^D^pPM@?JzI3qUT)?n(eEn6pbcMnqQDsRrnb{b
zI47po&gkb{^OXXC&p~_7coxq~f7YDLW9_CrIP0xi+wY(<`bkyVTV5jWLEnl&8>mCo
zraNPrPnc2*`|7SV(Z_-Hz>Hv<HB;|;`W^oGK5xt=^52FA30j~ck7USi`NAUdy!WdE
zKV+xAg_qw-ih7#FO#AFD4tSu8I1&^$x>az)8WLc<uy<6oaR)d2!jbm1{~-M8$mPqe
zkl+ooILq!&O)sq~w8x_gv)YLt$t0~&kF(jz7;)Sg-TL}?m~2Trpw!-Y6#G+n!P`Hr
zLoYy-bx}1^w!ih(u1d^mRv<orrrcfKO-Oi8NT!7T;dkN69LU-`;0xT0T?PbZDwBG<
zCEkD*a3~G2FGLeXNpfr1D||vo>$ig)i*Idg<i83rBiVF!tf-qc&0ab8ILQ)+&{#e}
z`|^K0*-{Rxv?x at nPv<7`|2>Yss3x4oV09ZL60M`1w$1{Ai9o{fZ+tQ->IFKdO16+m
zOk(F}=*ep>TNfKsm7cTb2M?@CJF0o<sh%woUOM8TJ>&{se|DJmijyFg31{hv_MkWP
zsVLpMw=PtDdyIVo$2e73ij5iYhsHpj+Q$$0*9gB?gJ(4%kB?m!Tu at 13*!vv}=({3U
zXIQgP3~9IDrJ2tq9v0)(t>%Uk5a31uIN#uwG#pwo>q?xRkpM0gJk19t%omNvtJ&u$
z4o79+%``yIbG)|qzH&5dMK&St8mcZPd0q)kzuPy?9}qd%9P=VP9HVNAuAaS!Mqh3w
z986UkwI__7Cm1ycTpvwPzmvyaI|&$ps|D}5PNRau=Cql19wXnIi at h9Y>sP*%)ka-M
zZnZ{NgMhD!p<T)4>N*SH(xPJ2G+udvDD_qP5N{;+7G;0B_tsoT{;%fml$uIxV~Qxt
z4)&byvl&AU#mv=@A>7X+zEl<DW~uHtJ)RqTD;k at V7r-~y=&nAg!e($4 at KwQ<9Fvnm
z3%_ifJ#p3~`|61OmhUuyNx_$U$Lna+h*6yuu7HVKuRjtR3>sPxJ-L}RYfGsp6yjLf
zD+IJ82|JFsf?wt2zssUIoX{l$AvTgBPnLa4^P%^0zPrD0K>Omna@#FOm{W63bOM^d
zA#3V8$y4RlRwi%Cj=gA-HW=+n2Voi*AA9%yL7_{w!>1MA4!#o$PJv474`M5viY+gc
z5OvXW>;iJO1O^$QHI039Y9^FZL_5PfWJ at GC?0YGBX;eB5yi$sYq=+;k$;x$%!5_ at S
z7t+Vo{f at WllsYMFWSr3N)umxZR!mm^g5JgZnHkYq!ORgccd4USa^s8Q$x>2Z%JPKY
z6yTi*+Zanz5C5La3o~#T#uOW8VWc7e+L>n)sPa_%oo`<JxQ)FS4EE5Bo3YczD`^5=
z5~f)xuSW8Vsp~do=Od$o2C|w%5vgyEan2~NhWofb$Kd<Jmnfp0S}2Cu2jzvunA+8h
z&H%DHkA0(3qA(7lc7`M+p{pS662dUMxz?VZtpfCH13DS=9xz7Ykm^1FjQ3^qy>2ti
zG{+DyG!IwiOr|fL>b<5!FG4#Y56L7kQ+h|`vls#}<Gwa#soEP+!BxghRED_uuf(o*
z<u-^X^15K9<Lm`v5pNnm=*L}hoRA*RI3{cA0Q~LUfOPg(aVwU!>74fhn-wqK(zh(+
zj$v-57mVHvDTvVwn7rq%t4zSv_m&5hN?^fe1UtRuTyP7xqG>y|Wc-1iZA|5u&V%ne
zzLNu~X6}}06KUn^ydi7;-{1n at CS3=~6ns~;Z-+0EG5EckQ~;r8_WVM<k-Iy-*Lzb6
zkydSBMC3o%EZl->_9ED8IJ$WS5p1zDinjy#EhN8S21z0hX at LiT+?|niMxC%=m)*fJ
z^1JLrAJH-_j?<QJYXew_ybWMc{nMbAfOQt!N&Sl^gPVkQ)2YjC8&8T-NuK*9`W=9$
zzthf?kbbkDLHK8F!!}0^gprp^-A66G(!xi~pqwF3qYuF+Rj-{IVi=lT at fLggy8Rfl
zK9ovguuF{Uuid+rg4ZmL7snF(U<neWG%<6RyB>eBb-!=?>DoGa^p))*ATP5j-a|z~
z7!MoL<b~sPcRrCEXz}XM!EFJobgu6gDbcJ1@;T8S$vMH2ii>qOI(zbM8ncdZ-1CFZ
z!1lz42QkN&q`5w+hXD+%IGLo=cxr&Vrn3aqeTP)1&se?Yd<pdS19wOwAl#02PMgD)
z6}E4+2eiH#c;&tvSG2V>s|uwt8skXoel-4LgFZFRW)9_V^m>%%rMMVu+hvwVIt=n*
zIf23Nh31}L^8>$qrGSJc4~pv{EC&aCp9pZ!9j5EmWT1Pqu6-MI&ys=B_MCyW4D)`U
z`l}qBvrRrtcadUbq|qJCokkeIZK?`x*lt(a7y?CALnB0H&-f(K_Z{m|3nr5#T`>$x
zeLPJq=7(j|%H$wFb+C_$-!(h>{F7YtEi~iRdD`;xZb!6T17r2kl%3<eBj$8&u?sU-
zrVssm!R_aFpm|A*BhAFbWE+lke<xB18l6L~_)J=j#5H6P at qHAR{#EFhAx8DqyV?Cj
z^3rouxf1AX(kgA??2LM3gK}h}5`9!BZF8V$U^%u0d~A(W4bb9MLUOO4D_Kz%okK<j
zJwYb2AP)i)aGMSqV|s at +uLkTYybpSu25P-Z>1fuc8$y?7c at C5q_YaW{!1Q#5x5>>N
zg)-6&$2gHI&9_VC9M*F7F0+V-JI at Y`z+uo6%%a*#PkkC}uBC8RYF-VUwok(7bUx6^
zsfb$C_Iv?uK(BHUm-M6`9GE>Iby&0jE?kvtp>$8`ip!7!dvS$fK7!{8YmO2dvj#m|
zdr9_=6f+1|s9ns at zE-NvM=q{yMRx%n5}lxrVPRo+O+e3|m<@ag<GyKlgfvSA{c$n?
za$PvSXNNZ_gQWg>fgf<|XJ<9UAfDzcmaE-8zworH<GiyC6=+Z)&k7RD=cExw{GDJ3
zvfQ7HXDP4w0?cr^Ik#ltmDZ9oRC>7974vAnIR&~qhelx{0aGOf^g5=SVT#f43hN3=
z6LNdU_t-j;q2a;)+OL7P=F_d-rGUj&f}s}$=D6q4`lUGZK0FN}A?}Ap`Gl8|o$bzD
z5>~fETQI)ogFxDiX!Z>wojC{XBgzLbt9b at KbeGJ2htMj(*~jSelKw$YV0rPW3N#q7
zCd)g#Wbk#Z(KxE`)QlMhILF?9Sc9w=ptDLt;MpUgzK|0f>81nz*)vp3Z+<DVeakcd
z at TwZK$+Obkit-fSSh8T8KZZ)7D!!efmRZ}7O_x!%Cs&1zgkcHLNQ{?{I6RdJ)PUA{
zLz9Cf!|X3LC)puh0ghaGM$04ipS^J!PTyKwF48&y<8-fI^wSd#vbk=ByOOELM+AO8
zM~Jhd-ny$p0u0_~)0g{!h_hLvCc)}r?b5lQ2|&qUY^mkX_g4=5^JYI{suT4bn2Uj6
zx3Grq15=+;C$|9bu>!TqKx7 at Z(u{e7Bx6<9x#YjoGcYXmd}gMbtq*O_S~?Wy7)2~D
z-0w(>v8d6$x?Be<goYmGw^g`lBN7Pwyr{KF*Z at nxNb?IIw-Il-M2*zC-$ouj5flFj
zc<${RCu!u;N+r$I??qrj90>y$d=AMlTTqF%g+^~tF~9c at UaX$-Ic^=+X^oX$IMz31
zvYLXP%gM<_ at q)5beyqyLQ4s*!?uQb{6Lku?&Xa+WOQK?8>=-m)E>|l>wa3#0JNFT?
z)@x9i0p?xlaH|IyjIq^spn(752<$YiWt!%YX*H!UoYFUdO`I-PA~xM)qNBBxi;H0^
zz_gey%u(~=Lq=nat)PcW6M&@SPuSwwW=mlf$#7HOWV%vdev$y_0TWZEJT>U|uQx7C
znGu0-^riJJP>Ht^%jd)9Lc_5^`y*Zbxq_9#fbrbHy$ipQ(-H(GD~nl?RO)A8Lg}JZ
z*AbS@$fe`qIm_N(7t8%`7n@)Kp_f0aTqpcRBsJm4CcxORR;m<*E-6()AgUyY)TI>v
ztp!j at 04`%{J_p?Fx&AH&a209$uh+Exxlmds<Aq72{R}}lTiX?A>39RioZPvNlvRWa
zo99(A-$a2GderqiDl?=%^ZGB5u44FTnD0hg?5H2>)21wpSevPr8y>h`KFa00xC9T%
z+NFtXh{`}!U6duBsUXGQ`Rz<G at cb6Sc>R6=^3f`7Z*M<r9+Q&l6BaMlCdZZpoa}0+
zq4 at s56C9<)k)E0)GB~owRTv?&r+E-ug3U-*6!q>C7A506 at p$Odyx2~9>+lcHg#~UH
zfEnjQ@({lkFIFD{C2lAD!rAHJJ6p=3K&4{1<g}0yBHKSEdD9haVs=QWJK4YL`%;EL
z225<2j$76g^DQN6ZB$2Bbk0K}#!#dFw2SH at 34@IQR&~J9FYv%qAOE$IQ3TewX^Y#e
z5l`<`OqUsYRiqg>-2VNhH4X_4GJTh6iGtCVQ+crmEt>4)jgU>LgDJ~12pBbj-e$kP
z<prqf5#=+<<03o(d4%5$T{llls=a1pjRMJ7<U!@mVJ$8uw%6`l1Ibaky{6PME!&Z)
zGEb5}qLxGKq}0Yyc!Z!WRQKehr*cXTFyS74wEnEh4(gLpdd^b at Y|HC#FDfd^8kh;>
z at Cg`+fx^0I%`L>S-^hu?)?o8 at 6x7Md|N5VZK_9}xzLVqoS5_3;r4lcEeRppej2AM}
zqi|`?ELul6aNMURy-|i^pk`bZdeXP*n7O8-`bGS~YayH+CnoqvNN#`3{wsy^?p(}O
zvaldy;KOGDmiW&>ikZU1N?g at BG&h-Qe{_%Br=)1IdK%kj8xrWmr2a{;A18zfRAlFI
zx4qi6_8wk=Lxz;@O{T?Y1BX{?g1Bn0 at u})|T1Mm05 at T{A+@}H^E!7!p;nPyLbKweg
zmcB#;gsJTJU1_89dtimUGY%HL^A{&LEv^&6I-{y;CKHh5ho82D>1yJ&njEVw?z75D
z3?x9)h>bVI6#L$n5Q4{&lVQ|#n at PiFY;`dFfz3Eb_!D8uG3jP;E!j5(*!7>0b1&XJ
z-VG=0+xmjIi=_K5uR7 at -(p1<^%v3}OQjlP%V~>fjY;_?4XB3m at vzX9^=#IV)g-2LW
zAciP!yF1?lfqjX>GqVI<Vr8$RPK)-ogz=YjOcRu3L_ at SrrDl#*zY)5jDobLD?AExe
z1_#-Q0;CYRmgk8(ofp1}p%CkWV8dpdM(e$4FIAf{r*og?<^%Dz5IYsk_pqGSvKjSM
z5t_D^fLuycM(fU<uEyQQ0f_w+g9xB(@v|ocHD6uW0WpkvuL;H7#{1J+unnj@^WBT-
zlg>Xo@)S=+9n~R48dFa%L?Dg_W3DKksVmGCvRQ#T#1lE=ad373fXoy4pEtwWju>QP
zg&6a})w>d{l4vG|Qr3qOx0FF-z*x*-SdqpzuoyXiPOe&@-0w|&&y7$<gfc=Oc*yI}
z#AzxlKa3?})Ie7czANh&_g8nLaCjmoydirVTSjQU8nI8$Y*bC`!Blz{%Vq3^g+2HQ
zngB^50&PvDFbzc at v2hK_{U)e+#;dnlhb+?5b=Es=YK^=+7qaL@%V)f#g+HB)DpKtz
zgY>k`=|6qhN=|6uk)LMsqSsd+pV(MasIa_zo+WOrrc`U+RO~ZqWHD0^oKDg53Az_4
zklijF-L0$464Hd9(NExSv-}i{*LeHLpCFo$(RDenKAi0*ww6e#)2&q@`xyQQu{>M(
zttU95A;hnWxcR%&)tosH%JXd4;k2fFpl>(zYoV+9JL7oV9g;+2L2KT;nra&r6rQ at X
zDs>e1X;*hNcF>~4`bzkg+~{&r8tPn7Ikn{^X3Cn%SJRDevP`A$;<@h=6(iK-<D8Zo
zQ~NvUy*jDsnwaEYfwf{W at q@^X&XuiFiKAOyMamwtk>2iJ^mf(0)a6aByv4qb>a at wH
zU66fmcPZhq%NQt{xty~d$f*vl#{~YF8U5?Y-o9J3;h&$c{|F>na`6^tOAMGA^)yBx
z7DWUDG2K2nDMsv^bk1EIH7R~f(x01=115g_@<sGdn?B<L_ep~DIK7U|Ux3{C=@*ms
zO;DNGB?PS0p9@;uvsq7IP?=}%!%81Xd#L=miMc&$SReGJd2qz%!MDxy#1=97vmp}F
ztlR3`M{M4AGlSV$>O^SW;^!!MNDY{bLWj_kmA%=dIj=)IP6jw+#BeIU#?nmXPB>h?
z at KYp)j>AeI-D>vy57bh0h8}Nx>ATZqIo8+{o}W2ZU9M&Y0e|T&<CKCuqh?8eBLV7I
ze at eT=A34Sm at H`~7IDTRA5LTFBbTZgcw`vEkiW3TW6%OORA7{J&B%qKG%+<a1guYu^
za}ZP5J=L?Zs+&V9J>I?@-FvmBwX5(Iqc<CU;j6pNtXFxYQI(dW?v?lup%zp~d+I#m
zRc1eS-sE>a052|>`IW4SpJH*ALSnLoUzb&R+IRshR1D(Jb}T?$r?C9E=*_}X!2R<*
zVBMK*(+hv>dAsWfm_y0l-dr~fMI6%rxS{UNbtH%7d#(4Vu>m#Pk at SsslD~8B&StAU
zj#42F(c{{hKJ%!Ewc-Fyp%Gh9ji?2cbbRE{9&Q;|)^xNMzW at 2<#-gng&|u!%lKEyX
z*Oyyf_{L+V9y=tTj!SdZ`B3 at 0z4G4Ww%~pHTcOq{ZbdU#im4P8yt+)tv%tT6Up2z~
zBSA{jH`zM(OC3%Hr{0aQ_`qFb!D@%G;%S_+w{t(8;kvYnz^6wHhZOGBioR#V6?6nE
zijm0#?j?6K(7g^)!~xwv-$v;Lz1cOMx)0J<udh0Z5BQ!b0~fMR!Z%1 at UZl+PY3a#!
z%u0OCPB8q%SDNc0Ava;6c9Yl~BfzUak|&Jke*~E=Ng1#+`ldeS)<5;bhN1c~=_=_a
z`n<{JytqV<Xh(9#>vQMM;hxNxN&VCF%I!MjCc?AS1Uh}Q*$RLbbySS=a3g3GXWyAv
zXlZHl)w{xdM}(v-5TU6Et}_W?p+V?!Auoj1{ot*BO?054b93>F(guYD(_gy`TGiY2
zn2o95q at JMe-;_3W?+Ev^tp;UsbENOHLak}z1Kl6_vlK9cggBK(210nXaQzY6M}qfS
zJa!Ie4P~q=P}!PAL?C#SJ#mE1m++g2li`hisU6p3kkdiNov}x`4!TkwnKr8y-pG3y
ziI`Nz7U_EASb7ar)fo)nNT)k;kR`>GnLTBdWchqANOdUcuqi&2pBB5t$qlp)$MYwu
zdL at GApTxJt3?u1sTM(5DpPc;hO^iLre<V3go`VucxwZ%g?lzB<FGR8PXWP6N)T0Mo
zBxARb?ARNkF7Ce_k#xAXP;aaRs&TkpOpYlDWU11xWb+`y`PR{~Lr=tv+K%@Lq+za1
z$^lSdqK30~p%)`*XJTEYdBau!kXuKa0Z0y!yXtH#4V;^{$^yHs{1I%WZ^bfrmq|A9
zIL}?-Qx*yatTNKbLgrq4)nNZs(%4R~^ffK)Hbb|IWMbTKwt!eVA)#dMM|q&Wyz%&v
z+Z?hWfm)IohF^HZRXfTdPOdmlg%Y>dO#B7j+^h&!HFYN3-<+3`v~J%W(Bl0vVsAlz
z2Y79(eAu)28SVx1TT|P=f!_5nrdGCyGv`Zjhi%t^%4(#R!fzF&VvFyV&_q2%%7yT}
zq*;tU8vao5J#v}z6#f-4XYvu*?*1)aUCSzK^w6fb5WB_a?z+s5K4hR<{@hC<u|7|K
z+SwR|V-DnGj~ts<T8EF+{4d%3AMCAJ=GEn}VfV>ANs9Na5)*P|+ItA6x1v3@`4MC9
zu(n~_Z1P|+#8(^wY*ReXnZx8#Js0nW5ibf4I%?&WMsx5h at b}&HtH!DS92I4|qm(FO
za&mG_J^-&kG>_zFyA=6`NJ7KfxfLHmJv+gNvu`qMjC7m at d~Y{8!%QY^yq0|P1X@^c
zF7(oFd35PKZq!)kZWEOs<dJ`Eb58k`hSwSvV+ak4S+3O26Og70-B&!XR37MHEtbUn
zDQ#84#UGa+%{w*ZpxuKYKbHCF90Y50N-MQJH%~MrFd%-U^O)aO(@71VB>aORrI~1=
z1mhU7j5)_Ru<(aZ>BBdeBh84#&IRQ&2v%5|+_rdRv@`0d<z$K5xjAVrBFis8WESbw
z`hnuCZ`V>Cba6#f4wAe|Y$U}hbPL5nzZgELcIVwAVy%ntqs&<ABe1mgyHdUFl_tco
z-Y2P*a#ylh1(?z_qCnY2UAa>}SWKwjDRJ)g%Fl3Ij3HJuB&$2r&>Y0#HP0nTI&$b2
zh^_4HKg=p~p8>Q0{5~6Au|(N at l?X5MON&SS6<{y&yH8MWp!bTbN7~LMXDZPlTjOoL
z9%7D?vFct*r4c4{W<$<>`+@~t|GTjI#=|z;Hw1X?3;rC=#pi;y3F<x(Hoh~WPleg#
zMcu5JKXlHZCAHpN`3Jc5_1<oeN8)kpK3Q{*@CI9geX|Zz2@&HQS?FAFc%Es2<R=?e
zsCZw3WozsnA~2usc5XYYvR6z9H-k<=vo_6OMiNK*7P9wI{vDo?Jst^FED-NTf{KVc
zeg!I+i-7999lz7pQTRj)ydM7$k&&LpS?ZWd%rBVbGi7}*`tipKVUZH4O;MLUqGt+E
zJ}vCN22uAA2s{9>I0gCZ`mP63dfg4W(;o%W_fqM6TtRS;GC=h}PSeAoSs*At$b*w|
zh6_nG2`<r^WS9xDV|U5AvP8w1%qP2S{jRJF<>rJM3i(F<HpNZyf07tALW_THHSi1k
z+^i-<th#9CX5W!D|9&5;b;WmD#%T5lpw}wPj45&iQrsAE$U=T2k#DvogGdTN-|8Te
zK#$YNd*^G#l9vE|!h)rak?d(}(Q0GVpFDO6$YcNeZV)Q;0>*xRe2{m(qSI`j^dM0=
z at 42?bvue*zvs3BT3r9L3f^4^fh<gNel2#LQZsc-YH9FUipc}c8VU3)hRY>FPe%(_1
zTxBz$Ym>yJQ#IXrLWP>KPtJm2G4|hPE{d1 at DrMcq;DBBpFQ at Er4L4U(c=4Gn7jZhn
zX at FpW`%0F&9i at ImcDNyWKPtkj>xU(GCVm-=?k%a$UEG0l(dhRg at V;F%^t^uXg5MkJ
zFqwoDuKHmEEo$AHyfmK4XFI(P?*#xG0T5stiWYptjK(LORSbQ3*|y+ht0Xy<rw6V}
zE5n6rBmhCtTBokQEdazSjSkR9_s*mdo#bPKb@%F33O2F$n|ak<-|i1r#HO2VlucQQ
zGMzl`u)F%(YW;`n`1_?O$PMTkR`&?Dl$CxAl97|E-3Fo|jh(WbtMh(RGegl6p^iUM
zQu8|NFM3Qq+|l}f{o;B(xnLAd<VY2RG~G=yl?tJ~6Y^rCv&nAY&zC}w?00TmNF96B
z<Z+rSU4~Scb3tQKDl_e1!sUVxRO-KPzc(&ZFZunMaKE*>&JfHKVl4y-?UAHf5{V#c
zNP$@zyVB~4ay=DOrZWc;C`gskZA)JLiPMoisf<Fvk0x)EaqQ}Z4k-lCkAZG^xf9pH
z?E7C_ZC-IUqaZ*VY+*-HHnFGI72-&%+*WN|w}ClT2nMm^HmpCUiyu=JKE59mzW<e^
zyYNYqij`it-f at Bz9Ll5;tSbJkAXH;8HfpW!>VK}J-k3Oj+iwkO7>TSVpy|xq+($8=
z2jB)|FoQ$aMa6=K$XP(SvVa%%Gr+bho#tj+59g0=7DhT*px7*9?Gy-#&t;@$>FzXG
zPl{?S1Drd^l0tFW at S8}KdJy+1uR$^4eR^0%{++r at Vb@xTF(>j)Mty?;M3J>qeIc^?
zO%r at Cu8*VOgM&Wt58dV+pP!#@K3Q)Oh=6Q>@nw(2)%^?u96T(UBR(|<pEq&ve(UwN
zA)aI3%#|MFI#%Fd`taa=PJt8Z^Py-Z7fAt4y7h_RaYj6I$E{;u+5#q|iU3($7w<Fp
zID1yfva_}ZZhJQIV7N3hEva!rmvZpPZp$PYh_F4t&c@<$`;>F&s~m(nNq1aUfKE;w
zG=io0ELbG5Un`-*NifHL>w$g3<!e^4hS?-ZE?JtfN)zkC3unVn+bE5hPGj+{immD|
zNUXdWE>z2+BzJ;^FGJW9VZjkukuocxA3l*4=*GowuPI3a=<wgbVVY}J1~W<Yb3U|N
zD6PP$Y;sPe0i=prMgdEvxeI2}b$Ye>#}ztUoJ8ga*;&P1Dz~|sl+DNGPEF!KBSHP&
zb^`*>-^+<9$ltckx>|zzkf4m=AuCSmqCj1s$*uNJP!T%PCXPT}6XQhe?hxJ;QYVCC
zyGP_(FOhFdHyRK3yhML@>`k4E364Cgr)U|!eSVJnLJ-xkaOSc_krb7_^HlpVoll<+
zQeM~KfU+jIslj+(gY<^K+5jv7w at GVKYd-#@H*i3hj+s=lXqLJK?EYgf)hOg{_>61_
zWq at G=)&2eO`)!?``D0lPot7faRyzD25o5d`Q4<yaTX)|X7R9!-+XF~Yq98fT7L<(S
zFk~<hl$^ts3`0(m28j|?BnXmJK*>30HbF8XAPgCX%#gznZv*?B?|R(#$M@?z&+Q*P
zJ<W8lnqIYPt+(o}TCq-}AS8P@@sh#Atbds>6V0oR_0GDngsUHv^IkjGW^S?DSRzoE
z8*R<BgjF~{B{qkjuxpk_aJa5x)X{RMD*8nYZL9_ at yX2$SgqT%^q$wLs>J~nh8j at Ts
zGqI<Xl$DA2KKh4d>pM`rhCFKq?V at P*sEH#eV*nevp0soZ;i>xNSoSXiqTu{k#7f(8
zTRCS+Y6DuSXOV_ss>jD>b?h^*cvtsvK)<mFq-`|#tYoH=(>84%>=z%q2_aYrgmLIs
z6KZo4xTop9Z~qGaTBP9jZJhexloM&_%Dn&k!K7BrL23GN$|mAD82vquScZ=DldbjO
zK^?}dW41P5`Fg^1bjh;kLx#@g#Ykh{u{6~WPG}Yvra)a9U}chHIyAt$RQ=tsJ<Wq@
zD-0RuF1uEL2osr$0^f88^OB5|D~_4n*cQhL<x#LLg5SPkC5=*2;BRy*^1bmXQ{XES
zc<D{kg{FB*H<Hia<}wnJN1>nj0*AamxAJ#!Vl-+8r^AqE<}vkZG{6hpdKEMKgkAEe
z<lr+~4;Fp1;W%;pq-zyuD1!2~ydDMdBLUjvMvZHM<Qyt<<3FO2#~?s8{^3uIVSeCF
zQ?Ahv9lmnh$Ps$I6Uzpg){_O;gz^D2tA!rE!+vLe{1Wwu-8}3vNU?Wyk(NmOYFvQ?
z>{F2INUBkp>r^QnHeCHzE13HbSmI)_0F#we^`Dq|eEwOIw5wQ;&BW1tenQ{!)?a;T
zp-JP9b1CwQc#OtYJLOqoyQv@@Wt9)-wOY_y(%5jf27STvCqBTEMoRYU&OVAy%fohF
zLlT`~W-U6V+Ss<~v=bSYqAp4SnX68Jsnyq;zIzJQ?Ft-0{aFkX{Bu73cDkui0FSsw
zaIN21sa7ym>lr8X9V5}mlfOpyA;y!wm at U>x#p(FMHYmuFW~MFI_-)R|3QO)7KjWSb
zf5c5HcBC)<S%=pNoeyFQV3H5Yx9R66sOD01(0Dn8w97}eA3TrzF<S{rAfln|3jJA_
z*K at 30_LXS9J)@dvr`@8S+djKx7OiuRKL5UX2%D-X&*_=1hpk9HTzAy-b$Bp=*3deL
zM1Y=NfnR5(asohuX_`yiskG9>x7c*|XTQ-269JiI<}IOjlBJ87&HRMq7!tRJo}^PU
zv60c0uYMYI)WQlLtg_QUlqvz*r%i^Z-V@~&h~c&S==%Q)mZsD$PG0~^JIhYndyak@
z*ArTK0^y_djQ!Vkl_Q?EgDKI02065J+H0v3Mz~hqN>NVww*UoaA_3LK=C45xLg6Mb
zd_XHC{2|#p{|FNiOZS&2hCawe<QLA8 at aOMB{z7+jn$BnN=6teiaWoK)iuQ2CoeuW(
zZb)#;r*!Dt6LB!W@!cpPK#UQmasB*(W4<`NLY<EfRKWC37pIO*O6I((>oq7|=Yeo{
zH+5{TTo{9=0(Fv|bKJHL#$2d>T~8<}0KG~+F at ukHLYzSt0#d!&`ucs86bVKmMV_~$
zZX!l4Z5m#UklvKKGG at fvELvdLzQzjBenN!ODDihBid!~$hd;A~{qm969UpfjZjMaf
zGsZyXRXi!|uVKWhVI;4eIzL0*@w3pSDz0w$v7Kx=%$wTy{K5W3JW4k^<^@NTA^CU?
z%p$WK*%5Irv1pQ5^gA7b@~@pwv(Ss)N>WRZ>;cP5w8zn!k#yw92fv5at-J>dSHp at 6
za&xh7DNhX2FY{q+8HN}`uX(7^#bK6J_xX+O9>PW|sBz$v&1&!wP9v{z^5N9s|JNY1
zMS!^UYr_QUHoZLVyzGtcUfiKKJ{g^ucV8NY7J7>ogiT^Kx-e#mQ(GR$?sjG+!*GFH
zq;+g<4m at 7E1yq3v!D86($6b9;$p<SHb at xsll4lb24So3%X_`huND^X at 5cc|0ex^gL
z&cv*+3}QGglT}LzCqFm&L%9z0FX={h_i~RzfB3R1i9Du<0zEbLI%NrtfTbl-FeTy3
zZRtCY{S}ZuU7ML^3)Ns7{19WdtmmT1kXhkCi%!--Yp%`^1{EALukQWaz9=tr9g9ZS
z1v+!t_8Pj&p6LriwU<zftV0xH4^B<0P4oz4^T(it@&M&R`#51WrE+oJn5KlJjpWqf
zAq=ILg$D##f1IE*F1C7c6g($baCVYia2)&(iW8ZFk-M_}HQuQ at b0l8qw9k)awaEci
z^!(==l}S!R(Xj#BXAXiZu__F=Wc-oZHz3m|q+s=Md)RTc**Db(O$D$%6hr8vq&V5C
zAr*-7Tq`oXZ;=S{72zhSQ^Dy2Q`aj~82n=3`K%EC<^1jxOa8DtHoLDMI-T5X?vr>L
zZx|~w(-Pb&C1K~l at v-9O{9ve7o)A at e*Kt1{Q(96RhlhTp1;X at Lqvd5jKOV5N+-mp^
z7*q{5+Ro5%=&nt66ItPvZ&&9zFC+#!cs6^ge4Z)!k<<1L-6aAvTC at kFA)k52gQ!Q>
zRiobJAcli|^waZ+<We-D{x8f3SWma{+Rz>SJ$4}TXLWUW?a)+q%Gxlga<yZx8{=>c
zX%mg8t=_Tub7HkzO+wLn!?DunBxQnVI62Yu(z|=_BC>Pm0N4$_3&#hMjZ2U0T}`eO
zmIrUKc68Jk@@W|JvAqp$$grVtn_P?WL3G4P{rZoDJ2sz+N?aEZy{|jQa^Gflxr*J;
zNd%d%l$j4Q)mZfCrfa!bEY#1zT&uWM5E9X>dBrg+sj+;Ed;HwWPBK65>7d<^(C2a@
zej|e&(cE+IojJX!ij?|0h$-aB*nuzVCFofC6`Yi7^u&k*`tC&4gKQ~l_sB4%D?*~|
zzYQ4Cr!??_XlM}=bnX2*VcFJ at z-50{R~_9g6-ywjDI`!*ZdW%Jwu?v|FouGT?a<#E
zX-oXCAfSJQR}@tXgTiu>5pUK#>1w)&Lww}sTzU{{fv3bVnUUQfHuCvv at Dw%i72#JM
zIW+QipEZejjcD at +p^}}XnB?g!v(e7Mt6xye+Q|=bX at t57c1vD7uE8}K;e-??G}2X^
zJ={*|0xRJUdwT;+SZmTPns+eSWE!oi$92T)jw|#$OLXfQzgJ=^@sj*;4Esj)V(ip0
zKQ+0}7xE#?<}5tuw^o7*uCu{P_inz)l3}BNtHwnH$g1Sz>mb+F)G3CIP$n+ga4n
z^N(f0FlhL`_{wtW`qZNqu$8L_s26>$XXba}L}G`QEHa>XuViPG8@}Vx<5%=6>IZ#b
zAZJg_<fkCM2Ds`8%Wm0-p2xX~6&%G#`*CgwETNnLmN=hzFG>a`e#6a$agit0E<b}a
zb(i)L{mA3&8RiJt%IZXW*@0=doqYlXIe&}vv`*LR<J;PaiRU#RWi%>i(CXN5J#I<)
zc7d+-)pDY#XN*5|0AV}?PigI`%u^H3x+({Uo8?{9*X2V-*jG}Sz- at -YUhfS}yJ<xz
z=#LJIe;^LV9Qod9hgkn2?pto2Ce|5HyIgpq<hw!(tRQ8d4U^&m#B{Ywpnj^V)3iK-
zCPa&?k>FF at Ncd=DvvZqckSTY&MBrF*<P6JBEo2bYe18b(bM5s-s4zF6e;OOYp`-^J
zw6ewn9!?hQ?1AV^c^$XkwcUG~N>v at Ru86}|@MTVpYLDBb#ar}_;!{_wna}zg9>m?f
zit+)-gE!>u8QKa1#JMZo7np81?-J9s`aj{_w6kQ&nPLV2>WPPP(&}N)Pz}q-RoIJ3
z!Ge(^I|_f0O9&J16&Oj49m&NhPCZ362%#vlvb#(rU)>uaOqT-T+n}jdxwyqe!Ses`
zav->X?f^z6EOij>tT(-ujs(GyLVM^hXvwDYfB;{O at m1~iPVgLvl|XNP2}!BM(xbB$
z=o5IyVCMlRx74)G_6GSZOR&XzRWsrXfS`9GoN^70;7CokL8b?qBL(_nKh}8y336u~
z5t|nwItwsF2Q2e+Olc{3)Z?fPcN1h$9;`j`@uA$VGp^)0f|==&9wyp`{~PV(;wyh}
zxc>R6FNX%HZw<jn_iDA%b2aMT=7?MEKGfA<pq{E*=4-zOnE2Rgj)^BO4_5Q4+RH(#
z`IVi1S<5LmH7a3xLY4N@*DK$MGm=(JiIexGLGIK}7teztFZK;g9rx}MM<Js3>J)fz
z|4*G`%8<{Nt7tb4At^Bjq=+SR at 4dxn(~h|W?i`%IVUoZ~TR6^b`80}SVi4Cg_P0?s
zegX5b5|=+t;2E!m**bqethLiEsJ83722YA|*7Q5o@$5<L^xa>Lra1^-aMj^iUPP$v
z%;|6xRGXAIyWRMQ83B at J>S}Qw*P+^Pc^d at Ud9*$JEAx_-$&;1(&qX`@SZJCGPnvA8
zcEBoMv&PS0%|XQ3_`nW{oU$Lepwf{tJ+7M~z;{THwbY{mnJo0?)7HT>z!kwL#MRjC
zBs#&D&<i5I4(^4x#OB$-d;sL%V=M(4+;$lD40(0gX_|*EKJ71XmJ9f2;o%Ow&-3~o
z at GOvNXj+b5s3rB9qX7awVJI->FzCpzI1 at Gc#zgtdy%kk(&lnoyqy$h7ub+>16dd``
zx$hYN%n9^KUlYs8iW1B*8z?|*anw^EDU7O6T-WyMRs-hp at u6nMSzg6ZD=b;ug!QLY
z&(~~-Wm*~UHcMlcjE-*8{=j5m%LIXwCicwWiM|>gnN2F8_fl}kQ*5~lu$YinZG`e0
z+$q<oTd9zsptKk6P0E+lcI-*qu;@9GAFSr+j34Rec4zg^>DbBmCQ at _Fw-5EJdrc<>
z=r=e-j=7WJwzjID{nS_+CD^_V5<SQjoF7M+e0$2-O0>YYdDoXmtNGK(eQPr;W9X69
za6aw}-bdydjipWAU at +DD=EAxw1-%rH16frROM}JFW?78y>D=)(@i at 3)*9}I}tf*ZK
zl*83&PoS_q1^lm~wnAS#XO~R%!W*=jyH-xWFDNMYC at A2iHx|;m;CzbJ8}%OdPcK;f
zl=uvAgpP4)Q#+Pt*2lVKxE?o90>f)IPz=ZV)aOnUIhc*+W%$Sk>hgo>Hq`uJ0IyXu
zPx7n8f+x?rbemg)Pzr`SF~-76&CVQ4PS at R_FQ25?3lM$&k|LIaKRz0&t06Q~cI>S7
zh}AK)e50A)JT(W~0FhGBv!c<kj&7_x6Sl8DGj0{Iag{{m8}a9L-P7Td0ryHNk0 at 41
zq!ASRN8=(0s0YDo9Jq^g;N`R^d>;atZiR;V`DoN5K==kEZls77&{TW|0sR{(u0SQR
zuDXpX4G_!+{J{TNZctA<5;S)hss?<+t!oVUnq#(U;;wbtZ$zP-OE^Nlk&OL0^o5;p
z+|x-0CCYUq&U;&N6q};-Xu!9`KkM^**s=uU)^#h+%bL1R>K9I*Lk}OC at r-f+xq1!P
zOPuiS+Jjbwms-PbJrQJZX2FeM9{(CePuKD^-0Pc;!zrO?y$A)69Zr<{?b&Cmlu*0t
zNq{jm(R7WQ=af9SQ4bhzd8^DOYCEEsHOF-g-qVY)TMZhs6B4=5Ihwxr!KWXs49Nd@
z%9A8xdx_=Fl91baDJ6Pf$&ml>01Hq-zIYBfJW)RXF?<bvv~5}Fh!aNKU%NymEmKrK
z`a1Q=+4RWij4fL2V)&l$Hz>w0<bUzMhbhI$FseatH^iSQOA5-CWvPk7+eU{|F4<@=
zMu?v!<aL{>bKp^qf+uIW>oLF+DaM1J#pjfrkeO>*xH}%D)K15iRb`Fs@@6UkR>ti8
zeyD;vyUq1 at 3XB8~ZG0TN+t_1Gg`)t?sHx5d5#4*0R0DnY3En=QRfclzjV;!!P4Y5F
zb7vV6oL0*&<Z^~oa5)nrnbu at 9pQO8{GDJD#A}*LgALHvN+3w{uuZz at vf>a-2v+|x4
z%+s1EPoiB^8cEH=Y~(y{&4(D%TlT6fyTy7RNA`|#UQi@{gYDrV(m&Usvrhx1CcCHB
zB6uW=72Y0nlgh~U-yn%oX;&Xe%B6l<VE`8X@>dp?qjfX6hd$blkPF7ie&yy4e~6UE
zYfDtM)&R5(eA98a>HWYYJ4IT>&G4*#Yx+znPa{5g_kn2UU2k;S%^pPz<MFQZd|l{A
z;kLAxsTNg7Y^1F6lfT1G>9|Gaa<is-6+}RIKN!Ws9w2Thyz#h)fvbqD1JuE)<;K`{
zg}m_=+p3;ciIK4Yrr>}y at 4{|dxsk+Edt$&;^z|SsLFqBm3x5g8NS6^^@>5;j{^Zq=
z at IfVK*Y?_kV%_mSdE-pdMx(mkd`i5<820CG*Qx42RAwk*n~6jdKEtNa*SF!Rg;n^<
zTPmE+g;#&2TdlHlZ9HNQ*RG}#XU>O;D{)DlH#k6f6sMc<uhJP$M6Th(_41NC?Vc at r
z7Dxdbc}YaM5r16@=RK7FvI}<T9C6CsEN>gGGqfMS at IQ@Yn_V(vjZ`H`QjA~_*sb>Y
zt#L)2Jqk`9jd4PfwY$BG)_D|<>MBR!IPcwU6t#VvldB?2+}kGAYLJEh5c}I2UhY^Y
zu~NPo=vYG{<5!7WhGIweZxK|B-Z+Hgn;2`1#fSK}bjnI&*NYs~TOUzofKgnk{MZeu
zA+yDv3fI$JU6rU0*~(>+qP^peWMNTmrOdQ3kTh#bn<%f*#FJOK3N))IU0mQ>p}{2L
z30UrdUv*L_4|cvd)?i`;dH%@|U24EYrX8h03JB)@0k`_W)$;ghpdNc>$-*$5Gnz4~
z>Zy^M$BW4VoIx^!8eO7WaT<ZsgqaTpoI&!gwVM~YzRD4jG%2}h+n3d`Oo8wD&d!`D
z%FDT3uY#kh;kvJD&8R1$)X)`yl1$iW2dDap%lAAZZuOlz(XcP>i7Zt_=S3*-949~`
z0p`~W^ZyO<4A0ZUCwZ>DW_qvuMv&6;?H#<gEKPT at bKYG<EhIhz#r#b!)rcdvHyL-o
zSD%6rtiii)UFADL0~N-iv*jDd{P69zAxuT(GW_QH#$a!58QdTcwQvAgE2ux7s_iKo
zH9H at C3L?q0L~i8m`?o~4S98hs5Ke^V6TAfmw)F)TR-#5UIt68W<BUopACh!}ORMuZ
znp_a|#m at p>*cGkcX-9M9OZGjAGkehG)APF9V39hd#O5EyYqsZG9C(hxO$qilIdLi}
z8H=r027UhN`KcJkxn^_9BApyd`~7#bOuW{_7IC9 at mbZQ%@-z_Pz`Ud-?kUQR_pihR
zU262iTHmD<@xT0v%a-lmTV2)Z#Y5+2LX-G`?`xyO7-h-a2Ql&9EO2L`|5)Mvo5=nv
zB#jXGn;ZQr0>3}}A#`bW`XAz1e^Y>e^>F|19$u1XouWjte;k at M`rcmhlAtRdq(MqD
zfbrW}WK>f?1zR-`em@}v+}xr+h!_LrvA=qU`J?CWOGNOg!60>mBEzEolx3SS<$Lw3
zP)qvXK{x_XCB?|LYUw8fV^?29PtGj&-#^Fg`;m_Ow4Nc56m1^N<B)c@)r)!@#bfjY
z8x9gXIY#V0(y&@Ilz at C3+JAgvd{fF*poOn{=M$FH1!*e~ql=)QP~TEU3YXLo8|1;6
z=`aK*a?{`s@&VnlQVi>j{`ar~SNusBNd`t||8Yjto)~TT1Koi4DUv_Z7#C6^K|?}$
zOdY7o`vBfQG|z8DwQL6Z6Z}z@<iLudu%2K)Qy^jQ^*hX>dcVJ(JCHP*-so?uV%Gy_
znf<&KU(Tf6=qpO=`dTYviA%~Di9oVRrmqxE00Y7*2j&OBhdi;!T0U_W=8q-6Ym?13
zF|kmh%KT*{k%hA5&EN~rowVxSztzJBU;!+*cQJ at E^Fix9K^F@#294n>d_eYs8Ep~v
z`+$Frm8SVV^G1Zp4M at 6YCBp(!%3x}c2b$lIz~uU0bU49-Nt}uJU|oVCIv$XW{v!DI
zSeFt5hH1rds3HjldqY9$C>0ak5wVO^35J|wgs*YeQ{Q`I17vSlC0AW}F9;x9WK3z*
zOm7{00O1GbYJri)hh#ZYaxT2TkKjZsc(#euT at +Z{3%?-xMA;Xl-wM|BrK+0fRG*Xt
zSP61rw#;Twa|Op9V{+lZ(XvwCO<sqD!z%M#<>X5L_)VR4<`OOLzFj7>DqqRN8nk+u
zd*T&Vdep=r|CVLvTtQB*5C1pi`fm)-|HbGRb%#t}l#G%*+loGhwFNbw`#=26d$h;}
z)cT!6&yYrEW>Y<ts)v$1e`nQz#^_Ex$o};PD_R}Hut6 at 7gkrA&aCkxK-D;({d?Ldi
ze<wnK{x{P0_V!A@^RxOSX^?Nw_r{q5 at ZB5I0xv-`2k#bhAl#j~u+G?+uJS!Vn^wNH
zH)1pgW-PgHOtxwn`IK!efHZ;u=lSt#@J0 at -6L5=Cl6GFBi^l%`lYBgK at q<7b`u&sJ
zAl>wjMZSv^h^ylx?PbE$<%f^X5fDaD;>%+|<SJ<hjL?IGGg^>v2FiDNxJ2>(&;6q9
zl)%k at -IM(1C1v^Yme5|_%fx}Jdlo7Ge{80j=R1FEQxgO>Q5_TwJzCPQyEqF7!2E1g
zy}?I%(JjGOZ`1(SDsgr$TC#0shUv0X1&>-7&ia?Yt~LU9XAU&!Ail`ZTDY(WU>Dt(
znVtqhLP9`w8BWB8`yIA0 at X!)&?IY~xrl*akdRW2lEaG0h(rRL`(LI at n6Lzxn$*rxe
z;eruEF9Q48Eo|^Qs2!JL1pZ45a0B*%`lS92E6hglYwJM>EwH^8)mNQ35VZL*$n>%g
zmva9tiu{e%%YP5(T%}mZQ8b5>hh6Hx$C9gbl~Arg3Qn>s9kBq}%ohq_fXl7RcBMnT
z*Dpo=NYOYjLA=r6jA>toCeNSpAex!@)LBD?Qec?vo%uF7cED^&8)l~Buz`XQq9$9m
zVr<XyVpt!~AY$%wNnSoel>JJ>Qf#Q2D-5M`hGcSvnvq?3+kFM~&WgSZc$3y;{V(p1
z+dNKnSCT1;sc8swT)xSrVL0V;?1nzGki5SzS>pm;@i`xUUmkxcY4WWrMeQqE+w>{b
z<<zg+hem}<Te2QFoDPxe=CR{OL#FZajjU!m_rwHjKCa6ac^#f*Jg#*4CUcG=Nui~i
zwivE(SpNP;t<M2gBi^I{_sn<qsn&@WuS%~2F4Uw%W8EiKi!sB?W?VF{-nB$~ikyA=
zko8OtQS{>3={(A-@&(e>+v8n2E}&OX|El6c4j2&V(sEd at d&KDB4PPy2c-iH&J3XW|
zCFk-EBHV;Cl0Tch0}Z3fb)RYo?$R=hUBz~A0v0>X^u5ke&yEQvogIceab|Ev95aTR
z^#-;^?N;ZxV8X30xaK<938A&_%#!=``G)lvi^&0bHdU@{`}5>n2GxNZME3+FQFD6n
zTr;c{(Gc3%WALn|&I^EZ=+z|}aALzRx1P4}+qZaJz;L!1a at i$c$glc%aWsZlEBtN)
znEz_-ffLdmE|lc;l12;pW15|C(({~7cza`m!CcCXLb)hPs9>&5ub|87uY%cWEZnKu
zmzt}$#zi1-(%J*-Go8hN7Vq@|SFlHF-R(t|tDSuWC8}J}w`v*A_an;pur_Mn;`oi^
zHw3un8^uUZ3(#VCII$8ba0?~u*SfOB(V6tqOn)h^38`yn%6J^V8G}%PvsT1s;`nu)
zkU+%{5IDOcz!eN1+Kj$bgS?i@%&R34ckfNehn#o|X}z4F;aIJ$-jIWN)|BZZP#3f&
z|1v4+A5hYdyS<I7OAT?bpA`R)cfXcv<F*GpCV<AWOt;c^5v$Rl)^OauzX}fsoveO_
zZ66*6^m}qMymEI#i1sQ9fZ2`*oqOYr>;;C3DY7ZkhfBnY1Sz$SW2$SL!+l$MkK-Md
z#Uz_ZKym%RpV)RVK!d-zAKiVjF@>gz63VypTFnGNg0<;k`=!XkSL1T`rLYLJIeGIA
ztQP%3q;7w#NA}$T;GM&VJYZ?opaLeV9B<{tsbO1H$qMI@=hxnXRECV`f$HuH(AGt3
zuHJ)<d(h<#3((Gh$_|^^*2_^Go2W`Ds0lspb<&&B)9Py6>0~dMJMv=ajqJ3^MytW2
zH at h~vLVUaz?agnWC`WCMu4Ag>oJ^d(fAu)NKA?%}4&3zs(7$zdWh`9(rTK*R^+7oW
zQ`+=8ZZ4!+pa`Dqe{ld2<{PPUNC`9{OkX}{?@rW$=4)<e9j=|3vMx)5I{zgfoV+d}
z2NxI8ykRqM2iB?H$bg|8y$$__m&3?aGfKB%glIj at Y@6PQLz(x{*3jrF28}gY7~NEx
zJ92lj0gX21TI(t%{lLM`Bz7orq38?~qBU5ri69p_7=IhGC6T!3LYtZ7fS|AWqYy(*
z#UZ=vzz%55$MbUMHhuJAWeyrpkxGxB9Z08S^q0EfSkOR>IJzq>l+yw!1Lewun+xm(
zv&oj^U+8?;7(#ERa6Lyr$;8 at J>SH9Yc{o(o&Q<vBa_Uz<Pd|F_u4Y5G&jpL|a^P6M
zywt*howY+*{WmI2b^E<ImCg=uu^AksEOa3YC?EtZh;CMexx*Afq25FVrMi}7`P1gS
z>KiOXWO}W908A9^gTrl9Q&sL64w(i=JEgrrO5P%BLd;`hOvCfMk=4V=!p*43&W<K5
zxnsb4>Il{6xT?ueXUOe$S{%|B#Yaovs}4Q<b8{4ey>YhmeiHNbrAz`K3-V$SAaXE2
zjaloPu?-MYeW}}%=Eb(t06cKC%(UYQ=6q_Ms;W=eJvNkGKf;2EK6HW7F~75#oawRg
ze4urI7S+3#V`)$Y6_Vf2E#I3*^<<oaS@|Kt5C^ACLS0ZFH4i)k>|~2rQ%`MCcnw2Z
z&{m<A^@@guU9xF`lFurUzu0Q-&=}TsVNvnstr%9}^%5TC6!E4Qy11$Ka%JUSa|sKE
zFtd(gQgP31m+Wts!v8%5F;^2Cma1MYbN*%bU6^Vu)34Si|C(NwWIP6BuGTOAve*AS
zHxB3Nbrf4{9mbS6jscsILX(YodKLQ<-WQW<)W2uY|C!7|YbiM$-*93kl5LL|LD)A$
z1_T872&ICrH|6%#)V3t^V33T#?}V3-h{!1P4P2?EL1 at wg(;lpKbFsSMS33BQ$KO^`
zqot*t21Pks`V`$ev<jYqnTN)Qis0Jo at zt2ST%r9}mS;uh1X?-aP7{`bqyTt4lvkF^
Jmoa|%e*hJg%a{NF
literal 0
HcmV?d00001
diff --git a/documentation/mega-manual/figures/set-variable.png b/documentation/mega-manual/figures/set-variable.png
new file mode 100644
index 0000000000000000000000000000000000000000..d36b52754e22c7779ccc2a58ae4a513f03d7ba85
GIT binary patch
literal 111430
zcmd?Qhg(zG+CCh_G9tyX3<v_20R*H-ktU#`p!D9GBE3p)Avg{&h=9@}AOu8OXd+E&
zP=wF}1PDDq=mA22B#@Bgw{_lgzB%uE{)3NeU1VK5D|@f~to5{e-A}xsz7_`?FB=F1
z;&}Y%fiVbl0_d{t{Bjcb at F_x%f<RY5k00DK4Sl~kON%(an#p|5h^E_+<IEZ&KE$O-
zxHr2$nf7i7nwpK`Ylyfuxm`bKJNuO2vlaX@>-fxB_IyRTr1QwrvEQ%0J1+8-<<uWv
zd2AeC{&Mm)>Xg+f&u2Z1NC=Pn%^qI<NX- at pOpt@(xZ6sjtL8Q8&TE&{lztRy8Y0YW
zF{;=PU57C&{J~|3jCFOQ2ptXCCEWf-HRl6*iw4wU<`UNXPg2Egp!XfNZ@}z9^g*!%
zhhb8MP!e+&+3c<){z&j{cwtr5&~kvcZzJAeoAV=tTKwM{LXc{3JetdcIXO<bvX3Zz
zbFqA%({78ke&m!}L1Hokn8|->>M)XPHp{`4eP*5 at Q}6J$j?smO|8BFe^gFC?!goB-
zGc)hsdqhReF=P*2i;-w?@S!apMLM#@S^0#iw-y%oHr)9{S6 at T^w`c4L8u)iUy+uRm
zrnl%8X+xr at yN%<BnclkA`$&X2o!kHQd6p}y%$JkQqWk7wW?0I}EH?w`@yHLuB~e5y
z;w`?aexn+4n0%^|d5V63R;T~(28rrJKD`yw at q~kub7N&7dpEpwRC#nDTR~n?@djFs
zn_spVmkGSc9`h?+9nao=s<4P2)p*-C-7|m;dh_ANtN&>NquPH$G&D5WPQDC2FzgOV
zuc*D>fEdBqRWVjqS1+=kl$VqH=%@G|<JImZ3o2c#(koM1t{Wmrg!KC6<8;z|!<C&t
z2YEk4`QH`@H4BmB9h;bVckD$pf2c&m%8Ie8<Z{+z8soqpgP5zEVX(f4?&|8gkf<3T
zz<dDeK4dzQ5u(%Q*=Aq#1eGz9a?1|EgD0c5D$TJZKAG!pA96gn_Uk}@zuOc6Gn!`b
z)$q~VM<4U}c at j09vx;0?z5(yS7IPo?FRGrLlsL^YpUgNc2Cf7vRj6OSeUUvzPDx1!
zp<a^dXIWEIb0WtuCO5iI^~o94d}zSYf7vUDP-?Pf!K(+?nnDP3pT|ws6t^kXTMVb_
zciXeg#gmhhX=kO;!DljAx(^*9>At;V-;H at Aw@6OJyIXzAQHyD~J=U*zjQukXZ}9;(
zq#Ve>^Ij(~#&=_n%NGMv-8TcT>~Zzgg_Wt%I;%FS7*xE!dQFJYM20=LRLHs(lM18G
zbWD at D9jJWtNp3_DDr!MIDg76a9i&cvnetMjBVn9=fMV)Es+WHSlM@`$J@?Fi+!BvM
z>?=@b#=UtjU9#I{v|!;w=j$h4{U2?Bv?A*=0Lg97G}dh6@{I9=IVv)GCc|!Wc>f+*
z(3y%;^dqTQ2J|9GIbHqikOQ5hur$?TmK=$v$qYQ|T4wC@;)A2fQPY=z-5#T7BGqD9
ztezMbrBC{ff|T+p_)1t8yJv;(LJ=dbYEb&&p}9ZkV7(%Wz9VAr at eV`8y$`b8haK8(
zJvB~m?*bI2Q!r7}B+8!feE9$Fc_w`fvbfPS-QYVt-EF!)ttW`_hf3`q_Sr%5>jdc7
zHn7ctpCUfose1WDG+%2deRUgx*3J#>AuSC$Oy*CFdA25ut1BvcsWbYRhw8L21Hz;$
zGindoux??XS~l2c$IH)eV%PC2cq<#*AjrhPc!PWS6E!b##+gxlnNQRihj9(~LvH)g
z$z+tL<9x1*i;K+o+Qh^+p?2o3AX{7q(6TZ!t1<lSv8KBPkUA)hOwk#e*v}{`Djth!
z(=bq_y;q~fR87_Vf>j5*bUI9w*_ElP{U77TByDFiptsv5C#?V#Cs8QV&}`u-*n#Zf
zsu#YeJ~BUf6 at DM{LroJHG#c$<5=6qP-YNGNkP=g{pP^8((#u at 2F}I|wa)I^ohje?L
z3{>~t^B2vwj8(bG!QBxK5Na6Se+DtL+x_9ViV^cLfmscsl`$i_7<3g88}2CPXiZph
zK<}zf<LO65&Wv at UOho2+LT>LDU1^?C7?|kk?>z at sk680$i at lEz_Y?h>Il18>B&G at q
zgg^TIDKoP)1=>?Qf`Q@>8#5fXaWP3D5>y9m&?D8*I#JB&6x+rW@{%)P@$6N0i}<tZ
zqJ~`5)$ZK+FyJsJj9ICmHZTuj=<ksXlKR%Az}3MJMPY0d<gP>Lfp3LXlud*9*<U<@
zgUzQA6y}dD$ptJLuzY<HEse+SqUA`dL`On`1HI^e{u>;Xd<W8Qj}cGQyM#oH(sLL`
zUdaabV6ElY{M}vuW-;*)cT8n(8a5ruClib)ST|E-G<G4f=u*xtfP?zq4HgED&kmex
z2{T#nvn+CVDgW*iFOE-vGziqq5HC=VNNY^MAOrj0`5kh+lhq@@sQoYvVoRqR#lRpF
z6E$yo7xstFx6wKv=2y;|0v1w=NntKxVHD>do&{KSz`{*@orJbgE8cTt9PPkxed^`$
zJ)*Nmwb-brNhxMS9&3gGs7Q)3JQ+a7HRpy&;;CIC!kYxan}-l)3MrbC=CU7*c~{AC
z(tHUd!t^=vh|`CumhG*gY=Vd_N!w*_o@}DmzY_*wn8O;^pn6>F{W8C!fSjR)W<uW$
z-=XhpIrDvBR!cnN3_ofS32q8oe$~{}G&(j`C{Bb`0c*D#ut<#A?X|c-$3l?ma)Bmx
z&~wOzlqTx7*b#{Izx)A{*2vrk4T;WcbG5Toq}yXXFq&%+QI`3sT;`KmQsf5%$sp&W
zqwsZYnD93~8enrU%%Z~E*}g&c>-8NquDL3CfK<GbuveDOI7~{S<>XaV%GTWxtuqP;
zO2K=4#axK=y2?qK@%<)htO6S^ZfSJ%TL_4;XTYt>h=V%R2&!YBi>^}JxVc2s0R?oi
z+b&HFAw3$9S2Ygs?xaM>)gL6uHDt}oh-F>Wr`mb>=m%6!z;jvkmz$|s>;;d}_)p%=
ze`rvbW>0Qa-h at 8kF;BPf at ZHMZ*nn9go-doUNty|D*&3#o^+6-(1#^;iO-sWM6iJlx
zbOF2Feew6?0P0?iYKDQ{eneoYZ#R{&^XDCCliY<sYqjzy11MGG8y;eNSuC<a0!N$x
z&op1dqgF$g=aR*3M3MjFuA8dFe+7lN+9L at VlxaKxBiIyfPl)of*Kl7LdkryMRX at 19
zdgtYdiiV*r5eNpdh;mK`uFk0!t1!OR!|cUx<$k}_6XgE<8pswOAhM>KyBDxgX$wpE
zc78X|uJ<4l3D2XdP6{|QTW`BAjKR}DevOzWS2*A)9VQue_>q~aNR#GZbwNZwrEg=q
zt;z4&$z#FY<Zdke$|{-JJmM_{Ssk>q+pzwHmus}mbchGd+P=?l at D1;aYB at aUd5@>{
zk_nxzGEuU4|G4Q>KZFma7-Cb%ko-PMtC>*2qQv24j6#9qQ1RU>Zvwyzj)rP5gEmKL
z&*TL^!>^9gxOl;qx!*h7jEC|CJ^5IW+ynk7%xTo~^wse5a23yF- at 3ASoM4Msi2VzP
z^ej|J502O!P;C`!RJhH~;@C at e^>Oz-I+Us}KB;JtoYp5 at o|)aFUR)(L?R2;gAvtTr
z8o8=sLmmQFA-3{#+%j1CDUS?q__!C7+nP>LBltxImsRwo%IMS-Q<A<lCNa+?SrpN~
zWYKMqJIgJDFUqI6ux1^VcHtPjO&zh4OmtY^`e)cy6~uhoeILZb7PGk{N({JhLHkgN
zL^RsMZm0Au8 at q2kjF>dM at iB8axwdn8B%>I0;Zs{?TF}RGDeuF5>rzr2a<F^ZzjUME
zt8<0aWdRdh>NIJo&kk at oI=oopW9 at Y+%$MOIly9rBSFc`;zG5;Cxo9;o$m8>l9;oD-
z0tCaS-ySwrF5OyimZzasYj(n07zz at uC)QaXReg8jhf3lNaL`W1<2#RN?vsOQ&aN&l
z`%s7Q2bBXhq(%fov$rR^%^odRw?$wMH%)eNw+X|1t%3D{9k$dZ!Zr^wb<u&B4X6hq
z!Xh<;pq8l+yGq2XWLnQ|Io$!@>{Er0htXwl<jvfUqNeQwIexjCBq<DIAmkA5&NBaP
z7pDv<zb%nAQK+D9^}anW?vBTVO=gqVp-;{xukPe{VvVnxh4qk8BZY&c*DrSNOFrxJ
z8HALS6!ghv2GTXr{o8aUYr1>Q#|>+F#q$o3Jd21vu5La~{9tFQ@~1N6*lHWqwj+wg
zCno*jJ>9XkmvHq+zv1$x-q`*cH4Ey&g_g*jCQkEbp{xUjqOInaM at f!kg*Wj!9B2BP
zv5!wDR_v8nwJimR^&S3Z{ghecdpEbOnN90j at Wf<b(6=XtdHSZ8;2up)OY~-I0wjK!
zHs{YRXA(dm&b44*;VntUmy;jtsH>`E*9wYYJ~F at Gl7mJtQ2V95(t#hPzIaqsjj1vC
zz+wN01DLkXSuWZj9(L<g)pP11-%6IS5=T)Fq|`i4L`!0RlPBp(-BBY}3j{UpuMq|%
zthI`IYZ+eC230_gVivz at Ez6Bs+c3Q1%A7<hR8DP4dLPbqKI~hXhAh7Oef3Ia5(KaU
z(|gPe`_~Zj$$<UZJGn7ETmq<v@=X<w#a)}G$9B4e1{5pQL(L-2!NP(OWp}4S!?82`
zOx;>73oxEWMdTh`@?vdeC at 4w1FFhw>vS_`(gk6UFs#4$azXlSGu?PapzE*eHq<ITj
zMiKC{#SHEI1#Xy?NRG70{}Hu6NLC|Pk at u?h6;H9Orwf2wtXC2o4vSj*Cl0<iG1Wu8
z;#z04T-667*gcKFmpZbZ^CuS*wNPaD5y2FQ*In0SHQ%_iWFp0(#^sXP<<T(0o1^?U
z!bob+hF>~+$I!ZpxtmI8+hF)}g<Nyy(8nXjV~$W1-ZAECN2uBLx9+o~@UftcPwcon
z$?(?Q(3UKAExEaXeyYWbmjfGoS*ADSL<yb0iKmrCYFvN&*EJUL?<G^tcJ&dTsvmOG
zVlU(jggDF?ZGC9(lpq|ntgNgCd7u`hR}w3U&N<97ldH44A0Y?_f#t?R!*SBda!CGU
zfc9JhNrqj+JH%zvJ{48aziPS|8PHb}dJmaAHYF<&vIRC%y*?gx?#nRTZn-&dHx?D8
zKR at WcC8nM?clSZVTot;Kd%8U6R3%(Y6!iYmrt$2Y9T8_zYGGr5uloq{JL;MYmA;Jl
z*j#CLUAAu;+o#F^`)-Ne0Lj7UMnmoKgOM#VZQE$FllBRpl3<HM^7t5F4^s|yduNrS
zh)LJp{&k-+=tikjwrd;ChX!Ag3Fb$qxqEypHj79l2W?gFkq_VavtR$!bMpH#dAT`g
z^QhwEt%E>@WrY}ysc6{fS!EreS-$t3fsFOvQuZ@$>wX=s-v+lMI`@f(tS8nen3G8L
zM0=*E%|9cmB6l$!_KmJYzNCe$fVJBnI*1^@ggzk*ncl?BRqY~-S~r5~Ov7lu3wR~s
z=~H6f*ryVRidtiDh2o1m)CVdJ-X=kwh(EsO9eZ(Ae)HyV{byy46UTszuZi-!qTXB7
z1o<c&q*#vW)!7d<tBbNRKgV^gp{$(h&2gd}R8{k&SUY&UbZd(~wc=me1iqUe0j)!n
zkMh>^6{a8|Wy!t<$d`S6R8oQZxF=Mr+?zeb17cOm at 2|#~7H&p5O5gCc$q~TTcTSzM
z5ikqeqGi2XGdwJqt|0kNR&GthY~{#zBO_njz2YR4^f(;!t~7<Uy-t}Kk+d~PpG3}<
z57u)(Grin%Fe!5`{>HgSY at kH39Kpv?M at jrLys<VG;BkUhc&b_%&+=3q#f+3>lRT?z
zS8R7GX??S&DF*48j1&<#5x7!lr|h at eb)Wfy4=zz<dvLVTobPlhcp4T22p<0o_1Cqx
zo3K<&4I3M1FHGZ6<&v}7(ONnGYkD7o4{#p|`gxg|nK5}=0XAd1KKKu$A87)R8U)c~
z7ImOi6UibDCtH?%+bYU1RGFj*H#f`c1x{p$h{Lg?RzXHU*Xrn)!c<=*ei#`TGH<U9
zIBU!8S=3~o7ZB!7JB()%&Xl~NH>PnvD at xrNoMe@G&6dOemz!k$PR!ft#xRcesy92N
z1A~Xy&TC4x-RzjS?)%KX+U=TNlGts9((sNUPdg_dBUROcKf8RV>ag*hiz_ZZK&~hZ
z0u^J|K>Auji38uISaRbb?#|y^Dp+IlUr`fAT1YdGe*ZA(rkmALBGxf9hi<rddcV_k
z-E8g1 at WEcdt%tbyU^U-I*H`f}ZR;(eN9B^a>Y0b1r|gj2t)Ujw(2Ff?rG0$|ob5Mh
zZc8n_92%!k?BcwQE- at 9pff8!Ty0Xiw`$XYW_Ho$;>!y1P2N28#`i-aq)&@{;t;Hv4
z?peDe{<lv|OFhM^x37;k(FMf6?7kM43Ai5B=ozzNqc2i{dDGle at F)+%_8QI!U*31;
zS9Kd`DZ4YCy*Fc7K~eWaICFwzQB!iJ)dbdor2sV!SWPmfJaakp;WedW?J+vNWt;+I
z>*#?gizjpn(H<6=+mO;_mk&-9^ek5(+6nmZdn*-ofycejyHm1R)eYWsp>4$QIj-AW
z at Ww)`Q)P<_;ixZw(kt7;Ya77iz=YPV at xIldgLwfno>(~fvMD;wLjEj-!v^Oy+;-4p
z?Q>wU&r`KTbRbaviS#g+%@=n^+uGC)=~2kLVgZljy#_!>MDZqa4@;x1<d)l729{vq
z_C1T`3q9lqpcE9Id~rzCnxWDfI*%dlY(2NjT{CIy6SA0`-aYY>jkDp0!b at TbJoxIr
zeNHvAS at JjQ$^Px#iI*Kyuy-%MET3+jm?&Azo$)#GdfWWO%X at Y+uwMwa{@$Wy=yaWN
zvaO^lai692pjiZ$tX?@-9ew}2pl5Sm;YKn+lxNe-?9Ks=^n#nz{7S1Luj=!|Hb=t_
zZjayU=~O(qUdIzV{^FHLo$8!cCz{lB%Q<n9K$)f~VHn$ZybWNOoChJWxj-q~_~1F*
zTVyVMb$C(}FFVq9o_l|LFLtKbM|81P4WZ at JF_hcovL(yjn2h}-NFlXc?I<zaE7iQD
znSK$JWNTXZq`PFQI0IcgHu42UWhZJTUwiv#<f8ROk2^uu5~PU5)I6UX=ZNbSY#JA}
zDvP`jK%DShRua9BAN9dE#wF*Dtea at zV1=A(<GLHJpAz?}*rnR)bb<Mr2+H(=C2Gtb
zxvJ0_W(y$?VK$vZj#eS=gfn&F>*<<wgLE4kfx~+GL{)CMu=5=>I*PuCfYeB%cK~?G
zq`($6c4Uu27?wHEv9eR-9LT7v8uJs7|HGzP?5>>sB&Eklh+}9XW?K!mT`3zX%$@T&
zN)h&eH<w-b1g1Rwk+)A_qYToSlybm})~+6M??0H-r&S{kMy_vcH)aJuD##8z>vf9d
znIl9o;Pq%1vh7-qyu7Tn#M#YSC(8h}eJidvWrEG0e2C{PDg8F&X(93~tElp}S&tv0
zpn9M9 at V;_HC~R(z3S2FsmV^An7@>I-J#okPi4xmV=h7P{B?^u>4j1orenqps8d$+1
z%&z7{<zI6;o7y_Fk!3x1Ca^OZas?d%>Ov5taGQu20;pv%Kmb{XYsTFpl<NkV^OG*h
zyyo6_?|zLia^VD_k<edSc$<agxf4Wx%SJ!5C}8g}+{&B|22Ctky|Z(t4~BQ>D><Yd
zYqzP8>Xv5bCmqNuK%4ACQngmnNZcK58TJ4?HZXv~N7B{CAoCJywpQy3Yonk~_q7Zh
z(nR{$^$iRfex%pK&#fAY?<e6M6z$(WM0yV6)!fx3H?A_cJvtZmMvmS;tyUU{qm~DF
z5oo-Lf>KTf3Bp1HsF*<i2Kml5DY>e~#&;_#PED2$LLE0SjSEZONai2qC75?B7ZW<=
zsvh%K$UNIr7DXT;i1l>yHRe;=o0S#c9&a8Ga#mKt!)2wXbm!Sk4omziQdtyA4IGJa
zn5TW6;%8oj(7C at v{WCsYP7=AyDbB+_#o~DN;xFu_WFx5UG?$ydizYHRuxELy=zPO5
zwxk9mYkL40l`No$@H?N#hg|Y+++Ui;1g)%Z`8Vc{*4 at 2}i#HrtHV&eF`r}>|d=dYc
zYiJWRLi$ruU&yEBS3_K?WTS22#=Bo8SsXj at vjC`K<Y1C%D+$ewqGYIM<jb0e9){Yv
zYJ(>D9O{R04baxz#q<7+^=05t+p6>;--v!*gY`b%93s9Gh=C#bCbF`!qE4s=DwSGJ
zm@{aK at GH_j9_<;#i1UFB9=6hAjq*)qxofAT_ZM1k;(@aTkxF=Rqjs!OaYT_Qntgqr
zMI*NPAw^9U(C8GTs|TE-hYx6hs70}k=B4|}g+0qU14HSPwB)!G+<hcVRsaRov$z<4
zuy20ECff{KLK!nW!{?*}clO_`;9!pl^<U7!HP3Qy)Z|t%^*o6ux!Gd&#|{#2G5q_k
z10c2)6ydl2xov;Ux6oGRy)A?qQ`Jr1v_FA69THCOFcA0wAuA-ILI5ysz^1`{iqH_@
zr%r33t3rB64On_U{n{>#m0D^fX>mkjmmRZcfEXYRa;@tWmX}Sbk9kg8O68e^+~-8f
ze&8GMxzvn>V&&xda?nS%rm`$B&Fz_yM9<l#P)6;XqTwYj|8hsEP<+~^jx1KKVw<l)
zez_sZ%*$tvb1RYvlD?J8hn$spy}H~8HfT_%o5F<0wx%gdVZO<AE!YCFg8Td?H98Yq
zCgFXpigGGr3KtM*k=<-UGRLDWz at 9X2zrkIK^ATtJ`zJ1)_edw++oM8EZG2i!WB65y
zoRCTDod*oJFN&Yn?)0j$4oP$<mZ-RlWLvJqk^x_p6#CnVXdsR}%LP(ZTb=LS%dm;9
zHfTt}cmjz1^wL`;bXCXW8h*-n8=Sm-b)eH21+8NUw!{GHCt)YhN{S5IcDh(KmC(V7
zZ{3P)QI6$CY^S;!D<8##?@#T2qh7CRnz6iEu=v->MI_$M_ioMGzjOn%2|&u{wmIze
z`#PPGA&(|J!dQ;f<EolpiETv%LxZ=b3SD7|4s3?RENWG&dxeVgw9(@cTe+0|D(~@|
zxcM9|ZnD90P563ZNRZR0sa%Kpv+_}*EuP8Zu=U{|4pyp``JKIeZq8oMz+lyGon`*f
zQI}wHldZohIi(AnL#^&B^d1xR{OE)Lw4z>}>Xe?5R`T(qX<@Q8bijw^oh>Xi-V5Lc
zJ^0k(`UjOF_Cqg3Y^RK8^V{1`1O9o;F82+VU~oy}iu6a;=?cEYKkr`!JUQT36LZ3>
zC80WXP_4k{%mV*Lu|U}i##hc7YI(=oR<e;gp%faOEyf3aO>KNWw3#0i)q>5c`?5T2
z>^W0dNVEb=nn5D%XbsJ^%j-3w)Ak1fh$s9LZD(y)YShm|grl~%wgxVNG_RG)f-s9m
z1jRSV)tp!1K~W=DI!Z91^-NeY#Qr&AIbA8zI`+xhLE;--NCTW5h{HI<XAnDKGBSK7
zH|0L+6x-|@Z`pg^&U at 0$&z!n}-}7)9xqUt#CbGP`gwi>aD(WI%^~NWt0Y6bz7anY}
zSd(L8fmZMHdGqRle?Q2!lsYNJP>Jf<Hn+n!Kf!KK$>|}_%U$NgQy?W6b;i<ZdXEFx
z>IViwLeO4_F$tISsF6wyO1Ez1PpP-Swc1GZnE4&xyu}r9AlMqzB7_UjZ^6I`NApN3
zUaPG_3PM+*YJfGmh_gF$qY&mw1GV?I_~_9lHv%r0wr$w)R-q<Iv~kszUiF~R*LV0a
z&jw~sGe)_l|76YfC at rf?*JNe1INZtC!_CO7&PGZ>p!SdVZ3oXY6Gdgli!-RTd>*E1
z#U at a~B(C~c`*m{YZsX(oonK|y4pia2w-N at zAg*j6j!RvVq=RcRdNBQGkuwqoNn01g
z?_ at xZUg|J7+w(e<i<_{o5vN5?#K*%zU}@N!a-edIp+EC#RW9lrh!e8=xwR_i4{^`d
zxFChFi2Nvi-Q&?K<trE7QWo9i1?F6_X1x;;+Nos+;eBT0*WG&ptsz&KJE(~e?H6t<
z2)7!+s*Hz7@%K(A9nE&}69NsSqx?|CY1Owp2`Dy at LvzaK7A!3($hIm;#CzJcb$f<p
z>fqpOfg3LH at Vb*f*Eim{V?I@{5rsHn3 at v6R)Z7x4`<PIi7361-K1<Va^{HCKdlvvW
z#5no(ROs5j4`U(A4bXQi?*u^9NHrR236?6zbv)M8<|&wh^*h>~!TUn{0Ig`LH!mb+
zMqC#pG)Se>z0K0$aJZ=%$wrkjgNCb47UxxI8GNx7^K>(@E7eg~3pT?ft4Ufsu9(UW
z>0J&tZv8s{Vd&<sARp#zV;YvL!2;=emb1i(dAqUR5|^EuJH9-1uF=+ at Ox+zE{N|uJ
zKvWi_LWXuPPgRO+-LhE67^oLxRq3_*;c8<Hz(193KRPW;Pc7i(&oR9seF1WWd-&D4
zjn>f6VDaK^yBb*^sXoo#o~|x<YV^%>e?1Q~`CJoP-$lR-)k`r4EQz2`8;@W*Lr%zl
zaRK_f(|E<%(-myTw*u<MSJMn1<bVG&rSwx#W!=PdD5Fy|M=hc^yiJu=nqK3z0`hx8
z8y_<ocTI^1myg1Yz*iki(eX9P)Be&p*U2AIW?JMQOK at A(!P>6 at u)uDTl6W+25<)i^
zXHnu%<YD*l_wX3T9VSU#FxUa$!_R6EQF?N+!31V%b!tJJ9-5C7d45h`C|7o}K&-=X
zdMgj7?Ay|86HEK^Xu-X1^Y$~IQ$f`b-M8-+SL7AA&2-Z9F^e?;-xfag|3y;$V=v`C
z<5rmJs+l07v1 at qSD5fKU^)Biy+ogy>v9d$UJM1OKm{H?FRJ2;C8v3SE!yS_+F&!r1
z$g7~u-HTC-stqEn#fvGf`NXWUFEukMWGGA7`|{}Bn?VgB@?BE+%WNtqqt|gd$L&Sb
z?LxtSs(~$HpSYn^>`zd!I;WF57CsFkET0ITDFzMEa)VxGrDBS=yifS%)-vQ*|I%U@
z7<dxqEXI7h<P;R7M4wy1<@qCo9GEeenUxr^C7-sEr0Zdkr+r2cu^a=)3q1!^6fTsb
zxDD_#BN7|8h*BQD!6NjiyFsy6J6g|z?CW0o!ARDnZbPjfiL;9C{4g#WD{xw(;-k@(
zYm$|djkaysj at -|(R~xR_8A8IP%d<HrX(-<uZ1Y^(lVn<j8Xn@|6LkR3jUcsrAnLSS
z{OkfY=U?xo9h8&)Zw5ye<g|eeRM|BP!%)SgrJ{OzdXwrR$Kbll6shCUFCRa#_Ac#f
zd)@G{$?ogIZSN2uh8s3W-40jDYufd14QEsyMIrPveBbst53rTvPm3*;*7!<(F5Cbg
z(iv&q26}oDUJ#waN*X;YD{Ewbzjn&Ae7 at 5A_h+Y~HHfPr0-q&MN0mnOZ=)b|4)5oU
zrk at eloliO%%;JDRZf$A)wd!`JfdRb53qdW?s)aP`R7xPmBqFBIhc9Do{lV at Hu}2zH
zh=D?Hd2Zvb_l$t2kYXrm6<z0v`E3ByA9!@0W#0Nd6K#>aOv)@S#iiKGvCCuM4XQ<{
zfc9@(z8!=gZTtB6yen`DUX)UKqnTV3wERxt+5l=ml$TUi`pt062K)mh*?YT_c9F_Y
zoKUy8yk3J$eHS^rbO~eHFlOTfb=cbrc-8r#i9RQQukpHq0QsrfGqXQeI4b$_0AQzJ
zZB88mMexLio3c_)p7C&$pZg at Rv?Zndb>OtT8P8PEQBw!GIB13+u??QeGLHy%Gar8R
zz@@kT<o at R;C!!a2-q_2q^S7#bS4o|Vce~9yHWT at vm~1HuR=hlJiv9Ic*RK(G&O`Ce
zJW^}*8cYS7+;rlmsGiF4=)-MPen6aT3-R}3YWSG8H6q+a?;YRf0TK(!!Rn$BTz(5G
zAlWUIfc~b^M`ljRF6esLm+}Zob(!eu at S?&%jP;kLpep?k?9jlrtg at j`B7WEO*@6mt
z2qJ$wTOnwBi&YeP&3X3mSF>ku5w)7YDz(kF%IsOejmA*a_H}_6AFHbc#7(}9mT)_T
zCe(MS1l5uknWPB%39wVs(cGC6$Lk`Nh$tXwP8=RQAa2;#zD5&!e*<MjC4((0p!z{;
zD_dnArFGl2kvsjWG}<Lqa-)-nBEwn?LJqR~5^lCSr}ivycJ><6Yu6$2SB?<NK68O^
z8w=k#)77}DUTJo-mhnQrXT}4>dHNU{8bm|;v@*)&b#`ZVUVk&OgUhft;^)R2&tR6r
z&{+~K%(Y8)h%l3!V(cfMbN=6Jo?s!9YSXSXFW6QMxE at 6&P_{(cV1qcKo4^0atvA|t
zZYwFdLs20HaoPa>P;;#P0f>9kw^}M)qSVLYigXbamp at -=q4owDpbt4H3<}%&ns7Y}
za0>0~s^kGhNj>VtcN?QPV$i0iU at uRGo&lFN^h&cWbp!>es_%o6zTyq6 at S<QVjTh09
zqn0f5t)V-=@hDfE1JDtRcuvG at QGF^YyuWT|Hs(cjC}=|Mlb=S4L^6IrmU}E{MUQ@@
z1EfwWL1P39gAUxdb3fwfrSctU(9t~VM-nz6DA_|0G#<DOWNp3sz1f1 at Dj8u2<t;3r
z{$Y0n at JYSI#|HXHStXF|)*fL_M9PMVfDw!0h*OvkHef=xG<iLEqQ8w^x&)Fg?>3DC
zcP<R)KF)OU0KGey+lfWzG=<gJXi<<=-~18z)98e%H at aM)iuilYf$+Vi%8+_Xg{;?*
z3~gJ|Ql<Cs7_gV}mxXAu2Q*BV%*klJ1(L%MdwXPGK%D{hfUN#8Qem#H4KLot5C3F+
zdHfx9e^da7X at Zg@?W0QeI4;HJn>4&+Gq4KTp+Acx`m?&0&#zRdA-*k$0@@`8sk`36
zqZ>5NCu5H{1~ev3L>?puHt!CdA01#v)oq{MR2yDZWR=Fgde=}ZCE+z0aPViWuIKAn
zk&WfbN8pw=Cq;?<8PGBTy{D7Ka?o;z(TQ&cH;rdC2DuVn8_LR*cd=<`j`20^e%&L7
zjl%W=r~&1f;Sr_~#lsPw27QvA+c>+pSM1m{5c}WOOy9s$x}|e1VCvqp#7}#Fx#~U%
zFh|d!MHgJh+B&98eklAS-MN~?Gf)O^?CV#m%3CC*ICoFOqIER!b&U?U#aM25m~g>(
zl)oj`ILV?n$~I7~lXV%cDoXQl2!MVYesm;d5 at HPEG5=k;tj(nKMR;d!!3I~?vse>s
zz_nqkFl){ta at ePb8Vdlqr06Nyeylmwb=7=r?J(-$^(Qd{r*o8f5TgydUn1Wc<tV?W
zrn8vQk~T6R!E^`c-$c2G*6Tpl?|dp+$h<w{mmk)@$-aKOvKd#X at 98pc*#H;B*86GM
zLv_+QwzB>@6~`FfGoPn~7HAd~%d4t>=tA24Nd5~SGe7Lys-{n!gW4vm<s%y;%0qP4
zeaDo%>=tP~ZRZ;6$0mLTQGTwe+6`Y)x{To%Wgi<THtD at ld|#pJ7OS~*SpHQ39^viZ
zkG{;c$Xq}i57!kb6Es*a{rLGFOy9ERYBSa!2|?%)xNZtSDtANgkj;`Olb&3a1wn1v
z%Jcvzy3TfAapvP^9dPSxxKqPb+<fB<Y;4g%q;6HUiiCA}B)Bd6j3+Kg#p{HfxwI?T
zB{OGZ?CTPWwB6zH8d6l!e8&S^XPS;?ziYy<DK=>v at j`tC6K9;XU7l&K;#1X=P1ko8
zz8`;QvD~w(6sGEFvU at t^V6tsme}o{Tnrjb0<*K=!?h2hZhFiaW6#|Z;Pq&=I*{w4y
z0>FJ+2nEKINE!FTzmz^w*)(E_<!U?op2|Gt?Fw*l!Ir1scU6dzN8e2+F4rB4>9tsH
zRC&^RNYe~jZ-s8A&dvI17QFbhozrmag{uSe5o;=%t^c^(t#FIgxjCs0>Cw>1rsJX1
zjG)tN`RBPuAt8oseh*p)A{G(NABWfTTwIRvw$7G9#VU46km`Ie4)emwp2BVHUq!Sm
zlRsjq4Rh#et>lfh;R5Buxzqf*xhFz*%D)YFcd0NI{#vPVklqU9ue-L;iB~8HNcmWD
zY48*Muct(vPuGp`pQm>EU-y56p)sx!3IJdg)_D!cIIjZm)I_<vlnP(A#Z5*b{Ov^K
zQHq^sWc=2<g-_prbVG>NxZ-8H_eyk$B7WhOTU3<(UdoEoIP^S9bM^PmMKs}h%F4yW
zKQa5E685lC%iL35z>pdjG7gc3OILJ#`gUiLsBa at Hp6#1C-nK`(82@;$+6vF};3>KK
z at wUpjoYbek;w>!=41ZS>CfNAURDYmb=V~$%A6#RLd71 at F=+P~gx;#A7av>ga%l~)b
zPM7OMqLso~;}#Lw%SM4db5lMyK0f-r=<x6z*xvU~3O<p{_$PG;F+&vgaU4dY3*zJB
z{}B6?e29a#3p3T8YrMXD#nFMx%YJg1PjI}wJ-Vx?oX_cZRMeR+gqHLz at xdl^)x{+}
zU0uNG$avFO;gc&PWIFc`W~Q22<-)@Ai0pWxP<^UpTu`b1U0g>8uYf>?R9oVYFfKVV
z&s!2oe&3p1yO|an7YA at TpH)q>T>+2tfN|qEClhkpqyAXk&6f{ghuhOVJ&#HI``rYJ
ziU93<wJs;ff)**`>KaH~YfFRFhBWQ2FLp1YL=sRCd`*7~eR9S$&_1QS3}9WlJQIev
zoYs;P5&bPe^xUgQKrl4$@ZxTqoQkK|xojwabfqrhYoac~OwY!9*q?y~09Ul0zWoI7
zHD48h2kX=*UFy?CVEwrp017s#|E4evOTchx3u4ZzPnQ-o%nbu<o|IFTUUhSHO4s at A
zo-}NBRswtJvg6nX?!~Vek`Gs0aD6fIvVlf4u at Q%IpPX%q=jPLbpfIdaa{r_fsTkG%
z>Xdh)D@~r8>-o1LQG<Y|nudkSA}$x=A94 at e_&h=l59`v!$6Rj7R|Qc19^|!iXv4_<
zN%&KT1mV>W<m_+s$RkYMxAA at 4Yr4qXXvP<VfYu)GG;qs8GUQ0*o&%oOj>mNlWpLD4
zyQ4zTsw$b029EWH-L#qUqU)J7F780Jn{(Tm6&#TN;Ft!OUIT4zZ;u1~*e)azSWh43
zo!hrFelV+mzcfQh at ZnOXSNt+s>XyDe=HTE9|A^3d>MtEBnCv^b@$o8C6d`C^ZL#XI
z at zm0)P}e*6nfN!-L at Y&8U>E`J$m+3xgef{7F6q2MV{#alyHVP&MZ*v-Q?PZKua}qZ
z?CdPD`9j=hfsO~DFSl0_rIRf#cl$lZZL={?7plHqhAE7w`wB}m|LVXL2ae~<zW2C6
zL|sM*Bc6d?x&;N}*<U{(HIZ`4w<~*kN?)UL-n|>$*(nhg{!Kl^#YNKzhfC;^SN8A*
z9_2N>n`&axB<p9;(Q$njSv*$sTBy_<&KxV*|8u(XU^C0ITM)vUX?jC=pwq=9L$Cka
zu0a>pO_=_w)73n)ruty%vUp<h1E-X0<j<*$H&0WZ4nNXnzCE~Ew3PWU{?fzLc*NNw
zb8FZ;vu8rg1lMa9tyjEst9znyJnnqCQC>b3VCkx=kx9YuzGrq??jyd^U~TzS)l*|i
z=WO4Sz*FSUGZCElNamMs6b&X9mH1DpIjR7*1R5&U)Y95gmo?j!IW(nG{Z-Y`yXVh`
z>~~2CqNN<xKfRPICM{3R0Sk0es<jB&MtMhW2{$iDO~ubKHQ7N4TR%9o3KwOf_fN7_
z+~;L1S~Qf^Z<~2DX at VOEJtm?kX8)?dIKdN7A`y=6uBtb_`^<oD at R4Q(88w`j!yiK^
zYssXkw++7~I^oHLqH<q9H%kDMGNX-@!F?4|WRkXXJ*SSAechM at W*)pa7*BE<Acq$f
z7Y7|IV`@owNY$%eJ2-fK>>^$rcD`r`8IUCM{@`18e~s^^bH^FcP_mO+ja#q<gKmS8
z)eA5R{q%tzr}xlleEGxM1H$!N_;dYk-)$TAAa+U2li_qU6W|VA&&r0O%QZgPyD?Y1
z`rFbD+t!%()EWOg+E?mI{qnuOtW4+n_3KG27K_zy- at Z+Q<zzVc0K)3-{!6t?`WC+O
z4e^;Z6VL$FY$+vO+bTwLQ`2VOUp4&9`^WAMG8gd>ldA at nJ}+a+nE*Y+CMS{t1~avo
zMP1i at i|$Yi)R`As!HcT&yudg$#=#%-_h0j`f?f8^Ik=K<TwrteinPr}9C0KjCKs1S
z;Oh|vR at nLZH@4Xg8 at jZxpx~h5o3sN|2z+&;uH1=Era;O=uuQ*)G?XjTXP-3dOGov8
zFJ4m1`>!<r9C1~UZ5d#0>zTTY#y3H)lai)nnHeg%F;+3>gAW?!=px73zf(k&`I$?g
zpG15J+8EX{Mf$-a)&dB_Q_YCrVJFDv!#--<2>%ojhIn*HAF!bV+*&ap5eLX%KbX3Q
z7zfOjN{C5@&hhB at rVwAlA7~^FLd%5bhTmSU_QoD+CBA;`!tV(%dI(_6e-|<sl^Ml@
zc6!src`skCWi7oguG+56_2pHoc at y*N*L!x2{z9%lxo9B2R+NwjSWF0{`~D`tvRhuQ
z<JH~0jo7dA^?3U98jk#fFS$0?dXJ7i at 2pJvsznZc`8BVNIf2+n?-D+7jHPvECzi2{
z?K94uo{q5N@}>Fo63($W7BQ0B4(l1)!^X3%AqL#alK7mA at rO98QqZR%I${Lrd7b|s
zF!#T84y#B%_0k*^N~Z>ewc4vh^YZe3X4+~CRb58|if6w at 9S=Vo+s5Ka8&neh#Hr}_
zOfDeRK4&m!x-PDZo!7S5y$#e1w5p~`ft4uRt-O4E7RW+<{t|Fc+j0m%US3*C+i-}`
zKs+ZHb>NXeH9+R>j4P~cxOycc4V##pj9<rYp=A+e!*i^0#$7lHZHzo at MXy}R;{;%W
zxi-Fpu02|ZR9W-t)GIRLH(EqNV%+~>)x#JHF3cBq at 1oIYfRa2Ge_mvCa<Wt<WZTWn
z?a|AZFN3e7AB6e&NiPF+B>`g|Rq7b>NZHU<l{qtHd&bDswOIeXV*c>35dirYKf9hO
z1^|qI?h&I at m_P=4;^o&(7RPWQ{UU%Qxw{w6pI0X!^?%AknBkPi%zcDC-N3-0Z*|Yz
z&(CmmFbAzdXen4(aq-~a$O)MnZVXtJ1FA(}C|4AyKlrHT1R%^#EaV=GV<pE&3+l-L
z4!1%~!??=3|MG(C2um8*@p7wZ6B84%p7am*^}}<yQVF|ZcUsx(0D`Y}a)=V1Pf!r^
z{rjK7!oo{?hf5UNo-#MvX at I7l0C;+RKAS|A6?ppGlRk-m94-E1S2)~2V5`>G-Bo_s
zKaAWxj3lFg$Ay{g2FR$YV{qbjF+RSHIGcFJd08f~<0^rpJYYMxFs)ec{+p2g>O;x?
zE{#5VvgCeprU~fLMTj#8=)8!@ZoJvr>G~|Z&DPd`DK+?6e88>2j6wu}{#7Uxe+p{+
zbC3DM9M-5%6 at mXg=VIp5Er$`-S?0^gBL#_&6XK08$El!7GWow$m;4K@#xyhaRDsOs
z-(@*JI&ekLRQIgEOA3qtwrFEVw{=m~KT4GVRljH-e_84+KIZ;afH8jKGH0Kho;Oge
zqWx!d&pk(fo_DtK7mfep7j@)x(Hfnlu=shYUl|Xt{py{SlVkS#IisR0(yiyj|8oK!
zbTN})sK600Y+!KE!vx@|Z*G>4ylh|6zLWVMLrW4()|Kr2cN73tHc()oS8b^~>^55Y
z{bkRKEB{|<)eqCe*N`IHx>PRpTY~$K0;{Lh at 9cWcD4uxvACr7o;j6S9+GB+UMqC65
zTkIbD&#z}4(sL=^SumKzhY`V#{~@#uM%hxolo04Yufo50q^6Wp9RFkJE9)pBozox|
zpneYcyTE<y?vGCpDDSUdLC5~?K70*2`*-ig)8o;9_wN3B9d!Kf?kgUaD}VP4zyI<-
zH;TTd3Hs&lix+MkyZd+V|Hrqium|xZ_R0->6XUh3TLAT~_~{3X{}gX at qSx55_PJP@
z^t7~_`Py{_<;L<H0~`CC=PMmM{FICF;gNV%xxWRdRmKC_wtWhEXI`i>7Wu at nF81`&
z!20_(CTn|1OU{;ur>{kXe_dUlivDq~AHQg)``}JR6Q_)3KhRWNzS1i~S=;kAv}F<7
zoI!Jh)}L!0O%n#)6csgkY?Tvh;n{wdv-2|OcDi%az%27$1H^#=M)A$*gcIMJx+C?W
z at ItIDAzuQh-TUznP^TCFv36rKjC^USdp_W(0!z9oWa9eHo)-FK^f3<A`K#vnzju;h
z|M*qVOzGUs(#L*ZEcCYdCpFsnIU)tGe0r*j1bzA%fk65Ey{GVJK^dhY?`Vgrdg)dg
z?ZUoE=?}mg?!HEe5yinD2X5Y+tu`488rZnh{p)p2WKe#cnYXw1nXxH2dG2`xUrq%F
z{N{AE8(p45VmGNcM#KmvSv%^!nlw_o+_zNeK6HW*y3L>Z%@ktL%<C~Dreov!*uAt@
zY}Uig#{@!E%;+p0tT(Sy-b|hMtIEQ|xf5NrCiTbUY9;4HPE<Oi#70a9cDI at oKF;@F
z3Gi^H7zECg)z|Lj*VUP|Hs&JEtv=N(qN+ at rLaPz{Q&v_LMHy#!cbp&1qz-P8>wjzH
zcfn>fWslC~u95zTO>pYH{!@xvX&ihYZKFCfsB(G10~O97WwojXlA*C;TC27=ev}}W
z>sTE8Y${lzs(&FkeYu*UvBf$LZ>b2AaL8DlO^Q>=-m}Jj3(uDSbWSO+Lrv6k&D0=4
zrK;L=ysq#04NkmN1wLJ_QaGe2;Dc_CJJL^{Y+zuwl36+!(rfoM;FexK-Aus4OuJ?C
z6D;5&^f>E}N%=7++gb8HE|{<G{El;OSCe;T|I2?&KgcC3(v|GyTC}Xw$M%asa7k%h
zY2K&8+9uUL{djoIRoZ5^7r0(3gbj*T6Rj1qNedgXUm+2^+{`oz(bN=F>DaV-%<PHK
z7*yx)IZ7 at _WvESSJiYci?$O^iqn+;RbSiqc^y at -%&u<RoOQtnWchejI+5>*jTx`?&
zzPyU<;!MqEvpBTp`8R7db3fRoV&IdQafF|K#R{WG9b_95aO+mAP#gr<`mO`VpPjt&
zw}@YJ2!OO(Ih;B1k2yfJ8v7_~c<%-;zp`mTj at 7oDt@Uh1xCQ1;M+v`*|4i-gU=@|#
z- at x26i+)~2p}}EB#^r at UeKX8x$yCnu<I|Jx!^n1OyHg^C at IXvS(NvD?GmlGuNj{+`
zph^elHwdsu)^;-`ZlQ;#tOLjv0c&sI;yL!R=38DH>CfP;`PS*_K4z|s>w`%->Hf{L
zK!eX%m5$qDTTlO->+Sa(f*{TYjN(briuj!y8)k(X(MFSgS0(!6;SFP9Ia at tYhm~In
zdO7QQ+n5 at o#pI^TUq_O%()cuAQ{+ at mJ#*%8$K4)VR4gku)yrWmRT;c&9+2T!oF5W@
zPd^F#xuD1lS1Jlu&VJ8YJ(5NKW87E03NSozoa=^qb-@{CWeQ)YG?6NhU)|uthhrJb
zDT}dZO6d=g5kcMVWUux7Q39)}>3~WOnKgvvN9i?aKB{4XwcXM8rPG=bH^Lk}{r>QC
z_iO086&~!MFyY(%$!|A8 at E<N&k9_jD>>4D|W)$-~N3FTapD{q)gI_j|a&=tE9*s9i
z)%cVeb`;iKZy=V<@4G#0wJIlGVJv#dq!RS0);g!-Qt%S*CM at z;yO|1i&A!F#?Kfea
zZD%-H0;r8Vfi0uCI#EB3+85?5hQ-mu*Kly*VWx78o;_QzOIw1+?&b}ow1?KzX88$K
z&U+T_K{hKQiYHXuS at N6=zo3- at Q$O4NhR+BQJ)MVBdz|$)^ZAw5q_6hc-D&cmK!#6C
z-Gq80Yx|fA_bF?B7o+WxK7WiG`iYA}rsT)DbC!C?qkjkjbfF?q5JVnTDi<O0N9)&Y
z2bWNXuJZerH1QT+a(`S?aJi$Tzvl2W$<7>;dU(1>LptL(P_RJn9s7{7j!mg-G^6L&
z38m*Pvi?-(!u1axWrLBYJ$u<(Z?ZT7^f25M<|%Ut0Hp}FfmF%<UYDxRud)D&l#Cu4
z?r6C3LE8WN@#tH1xnGLZqbhBxC|cug**|A>hv#-A=$*G}&OM1kpQ6D!6V>?W at 3%JL
zZ%u+%<m^LqAb=#iuM2_pOMT)@?xuRWR_-k4=;H=%q4j%ZFWcQ;Yci*axPrdCT3w9E
z>c?747<MO!_NiH7LDEI%wWK`JCj7*vk5tB_{DkDs2Xe&%8(4W@)A}8YVx9))0?N2d
z>3L462~XYHN&ZG!aLc-;J&U917AGx#ay at He3B2ZKwX1zH+L@zO3APca6asvk0d51H
zN?~swQ|8vIGj+*Tova<rZv1G80-oxb+e~faX9&eb_aFc1H5`S!HbFx~;gdpQlapR2
z?uX6E*S}Ft`|^8JB$4M|TmbnhKS at Lz|I4(N`h`0>5)^jn)n;6!8)z*sJ|Kli*3jVs
z)okw7O{ps-Z^3gC23cn5s;qubR<H)VRd^9pVQe&H=1%pi>AyGq*Xn%M_A_xZ4rEJX
z;}1FU1U1<R8SLHsXT?+D;bYV2g53M?8Vg*bB#ZqXXvlOgMWaQ&>G+p&QJuT4~<
zpJSI#Mtjykc29#W at V0?X$0rUskr^fH=!1h$>q0^g=@*cb^7C48p&cDA76|dNV|qQu
z59zkQbnZAA&FU?0<)SHsjlry*o!>Mi7;pP$dvzR-9>mW+FOiMlx>sx{HXX7d at dTD;
z3Rl37)$50R)T8CL37z=yOn<>?U at Pa)n%|JZRD&{Kc8u!8VU$6(mw$+KI(K8pKz(t$
z<L6qIrv?22s)@TgJRfb%rKGB0pDtl-858iyG<CVMI%Ra)wxCzLVP^Y*8T at lm&{emo
zyDWKovv0(g2R^HxvYyR^Sy)4Hm93ngXA2u7`uIbT)216cEolTTAe8y?8?eCDcC7)!
z>$LMa+QBZT?Q;m)kyn=k`~BmIuOg9-pF0<@g2ge>wAM(9;LquZyZ;P0#xIZLYm}Oq
zm{jCA4?>TGEdn4OiwpQbPKYv6wphJwZsj%VaptZ17su{CY=s9-2o`RSzYdvC<g8VW
zid!5kno-!g;nqTQES11*y{(zKTu`goaagXd^>a=zr)H1Ur}YfDECqu$UH^pQDvZe<
zgx<3dmaKF5wXs9ph4ItUeA)$K8e9AHG3Ta_0k%O&Ar2B|K_=PMI568uFz+_O$RrUx
zG2)`>{SjoC(lB{-=x3;vI2GQ)OF1F0Hd9q!#EZNXawf#k{*U(xO*hQ+0-C7+Mt$c_
z`P`WSc)#Kq34z+eQ at T1FAdDk(Da6ZS-8OA>dg&-jY}TrPJjZhQ$2|@TrQ~bQGEFvn
zL_>A8nH`#z=BDLb$H@;ja$deF0lq)~jYItx=1<vK+EC0uYjWtvDSx!;_1QB&5E7;x
zS at PuaHZD#iZ)Y%ClAY#ocE-*JbM4N at qsv+$yQ=kN{*slJkg?vt{CYHp^$6ZDDLd&|
zz2cFM)Hn5?H#J9r&x6cw+ZtBVZiL!gZbL~_`Io7KS@|SEX&*YaI29_oWi8?E0qjP5
zpZ{QS)F=Xf1_;YR6oaeC;7(NM#q}yv33_HTAL7kckxJNm<Yd3 at T7I$eKK(o^+}HN<
z at pJzp>n8JCpnhLXqd~ENvVm;ome|RuoVJ$|I$I@!M|3a!kiYDZfRvZ;W{EiGqCvCS
znN-;a13k}M(&0V+lj|RLs?ZBXJXU0_xm&|xTd at 1dTd#5xMCqiGrg?_g*f at -ITP#UI
z+A0{tlQ~*ntXx|`%&0tZEqpIs=TFGrdXR5+21J7 at vchWv<ATkb%rG;;gq?F8EDi{3
z&c>QZq)nuavrnDvS_mij11o%RpC05Kb1M3hYxCp57Zw at b-(e+l^}=QuN|2CjvqE^e
zyD?$s^9p_W)|_zWD|pS}8(gBiwzjtEN~MWGeYIjac3o4z%Di at whFn)U_#FFGJV?@I
zv+7=Y;~(uKGGle*CHV+rHh4{;zDkH9p{A)YGVIwiV{G!NDD^PkyELX>{LarbAX>iG
zgJr(U(Ic|GZ14<_CU~29dX`z+Ob6!ISah^qWcz*_gjTreYfwBjJ+&z?Efv_SB7HMp
z(u6Uhkbz=XHR+(YHocL{J)>%$c*-JNI*c<chHPLHwBmRZVfDN$MDirKV`Hl^ufF~u
z+{Surd`^_mevslCsi|jj4`zVF;dm*BOM54rB}va-p+HNY9exUPT<h(rXv^n)M at elo
zJ-M}1sWlUbYYncyOUUjwTJ&jDf3L5FS8LqQK(w7T26Q$iEbmx*9`Ei!WvfdZpXbk;
zfV_?$kG|2*`Wuk5EVF^cm+fHU**_H%w0j@)*SE8vqS2(LL6X4lKZoBn2S&f1Eckrt
z2FR=X94N#5wtHx6+~1k%8&;MpY^m>9EUiDJq>O~7mwYTQy}{bP()&FJqGM)l4d-`O
zF$0&}+fx01?7d}FRo at yfy!NI$rMpAA8vy}HDM31<Te>@x5-BAWluqgHmX1w_NOw2f
zrT=rzJ@?}s<G$mL_Z{#0vTMbh^NIO9zb7`_u9)E8`vo>(|G&&hw(Ev#14CT at 1q^{`
zK(Y>N3~}H;3;O>%_5kp|jcBwX5 at JTIpL@G)kJG!ky1vAJZhz%{wJb4u`A{1*Q0ae_
z#yY1JpaGY&s&(xX`VX4IU+yGWJeb0<3${@CCnJpax!PnnI|xJ~1h!r$4%GVJ7qn<k
z6;X;!HM3AtL00^-uX_?HyuYgkoc*M?_bv>X1J30}^v9*k&I+!3CcU#LKoT;U8kT9p
z!NL705&#h`UXt%j at 8?Fr<{c<Nimp~OI1HEWM|NtU3F{6P0k=!xt~R^dDo&<zIPu4b
zdcHIMT at e)?`o7zAR}3HMQ{*L~2lQ?3Z#3?Y1hik>eZmGDoQ4E)r^ObsPgpIWAcSGe
z=j!Upg!``ek`thEgby4ne%#kRHj at JC+QrTkmK%`tH2u#<S^akX8o&p9K?c`{i6o}<
zUuT2zh`oI6 at i<8-=3?EfN(i2UPYsm>E=i%1P)U5NW@)y<@;^YyD-sA*;4KD(3KY_+
zr67Xme|*KjbMR%wUmB1HBB3Q7U!MQPtc?A at m%3$a02j!X+$FbCgAW96pkoBS90<S%
zf{z^aM$*NHPyqliP5AHIu9#LtvU~TqmO9cDFu1KdNG4SHYIAdxc_<Mg(OOGb@(T$T
z at H<K>-m>!M)?7AuFWTnbxw|^)URrF>zZiSRb-%M^f4(W^Z>flxlX<$;tt#tU5ugjZ
zVVt_ at x4-{gpM=r)aCPbDeLo(lD{)~n{{Ys&xGF9OSlmn3DUZ0?KFZaeCAbj{e(W|v
z(w0phna5xx7<)bvdax)b4O*LZl>eC&J3r6Y2r{@NhwAH%Q=Jzwji9lX+r#yuve3U!
zIxUrvETzTs*GGP_^{L;u;Ucq}Q at MHU1$<umJPC6bni2j}De_V at bB{_96yA=^dh*qY
z*fx5n<sBC!8y|y*KdF#4H%Xbm_`LQX7|)6>eLsG?x!=XPI^UlASv;3ort{eRSVPx;
z`|R=_4;WV3ihGps at wlDr`MepEDPjDWsI;`@r(T-9(<E5we9XRt>Nec3g0b1Xpz+nl
zLu2prBL3`8_=8)9u>E&Ibh^O^vF*cs6r^UPWSsmJv}o at bgTm-3;F0N`qP&nVNiJ{Q
zd at hl%XM=(g8lQBSw<GZ6+pEi|l+ at _^q4QCT-p1#d^8yFPl>3X7L^JZFtsJ%Wi$m}q
zA|oTW=(qs7>{<*sNyNZw8D>!t7hA%Pc8F;|ujvaM7k;drxjjLbqAF~ATQ<758^xU4
zY;sFk)Bp!-R{}TkqR6Dh8T>hsAJodDl_3Xu4t#B*hy94uTqCGEb7Y^QQ~Yo;en{s#
zthd1HS6aZ8FE5`A25pM#vT$=d5JP}WIri%Y#VxTCoIr9`Y~W{1->OBgXai-*+UX&g
zqbk7kNRiHVve4p;<Rds?(R(c={d%3>Hp_<wJh<Jd7%B)csqs;%$zr6Rnx}_EL#S|?
z?TG+x;Ab8@<q7hSV!yi<Wt0<4PScET#<=X%k>_LMT(og23TqpqqPm$f at sz;(I-wt-
z9_xV{w7bII5oGy|Oi1RYWX;m2C%2gCT#a1BoS34fnOc+8v(9W(_pQ~N{oLZ*9IFYe
zr(O`M^0;Jvk>S|QC2g+(j4z4&qC^8&t>Rv|2vlEcRWT9d;E?IoeZ&OYQZ4Z;*Ucn6
zx^U3KoF~51eJaC73q5)fL2l`YFo_c$>=~%T6u4|OD?>#r*C;wvx2}e4a{L6KN?7QH
zlOtLkWgi~c$G&i%vYo0H;w)z{9jp#+;1`+Oyud-*%Z3po2RDy-O}hDTlH*Q|MH8!a
z{mw_TbU^s=?4X^sOR7=OXADkNy={ovylRaMalsk+q{QMQl!3B->XIT<=IPKi7x}<N
zn5DzICRB30{(L6cxyBJefRe4q at 2uYnP&~j$Pm-SIS#%IhlFMcnb6&H{LW0Y2IDaiM
zzu8{p{>?`8{Q>J~_ at Skg$W^`%v8sUku~#j*TY%f at qbA%dq+!F^KCGYJ<@neGBl=GE
zc&&$-YV$rdBO&#IA5ivIa$<?kcKjvOxA;d^66D4Y<wh&tEgQMMfm^7rb8c*i!(G6`
z!NJMMgcXPt*I5|X&Y#*?^98CuXt2OZ(s<9OD*;>W^^d-RE{|DiVjcC5cL<vgg9Z;?
zkAut^YiMzIr&SM|!Ry`iBNQtO0YABcr|-yon?!#1z7h>9d5Np{RnQ@}?l&hB3RTPj
zrpVG%Z0vX#miiWBa~TF;WF~{zF^pNVGKV*WTz#O`<rE01#DC>0-VhWtW-dhbx+nRW
z#&;YG3V4 at g!5JPh6h1NTkcOz;Ueu=pXkRusGvKKXR&%6d#YD1|_>|3to1?yq2^FJV
z9Xq6vZ;B06jcDt<ML5zl)Zp5?SXpdwd&+E*&SW}V5gq67;+ef;ExBb<!H6ktLM$Mv
z5Y7|;TeL;8$tu_v2e at sEuAl7$MdIv=QgnT<DK6Rn6=bV=FhM8mztEMsKtP?@wXndl
z)Le%OX&cYS|A}cQ-)_jz5|>w6E`09e;7j3V at 8X%7Xe57NHeM0McfA?Ux*kU*`Xe21
za&UbmzKPyIY5(QB$b9nhvTko%-^V*L#S!fbPZ3>N0Zz_B_;d$POn|IwEZg7zN%O$w
zyuJ=@<!TM?(*5ZNq(_#BFw38cf{%3Rtroc#9!`$hBq%;(VM~l at Tg~+M51GU$a7b!*
zEkm<p4X@!2!}Y_wIRAcJhz<9?mF>YeiSTP5FNg+rtjsCg$IP+Np4U_YJ^<*q&8t
zp&c*$TeKIX3*6O`Y0&r36R(t5-wXxsl53;x0KKO~l#MPVLj_E`8I5&5n?2S7YufvK
zfgvGqzs1eMV%gT~)b~Sk%5|Q~qxGh<=f~eFCEY~RcZJ~HHcNa4oG>zjA3J<wTv@`j
zHlf4!u(z)_n?>0$_)nE at zGYcnLVzNP67rK-Em2iKUT&-%D2F$#lh@&+MbMR<@Wz0)
z at zg_%x#=RJL}o|m*LMx{pQF<>aLlQBjD_%B at 0a_KQ=XTQIIM74PeqgctVi0HX9~j~
z_-S at P#6vfT0c0_J4Sx|9mlmJL5VdtM9L@^6Ljnv}b&W0z863^!#;m0q8u+nHf!y`W
zkpWu1#>ONU#<5ZrB*Ttz2(N}LR$xfEIDikKW(4%pPW#$NQK3N1#=?%6?}3Um3fWW*
zlSbe=@RCG`$<OHXsET_ at e-s7tigLJ<EQWH<m5f)bBOdYkX&wn6?4&_q|Go~tJY%Yu
zwLmn^L|Jd%U^ajh(LnvNTJWO6LT?;?=VQ6v&f&7edzxI|vJE%oHu53F8icuG(aZ5o
zOFoUI3Bl#~=B#a;Z4VRO2ZIkSMf9GSm`+1>at0CnuBxkd&qa0`1j=n^*g+MZUHc4o
zFxGBVp!G+{@1QfwMpy3W_1Qh2O4e>z&;uW0U<y)%afNTu!yT$*R(Eik0HSJ{+LMny
zj%OR)q0#sq^w|*<dfSJ#!~0>~rq6OgZ`pyg#N#0OtT7ut(C|{fdoEjW8#vOs;TumK
zpUYrAY%-f4->mgdhPG8GZ!gy>Q0Wwl6)|%HPe0 at OqT8GHQ}&LBSK03O)rpcE{zC1L
zLkE(^q&HponLWJ+zm`I-T<JvK?nHZ`EULQW at ctA@EH6I;UZNUURMP&8{j!G>NP~(L
zNVqx1T@}g$iWm#@bBx>Kt>y1(jLn|Sb)3MHKDLk#Duh3_p_1Emb}#dzHwMD}Bai~E
zf!kS074clZg}Ch)ztDuT-%BqPAr>lnRT8YWJ8bKA$TSAD??yxtZ9y|?VEK3(F_7oR
zjb-YHw~@Lx-GWV#nN$Cx>}^3-ylgNiVP+1#1a9^Yd|SzMV>GRl6X$*xsj?$(UoUz3
z{gmeTkFGx`V(2A3jD+5)JBg$~KXh%{r!K=BM0SKNj^e!tEE_G4<6j?KVq(3Do_j7M
zBXdR|kB~eSII at Z<&yjnHgS!7>_pv#)<9jT8`t$rgN)HuN)T0;?50i?sXYZ#A<M563
zwE|vA{nSMUCO*TFIVoHgC|DSFnpUhxE=ZisELa}b5j5|DlIW?`QLUH+3L*(`&{_>K
zMl>_pY`UC6^q)<BluCc!7qozue(OuHDQ+|%6i2xEV5{QSyoN;iz~2;p*kagS-&(wK
z&~V1_#t+zv7eAflDbU??J{Um<1~r^8B+VyBpJp<|KqdF9=B1%+P4QkgPV{?NUp?Nu
zHqa|6wVyV=T&0B%#1z<>vsf|)1mUbL$`+>6FC|Fg1}|GRMFFx53Epo-uE3QhA+XWX
z8cGj#VQBXIS?|I5D>*Mbg$VGbSceZh;016tIW`tj+MBf$fls&5)^YLBw)BGClgW7=
zT9c<SBQyaw-tIe1_`vW=!G(lW5)RNa%|9uAb^iegW=Gm^tJYf7LLR!#`BGO=!@qex
zY@}q+raG?p%l)*lg%MFz6sQFAcba>KKT2Z&mdX6sOK5Fuamf0ZF9IT7k40naqY$b9
zsx&~=27KTPu8^?`u06Ywb#hX4IWB(w at V-HNx^8rb<@y*MSFG4suZ22iJTRMtsNRM2
zYl?_hma at 5_iRnqa_d-rT%A2l^fM+MI(Z+Az;-;_>=sZn1KI_-`IW#u~IQj0en;yd-
z#Ko96IbjPpEVO-Om1ttRYzV~Xj#U*8?%kJSI7Pke=>es+>|*S_BVMP6?Bs5#cgpE-
zJhqHzx^F0$K(x^03}<GR<8}Y*txx&yRJDN2%#7ZTwwPa!C>#biTfNp0bN5@@n7*)m
zC)d506^f2og!@9deL~WvnvmehD}-tO-j?MQRYNs%rv<hW>mT%Vo!B#JY@{2Xr_A|w
zn3IO17GwSxwN1J{pn73RD>^1dN@?pc_kOEi!(e{8wuVcXKb%y+;nzkCX`PEDQKOK(
zkBvv$nmaXf<dumNwzSYl<QciDsp}r(DFGTqbj+{S-<?f95LAh%_v$wTk+^`YAtIMw
z-{EMnEy`)-b-+lvGu!qJ!{ujgRA3F|*?n_8ID-w#JRDzQFI%{_h-KoY0CT;Ym>0cA
z=SHub4vP4GdV8$CUg#p6TYI>Jnw>(<&sEDxR_Z}Ov#b~&888A(l!xewYrvfrMaB#T
zp1<};;FL!N!mbz(IE at R_s*-93zu)7!aVl%WH#VR9=3uF1eWte9t<}}VG&jVKZUv3~
z@&hMKMB?mIlhzXc%J$gn$?E#06?|iBVMd^9dfH_vEkQbww}E3oBMd9MLCt-i-P)}h
zY5KDnLZJEzF)V%ldm8kqGINZrETKZX)>q)==Zl7KD97R+=B*yz*}}nXWV^{^QTOdh
zl^s`fW&P#(G-BY1cf^C8Q${>&_SQ<YFgB3v$o4^1g0AG!)7 at 1S1IVimVE9<}dH{c=
zzRA)c6Iy)ToSf?f8hhdqqCd2SOKaz2g-^pBVxGkfg^ct{M-o;4!|~rMgl(HPmd9_{
zze$jk?HGC-;!|LpF+e4`;JiqVF1>m&7wb@>x`ScF&oWx_OWND1&$AZU^KR;$L<?HP
zc?I)tmA;;j_=<3x4omQQ&N`8tV$>TDL?Q586qp$h_Nnkp8$JFg#R5s~VDs?0aafm%
zjCF>?5cE|SR$|g at 1kGHP_pe>#tdqxM^>Y$5Ky`&|SF&Xo$1o1QC88un1e&4`2<;vx
zf9K!SOKIpNZGU4$==g?C6=A(B-I!}w*6xun8s~AS0|7KHJ_j#vFDVAJxA1z)db8Cp
zR~&1uNR5~Z`I*b009d!=-t?C#WAZHvI8AewsC`&~%i(jM=2{*=Y3<-Ky}ka`_jJL_
z*^xS74vB;cG2fe%C+W8iq}G5ZJyNj3dXv9)=1GwfWEc&Q at MzbztC+@zYa6Fq|FW4)
z3bXUq_xbV8R+Zn`Up_O{r#mhh7q at EYSE>lherRFrQ&wD{FwJ-7_&UeH^Ui0hnI=MJ
zu?ShZ>l$;r3C_g?{I1R-sdT<M`O#=aG*16Ir#P?!veJjXBm8P<g at MZ502vQ0bkxU|
zI4jQ1SY_$AG>VEu#fyNpzOGA7&L6?H4%b*@Ck^l9z(CO^ft1NvY^j;>nZl((t>8Ca
z%c1HZf?bx4#N{z4<O?@97r{)o*Dg2WWX3zJBjYy|Zi`@ML)RU(zRzzp0Z9BDe@>}l
z?fUWBU7v97dJFPTw#{XjHA3Lq<#aI%KnJ$bp{$BeF at h<+U2b`3^kA4|={Hx+T-GcU
zg5<-A2_#T6OV*aI1+nV7;(f68V)1KagO8Jlb})xaI(SmdtW0n at IjZd?8 at M+YYZ*Sx
zwHdcopsd??w5UhD<_>xwI9g(BfKw0c{cA@@Gv-4v)%>IUAOR3%P{{v+CCyz%6`?E*
zoUL{bW+<Q6ePF=$%D{08%5azYq<7y`Z*^O`SXW?(H(F+9<-=Xjk~z at yF@#ug$$8yS
zo08kG$Iz3o&9>M9;kS4lB7L2(XOb8{!P1!DE0Ooy$=H0)ez8^`COOI83hiGTLF$+T
zC>6eFDu_fgwWrreK#cF+Dc`qL?;qL7ZtbI4pZh%dHGWzo3Ks@#Gc_5{sBo6oaKr<E
zV_ at ex0`Ycg&G4#b(n%Gi<7u+^3e~O8N_?Cev{yX~2Z-!K(0NKgw-z64uZ8bJfVIm?
zyZ(Sl9M)Lh+FBo!bzy1GX>(`S5(8PWm8p?FvS)enjP5JC{)@Gg-Eqw&7b8bA%08^E
zw}vAacV`klPJ?L!nYY6X;`cTfDFN at L?)BK at fMof}Ql1nZ^Qnd)wri1SdpipOXRFG!
z99DMamy8IZ3c#m(OTd(Db0~FDU&P{g?0I8 at kIhfYmmcI=I|;`Iof)z`K|^<Hnt>L6
z{QHmAinJKZ)dv(sJ_A_5e*Ugb#~Z3gENt5YH)TrU(f#p9?H(mxto=oW^3>tiikuR_
zB%-Qi^=^Ij?AXC5yli%0pu2qsrocv3kcwz*{V3}_NnnHR$V#peX&;5La&s$_xJ_E`
z8~F#7F6`lr(p8VKm~F9pkDB$R54RmmfPTEdlg~abkd+`_Q*KgVct<XcMAU4~ED^&}
zoHBK)%8~#smF=S`>BAoTjQzNLpRMiq?EnMC%@^gaK-^EH`xYhk8lq2;V&A$oj<E+^
zxC~k8T5Eh>aN{ys+rIi(N;#tcx;IrP-vG3~WTrTpxYHz{qpNK{qdT46tazWf<^gcC
zYRV&-O8I48zW$3$tn^Kz6gf@}nMEd2N|@5oveMRa_yo3D{G)y0?6XwLU&%4t(syk_
zGO9k at Pn6+Cw+wGR#y&}cOFXVHId70{#4o$zKXN+xdUGuWp~5`dln7+FVyPexI~$~J
zNwft^K+vcfnZwm)e$S(94+o?JqmOS at J)%!4>GQC at ZJu%`S`Q8`B{gkVr=8^UI~oEy
zcf?~ge6(cZ`iz&apXQZCC*Fu?7631;%hb{mznt%*0a0EUut>bk2mP<W(Fp5N|D*TC
zf)T7b&rIFlUl4jkM at B_Jh=Vt{94tahAt|4GD#z6i&lRH+e at SnBW|%0;KrZ_M25Tf1
zUUFZRLj~5oFMpBw2biN|={s9b3;e`Dvvj&>^h$5u5}dBCnmVx}bSZVS#se!iDi?-c
z47-l3<s6Jl*LZLYujU+XOrEy*I3rpPSk<0gd!;i^5<bbF;1&?hiPirZX&t)uJoEew
z^T^HE8%#rKc@~ph+b-Ar4|#S*$D~HLE5IN0=ESp==P#jF+<bXBey17C!Z`(=H;n}i
zGF>c-ENcSDOb~?&x51SU2bT0rFQLy$#Jm&=U}BbnLtM4*_k(qrfS=^u$vzyt^`&ny
z_T?+o-CwqNnaN`)D59uG!?iu~i at us$Jiq-ouh#co)cd9Naw*vbiv%HBa3Ynu^{F#d
z(wwAxeEOJi#JJ*&hFx`j$%i at 2*DrbR%;-69X5f%`N!qk6K0t91Z8fhupwd+TcklT&
zx%^cDA#mV4dhYhZ0s1y at Hmk<@e1reN-I7%M&~9y7)rh6 at -?;#9kc$S|sK{1UYcmJn
z1DEXw;kwl8&b3s0P&2Y1#`ck3ubi%WD3IzbYH~`;BuCZ46Hp6P!0u?{0o6EAlLg<Z
zch=V_FH_(8-0X|=3$wYLxSn>v4XMJCeekj_U(iB*1nP1)Ks|deyytCkrV*Gj?UokA
zR87L(Vs({<4v?Q9f0J<~%oe at BoK0{(_oG+hO#PJ~%{zbr^!D_)@(BsO8>>+3j3KPr
z=RpOq(4=Es403F(@>CVlysbur-h*KrrTMJ<-CtrpCmQWO+zkRbqiSF(r<$n<YJV(4
zVsOvxNkia3q=>n9#n_Es*}5$y0gz0>U at o@?v4}!gGpmKvQ(ElB#V3y7%^h#w$X^>$
zM#q?r at x_7NaflHEzr$Pfq5y;2thC=BFtu0!%}iz39>?=CZEHtgLgVZEO)hK6caG!Q
zbii2(4uJR#^h)uU?}awKjjqeloKT(ih1(*h!cI$RP>e;RRU1-Rez<H~Bk9T&5xa_9
zU=yrMD3N{R+SD0~MlN0yW}}$r7XNWTq+(EpsJO;HSv|CJDmO)<hWiI93+3fcu|Ute
zW2tU(xiTVIdIRJa_w(~z1A}j0el3O}zUf4R6|)_tv!)u;u_K{5z+9J{w|}zA<ltBd
z1asOft3lh=^lL}?z7=$)U`P<YlZ_`paFfYUYn`zmbiKC{g>s54YO#vYR93m;^H7&v
z6UND|-~Nm(M;o;LHH)76o#l}E{^KINjD(*%pJk#6^#JcIJ&cB3?~nZi{cvM$b%bi?
zo`<h8&}p4$-7$W)v)9b{J4PxN53tGFmwKDk{q|-+zMxfl_DCpTabO|7p&R7xO2V9r
zgU}pDd%&s=?TC>5rz|gI#p7f-UIWKZ61JPb4`H^(XtRemgtS5Yx81BuH at oYX+!nov
zfboiS_b=VvB2dXcpmCvL{}E=g!KqW<*Q`#i5c(0s?1H<t-ae4SDi7Bke*#+qoPyYu
zAvD~5vE#VEOok#W2ODra%6NOf_W3dwU^MT5SuG;H^$uTc1q~d){ZepWV%Jcc|Ldm;
ziB|%O{riMmr^1e#^HR2ejX)_7h#+L8ky{1Ykfw>Fip=}D)U)K?Y%_5!nnn_m?l66G
znam%rzPa~q!U5X9-4L<R5~^T7bbi=!+hnordwhY9^*GdrWysCG?AkPdcd7zjqEJTl
z`w{$$%^<1Or17oSFA5-EYMSSiRWW&CKDW>|-X7tAp8ChpX*gej3Iy|(*;A2S!OL^Z
zZ)`ERb?56G<FW0J*F63xeRAJH0nk2*YO2x`{@qFVXp%5;Dxb06hZCrY^9VN1t-jV_
z)O#FV72NL)1HI5lo6#5Wf%R!LR{J*YwCA^?4VQ0WGq>ygBcDEJXa`J}w(@fz34kVc
z90Mchd*&kI$dXc7VGQgxVPIhXI{vLQ=EQhu80&3d-lcVLHU#%3Zy6KAu>1FKTJ&XN
zwX&~DIT=4j^2@~hxWg<jtj{g?t;(bzU*0}EhtW9LO6jOACDl*5<D139(c4oMj9$!#
zRNOXP*oLfVA~vj5Ee8~sjDKi|UB2A0y-f`qKlJ(9QW|Ys38D<5*VvVnE)Bq#X?^q?
zQT1t_Y$ZP}aU(lA<AX{a6(eHiO%E&0%tHGL{hsW>?>_9`T0}&FpZ14q{Sn~ASZ_sG
zVg2xdyE;iO_uAWV->Sb~YtI(FgwGo2mC$aP(`L3S3B!J2oq79F7ARerproA*(8x`g
znM0?}Hh2+83l!iE>pN$8mv^(2{CRV+CiQ2h;M<~uwyjni2SdJqiIoox3Z50)dcDhT
zCZPzeqF$j3FZ*}rC&|q!bT}o_B*X+#9?fOM{C(}}tm at 2MIpn}yB8FM$_t-!a)M0($
zaC8L=8^O=%_gkNn(#8#gX>zk>7wzV_y`CqqicHvsINh3$oQ)hc$L}G9=-e!5+uXE@
z;cZL{Y+)@Nv8-*^AVKao8~Gfjc|*B-t;J$&U)kBnVssP#cm6xnX5RveLwBJ8Z&^dQ
zhRsX2_;V%~P(*K8w1rxwkpTanvuAJm`8XutZh)6Q%k>g)ZSRHOa^Ct54LmbuUVdG#
z!UDK<zdt)Hf`c~<bv0SYlL*J2y0<;xgR<VvD8tF`D?+}glJwUK*Ha?|3Q1($4x$Pl
z$h{qglc`N;IOPPsnbn`uyxnOhD5`1z-&_$Y{8>HC+yrDG>V>)CW*GVV=WYgV_dkZO
z=T@?oLK7Mtj!%=k`Eo{g+-5DAGPtvqKD+y*S7!Ejq|OUCURZNqFwDK|w at tkCC0_)|
zDp$his=w6cp)D{P-<aU|nLfi3kKCv%!!C^&co4q7?b;}a&@29Reu$TrcmD|+RIq9>
z-Wm|&4M~!v?BWuODn;wB<i^`p?_+d}z9}(;G<&L3lvp;cajMa4X#-aT1aNIeWqKSm
zf-c=de2}92hp(MMJlYFn*K&X6!MLN05IAwdfLFi!!Fs4(+qgpKLo)1p&YBm3bx8Qv
z_CZE(jQvSfE*z0F9+}>5-~$-p`g<g;f){e+IE#9n at GKnA<EPSm!j|!DrdZLk79pBg
z<*&K(yykYwhFx_#L at Yj_O9j&kY!4X&eZZfHA9xHL<-!0u8ew+CKy=^_&JKc1=-|68
z`_BJ*NYH-*YIJ{;Crvgt=YK+le})ed0ueD#=B&o#zwX=yK4Xa=9Uun&Y)9aF5fcHp
zWAot<DllU6_h1R>Tn(f`&RayM$^OU%h|1p2Mm^qgxIB4O0Z;vVkrr26Z^-`s{)7V}
zj#@tvK#}vXEA+6Ll=MD;@!tb3{6vNP>GS9I;bF`?DBhS}5M%{s2MueuTKM>}O1#UW
z{3NI4--FN+dWOAn?78A32!@beKP4#I*?qhUh;TYs?$x26emtKQe7IZY(OF)Sh<~Is
z0p$Og9XP+ve~$<p))Xf=*?%8=f1-{5I at B=C{y%hyNIU at MWWYlqU=?n;j-vrsuNRr^
ziQ7u@@2NZLcf(1l;aAkxzmud2TwFA0^1c4p?QLu0;XxQA38bZ^p+o-RsmOc=5J^Rc
zhaw|}M9R=a%H~9Nn?9Y^1OF`sKVBZb-55Ja^2>ND#ed(qEhYvdw9}+(&6y4tg<!X&
z$Wt`dNf1QyViX>|{|MlpquH4e#N%?tG_ag?ir2uu!!Z930r*yBplv!&-FG0EQEusA
zZpOd)1sn_~@TLO&{eK8Ig^C#XH2E1A|Ne(Dvvu2n58d2M{~@y`D-rNR2N4v!zaj!|
zfe3Jt1cP7x!xU;Ipir3-<NuqrX$qg91FxTknEq!t)xi*|DD#*9a}cloPYt4w1^D at f
z3R$W at ssD|FnDfJ?;(b2kzCPADTVY_gk;PhDxp41PQ|WoDhB)ot1wLa1WwV<*-v$*R
z{29afS!rF%PmCl at cT~bo`kQ1Xjz{XLIBaxXRGqYWdZWqZbH=gRf}1(fxk2mg*}PU1
z%eCkejaf^!*oU5l<t*8mtH{69P>TVj-;`L>4Ixl at 9VxKErXydqPsGueTB6+gCyE{X
zA!lk@>e%==jg||KaKs{_{ZFj9hV*#6-2`>wa|6DrB7&q7Q7tL+EWS0M9QB9oUs7bh
zH~o84dxSuSPfBb at 8`1Dj>C3r<d#p6Is}b#|=1O(XHlS?^{(1je*ew{StiW}yCInJP
zP0x3RNj==xk at z<d?z!m0g{MfWv}_w~)R;#!=s^|sj~1f*OUgoVz|N|BGME$%4b4W#
zo<CZ5$f{5P6F8MSK#7D8LAGJ>4^;~eo72H~rdM54#83Vpss;TQxwB8W{xDSG4qTfo
z&x!VVg870K7cvmXO|HR-4&K3yoL~U?n9A3XW5Ge7sbvMnJz|K8Vl1;0DS$IlzR8#)
zak6x+4;kmG+0fI^|H{wsDi}v|^Pxg+x3P1W`1p3^90BJYnHbw3vNQa>xM#CN-J;>u
zoj*KneD;W(c~*4}LSWL>!CE}koj6C6gTR8}_7d$v(5Jt=s)GEV>2c=h$eNseZaTkT
zkhaQqlr%G=1#4W#UK+)1JRkti(5rc~zkbERz&P*8K>@#?c^MbJLEVL>U$#sx*Jb_O
zC1*@%XUvqM+eA%&!7`-28s)q at R{$oE-5daY7P9xP3K+$5aiIl^ZvDn)W&*u6;KCQK
zsXveKM^ER5L-(zjW|BMM?eD=Sf4Hep+qvzzP+K!*K9B($sCe6%nZfOl>VCC9IKCN<
zD9uHzRwW_X8M8~yq`b^0j%l#0K*PcJ$vh#!nlC3-M#yA4_p*2B?ULd=oJjJU9zX-)
z?iYLSiS`}kq=VEN7!pv<F^0CXoV2Y!Dg9-6N7la*uH^^J=sX4RIVTe-pYkR(v=}Yq
zVtKw#B9kGBNDK?cwFjm!L!vQ&l|4u15)7MaW9mE&Oe`RTlk^M}E-Bk3hhA`*5}i~T
z at RV{bW=<-LvT17W_|Cu&Pl?V{oeFs#XOd0$c!k}UyECpwB+VGZ8&c84;pmkK;{-9}
z@(7BOsqbC%W-Uu5fupNszaEMA;cpL`3m!)U)BjQ{U-PfpC<Lu23b!OyT6iuKeq?K<
zbD|;QR82vE7dZemoJCzEwp#5)j?kf at Z_d7)i1ul@!*5Nnk81D(bk*oKUm)-KvrnhN
z*_|O&IY*^mqG6n5gOnAY+O2FK<ZFiujMr~eoU&hBiV;3OD4+s7;#Gtqs_{R(E6HDj
z<4Od|q04?jhZp5GR#_}-kbe{+3%JRFLZw9sq$+WK-cfTbjOf?I((n`8i3(-Sz-wtb
zB|x`>=lEH|W at YavXIt5xpBHXXRa=`=UH!!1gsJ}5S0y;zIgzoYah*CpjX7!!|0)u4
z*eLpLBA#IuA(}>~6(73!*=me4K!k+d`?B&FfAV7Nu0?lCpr!Su$HLX!?Q3&=TXQvf
z3SW{-Ax~@Tu8Z`SXwo4sn9WDHJk)aoA;=dpDCnu*$mwB7EH7AxP3(ukngdNLkGbYf
zH7{O+mV9xShvTFGgNB%J1jEY3&5FUN;QFa8QRVfpzJInIgeC;Yig*pbQO7Y2a&MG@
zXYjEA3H)<uH9LeH<Zcy-MAPPa(0^>}RKTp;xy8ssOW`)>Svwe!=+U2JpaOX=H`o7)
z59QMeDIbNw%qRk1@;fDBr6jvhwo3-|JeJ)!9(@jn_PBTMYuo7=cn^260~npZcLq?j
zXwjq*_Z`|~h&6%`LLT@(>waziIClAJnWpTCPC*M#!{&{h@!aSF%I+3CgKP;==E)Pg
zlnbvP#Gz@|A{ubRrFT at tAdbK^GG_uY4r}qr*<O^r6rcMTP~tC8OULksg4t_DJ7AT^
z8G`@3iJU=N%Tj$+<Z99uN`#~ux<Q&++4WL}y`X<8_!BvyzE2*-%O`~;`<$Zla~IFY
z{Q6 at X6gjZ-gD;xdv`8Ue_~Gq_^eD?fM)~Hph*~q|iCTQD>ybK2-x4^SOi)!*GcXmL
zJUn)15Eq6J;<Ryu6Bt%#J3w^@w?Z+HrM at _s)hKSfYL*re9mlu9L)M<R7~RDrzgzVj
zthzu5=1Ay=cM0mo!18%TP at G|9ZLKvwJ-!gE=J)_-%KPi!2snxynWKgne{b<Ao3c{w
z at pjd<Z^#Hh$imCX$(c=cB3Rsu_?IAQfzf2M$yAJGFr0n79p~UXEs=)?ZOqEjM<()o
zkZOsAqjViwZCq!v^T^1ztz6?cWh57;sJ=LA71_(T)$2*V(Zwexcb}|o9&PFoF1BF=
zp7Ne-|AuSpVb=>1;m*vpsah+2B^ybLd)B#Y*cLh!&CqFG0HzAepB}z25u_=Zcwg`i
z#XyILiwnWFvAsUZVdmqAg{xTQxOi*3u=fyxfV$Az<tNBMjBEglg5RsRy5XLp(AJSC
zgn9U%`#sAr6UfR~R`svHlWhl~p&AmBw6UeBIFvj>9F=SOzjVcWnFLum&5N?Rx~QfN
zej|*bhEM&TX8hLqZhxcrt_AIsk(W<k$KV-ASjq)7+6;nt+>eo=rcRz6I#KEVl3MvK
z+dpy+I#4 at 6Z+Ye@Z1rfL`W3>ykKUiHEc`BphmIJ&S;LB>-1=Fb#o6==q(Fmfy at En}
z-nlLs$I2)r?3yuZ*BbtuiY3qHmiJ&MWs8suBM6m$C<c|neQ7kx($_neNe>!is<rBk
zX6<ERo6+vxJ&{hJ9Fo%$LiatB<@hy<w>=TJM|OPy&N=<X>OXTfg&5Pf`bY?qDm?1@
znel|@z7@!({;P?E8+OnDv&O3s(T>BxdO>w5?#)kh>c1$&lj61w)TZGVI*;z at eLef%
zc?jno4|_3+KbR2XrOold(Qe(FU<TB!hjdoQVu|Fc!MI{BheeJn+ at 56WK;Ow at 8|iEu
zf8{>E>L3$8a5J$Ii>(&oc&LYk+0JeE#&aS%u>Gpt{Jz`bVNKB-3&<XF{OYvbMW(}@
z at osq^$1!BK73Tlj*vg!o(kQi)FfK%%4);^QUQfhwozq&kV)T+xhoi{e)sYJDP6iru
z&gN_Kxz~|H=vXBJ?=T~)J%T_0Opcuz at m~;$yPOA^&*hidpy-2>J$aA}nSf*ckwh_R
z19O`mhwoK_IVO0;tNHs at 3J2P6LKgPJQCJ-HoM)nu)Vrcf)|HB|7T!3B_U}pQ1|uIp
z$5r!lxpBE#sQ+R`0v3SQYbZORQ{78iR^a{-@};0HoLm;7c1``#YeFza_Ik>U7wU<T
z+v`4icCR1b!h;UDc=Qf!7f5F%A&2Wm!wf}>!M!l<ruYdKz<RTYX80+Fe~MZCyrlDb
zqV^v<KlaNGv~AR-OmrU>Q{8mLK?;2z95~YwsmUEAvq#?|n3X|tmxdYPQ0P>K+Z5)0
z6eqNc(h~5 at We-bS#*E{*x8}|bNkmjlQ0{wt1bLK?jm|YkDj#Zq%d>#R26m1bT$DRs
z)=ihU2n*xQEdf4A;A+-1R(iqihhpqyV1Ax?FVp4;jzyE(I%u_*EO&(sjahNJyV2Yy
z4UY0P0>ws>d3%M9NcV-Knu}~+=2waMh%@@<Jc!1SrrqXIOmYEF>0;S)aO6_A^BKv3
zR2M?>NzS=YX%utr_IKHkSANp8sd{r<yrP<8e1LN90=X%K3R=0^SK`e(3CnpH<!+yR
z(}bePrQ-51Iq_;2|EF^OzE!whg6^y0!)Rz*cxg5*ag+oraVL3f_5JM3Wb{QTHM(1J
zE8>dUA2DC)_q}v(CB=KiqnnC)s99V>z$yp*>jjS;YZ(Cfp{8!jrPjF>1RV2z=Jstu
z3-byz87j1FT~77OpE2<8Q0QnNcL}(~=Vd0!^0eSD<vR(%C71%D at 91QxW7tyUQlY*s
zNEKE1ymJS`{m(M-ndT0D7HoQiKL0jhP1nhBTp;W{8f8oqWGR$2*bKvRP|UeYTm!Ry
zJzJNfjC{F5*Ip>S&UmYL7x{hS#LfM<kzWK%nK|Z6l;ozTVe2~jPIgg(LSuRh{rE0l
zlugG*kp{Od;)L(PdM2*iw}tI8mE_>QAE)0s4liYqtH5Z&+4r&pU-Dsh;-~=04IMyx
zM;bx+&&u<k6Y6rXN2-MIZQZP6Teef(aepQ;&UB(JCC#?veO?J}JrL;{<|>lX5LjaE
z=dMJxKutQQLin75mhd3M-OvM<C%Ym!z|n_l^eA!G;0Y(Wr5ggCg=hD#W2Og1o&usf
zmF_bnfs7A}mhkX?Xhh^YQW`<b9T at v~5n2E29$VO2q(Do6S!378-V54=xxK4_jKB|?
zhN?95vcEt4jLjr;23I>h0j}h at 8UN#n(8qqkmV<$CYmgz^)16dEBVRl-yl6=A>)&%r
zfJ!;U2}3!Zz)=rIm46EUkSHtZ&^ptRBG7zAPnVyCu at 8UbNUok1fXTcWy{czFlOj*`
z6$OBM2M;YJ+~IRqpFO1y!%wE*=v&=okxIR23gG$j`F%#$656#$L$%A!v&Axgz;2I2
zn2+<<o`AlQa^vd`HMlm!5DdcTkeXLl=yMEpw-~WnQYq1^ktG`@A>Etk(%(Db+AiLG
zS&)+z=}JAxg_4HZ%qk0=cvEz4u)Df3PrZA1mlM6hjahoq!L&FDL%qmYMQ+OhtFj)g
z9{Rd&REXG^t!9=Z4xqk?mKcIhf#RPYSwSVO2<I3WR(5tWX40TFKfgMd=9n2&DG|VE
zqTzQOpYo5H^*w(MC_f06tF<t22;=wQT1Pcy{TAw7>G`o%NDep7K_O?e#aXTrvVwqB
z<JQ~#?Sm3t?s~Y37sU9D90nd^rw}aWK!Fw`jtKC-QIgOSWJZoWXz5DA5fFc{kQE@;
zp#*k1#dBa}IqH3v?M{*yl2f~(HQ)K*Ipj4`k}iC!v03L1bc+kI0A*#Onpxwt)Q&`5
zJR<U%?4s(UDp;<6t at lz6Vqor#oo9UioA*^?q2U*5elLlQB%{>kcjniDUeC2KSzCY2
z-xM}NbPGauossC_deH)Xqbdl)R}mN;liuh;E_rBZpLPaX4Q(qjc;4%9>Kv*Xu^mwe
z7am6XX|DpD2fUuK(Yg3&4xO88piRRxk~(SG4Q(6ny at VDIUGH;}7V8lSAb%&F%X at z&
z{1 at m@vo2%@(7m*$wwr2#8}|>)R`i&`YJ4-W#E~-mB+ieatmraE8xL@|mg}>Y`tcUp
z_EOSNb at X$9!H^rcF at J?ZR*V*J9$fBt%k&}+J?<TR at 7riqXW2La*I16eT}+Zt4<Cpx
z6;j{>ckrNY at eZiy)nh)5zrh6SUS->3^v};3+!UP0`1yG|Mc+IR(6((iFw$fEL7h}N
zXiQ at 3hgZxm5F9T^^Nd4wNEY%6j6~$((P)HgXej4e3~8>Q%c8-DVGQjPkx+zJx8f;>
z(_YMB$mJ%{tdX+c_)U{4VU*}BYY74}3!bP>8hK9~0<e!g;SD#LbWxQ;*ysV#fl7BB
zK&Rkv$)0FqI%h%{Axk3Ccob>gDP{F0W=J3IA6$mz&-Nqp7AvdY1SYY}fz26qw_`ye
zVJCBxf;MhJpgrv(@I7*6<iy)Iz#w`9!KD`!z*F;O&bqx#syk?ac->3VyWU>c{6LXc
zDQApuu7`YasKg#B?K2vBv3v9`J5p1jZQao&WCRqR^I3B*3>nI7q5Fn)&r%gEcFX+^
z-C|vIpwaF|P4PQ?V6aF2mDjr4YV1_cjf$1t1}QuK%Ov%f at +7dY$B}MKnf5YwY6dEq
zz}%C|qk(13Z)DHbV)TD=&s}Ak`e|<ioNIg(G1{g{WI*zDF*ya0&Aoh&Gh)Kc_hixQ
z^S><IDMEnZqmJfuHfX)7#)Sy2F0;4PB`%tKh<xr+l^96#)7R}e)w!4{xE&a-i_%$8
z1wF_~{mXg6qx^j|3lGF(>Dnag+NRRgR~M=6_IH)O`u;#Z%7WCq&CInKRU_+<-il%s
zh(Ez#GZrCPeObT#3&gu|-erD~7S9WH7zMr6-QwEI)eBC*cP(1Lory!Hd_(#5Q at 4;f
z!JAX}%&Ex=xHiy7wvduV&-;<AI~NH04A{uom6D^=1t`iq?aaI>W3joVYpRQ`Sj5FB
zmfX|<H;!SqrQ=|6k$n8vw}@nm)6 at ZR+aAalwoO^q<3+Tk)oc-7Qmxi at UX#DpV0KP^
z2f!Khh9zilS%i1O(DH}_ws4g|->B$dkcL<50Z)gAf=unTQ+RhnS<1G$rZ}-vktIH#
zFx?2|J3UnI0i2f&6Ic86dAWYGyI@}2By8!{0>=pKVpy`K%?l{W9BW0?P$nNmIG(}0
zS}()Md=FO32oufnjtvh{q4hb?1Skd8h|SzuN0$F+RUR01en$t_#)1l<#k^#Fb&e5Z
zWqsIjl-Ou&Wmfe}Dr(HNGn%r~fUQS^g%lMb at O-P5&A6`eWuUo~nXQCxm^*hryvhDk
z+_Oo6uge?V!R@;4L(;Qum@!b^oN5^S;fLe<^#k8D6w}ECL*71XtAnn at TB&yBQR7qe
z1Qd*n=N;V&XNx%Q5cYL1RN)eY+`)nN*SpwF{(0?I?R$xP;7ZCujDwu2ahLrTkZdi3
zmgx;7K2>1zDtZ3Pc>Bfz*Cs;~l*nX!7o=ynsbX{(a2RB!J-OeMwt%rx=}0crJN#=v
zfI{!zxd66u at Yz2??Bjv*L%lWNC{7~c2V^B5Kk~kuK)Wn0wxug&S>zn%yO$LFY+bk?
z-~Y4Dcx{Op4)|YZiNRHk>L2)NRZ$L3ZSwFLkH>4N?OC!50&bk2Xh$STYQB!(eAmsG
zDt_z!gqj|hT&Vnjdps!PzwAGH*gf8o?|_+I`r=cg``0FwoN-W{gHUGC3t4RJI63Th
zT{v;Q)QKO}-uyc9SuCGTKe}0P5?(~^QA88qmV!5|#pBN-^go2Aqd8pBPH{4FheR$%
zA>?83r(tMl at Cy<)(J#Z&UY`3|R<`e7nzV0+&Tq;+Z#W<t(IqA<X!GEp`gPgfyb?OZ
zkkMPe5<Wutbl>CsKLV))8VxMZw1nA=Z7s1BTac4|aqPknzIAKz-)XQgOX5$+%i_(<
z#h9_C%W!AND#+W!;!)*J$meMw2APp;yOIQ-q<;7~J+DabGM6B$(Bf|FM+%1}P+pfJ
zE6hey!y$j at Sh_0<6lN`|D%j5}Q++0g|2UGOf&w}l@*C+AK90<h);K2DOC7f~GF)Mr
z3NoGou_fhSYV?HUgfnDy6AyUIokqr+Ba!!drd)En6CEs#&;8x}n5yOG4|JdY7uH=U
z3}~`^R<hYCUsDu2xZ*QUk|Vol2{aR7j|kSgl8*3a6U*@tn&ZO|_xb4~X6R#6`(HS?
zCo8nghK(A(FD<ob8Ubq>7kzqZ`hS7JSDeAcScqF)GUI5ub4Cfc^M|zV8g;B&a^NWL
z=1u%qD*aziuV6)?P6}pvZ}UBL&Vcj~rvCo`hW=j at _`e6_|6d-&b1kGmpH+jsgK!*<
z6Mw4msOGC}B-!FQmj7lA9ss?LYr#=gRW(lEukLbE<M%y<4&!D8Xtc&7o1GNiHFyz`
z?sy4s+9ewuQp)N0r0ZJf^d_Csl{X6Jim1-;WV$q|-#Z~K)Oq*S-<BlI%qUV-<cYls
zILz!X3WwG4S7(c;%qO>s at K3_-V@=M_ojvND(#piTJX^<_&%Olw1iLB+byxVGot?Ga
zdC2jHYR#20yDV!(kCblu#x)Y{!fH68`*ZZ;{uA68tI#w8h>Rk%P?8ZH*YdI)I-fp@
zitdj1Jg#=$5`7405#D}AgVWO`$*)gx85%E7S6<8g86)F{0ehNE!0A@}AZ|f2>q7XQ
zm}qmR*vKazLLbrzA~K?`^IbR_P9e{GVMHXk@|wn{)ty at lmvWp;5pnlx6m%C=y<l~W
z2pG)X2zsX9>Tgik4vC(5bq at LBLE|HFpK#)J!TBA9g7WF1MH~;-n-LE`?2uajo{9Kf
zq9%WGI6tvjTTD#Tu9|QeUj!H*WYbg!1z4|Py%Zm{B$DZY<?-H&#V*PaO~}<#z)1=h
z!mRh?I+4Sqki#xN;A5#Y{wde^bL3@%7SVYg?3>e84O}o2O%iVWkyucD9+IDjMTO0g
zzi<^*ga at qR2VoDbGBD#|X-Hwf{{iD0;<pbf!VcKtYN1T;v0qUtWYyP(b{!OxAYYuF
zedz`NcJK|VsctA!v1xf8k{DcE1xEmXeeKg$3*UqMOGakwbRAhKk78%wYLrnjQG)fo
zb!5StRiHc%tFjS=t|Q8Zhy at H<Ppu(R-0*JVQNL&Y_B-H0j3TkLzJa4TMS+GhKvkmS
zWHy`x*f|i(kagN_A>)pvrmA&(P{}$tRTcOp*GK{87rgV#_>}si-C`mc&oDqgz?cEL
zIf<W}Yj-5eoto18iKwPyVG6<J5nDDd{pAwBc&)ldxlnUo-zJ}M&wdnW`nPh1QCAXY
zWEgN>>Y1D(D%MT#LW>+`_Ai=JoxQMCn#E1A{s}_kG-rUu_nDIXvqja+=Dpp1{PAtx
z at ocb>sgu^NKe{U7ck3F=M at 0i*X2Psnb|Fs0V#v1PLn)R<6h*No0hdFPR8f1ct<L8L
zb_2^<#w;Hy5f-+lr^+GZpV~^t!<+YPXI(Da><*-jvbYUqqr=KSxPWUnW5(b4R9kg~
zug*obYa33InG@~j@>p{&2H at jewaHUNOZ#2CwJ?@QX-gIt)70AbHOXg~0K?+0;X^ZH
zSW4Y8<N27nU_AMdz!A3ip&7F#xt{3UIT7$Gy0QqukkDVglh&~E<Tu<JKW|@|$J{q#
zb}JsjD?2<poVMB5Mn?<kZZz3KWomp?aZ=V$ZvRhds8!YG$UV-~K%`FA2-d?HUq}X>
z^uGf6H()mq!09#S6+?1oD(rG)S*KT)D&23nDBy9kNWJfT&_a^j at A8O|x$E|}xwUg)
zB7_u+a<Dy7{M*D-o1YzH&3aoo)&%MNr$!Eg)0>I&rg9E-UVwM)qO;fY<cjNH`NObD
zjd*9~v&dvZ0CS<OuMgQ_xg~~FfWp{*L=Yfrdc<@1<TJ{1<grjc7eaB0A)0)s2X+Em
zsqt- at 7jQ81rcL)4LK@`w4ue*XSM9do6e9 at yb}B<sg<ZN{UaQ-WD2jf7Yuj9fhgPa%
z&kAsd?3WOGX=Xp!J*EW}iE;PSPid3bB^3q4Lqp0|`LIx13<G3n;EGJboo)&b^v#0R
ztB%^9SLhg6X8A==&IdMAi*?8x<jgeiQq$7L at -r(bl!u0_9BiaCik>(Rc`3)RZSC#J
zSXzpt^4f2C^g at u!`E7&SH(q at jvZ&%Wm+rZ_K<V^BFB`T9X_++-y?DMI6N2ylN<S6b
ziTKvBaP40qb(Pms2!VPN0^g3dlBNBW4OB}Vad#098Qqf#%0hJBv8>L!i7tPFDZL|a
z%YF=d2FxHua6}qAA+?WEj9cTVjlA*aWQtQj`yJ*7dY;dU^VH?Pt7AXUYC2ek+bir9
zm#UHkt~?bb3<N&Aq~q=x_}xLHB+T;!utZ(W);I3}r<LPm2UI7P&jHHxA6Tn!UMx31
zAM&%9Z`n;2AmMrp{j!S4q`s(!o){p882BUs14t|XGQ2lrT*yj_?mkCz4KZGLCwsj)
zt=8%-URM3&9OK-|iXzw at x1!NV+{i4zU54_DNZBmgmZ9UMzUmQX!M^o@(dc5Qre)4e
z=2V`D$OlZbR~T3Nkx&2=8zT%mCGQ?_fyV}U3zIHxD(fHRC*v4Zhz2AaySed1itmak
zDKAO4-ksimHwd}xb($&;HKIVaxpIH9bWfCtF%UGq!qasD`*u{QN;;0Q@|^eG8}&jN
z8q8ic>w$xNge-h?M8B&S6l{V?JgB9ffK~YU5>XFW=+w+o_D<jk8E1VaQ(V7N*Q8q4
zq}d(gGP5LqRcCq1c6|30YcZ_!*HUG=L12=xqbUa0BOV{G&#yR>H8p-?4LRV#U?_9M
z8v_=eRbUT8dP`bIkCa>4LJsc{jO at TBzx!~m->aZAf6?0MU2W8SvHx1)qkjZ%s^bdd
zRq(St_>d#;9Lfv*fcMRB%Lpw29p+h}9EacDG>>={jN$W=LGoi4cs?83SV`s0qNdHq
zDOK$9emd81a~WYp6TY2t at eo?m*&3;t_*^MUO{1~H`>QlvV8W+p7RR5*0si7*<?`oX
zS;-0 at X*C-!X3>wO0{=IlM3Ze40<JCIJG#(OZU?MSd^znuiM(o1)#M30Tag4P*s0 at j
zKa9fr3?9RGoYHP>Z at 2f|vEw?&341GxC^)`uY+1_mjrM|nMoo%-z%IW at OymJ(!(MD1
zn5^`u>MTx>rD?!nC0A+$x-6&Zuww(>ALI{AyPj5i34CrV^o>Pvq;o8hycdqV0h~;)
zzc=XpxW0gfetY`}-H`hRxGby>*f!QXVq+23P@%pk?#sD$7(twDQAC9l_<?=NA_ki>
zMSP<z-$A}4^8=HXmd<Aa0~#S<i6HPyFTj1EtdzvWAd<)^uf3R*IA5&HgijAgE*{|8
zB#W`gJ1F@*{9`pWAolu+%miR4x0*TDBv6T3K_jO457TKb7IFegRPp$KO#7~j^4i*n
z&=29Ca25O|l2kxgR$89!1HKFhxeAFUil?aL@%FyMc7<uj;<!yXB%OZKkXrIO%TnB)
z`@+hFKwTilpQjEDP5kuO;BBBR5|+4e{;hQA#Wfl8GZ%eB^Lh6CUPd?4QmZn?Nb75&
zoSLX{OFkF@!hUJ at i*p{SS=btKn*uW#AZsj62PAf_rk7_oe`jVyx9bQtcFK4Q*OqL8
z45S+j at GcX0x<nA6qU{LHG2S)Qb{#4B16xP()XNXC7T%oyPHMSvD;Ne|;*q_WcpG;k
z9_3b5cnyA>F>iXs7iwGKeF~LamLUYYvWzZ_bJ*iTfk?B$*4K-BW-}@Mttz0CIGCIM
zBG4uOx!6d)1l*%c<6I_nt$#*qWQn4HfzB>fgNY#2$-)8=GY6(E^<?MuUl*Syd*{_U
z7<_gU)|!VH!-W(659Z!Fs;a;H8r^g^NViBxN_U4M-QAti-QA!9N{Z6b-6^1ScZ*0I
zLYhOo8}<1<&+qr%aqoNYc<&w8vHx%|;GDhpr{-L9uC at G*psmh|7&bCn+?|ia!3wdS
zmXZycdm+sSIi8Igw at d21YXYEC7&6eEsUUVri;%&w9#0jD9&(^EyodM^F1fdwHt@|V
zOwi9=KSQ7qN0cwv at Xw5<DG~Xjy$=KIEurNq+*nQdaIT>OUGa~WtImolW*t%Uj7lq(
z6vW~TFN)XmUb!nEm^^N4$mT at wLJ4kT=izF(Ux0WFF&}EyI{n?FONf7)FKju0Q(Zmu
zp4y1MN7 at eU`@!$U$^*qIdI)vItXw5mtVs2Sj&`kfEJ1DYE`%1CK7k!`kjR^#>*1YF
z?7Pl92ZL_AT$uOxP(g~G;?CUyDtS_UXyR|u85N-M+nS^i3u<QO&tPf5X!#x0hQtaP
zSTG?Ge*FT96W5C+s(mg%@Fl_ug%dN9?1rCxPd7reH86zbw}=S3p%wo>Gb{aX<v1}9
zVxVuji+xvpyXP+TSjOkFw+?Y4SUEm|+N%HI=2G#8F}5Z>ternjaEDGw=JM)@8r6I(
zhw#^z<g)w+^A#*%1LEM1#2>^`%uFBT(<e_UV%Dkz<FpBC!@mGWpDrCV(<AM%6<etP
zo-iFWzl8$9ASs#{m_f3;(@6nV?aT)`IV*wxbOeFJuRk0t(Xk7vk?VD5`vXnN*o4fk
zUWLP~<beU0ZRJrucR$a0+J9yxi!Abl-k(jP-fc~w`xr^N=cKLV^!3l2!G8Re_Y;yO
zS at 9H<_{eq_ey|g~FdnXpNgP!gbjaulw`yq~MPJqF^(9wbTxkKtzb1#1*Q3XYTC+Id
zP7?)x%$AmUdAX3{Q|>u3`eE@{)wP at t)GsYY&xUcI at LX((EJ<I0{Zd|TwmCiGXr>T7
zQ-(NzjE}x&UIXiOF<SDZBl7P6G|qU1+%!_qs at roIErT@DG<u;+G0gJ^1!y`9%P4>i
zA at u&5IZlcuA=v3b!CaeM=hoLq^fVDk6{C67OS$mrLezJy$CH=vyX*XTRb!;o2HoAK
z)<7o$BaD$3>x*?5QegFj4#UdQoWT1<i<|03np-~;93#=Ajl^Hj`$4)gD?T3u+db$l
z#SP?`DS$rGQ*sYlx$K at -z8Ovi9IR2kJvsMvKC99au7@_^t1B+0NDN^i3SS;%lXlpE
zgY7_(AV=1=%5YH`F}Uk1f21y6d0r1DNWQKzb_^<BiMzDn4g0gAerkOJ)$b0Ed6n6%
zE=^r2rnlV_y|7>zo6E)2)0%X@=s??=&0D=iIVspnP*)H1YenLCo01U79^1 at APZ5E8
zBxE23{@kbqZvvVZWppt76~-8Ulv4g9YQ?qG)h*W#O6J`1;pk%J0DvL<bxmUfEe*>P
zj-xVicXG$iUmXZQWz4+`^jwr8OV=MKI(XbzI-}XB*k%x&Z{G3<-a%}LMh^s3X4l`s
zi4|kH^~-qXv)AzYmSY`2z8%KOIXQqIo**i;oE-8MZO|(@Wd*HK^H^!s_gKi|x@%z(
zjGidTXdncA1yhAN`6e4;>Ov<S(f<zd*Wx?iD1`iQbx~S1K(uvV8VsW<oxd6F%{OyI
zN|Hmyo_s#UV!syRjzekqUQ-tBj_k$Sww~ft9gFEJ(PBfk_WE+fAko#gGB>wBCdfou
zxk6V1I3q8<Cwtv5zHND0HC4ZQLll(s(!A#zCcVgwC1OV#S149Tav`oKbI;jQD7aMG
zeahd(WZ)+$7E+@=?*WuO?Ik)d6_9p8F;_=q7HZ%k$Tqy*BagXL2l557Yz^5b?HBQA
zg!Bzn?_L)B510blFP|KQPVT?~$l|;*kwXtqTT4q+CTpd8 at 4|w{SrNTwX*zmjg!NR9
zel6bIEfOCC2&c-dXM8E_AAw+${JcAaQgIR1MbRMpJB5hNV8U8iOCvhgzo<@$ijyo*
zG>`pw4J;m!GmYcDVAg%P(JJJA4yAJwn(JJpU at n1Kt7)kLEhOEp!)FqurM3V=+hH$d
zpxb5*<?`izGilE9=~`*VU}H<FuTqnPn#@yHxt!Oc_gj at nMl1SVY_5i2m7!xTPj%01
z>&FSo=AvwXU&nAlLZ;bUGtEbBE|rZz9Sjb)uZWE>*fs at ai6offgV=%&BbG07B~kb-
z*_+z}cOM42;|C}-*++hzLfBR(d<i<%&f*{3S at LRar>>HMt^AC+Yvj@&zrw%%8rJti
zv$lcfqv2hX|6Cb`7CR8fH%>!&KQEeL{H%^vJJ)~Z18Bd*(B|7!q}dQDUv{zR5zQA!
zUB^lEQv7>NGiicu_)fa`IH(J2a4myEj{#W@*wtPRmh<C8RO`yy{Q-eRIS<rIJN@^D
ze!Pz*@WDnd-5qDX>j~TS+ at iou!C*qO(`*uUO^(rxH*ropgzCp?uM=2vinnBbnQx=t
z7hDME0b|baYoZDEcIAY9fwd0{RGO+f6!c77Zoamz&)N{VE at xdwn&oM~w4`W@<*>1J
z7Kkt7FE+XpN)wDpKD)2+^z3lR^jtZ*LYnq{R)}TFEG8sdjJ6_cqr4H2B&eP37P at 8H
zqGP(aXxw1KQ2VXND}&udqHzVBg$s-jnK+~LxmvRYOa)iw=#-Z_Z|nu~UNX at z##=_P
ztppr~5 at T8oe0VJA@ltIS>j=(%WQcoK9~1R7b}t;pSd@`)CPYMBj9sNtUoG~z7d%Xe
z-~`6;V->XfC2 at S_ui0Vd190Nl*e~ojulHfaim at Z*v8j+nqPWF|WvP&1yZKwZLkQrr
zU^C5%3!!{wKUTQ{pkH9`%IV?#0*lYwAb%qj7**?N0B`Nl-WV&)+S_d4s8gMo6aj*r
zkdv(~?&D1!Esu76UqyHvcrf$9-kNidELi8I<t#RDxgAVy9+FeSu}<c at Qe%(uD5C_c
zYfFst_J)(i7n*j5Z%0w(*eYnfSt?i<MQRXr=DU%ugP(M?Xm&4eao?;L)!Td8Djc8z
zMzhefy{Dz={>pt-qqUNvE6pmQ%ubsfA~TE4s@(>YXCK2!`ugjL1N$AzOgx(6zD`bF
z at Apt19afLVz~lm23=Y0+cw^GPbj9c+ma*XvgNVJEObuZ|<OQ!9KymZYWvZ&r+)tE`
z=FB@~)Zg)`E^&VvY%Q`%Q6t0VwW(oWNEC18^bK>~6&x?J{VKqACehjp^!?@W7mh_N
z9f6dY)XQ!ba7JvfouN878{A7GAXdv!%CJ0*@`8S9$1<Wy)Q}FZ)_tb9?G9h<1>Fz9
z0lrno{8Alvo2aZG at +e_g+|RM{skqC?<8g-Uc at M_rg(ed)KW8%65&w8Cj2T&7u&2}N
zS&FKW%yFSG0_sd$Nx_=~aRDI}nofpZVZ#yifhLkA>%zD2-xbN*>k}NLyDp?pcx}&S
zW)qdQjQlFkt3ew%J#K!mC)Gag8hSMFI4l!(DS4^$d`bd8WKBwU7cs~IXeu(&dq(#1
z9P(8A#U(W|>nERj*q2CI*qP${m6Ew_D at UXF*S9?Nfb1IP$lE5Azc~u=1>pR!Kp56U
zD~l*WFenfmtVY*y$ep&8;1-^=t{a;Q<*1tvsV>Xa*T}8awdToCuGg at 4;8pgoj1l##
z3b`77q{~uvP)Jy7(P8lg`B=B?Nl6B3Nk+^$>zDS59~T}k9Jt0+!M`Xia^xAeeUG`S
ztj?v!V(-Ajpk-lS%)+I9+ZO*sw=BXVryXex>FENr^tw&qgl_<qq_5#z|FG3c4~m#S
z4P}mnSu at rJey+SqY||e=uu_JfA`=P;N`kl;WW5j7!^Xz78wdyI2PKVoV%5-`QyN$O
z$q_QF(0J<>Zv|B+>C at BIj@Ru+Y>RlXtj6Nr)ldFT0K+GeM1V+!s=Y+Z at N}L?sner=
zM-i#hJP|!M_0EN$q{FK-C1O7VqmmowNVdP=a*Lkc=faX(av*{V*^Gz}2D<=I#@dqD
zzy!0kl$1YH6Yd}eelRED$iV~0rFAawQw5QWIQET<sBJM7d{_7>X2oue-DUr~z&~)2
z>sp2fsAb6y{`HLs^WIz6NH^n4hE;51$8x341{AimKB0$lbW_zE`MO%kE)Xfm1UUo^
zOhh#uD at F=JU|EtstYpx7(L;wE^+UrSF&C|>H6T#1BIj;T)(BDixwZHQ1{iDFA2?KA
zoBmK(Omni!uA{#s;k at CN0QmL{Us}3m-T-#V9#iL%elQ7~2S3*G`#*0Rp#z=*)*q2O
zs5;3<V3cv(?T|dsRbO1k(|u{GL<@OpKYyac(hF`wnRhFaqUyq@^0{RN>q`y=ALcuS
z?}_gIqKCVhLs+p#c5Gh&<)F3rbMT{pt8}aoDyk2Zi+ax!Yzkpxd1`=Zvepows{$b`
zOH$0otTkk%KvbpnTpC>*JM##-oVwN7(&T at DNfyj3@*>a*5B}K=?H{f8HvGYZtcDKM
z`Cn(YBmbg9aR5rxC7yjoa4$Fhb}EH|ljsr1&YD+HA6y?}%32;C7=n~#uZ#vr@)TZ{
zM0q3li;B7KYfFq3*FomjKdl>bM(gmw5?{8 at cc!X;Vf*JPMEbzwi0Wd0av+8pxttyK
z3cl6n(vmgsu|o}(5yo+D!=YgzeN-kRWKdQJ+pkUD- at T-rGPhsggq`wC0y|Sq^ZX8j
zGup<iZ*?v{(gzs$XAI~cEa(c5J%F7sgeok~qFJ>p1T3GaS`6#nfXAnf@>Uh+izy0$
z%@{?9QeJ$cQqWqxQG(FGM0``WMaLxi{U3B{z50+5F%KeF<y8 at XHmT==D17NYAv=LU
zP=|@U&CYbM=1J3O!e1zx|B&hN=V7`CDS#PNnvHSnr4T at zXz^s7 at -K;*0>u*W%|iJB
zDLRx2-d_ at Mou+>1A!}j%q*BeN%&E8!rT4&p5OAL8FlQ{x{-dqL<Nto9e^V`$hs2p`
z#(xweE~W=|%Jc8U8JRC*h(Q-=@==CNYgkp%WKE4B-(4Umi*r%}dcEJ at A`NKP8+qlP
zew at -IFWx6PaKaEbGW_*#J at BI`GF+#_<Bs%T+9dGm3O<fI-sWX}d$FW=Jt)}cdN^cn
z{7Vg|qgCB|y=%g?ES?)2;v36?yA9~C6vBT6GH6H$Bnbh>fD0f&3^7t9Fsgb%qI6oq
zt|bBME;E>xibiK%UU2c!l>x3lCstXPg-ZiPHqqSK*!B=+LtaNu at 6w|n?&>fymyON)
zKOUXK4aV5}j)E*0eI+Y3m#E`uktoB)ShBa at nVivxUh&#MA?IbZ$l&3$nfIredg?)L
zztdt7sFQy0(=OthK*}h-u`4LlH7c+rDyLO6 at -$-QZh>jV>z*gT- at zbom1m=hxb at c#
z>bL4RsHfIZUu2%h$0Hs?;Z#{&ESegvAIG~^gK{gaky_yMnv`RDOYZ4y-|?DaRoX(^
zGWa~~5&M5IMfF*(ArDd2QE%QYp at JV>56)CR7rW(OFK-6DTk}Ta{I+^@UXJVxeze=W
z9FDBv(|bcT%XFEBCEfbUw##~t{%~~d<NifK{o}{1tZs_}Sa0n9sSD5?^xbn&Mvu~e
zhIn<+YwM>FF4iYPilKkr4~@?=@ST6FljWPz`Q^JyvB7D<tnql at 1zedXUI~rlif(_$
z&x=;?`XHr^6Q4PrSo<yCo1HL<_HfH1k9~?2evZV at V05xzn^ymGkpouNJ^9eOHG4)^
zt(N;u0{a17=>5~AuC5b{0lQK!I`F`i!_3ity79V(9~^(O8&iyGW?KLD7X5h+k<ih@
zip|-F&tk?j((dx5FRVL)Oi9`=zy}2iOc-qV9c at bc309m9zcQzw^fTzxyFL>gvKjQj
zE3BpZWo(WT*i;|Fdv?TnZA|I{!NEj)=4I86*>sL93aKU4>5jHT*j!0GaFj^3c-%1-
zG9gKycJwv8^-&6<WpdebK9AZHjEiHVzB&YE3~|2xfAYz!4<p!sHyUrWG><(P7BOaE
ziTPG?zHs=TFD%=+E--iPKYBlmND}|#n=8V at gsza^v*seb{4R%x#P<2)ynUX{&8;t2
z1_r|m3 at 4;#e9k@^Xw!<GmKR$|%PCb&t+29Gq4&)l at h$-<37uT5S{c?{B-UIOt-RS?
z;{N={EW&^vRF?o8h*-ulC;Au#E>aAx_bfvJS)t%ss2hitW$=+qfOInPy)`$%%Ye*a
zGoeH%3&ejoHS8k6eC^U1fwYeMh6`MduS>1DNf*v+QIOz>Z}x_nzUvZ$|BD-Sk|=-s
zs_0^6*qudRc*bFGEZqIp2d`{8(i#5Q<<_vQF1xom&IL)<u|d~fAnV$J2)}XIzjv7!
zYIMMYAtuJMG`y at NY+oNGCo^l-D%av at Pfz0$-lQ}9BWERz=FuYeR`P+hwJBOR%NcU6
z^P9cfmJp{A%XQ at MRZO$Tid3Nu?S@?+#1Q)_>^BdliTPmBv{lRpY~j9Hk{jix9`B7>
z*3Ab6qhk`o<j$l)G0NCxN9{Q8F#Y&KXGK~=wGu~&MsHq~UpQly86k<V*>RF?DcmrA
zV$leI{3LI^UMFw$P|q>pYmaJbkp~~k>#*F0u{<wt+V(>+Q$0-XmZ8p<tr{J^zC#lg
zr#)l2!|g~;FNh?Io3NK9hSuh!%;ojBasHd_X>Pwlu9t(=vMv9_%EpU`Kz(gzhQ{!=
zHW%`)kU?34Al?$M><kxkN8ai1altw=^G5L2JPXUq45mYB;7wIP1t2TdJKq$^M>MeJ
zXMvX!XLa;r8uv+}h4Y#{aSZcEKhJsO?iHb`C_LT+yIXcxF`R^BSSFtqT`Go+ve6U1
z8*hq8rR`Uj`?xEDEm0>IzWrYcaz3DweaJk|yt`>Rrfc=}AYL7 at t|7aBvsznQqw~5_
zWf3F*ScuPv4x1V#SGTT0D42g7K^2Weje32LrTtRMBphm$SyPXn3nfbSJs<K+(q0T$
zUnl!#Q_gE6Z3fu=6*Ig&_6<ja at g@XTrb2l+J`BeQ*4sC4w;=Ih53G${eOm*L{PKP8
z&o8_<lfan>Crg!>m$xS4N0Jc4gLVLSd#fAhGT_)SX3sNjZEq(ZbXG4AtgGYXdEkPX
zAoggR_x<&+%_r~eN-t;SV7!Yje4$Wpt~bG(o6w|;<?ZbXwv8jL#7d28OeAoj37H5C
zH)?i24MsO?)2_;bxtw&hE4a`&&JaUPP=>Ma at 91oBwD*9{FZCVcp<UWLVsr=!#G0Mx
zEljLwqLp&WU$;lM)ey<n{MVsWUiSJ#IroaRqg`F<+7Myq9nIaAq{E|y^+j$5pT;fZ
zrLHPHJ2?xjBV8&ua2Ug51lR#LvUfe-hj9<~pmSNG#o_))imAB+&t at K_p1yNDNnf2g
zXcEasNIBGhYU1IIAuBSiw2iUcv#c8kSf4uhJ+k`2l%Dl;BW-g5hQt%v?m5Y2rvi1L
zYsqD4x&0h;`b!{X_LnZ@=x1 at w`Xg~U(#TbVr|Sp5Nba1~p%KO0O<)9~t;YWP8<QpF
zn^*gskg>!D$0 at 48#mkDsv-<Kk&a+ at akPi{Z#|M`qtZ5wHKDs&nmp!ST9nAmb;716m
z&dY1Aw#^J!WWhOHF0t`l{>oJH6zll9@#-2~k@@+xp%1PIw8s7G;Z2$J$E>H<CS-Q}
zEJuQwWjpIx9<ay3qw;-*p1XYlE6+OUYlA##7d}vTyeqbo4 at h)_6VuUDF=Qg4C-zL8
zS0u2=xIL)_jzE6b=M=NhSy!>mvKjzZBBOgA&ivF`y`$e`5Qg!Ar<M3OP>6Vdu^hx_
z&SdX6&XwH2rF+s%YrhL6;Q2(d0<E$3o?W-wo72SiGh#lwC2c)Bqn(;2q#XJ8(YDY6
zvZ^!e%6VH8JGH)DT9hpXgcqgZ5j$g8IyOHq7>XR3lywyb&tz)CH6^(b>=smKG)obt
z@#~3^tbeW>fY76~`20*-C1Y+uecaY&(4tfWp}IuOp?1ucoB4Kj!6C2YqHNlBx63?`
z8$=_dF<ZQK<5Kb(Rdr=~&GS;FHUfS<M5G8?C2=g%Lae&?qy=!|BHH6CM$?B5 at B5@u
z3BcW)VR5-WZZGS?-m|aaVtyP<`2UOkxR at e10WJjfm^}3DuQhP6ZIm_m(!_rLl4wBS
z>U at n;p|7VMSOn*vWeQ>^3ZOc>*>;cb=2(dJ?E?%l`R85afe6sqTwc6}-)o1%Zu>uw
z+wc5m5WfGVV%F*p`Oo(MPQs4=orJCMUq0#o0!#i*!Y=rawe{fL0-^C=TLK94egoG3
zCpYmaZDCb+ZsoHnn3zgBE%4^YCgJiQB0}R644&0XCA8c%F;X5FrFtG0a_L!%JJ&0A
zHP!8|f_m<ss_h!@;Z}Qmu53Y=t}6~kkY$+Y@@5dn%Ee#igOSbT7x^l0K3~XxAyX~p
zn%KdgFokg#oaTu!B`J18wW*qOEt4<%o*X5Ojf#MSDw`xnn7eSwm~~JAdipGsdt`W<
zSI6%C6rqa1TR)OxYxob!$jRDd#rif%{-Bxg(#IB6OKpMZt at _@cpxK)j(M59S{y44(
zZjtqzj^~Hf2{mE*Ou^QCamsul+CtHO`Gs))x(pTHLAU$$?#L2uNqh(7m(U-?AD{OS
zPMUFM{|&Y)9H*}<0)K;Ma3j^?3D6!;%QgxFVL0XXE*x|N+59Nu9n7o_t=>l>kUSB>
ziw99PCZz&$HjVJ&_X<Juy6nqkG`k0ec$w5wL-9J<?vnc`STJI7*Uh6Dg9K9I5XftP
zgfF^*J#f%*J;hIS1koG~5cfhhM3f*Rw}Uw(@yncLQ7G<mP`N?SXk&lu&9$QcF_n%g
zj2tq*r;nC0sTHG@?V_$(^hQvZ^+uO{;E`3Cpw}mM_&=H63r^s`eSUk~OaTap7<S2w
zo}D%k3j>*5XOtws53~m;qGnj#VP%K5I`W3&{x%ltleVa1JlHxC&G&O~7E`ww%8%~l
zB&8QU4(&fMdoqs+HfNki2^%6*^S`Gv3Y}6BVbcD*a0@)?%hkPp+zC1E-h-s}L&TY#
zUNgUc*WR^ro}PWt2_f!*yp!WyBSWL5NTmJ=iAd;jLkPblTB3mHG~kTzuOIuYpLwkv
z_d7d&hQ8!0JbRAr9{NSO*^*qT0qcV?c0f*{l^>myKv&76!_~@2%VVH8ckr?SRmL=`
zzx#;D-&L~q9kRB;y8}f3$=JC$M_WP)-Xm-85qwxyQ|Q<GlRt at cd1-UXV5t5OJ_rWq
znET}H at c8NGLM;xk($NyaD}sNv>a_X5Q=Tqwr&^{S_dy%h!O?wvEO?m~TRNB20<$)%
zw0%5?b+&gnx<2%)U?t7{=0}fCCd-St#)c5B)f`zNC{VHEU%B*juu-(Zw6z}u-n0!f
z at ph#bF_#vFiJLSle0AOVUnKRR&j9>Pxi_^}4yk|=Rz<UlJ_fbc=nz)}qY&3<oNKr;
z$Jqz$GhIt+59oLCI~$R2rx@#g_dX_!ggh&0TmpGCyRJQ3F5RSGbq+>lPwyIOQ}e$m
zyDnF`ASSatZmzjKWuII~JD99fA0xV`ox%W?lVSJW`)7AzJ)tVkJ2zdrwoa*3_OE6%
z2_|Jac_S5oPBVK)d$EbM+td@!IBa$!O%F=FKS6F1Vo9(X42X00tk6L4(WS(u8E3cE
zB+Un_<Cml#MoR^D3|e3^L@{6EOX;DXjk)}84?+$^qz>)L>?U6&tmWFhL+M)VgF1Nv
zS^zv}F0Zzq at +Ip}rBYHhMOHIQmJ4 at xi6I^i&3d+ZZmv{&+ztqdTs8+aBv at bEnUp*F
zz1|#XU5T^-89?hVi>q)X15msCK{bl^6%LI1Ov5o0*02Hggk~~=Rp#ng-I-CI5{#4k
zUB=CxC{CoRWfAWme{k4&t(LR%NRk=6NTh|h8K^ip{6j_GONgXNvZhHY;wQ7cP>u(K
zT+6KiQl`)GUz~HI#owh{N$$Qt=@?GYSF5zf1YDN^b}Q!abDF~UmO%4O)R)bLi`~^s
z?7B7-H8a*hK|eF<UN!zHM0=RIk_tDg%Vp4yS at E%!tMtA;t{>oeRI}{+=*60Z@!z<P
z8Q3pKG8jGJPJ?(=AA22n=}QW;WNHJ>Ef<`uH9~B-1uek5owkPja?_<QTIOT0j9Q=X
zCNWtilVmF00~w)BlJsbCHRz(JcJO{Bj&)|(QJG*_6D;#FI{Z7x@`yj#=^BAFjVNc8
z3swy3dv+1G{i-9st#Cf&XeAk)jI!L=OcGka+fn}0-`ZsNgbXvV<}Ngp39Q)DMnVSo
z;9y=gccs0b4fLeNMeCZ!0}2G?jh0nvsflZ*m#A?7s%Yv-Ts>hKHP<5nghqW<@Zv+D
zr{Vuv4ezxU;3Zgv!Vxcg7h(f2rBFjX`Gl#>*t**}Ty)Ze>}-)+${ehNZ32x129uXr
zC+|YC8Prd3jayI)>gqp{-L%y(3l5gi?zBs4y^)Qr_r0^QN~@ZOJ!(++ewbdqtRwC^
zdvE$TEToR^09;O<>?O^_fE!tQV*^H00XgQcnKFTTP1I%Lp#PcXD7>W}%($FPM#s!#
zk>qasIBxr4+TQH~(BD6R(KeV`Xs<S*1Qu3XqD8}N^V=%O+d{QOTSI3Pc6|vF*f#EF
z5Lb9oSy%f=bGBabXvx-mXg$h}1w((>t#X7Z*Pn$6L$cV%$i+D*>kv(UY_+u$q2>$G
ztSItr$>J=ai(8EbczZ;;hxNX<K+I($l3<uBrV2^M_YgdpApx4#&U_xK^t at _WPxR<%
z^2iU8;)1Uz+#bU*TEZ=WkO8m|)1^zEE&{2qey<|gRl%>+S_onU+?xFh4l$_l(P>il
z=jA!lBp(0dg(%FC3)Wb=H;Dp6tTxoE=d_c*jQ<6GpyOaP3aRj05&_C#f|WBBC}-%M
zIKxZ%)f5|Zu3`X#o at w#<O-|X`z0sr>Eu(udYhA at LXXJXgJhqE6MZ6-b!dngYwu`Jl
zZHE>XAjwZAlGVQsvL`=*M9)omuZ#U>F5C#isWJBTQJzXaoOAIIDfGruNopd>&$WP`
z;)-uS7v7=5wpP(hN%Z1IO;3D)fk~sdjK<B4>BC(c`7D+jud5(YhRquyW(WSdV`MuP
zm+^d=jKt7kc>kt2`+WTFf+~!OlBZ1#|BFQyfD6g%z*#9#!T(hx?!dNGR9=++2XoYC
z!@dCK+?n#Q+0bTi|E6^J8+J{XS7!PKeT}vhP9n8gFkagu<mQk7qZJ~qyuXp^kO)EG
z4Z+Z3SDDW3%M(dCVQPcxrP}u1hH%T8Xc;p-Jy^eXQ~02SW1$1m!@0ii91fO-UC3w6
zNZ$Jtz`}A%^hb~^Qm#fW+2<9{-keF3-R<Hq4PqVjRSEs5Ck2HC>$>-iM@`7GVp6}5
zvdxFUriNOfaALf at Jj&IX`+HJ(h+ul|&!+CAToPY6R7GCD07^d*@T$Ps<@ZOa{Xla7
zi3sVEqOc{kmY0^gT_*OL0mj0;%A>%Ds>BClb!mv`Tu(QC^VvuY+=AR?rc7r#vj<HZ
ziD}lV!G}UDz*nL%t7qVDJFA@`hHmfT(F<<*pxslM+?>G>4?2vBs?$bZR*lMZNY2&;
z5!lVl-Uzr<_Gvw7{G+pt%MrH&&OKznH)Wm|3nrvs$ZznuKlSn%BSb9Tv-~Z4OKSve
z&TipR#KF3wLf;KHi<sY5jfFYoXWD>Qii?A6SHj;;LM7YU={j4MT2c(gR at KBnb?&R3
z_d~dfuO?#nEkT)*EMao1p7?_pNB*@FCtWt19tO)I-V*r91Ka851Ter9<u?zyodGYo
zk%9{L+QTf4?JiE26c^vV!7;^PVgcL^y_D{$X at ot{0T at QYs`?!_-MfQ$U8{A78*<dj
zMmDTiOS at b4;j-+Q?m~w&leIy~KGz`~1D^stiD%s|mQO0cmaAW}@nPq56|86`7`rE!
z$oLl*W`ek|VdmJ9Ds+}@56PTik?(jL+-nhroa}smIN+zQgS+*01iHH!xl_DVa}B&C
znwOU7&IK>0I|Bv+;YNW at 7#L^qH|+JS4vB|iA%^*IHs({py2y33FSh-qYlr+qI$bHB
zBs56|R<!q7Z!yf*h;q83^Bou at u|2BJWdZFdcgxEw73-dAc<ncUn6!FM({`*4{n3jo
zV2r#^qSY0(To&!><wE|!idWa0RK>cdG$F#i2mHd~QXz)^P0qtpg)s6luIDF5=mlde
z&(>B{1yB=f8XV~R@@^w-h+uLBtM|}5+jYErf1*)QZ_G0S`!{-WauK)7w}|n^GqGNd
z&J4}B)?YmsD_=1TbW0xG{;uUFRf~mT1TZ|cuGdY4dqx5(W at VPV%xWaob-D{(6c0fx
z1Zf9TJ2mOje3p(fO at e`vnTQ4Jy!;Z7B^EjIj@$Co)}MNil<cr$)&*;p7E_Ysc~l(w
zI9&+qEi#p46kNEK*S*)JJPpuYFvZXS(dlJgZ9WN8J}y(8LATIiq}@RNq}-w=W}Sg1
zaz=4V*o%DdnjyTwsNngei;%C1P`6Mnn+E`QGjqK?`3Os2Ezj22Vt1OP-;^wlHdXvx
z|DPkkv_6^q)=TW at vtQs*Nd4gl$B$Qb^w9G+i+EB2PVb2R%!KiFo at P)zID`BDE0OyH
z{b?R}>Hi{|yh~pwdK)vaeKJ58Q#3UtELxnZiY%+fE=o->i5!0g9!%IT at nO`Hkdf9;
zeAdWg%?`^ljMT-cb0k at FWIt$!Oa;7`$!2S*@~Q_#B at U`T(9yRC6db0Lzm?NKvrfAu
zsb=n25Q9cj!Y<P(k3*&c>2iW(v8hf|2NTs_T`<VwhGK_N*)CJAJ%UH35ba)PPYK7}
z5P=C<lVB&4Vb<{LZf{6VxQ0UMk&k32=j0I!9+ at 5?;QhS6wkmaE&VENJg7{|`Pffw8
z*jN>j17gkRpa1iFE7gLqU+M)o5N_%weMh0z8sDh$(356N3mRn<!(Ng*OtCC(!iJ}|
z4zo)k3ZZID=2T at wp)L%nI-UIDbX5cjSe<w;az80~+sV^CmY{%KSO?7Ve9}h_S?g8v
zFd41A2+Q^!yJYSQ`h!jkKZE;)odp at HxwCc2&A%T%CQ2{p=^M`58JVT0V$O&vRsN5W
z5<wC2>%2kTN{PpIZm|#YOqO5~%|1T%kgzoK3~MJnvNM8OeVUp$A$(Wt4XfJPlpj&Z
zTFB+n%n#dadEhdx&)A7#bI%p+vgJPWOEGlVYW%PEy%WI$2=TE4Z<1OYgS7gcdT<6h
zIaoK+jLJ<V%hx}e(HKHa2{H<xlW9MWUt<xn>%FFSQg{A7NepS~bZEu#4br%6-+$}f
zdOiOvh4*m%tr%ipda2o&Ax_7QGS|vUUopYbs?YH{{@xWRGy%2<rq3dr8KR8Y!>onE
zQ}_*3<*_H5g5?#TdgEw~1cuviU=~t!?j%YKMPs{4*J|LfiU*0>klw=p6K0Bhp&JPX
z_VUtYpq2beAG5fKGGtBiSz0JV%)l0|Ga9Vl_+uCFaIc!wBM5iHt&$@GdEp0V_-MD4
z>cH&xiDIA(iE-2U7`}_!%hIS&sfq(R1TXmwG6zeZHYY-AzR<=vdq@`*c+pgS+5)rv
zP`%CK?DAnJit&HFz3WwY7M=sq#VPhuhc=*v<0x$zJJiRUDoW|%Q=hA|f_Gtialghf
zSJTf&*z)n-$rTZd2E4w|6RlPGGuJ2D++fz0pSprLln)=2L`W}QU2Zaiy4W3iL-YxK
zwKKeBQn~v<#Re~^!XzK&4y<m at g02)HKNEz*tjq{7o}i>C+*<%DHUS0DK#_i{qpP+D
zc>%Oh2#GXl_WI&L?zGy!5B1(ELxq7isIMAN{a1uUMEh<G%~l(tio!iqSwT5 at jZFSr
zG$&RJ8~#T0e)Ar(DmX$O5r!(^$h(m*uGarJ%%Hm*CiiiIICh9On+LQ-tx1w*jFsl+
z?mqX=;L*d-e#q24g;bS;qp$r at wom?L!n&5PSdK*Aj4A8xWT0yoFOMbhrnOaH9#c1C
zV-nL3Y`2RB6Y^MWcrD~&ud#{p(Y=ZL1L<$bm>RwQBkk?{Sy`fj$teMsMEk>L%tOMx
zY;i}UWUwwz{!GvDnxhGXpq*YY#7<z(P5PkF%uue2QH35~3D{yCfRlBNcb>#tr?2l9
zD)=fz8tK;$xLNpwRP6KSt#iliP0sho$Y5}aF^C&Zfg^~WMy;*_SBb9Z%1v`fM8N&j
zHb2>&<!yMR8YuTe1%Njb*Wx55+9T`MY1qfMU8+_x+KQ``j?6mGgxPG7d>d(foIlZQ
z;I5&bg?U57*K=arwC#9x=e(Eg539B6oQOZy-y19M-=!q_P$9EE_Q9l6K|^VThdGF<
zFEnV;6k{?V@)`&y@{q*tQzmg<w&tDffNwO2*@Nz$WiBkTQh&##YV2O%ExP{j1T+Ke
z$Tsuw+3dkrgI<Aj2JP}Xc^fYTlZ!je6kY3`*gZ~^oM9sLnXIb|ta0g^o<Lp6&JL*Q
zX0hJiRD|+0RzRIp;q#-x^w!2GBZ at s%V$z(|u+R1zZO7<j{Rfh%7N6QdV##bQ{r1&u
zD^KWQ=Y#apBj|PZ6Wwq;=XO({ykSJC2S>Z}HX^Uh&JNCr^j`LqXXTPPv8GAjeb(OR
z<nmiG!1hA|7Q*6`>>}QX%{~e}bwOmvf~_G6P9h+Fl$+6HQ*(6<D;7(FyUuaxXJ|H~
z&rs+4d5RRUjSSL;>r7G;8{;x7e{&>x)Vtpy%pm40Teaxn|F-r~z4ynKLlp*hSTQvZ
zE%`)oY`^-hcOLJZis*q;Nb{&6J>V7z>2ETKvN3V6?X2GOfC&(OyfmouRp}YxImM>F
z{Q~agSwv9#w!aJN??ZW9<QSYv#cWof#~`v$^C*o}ei=~Ktn>msu$^2Jq#CVwppX*o
z&QSds$&Y5`S}3t62b6l;C?ZE$*V}4h`2qvc8b)HB;|P^GR`PS_Rg;Gw9Upup!*sh-
z+N~mZ6G at e8D!jVT0h9YE-Fq{XHrI3rP8``iEgUrApuoak5am%j{4nfw`PoMSD^?d&
zxr)`XYBl6_67jkP at s&SJ?l5}i3Q$ROV(a at WAG+C~ON~@jc{1K}b(zjHIYPKt7pR+a
z4JRh&-Mg6w84}>wk65c60Z!@8aU&wAkrmNbG*zUhXglX!NnE#emkN=Z;L<ESg?ETf
z_pt7VsMkh8*=CaWtkCvPnS`io3<tpLr{9+!*H7+F<PZ}^<*n;Z^IJ(v7jV~F&lRNu
z at 3wPBx^V_fZ56_q2h&?JLur$~T*W_muh2H5d0deU`zysBJ}ArC$?OVdg)g;#$pdZ}
z)ZR4l2t^3jk)z}sTQ7rR&iw3F5reLGT0-cfthqwuJ{9Jvz_&@P+SEYuJjNn<Xqi_h
ze;Qf>x&$fIWo6nX{m|?uK$tE&q;NZgjYx)uE>C;jqW+z(l+-HkDEZ6%t6GCa06WM7
zTb3j`-9tNal?yuF3O`4OjC{C`Zw6WP7aUm`4A-xRGW|HqU+NOCffLMjLH~T+1D3`^
zff3c+Sov!?8l3<wZ=@Ej6yRAW68Y5*i{0Boy29e+ivE}TK&h5T9W4p_LvXDH_mq8s
zt*r$)ccsR=pFG&3Ha7`AKh<r?G9Kd)iRE-97#bls9t2lYFv8MXC|u_-fy2F6|G4zy
zL(L>mSJIMwX8Ia||6g?hoZ){YZ$Iy(HG=X0Zv^BOmye+SM_2aW4*Ru>=x>TY#T|W{
z<@K!;1>VH)Pe!+%yO{98TUqxf?G%GKIJ%dq5?ow}4X=*Efvzptg&$$dF+|fHqtVW`
zY-r}g{`*+Kw5ckZE&@!*AO=_lMEP-y)C(!5T}VI!Q+HjzBu}jqWsf3GHkgjdU-^Z+
zI)ixbOtLT6?&2ts^RI^{yX^sv?0HRE>ZF4{lFb2J7tZhlmnAVoQPHMc1m9q0-0Pv%
zvzCSGwVwIrVh4h){Ja3C?b=ncf*2Ri=%Zvu5Z_~%J2C67Z2iMYl&i9xAd7(Va1Sjw
zN{#E8sM9V at VYzBSYp2vdJteW>dzm9WPmzMIqR>LHS2&i`PS)GsMYMtQK;4d8PB>>)
z({7+JPxo>MRZp>vK(O%4M`GYGQwQ^>nG>KbIlw69jFen)mRPez^_m_P=xNCw$T+>o
z{A^D)hfCo%!3Lfy*3C!(?0 at Z2*RTFXLagUC;bIoV<U!7%_hqKO{!K$Z6N6KU@)?gM
z+csziSvxN{>%^3PFahQ at 7w3W(=mwm&LN385^FO(@{b<u{G_8oF>5V)PP~=YvNJ#W@
zTj%g8d~*_Jpe1k<$A-7YyJylRVz^X at jG7w)hQg_kSIDvIi$2}Vv>`%#puI4;VYyVD
zIrUB&1d^%PEQH6_H6*m>&@+g%5irMU`m!?nrTvo#ePQ{aoX5b at RT38H;KSQt9xtcf
zKM=0WU#%g6YdNZD_?JOTSoFceXTVq;H(ZB%=WL59iee6m+VjZpI-lvwZb<>y at FEX6
zneGGjsQ2|#4K+gzDX6=H0SdlnZ*dm_g4!D?h at M9^BJhDx5zQ3mgW7%dX)JJi^Bd@$
zgby;AT_bi%p#WlVb03|lxo!#`N;Z;mQ;sj}`$e^nnvSuCP4!DVOV=J!5CJ7oiQepw
z_6{26P=K;^yR=8&-R})1sU7MqxkSCfa;AyI<~vuBo?U)vI%Fq?V8Igq^~nhv(c*!Y
z(zy710y1QCX9m^Il)Uz%2c9((fC&h4PQiD at TQ>v6%ZLk1F+1t)qPa>LO<K=weY=Up
zjkFj)WZ~{jVjYA2M_pe=obWszNd<H}&cP)!mGAQ0wTli8jE({Yhl$(Wj#jFt2tlTm
zYyi4onTejlROmA&BL3U95_NG_;_>#;kHe1mJ&vHo at K~RMUnR_1%LYd}!=m-k_4D?F
zDh8J;Sf-LkQK%t=(SD%Q&Ot+hnjAs_OXG#DL`a1Jy6_HNbS*V(SGRC$x8}b3p*#d)
z2p-ce;2L^rw{)bS?wDaq7OP5pQ2tr^{u;eMSLe&a#?0Itf>0b?b5B3`*B19vmP-{T
z_cK>*e)llq#g5r+?t{GyC_)JHFF#l(@@eujF<WhJbUL!<%#9CQMG!xtDuhk?h3r#1
zX at +3sspBMq^DNwO*~KRm+W~X)=QJr$A6u0jD)~4}Ur`EeM#nM#4aND{n?*`-l at 4zH
z9|tXtTE6 at rcqy?+3Lhg)a at RhkxjDG2zfr*{c at sKXjF7u?)&*nS%hE|OLflc*#18L?
zpQ0;P#5q$y66=w6^l0PGpkom4t7r>{wdOIJ at DVh!*YonHSL!<DpOZJyx)!uR?h#M7
zV*&0C#SyAiU_dJD#o<@t(F2wwTY@(+(r;c6$nCDIPIi31_`0H3s;*oNUQ<+%+L=rK
zWF|U%!PVQiNG<O89X#}%lMkc7_iCd*fpWsozXnJn%)0LfNa177%5NXl$NAjkwMhP^
zd$kpRCDpYgJ1wdwc?*WY?Y&rhS*d?R#HSBcib2J7&H1$pj>D*k6L!-wX6|2ty0HD<
zoqGQ-s;mF^N%>!Y`*_j+K8g4L>?TAUp1Xfen^h^3hdW4CHembMY8ZZ+38k4XWdMJg
z7GbQ9sNU8ra_Z0Z-%N#?X{=_Zrg<HT2GYB4&bQUH(rTfz+pkPbVe#;A^jo~T at 0tcI
zKF`+?izHkQ(+#%FZg)&nd^vVDrlkAs)Q7`UM<DVFMt*OZsxq at 98qeeeO4BHyH&H%&
zB9mh^Sbf$oV4=RnRGvL|B}kKYa^3Q+k+>n?qPU`3JI!K1Mvy+K!sFWU)?vr?K0Q1!
zr*k;pee$Awvoy*BQZXN?ONx_mr|^>Mm&S_qiA#Hlu+a!D1&ZE5tU;Fa@<a}bAGcmT
zg!UixJde`y61G!96>I&;tLsynHpPwagf>%lXz7{hoxQ!UUZ%|^$J=yGywfZ7@`92*
zQOfT7`gOBlTWRCFI*DBt553~XMt*Fg*8zIMp2^hoR`cC~fMfPSgu2nztONAoNb_aK
zHeUg&LHE>G#YO_z=c&}ftv0o<Ty|;7^@YrCZhxr~xcIBwN1(jSl(P}n*0_gw;c7I+
zeE;O(|LfBZRAH6l>Ws#`DM7DFG2I)NutL9kXLDgS(I`EfS?hTCJN%O;PpYg at f#D8<
z6kTmX5&rO4Lbi>icdvbnl#H9og=vN5+<RI!)2djtUO|^^GKKs}USC7IU(>(3{{B2u
zewBCO#^)7z^(j!LSn1`0s#UJf)qdMMO*c^Bl$Fkx-%)dt(X{%Hn;|ND22>JWYsG+(
z?E+gdO?CBxQ5~!7tk&S+2-y5_snYo{-PQup4pSkkT5kwg#7ft<bhfr~ZzF`_v`mTg
z!&+}I{1elL>$HOxgM8c^!O_v|)rsm4KD>-)j#>N((b1a&sU?lYqpF$TL?mkFr9RI0
z${d*T9+k3feA*E{-f<sL6-VoPQU at rb?I`BWo!n}u0osS~uIr4SOBBl3$}}=Fgc81T
zuD)NG7Y16-4K9RdpVT>ng*7eD2RBoX+pm-*Bs&_464&3pb%0z&n4$t5{h=9!wMR}&
zXm#M%jZ4|l7ABt9FwY9!j)x9jGMhI!PCETdN0E|Jva^Qk1n;`rr0mI)?uC7Rort`W
zMvI{-!RRl;5ocF)C(QhI8S9fq)EUDYGsC5P1Tzu^^RkOc7Q}<ale+13+P(3w7wWE7
zfN$x=o(S&wP~VU9peZ+`#LcRL<$262gJiARF}52ziW$N)x=y_7XB$MRg9w?R<%}Mi
z-yOA3F{?XzfN at E`To<-;HxDd=FRyG)JaG*-q_~}Aq~F_pBm5>m3$C-J0603;Vl=PO
zS!yj|a}Wu at DNT9gWqaEkVk(ZNnHb3J<Tsn*U7vH8!4K%aP~3$vX%me2mMYS2VlKbx
z2`A?N^>i4C?vv89fAtEW at zIRn12TK3nq1T0zwe%U$G8+wbjV0A+MCvQ=VRhmqh9B~
z!V2t{ZqA-kReWmjCTpN9H~EqGNI$Fns&k=ZWWVj}<C22a{4-n%A+M;CDHK2{Pnma=
zthEBc2G1y0dm7A9<W<&h{1k3WuV`Jf;RE(%di^>*Gqd;j=y5sQ8OTjU>FW+Zvl_Dd
zFTP?{_e2GhbS;7Nnd7HV!B?=g!&cXk(-K-YEqMKFnTSH})+EOOXe>es`WkYzT9mLy
zUmMus)bVuhmOuW>bS6c4c4zeFf6VK*A20y=iZb0)fcKQxvxYEX4?5zWTF_U?JTC+`
z6r|{AjM6L(*R+G1RkZWHFfb_p*zV>oCU!~i?Z+Ll_{uAD`DL-E?s+x+M#Qs9wt;sv
zde5>sF$v$bMhuUjcWyqnFR8ZS0U<75bjZ>KbWuXGE<o at 0&fOnurMnPJXN$+;O`wLC
zb!1QebyL^q%ZLf>FSxe*!dD$D7<;U&Gj+sqXVRP3s{WlOkMZyt*^O4zfJPs^#rva6
z!ubOtFa{&O at toP|eY?Bfmye`{3Wxvh>2b;oDyDp|Zs1L;(hUopnF7%4u10Ly)rx9$
z2NZ0m4KFKn%sSe$U^@?-P*W?cp|f;^9kS<WWm&OJG)!-0i_~KpKaF<F3$wEry(RFo
z3RB0?Z}cG`G{q5)YKd~!h&WxwpzVz at XpAd0x}E0ZxO^cl2>(6I=8?(A`mtr-BQM-N
z;XyZtp79Do>Zhu_LP8WhTT>c0XHs+c*^KEebNtv__^gGhQ8^R$0Rr(3Er3$-o-d$i
zdK{p+ck!JL|0#h`iMsNT!9-3+^fkz{rFY>I at c1ZNf~KY`;wF>nE11P0SDN|9!mQ+n
zh(T?uqyKn~e}2Vq0_OByZ#&D}pVYloV5mlS_x*yL&bn84e$E<Ce!AGVTv2DyzWS+7
zjMWd5KqENMx-NSXlk{C{X2YqHO%cNqpH-O8f_<+m!&C-1#i}PdW!7abJ{kG<t-TGG
zwJv(`pnouF)~GG`(^r_)SiLKE0Ez--KQ;xEs=ZFtaaG$^B&pd}ubXi7hh2Y7s4{h-
zupj3B^~?L?1YhvHWXp!4<Kf|@zh@;i%PX?ToV-vR(i$GUKnl{$K%I)0eyI?_;?L)5
z0plVmeVAgdqe)e<GSPot>rTx5 at 58I`nHz{JdEzW8W^D6pbTLbpE8YjFeIDhVy5mvk
zV7zu3mMO##?&K`zg)WZEKcp>LOzpW(HJF2Ov!a-#$@-WwAM&&7N9wNkaUz~rY$_zz
zE$<hcFxo_SbE`P6KY<}P at wW}i6|>Z(EL<77dL>uan&hOUq`F2K%ZKV`7asj;5es8|
zHIs^J8ZZ5o<Bm01MxV}9aWoWLuRe8}Zt>@ew^?mq!q{AGIfVYJJq-?y at IwNhQJyOP
z7hIC_w|QbJ0j=%m?dAI`v)hK>SpCWVqc+;d|8++l32vaBiEm8|*iyw_eNXv)qLJI*
z%pgO7-xfKNFF>UxHt0)B2K{1nFtv8rYK&lwichLG_;h=>svME(O!004;kDXgi!OEX
zdFe7tSrWR;=lXl9PrV<T;)F?vhjrsTo<Jz#@qbYWefkzxg?OrR90NiM8r)Fp>URzq
zA%|_Z3i&EUMFst6a(!mVkrK$Vd2()jmTB!e{pN*LKU;Ybs+4PP!`cJWZgWo#->mFp
z=>1n)+HJb<pNOAN at oyvxy6eO^zK2jDW5W|p-~x;oX;eQuP>!U~3R*OzmY3~9IN{~}
zEWBqhs_2E_0gl~05hqqHY=pW7rE>y&h$LrA0Q at AkU5CDjS`J-U=EC7fE;3N`sRwRl
zPrMm1N_;!PA1^F-<}Sg^B*4kX>7ErDe6>1!zS<a#RCC*vQ+KeI+>QOG at TfK0Z}7|=
z17pm(UlpNVf}BW~&WT{DO5%9J?Md{*zJ#bD!nfUP{8zcE%Md<=4>o!v&Z%#6hqswB
zi$Ct#x!3xc$Kd8URq84o4yV7Q+~+g@*K8{&+;mc>Vw2>!!5$Qbw-kkoiPl01)&p2p
z+d4|<C&wI(!W3R at hK*TSJXuFxZAU&rN0(+v9^|pv7YAFb7NXYMW%rK4B~K at pbDex}
zNEa0#-C)fvmeF?-oznLA0|xZJd4&)0pO<Nb7!-mRol;LRiMzJ5Zp at oeLj8UB9mY0K
zcq9bYug{fQ{iQ#HR9ou2<Fbf%QsDc<1v&s9o_At_OE_#;Jo7OLOrfaC?m63!$jPm+
zLDD+-?5n61CC}dKFz?x_OB~ovT~^GFevGt9l)_1rw82nip-3K}4m)xd670krHkMAP
zScs=sh}Nzw0d4odp{_upsGwYT#&&GOXy8R2Z at trH0xK_)96I}k%I)2k5gj7SU}Idx
z`3jkFOa|f+^u}GZtY7%XAA=<!^fX?Q!mN_<zyOI=O;s?@jn4H(Ryia({dBy4iT^Qi
zE?9wD(NAP^?ayiL=iqMD`PV~b)z6;=7K>;h;#`QP`*^LYNWUR1%>Hbc0=>Z3%CnAo
z+P3I9?n0^vKUh@*JMjy4EO^P_C=pba8o-Icgz#dDK{8;hvu=Nivy({*7*#Kij{PjO
z&^e~)+u%nEf~a<%VmLM`n3(g?i+{t={lVNx at KPsa?C#gcF~l*}PEq6HS_YGTPcJhB
zfN7(>OTO3_u2a)LU$Ey;kz&h-JU?IOw!uOOv9c;1vQncAO9=ZXGYj(2o`XC0TnYFo
z&G&r|QQwxH%oTJi*$kR0z!(dBpRsC|9*-~|3fhC$Pa%5NO->7_{~x)PD0~IMCS5+s
zFJ<HD+Dxj9!`^2FXig*_q^xG^gjQvq4gUbfGRGl2k48arhzpLtjG@$_7EXYbr_j*4
zKD!S5m<-cYmixO>_x{nH$yBacm*rPz(cJi^*Y?7*>Fu6oU~_aq;qlfTaz&|L)G=0S
z^LGyO%ZH<c!!W?FSNENOvUja@%eIk+2XO`q5V$CHm$0*tMZlF~Klg{ho|A*=W-~zx
zN-)OFNmEuKP1yTk!3W4OS4G^H&)5#nz9=(n;T(Hd#Swr>1DqiZnc3E7WPB4S0YjXC
ze;2mI2So&&xKBQ*iwi_VKy$Jk+z!WW5JuskR|j|0YpN$^L?_-p-C|fS1!;?jLB2$>
zlx8TE>i9UZVQYt1h~Rudo!>wFDe=ohhLY{%vowK9;>vdA90q?DYvZ!6`^x$$z4Bgb
z4>4D&uV?DZ7D<}NRe0FfwZ!2-(81gpV$kreOCXSLFd at +nkuBKj`WMDJ2bJ@`gZJMI
zL4MN{)Purp1dr&%AgoUz5rz&^wz#(8jX1qJaNu1kou~-H2QBdaxK4!!zb)n~wh#qY
zYkQPUq6A8 at oRyP+E0rZBaA3nc1Y<mRhsJWx+VUh@^R0R%6kKK^9jnjUWdLiD-Y;BF
zlHcuJ=NQPj^X^M_SFqfAgujFVBX*m|osjd+y_2r(lkUAlli?raSx(i6L0QW9zzZVI
zVRbIw)~hiO#I-Cz&!jr2zxU=>#Q5LiWKH>yqKHv+iw87Q*9WI;ap}?Ha_2e>QK3nO
z*fM`4$aK8C5xG32D#8=^mzf9A<Uh<j^Jf3e%u~0RJZjzmV2d%XNAjmnN)$VKZ6|KU
z`QM}VO{jy9NeCRcGdIKJP7+F2ncub3*gEX<A%6Kbq6RB1oauUvcg;p;)*-ToyXKfX
zkAbm_J=?Om9sSd!Z0dG6huIyv9Z$Te{-Ph742|ZA=F1v%2wbNJ^~^1=lHIG)H?i7x
zf|aWOvlS at tPctp4UeH%SqW+N(XpUc_UnT`!0Jg;k&kTfzREF0RcA7`sTv&|-=o%(H
z=<0gbalsYTwkdoY8Fe}*2_R3!;RVI(MBBEv_-SDcWGYUs`eH(V3c{O at no;YlEbEmg
zHJ%XhNzO6C;>T|_Ifl`w#Cd0?9 at kNft%uE8Ex3-82T!?L$1LuJE)pRL!?Vye%g2JP
zq1u-3B3$dh9Vs`Wa&QUBX;pR0u<SZCo30a$VYbxETHu!V_1CqLjq8zn|G%BofQOaU
zNm2(?V($$dO)7bEv%t)BKO<1_*UVrm$m+B+lxQ{{N;t8m&UxN~&nxjisQb#WD7&xU
z8$m$@F&=3|AHV=4B?lObE@^3$Zls1D6a}S00cnvEhEP&s7(%*ZKypBup=*GtbHnre
z&$-UW^X0tnJJ)bA#J%@gYp=cHx7Xe~&0INU0bTr_#@9IEVb{v}zpoA_jD at r$=W9?V
z3 at mz${nhuExtv>EkN66a*9*UN2`e&XFG+<gu7}kGydZuL=LZX59YUS{!bvmmzV|){
z&wy}kNT1u-ilVq_|F{3*%-~9?zl}KH(dcl2`YevgE#dO-^BEWi->QqT9xZ#xpYJgZ
zZ*YV!9FtgA_C!krayFtWXizI}U*=6%P<?xm0$c_vIqr|~pB1}w*1)?R`7iK)U<+;^
zb(uX}*OdswN9GqdZr5US{hS-OIrL`_r>dY|B9VJ at tP;}!+mCeMsN(fm*?@>?CHnd$
z*yzk*^d07pMBOX~p#Cn1>?!BJRbIcR{?m3eMkOz{vWU&Tw(#=w5brpTef$OGoD11g
z32fxw2ZzLy!rNigYjg3`@P}u=jM$IBsdr^#z`e_0S&rD&*7bb7iS1+OY{P{QB*>wW
z#Wngw2G=_&=wK9I?h=D$fiu*K{$J~t2Zn~^&y5O<PuWsBKd&0qL4BA}hiJ3eL*jjj
zGgVs?pWjEz*5*KAlu>4BujgPZcWf;Li0v~Ot<>)#1iq0 at 9<6VIQh9BTx>)=zdtA~;
zF(aTp*=o5aM%s{r55=6+`FuI4^J$*j-irt8d`Na5za_TN69O$tp4iY-?yhlZW_(y$
zP3ideV#F*95FvW at B6N&f_%^iWl7czIMc`TB7a0-R at Uzvg5jMFQUm~aQ1LwYP?eATr
z|H`*NZ~-u18SLiAO at sDN`YvtVQq}_b-1paJb;~X+gWyIDfm$!Qr(kI^->q at 7%gfrg
zPalNY at _p!xQ49PBuKQ|Z19r)Y`+oLe!1p&O4peYPz=M;oa9o)u5Oh2P?!SFNTIuGK
z4YLM^)Jh^S{>=sR#a&d>Y;Ad)n6N7qINGSb=Iy?`nZq`X*~2AN!*&WHA+X!HpRxf~
z(!A|rGjj++Yo#;2Wf}H;^#M1cV2;)dBob at U6eihb%_MYAAAA%u3fp*cldcU#)HTY*
zZ^GZragZ;xag-e{BiI7{_A0&l;Km_y`tX5tVw<)rVdAVrV9D8_D%POnjMvRDc@&9J
zA~2w3xeXtFf94f46uXC=!nz)k#+|U3k5jVb4P~4RnZPJPBJNzIU;f`aT&}D;gD^`G
zL7ELkW{840H*NQNg6&XR0jq8lQ4Q>=Mju~6YlBeG+OVSDE)KGIWj*|D#(I7vEnDa{
z39;I!qBe376w|cYM7G)tOrMarCf&0uu*1E{I!lv!@TbAE=_i9a>kBq9uYM#%+ZCsJ
z{)$QMmbahw`}|3Jr!Nn#Y!wgih_ at DnOunmR;bt`a`{_M2-*>7HXUE5Gt6u#Yrx!-m
zg^{uRI~KUgrP#rc<}Z82<!P+qB7M83&!2$Z_2qSxt-}I}&=?&i&T-hdk(c2Ru$dzt
z+NVp{D%K;7l8en`2=dcE$a&Kw@#6(ExD>g!!AyEUzfGYAhl`bXzGh3DfUfZ3>F;2g
z<MGG-n??bqc;gINqF!7c0%bfp=VCH-=z=TX$$*Y(6tIqyyreysG<@rE6|#p=vLtQL
zI9VPWyp7n2-a~WTSV at DDrEde%1D*H`?DUMBcky~2))&`DR^o*^tW2574C>Ee*`mv*
zF#Q^&uluc>>=c)Qlh=$TqZkmC>WS1Z#3E57KO}AxHIN72GJ94*n%Ea~j`W51PoM=V
zs_|MRJl1TvF*wiHA>Vycw|*|Kd8xK<Z){cEckTGfMq^Je7ZA8(R75yh8kbJUhOU%p
z+^}7+As3pFW^>3 at 6McIv7W#oK?z#j7M5J#Roy)ZjMNd3p^IvM!kINR24RGC&iQqJC
zaL4HqN=N}k7~`Q%@;cdt-S_wpcq-cO9mXRcB-D1HGaz8wX)Cmiv_$VkG+dD(>K73l
zZv&*gi!ur1h-i+@)y9KZF1ul}K63xjXmnvH=G at XYbXQDl+B=&QICIK%>e}OT4aj#k
z&_OgW`ErO5)ME<W**CIpJcv9-ilojJ%P!wg7C7gNhZ2HObvR;_{DlN!R3ZQ;J&ZO}
z9#on7HVw)aMMglIw{Q-mMNaZ=NySbVozkE_Dh)1<p^lE`LJp(JJCGvdqsJ(JUoJbd
z%``9i7r!8b3ZweXHoI^7Fh?F5gRz18aAKAoX>GH72O3aF-Bw1i^-lKC)n5Q{?5Ge|
zkESLo`0)UX<QDqa4Bb_d2vGo~x1EWFn~jR?84n&bV~$jU$!odJ{tGMH!EG+mgI55G
zQx?^|Zc)y-D@~7*b6+|=Y0<cWI9$=5T0U2{W*S%ogNt1QI5i!Q+$YhU<O2udyh~tS
z-<nf^s5EWH3pOC{??2`;{?Xu>_fAT2xS~9y3;jO9NW%|vEP|^eeXO?e#nx~t`4Ti>
z6+0OlcG_{c!+i3Q5>7CE<<QDy6 at NZsUx1|Pf`qG}j-523Q6w>caKFw?VA>BnVn~d_
zXQ|9YX^;^<k#r$QU!0I1lC>=&gKOHA`MLiqqvfvB at yE)v63 at 9!XS)T=9lT5s)x%Sk
zVyHk}mBlRg26$EAv<5Q+?f5SQ(f7JWRTh(EpL6>8e``yrJ>E;_XuC1#e>we$fT^v_
z^PQT&UH2lwTJf}<|20Bdo at X1{0({$;(fdM<zwVa^_3b~yUE-z_+v}~k6PK-lKp0lL
zb;@-2dZeBY+O&y(>-?Wu0K#$fEUq4jEa}su4m|W1J|8q~;U@)<a3#cD at f+%A8|cL@
zakH-=wtS3bHb5<0ES5cnZ`v+k$XT*K%Zm1$G-j<c{WSJ^*C6!Q9?%4x@^te&zcWA}
zChG-`4|l=|kx<f_%RVCT`=^8EG2rJdjX at -9hQk68lfJ?>zIt4{R*xB0-hPcD9E`5F
z^Ecqi-Ew%zMFGXKhhtE?g;kCPrQ_8qcu73j+lZH(pA!$Q&FM=s3DC<hJ5%SjP`rb?
z1nT8nW2{GA9;{@Nj&rKXPl6i={JuSi%0tx@#iIx|Me|tF)fo(QxU=sKcS9Ry8A-4)
zJnF*OFXV}PdJ=Q8V*`CWkJ*DZp}x0PG>(@`NWG{;)Zv{X<A5(cjibkX at QKlb=}})Y
zl<;J0%qgJU^RM(JwNR-uH%}REc*!ULBu5jIU;?oHF_+Q(F_hzS8GNjt^3HEM3!DQ|
zl(n^3HvZ0v4_uo=^u}^gPVaU at Mm&t5%ApI-`hzJ7RS86`P7WDys0#1~=FP&T+-|HC
zq1Kk&;m|8Z<Svs1vV%$n^%CjNNBnl*emFFw_By;mY+8EmlOIijRCM~&=?cd4LHZfz
zM6SX8^f$>pn;x4f=67aYP+FuVT$9>Ed5q)gDuy7BA{0UK8XMw`g{T3`YcYsMB71F(
zCf;~+^u`LpLP at G$!=W*vjaahRwYtPJa>H&nhbsU<=)?Gb`;VF7^V&W$6B=ECoSF3N
z75Cj-3Y5VAc{lHLZgZe^=UE0dWOCJ2f0NHMs at 8Y&VA at g=k&RprzBx!#Le(4$XHfk1
zW-_+W<&Y$a%97{n^<*degKgThmjVeh`O}7nj=24mjSMdK6 at Aoa0_m6E&sFLsBzU^(
z;fwkD!0iX`Jzg_X8`9T at wxN!Y_1?Eu-sP=#AkK=q;dE)O*OBCgk5M=R;Jr{hP4s|7
ze2UAq&=9vLMYPiE;qo at L+d_}mhC-L{;-pyGe+N$SO*kU}U*6u;MG|KNki-|?yEghb
zmZuOGt+!hus$~7Yz~I}@Tu_~=KlPEJ86~UhTZg*H-EeC6TRZFYo7l9R-s%Eav1~s?
ze=b2d8frwE4(tvFXil{vE(mBh=VSWc6P at beIg7@hg%n%1zlYWrot)O#(!8>L*CFG-
zw*zDF{}}P5CxE3OLqrz~fb7ZbTqx~aNEw$rQWPyJ?X2=$s_7j#keT{vh3#2*qTwKp
zHJrF at e)?Qo<Y`xlVu171`7`DQqb^RV9@)-jyjVl`-PBRL0^`bIKMP{d(7Ha&=TqVc
z&o2Ya5ohOi&NWQ%BqD0u at gZP$&Mx<PJW3dV=v45RC3d^z at vWE?&Z%nCk%~nJ0xa-H
z$yZM^7c;+tp1C1<>XU|MLLdG^F*{HKZo?iz+8ZqFw7I>s82JNue=p0gfK+*6NA8Qd
zU<QsCE1R_0INHa?2V0RTJc;+Gz-!j5U9=(8dDqK0op2+bo4rn=!Mo!!3O|Tjwq_|<
zoJXyXN|m!H+H|5{a8L-zu3(hnP}*r_uwN-wC00>gk)?0%C6K;?T!ug4a9$R=a_awG
zDf|T}wvKj}jt?eWm?JpWy-9>4Zu+3cZt0RdEGSb?$nB_>vkjbM;w5;M_eIzOOkF<f
z=za2%gZKiQQX9mfhJjBgDr#}D at lT4>^gxkA<B!pT8ckHDz4x at y_=m~VDj7-mzPyPz
zmLqiZXIb?o#)3FLx!*PFl0go58%lk={83@|*3lBHufO;7$I}7Y@;wpv=SM(YZqJtx
zx>1(`V}9&ND`_p(ox&Ac$w77=n;25qC`1_YBmCDZTaz|z9gesg)N2dej*{1s=pa#*
zPA0sGp2VnY#&>BF&=bkyzYe{>K{yh1`OSvpe=|pWEL~3!3~fq+JNS}6dLl)yQ9!*3
zts at eYC!=)p1E?RrE}fa-0+ibfYc=(%jUx%_$rppBbBhzZ3Zg6~BeK>jp+hCG?=w>2
zbn7*pXulsBPSZRHe`FD-Qc6_`!ni(j{dZ2)M2#kY*9CDgp9&b0^3EKlFH3|pvPZfz
zrATEwwA5D*As?OkYHvE4AX at qEn?Uc|>a6<##{3AvHnJUp%cV at N8q=vZMvpX|cTup{
z?<##`0_(d9z%~NbPy*k at Q}Ju&ekv&w)N#_F(#x7oNX|;@#&`9YGyLH_*D!X-_#tp}
zbfm&<p<XspAoheefbiu%U4>Q$n`$q(8F>1!{m!KvA6dupm_d$Ye2qZ*9go^lxq($%
zqpIR)Fg;Kccb-Z>{>V=wwsUYe9d$(@s)n6018ESEtf`Tr=q{eblt!8Q$3SX093gVW
z)dVZh8)$giT|GTGkvXj|19Q!j$7)^h=;`_gto>da0fjpikUQrZ*8Ozj at 59ecC!P7i
zwelQd#A+|@vRZR}tZvTG1WBB8J?~cSZ?b<(H}&(1$g1a*<2X3qG$P^Mgwv5S=KHsG
z#<$fLWEtNDEX?CU*@xBxWOVb-s`isRmvqSi0XFA at 6sW0ptdqyL2VSQ}R&o%Fr$!oM
zv+S!2Cwi5(*A*3J+m>j8W<xlBK~Jb|h^D59X?)L2)zI={qrE!It-6pECpKKHerEg-
z=g=%i;rPwBx)57cl~AKTALW5C)<ZI8Fhq-i)3hXi$*0EMX(y^tf_1+m<d)5)po^Fz
zg at 4I){FhvfOYX?Ueb at 6F`xA3PV#7Ud1`DfczYT(n)}wX#6RoIU_tS at rmRGwD#cV}+
z;0+BHuvHd)*s~O_Lmw+ANZ|Hi<G0ek`zzcG#7Ay#3f8$J`5Za`@692+VRdN%VqL)E
z at y%`e6HZ)TUHNAwNjq6jKdUMn1Md15k at y<iD)M{MDA}>k6{sPlDS-rpd=xsC+*^+o
zpBQ(mtbjkJk^Wt`o`IX27-zY$e0ca=VY<F at Wb;rZDA=k+YI>W~@~CDU>EzSaHn<(@
z<%@fRqnv)`@oo!LBGM1ml=0~?=(e9vzxTIzURXQ|iCEf5pXMf=>Utp8zY1sy^|agA
z?oBRC0`4kN_a at 6mIS*>`BaACO9Gpmaj}hmN3sKb-<{vhHyK=q{5SjBOMtObR-U4;f
z#W)4BF&;VLcFFp2+S0NfdM8?Pf%uM|#bGuA^(U?9CUBK}!acyqaXOBPl0ZHGbYs1j
zm)8Tf8_UDG^(v5&MpFF&4p)JK-`sqAjl++cWn<0O#^xJwjQwfv>~@-hNLS$Kd-zE!
zK^$k#+zh at VLKE~EmzIu_xX_xJ&QZUDKV`>U^4~E%{pq3Bzm|*Y<Uv5`5oqpTp8Ge`
z;%dQN1#mbV#=GH#psCf`=H|73LiLA#*Bt;qk;tO7v^4P>u1pd7%n%4<e0n-?ii|sL
z2sms+9su6n-rodJ1TFB7ZYH?MP_}b(e9fLF>uYPvT>_}#*;^BJr}i_512uXB;D(-Y
zc5!iVa0qWa9Ee<BclyI|+LmI(CilNt5b%@f-zXG#2%Zgj$^sBX^`GbkI4=+U!w7IS
z;$J at va54SM4xlLbZ(sn#nE&gyft!v0jT>xW_RmYC#*a at -p*J?t59m!-YsCXpPJ|M4
z?F#T(<>hbeH?%!sDk>_fhB!O<Bi#Z4{)k?+l`wQ|8hDmwZIWQu`9Mt<dw+i_sn6(s
zg`v~_*E`#672wB-`xR0FavJavY=WvbT3#he+%xDnt<rFP%*F{Z<(xmYVmFY#R3G|C
zKhjVx*C5VLci0wo9XWgmk=YJR3>4G%LSz<Lb(HfIpi@>a)rqiQBfG3c>mjlp&DR7w
z8|~Z6<=Pc!ArMxOyg&{Cuc|%Q{o;-3G-d>SMTMX1D(2K4PJ^MEtCB}|Ic at WM_I!Wc
z;4MWB^xAycV|Q6vA7qX2#a^q5V3BI4oM24+_#;cUeO+aZsGiZ9fwKB0Pwj&7xtNts
z)fP+&R5 at 8AT?nHu%0b5Ezj1^eK-3WH=^mBZ={*(kX0E6fdH9Nj`mwkec>8AWv$#BY
zp|TlNa595T2!7$%|1gCaYqlY<-E*ppfwoi+XX3sWIdbj&rOR_YzAL*4vtTbnZg{~<
z3k!MC-maIM6*Cd_^yjA?Ic at 8EB|3+-<;j#vrV3*-u-tVeH_Kd$rjg$UB}T$lN$=V*
zmJ2X>{rGN)5vxyK3%5B_bSuA0xJ63#yyQBx(k<n??w(Zbm*Stt?5Qrba<6ZMC#QM$
z6OSm`A))leukLSi_hG7g7>SQPYBGLeA9ahcomjmli&8n2eP6YlNiMd8@!;wSs23{Y
zZ9V>YPP{mZs4*Y7t1uP)w4sPNr(JJyqAU&ckpPYH)sGUN;@SDn?(1}&y&|ap at lL)`
zPfs`P#W$v3bW^*15jaj2oiuqSiZb+u4p2URFiiVX%l$S9nTutZcp^t>o;wJ^Gm5UN
zS&!$a$+<r-5vy<eWZ1kwIn&W6M%!%5W0t`ubmPG%wY+$BEA%qF?3YkhK74LtO^wQU
zBCMKP1MM%r;-Op}CbP at fcDysdwIwqq6UW6~<2OD5zojHK9w2=FEj{Y5^QTcBKf{S)
zJheb`0aC)j&lC77x#)B*SjR6QBDcyMncjtzHeE)4t_{KNp*L}&d-B>8f>JyCM~AqA
z(S2k6=1g7}F0~#&l~D&Vs*6AqG>ZxbBo|Czu}LAbg9{z;^LzMJ2xVlsBOtv#_Vv{e
zz5CJEeBZ7S!9mGHNozM~zInpTd^PqyG{pA>K>N2{@fYQy{PeOJiYVNkVCrmDL7v&B
zy$e3tkS-9{6Pw+<-p<z`y3U?PxPGeEfzMA==(Ev{<R10=Dm|n4of@>DV1-P+czSgL
zPiLQX?3m}sn(7bci)YMv^wW&q_|;=;3Kj>IbB2`jz;}fCfgu;r8mWc<HQ@!Zwv=4!
zaJguF8%QTP#u*#E^8ioy=5>M(#c at Y{AhGsEZ`abxi1r-LX&GoE#{v{`&zO4 at u5=+2
z<FeNyEAlb_810#tw}3N=zm#6xHTh=uZJDnu)eu=PRnZ~O6kp8S5ife_m9@<VOR%Ya
zr4zoa!x|)vrO<vz#k~(Ub<`tE=(|lJ7~j!F>vc~|P1`y at Te*8@?wclxVH#o8m!rI2
zQ|UO7Fc+0 at At(<z at z$bB=ic>CNk05#BF3wqmuVaP at 9j)lE9EFV*i+99e94nX>+nO$
zUMbegB2{(<(nl8mU<y(xm3;H_=$D#j`2Vrj{C}OQ0Ht~UK<w1Yx1k?*RG>0O)$hvM
zXmi5U)Lgz_Nou^U<kkdR$_ZP~2bTM~!|ROt6!T{zOpj_dT<`X!tno>+0wVEpE=`cv
zqvsQWKKWivOG>&fuRO|`weD)Gj2>*k=N_Jvp8P9EkEstV+vfH{#nqv$YhZPx(7~)R
z`huiYnL+&DkSo!X>4lD4{O#qUAi=QW5esXecp6oLN4yfD99;;69h9)2OtdZHsf=~l
z!anE*xA#_!8Jix}L2pCOE?N2we$h=%mR$Dcw0n?hsAumLGL#ZTC9*Q9K2LOSJjYt%
zVd7JY{fO!70lM|ku;bNz-;cAYb%pvnI(=$?o8%9~-|1le%@d*$?!FrJ6=P at UIRPin
z9!e2k*G`tv-DwnxN7zovDFk~l(U+kJWOZon%M5QQ(o}=8Pn#23 at 1@s6@;>+HS;h9|
zP_8v9(?(--(fVkeT}3KAgZ<}$<t7{1^VIs)Yy4yVR3(gxWU7qOX={TiMd|_+o~ti@
z at rb3ZSj@@i{-MrR1S0rfI5FH-Q7_ZO?wg2T1&TgSQ+RhqA>*<i at zOfKvZ#COvy;{u
zp`%3Ziv!J?nn1H!j&^K at w*95 at VWB(I(X*(b{t8|ZTvGC}q<&<Q=usMCqx<R%II-+p
z at OGBF^w!{ZOwe}8$pKXSA50H7s^9o#CDBiH at Rh%G_ez|6-Mzhdt=e$wMs+5Obs)c>
z)kU<cm*E3I at 9XB^ZcS`X138$~reE(Yuh*m1D){Ng8|I)pAx8wd~2`!($jh~Dys
zImcWv`}Vt-M-rqd{4q=gnu5sH{p_pp70N1*S0fXZm&f7$hsg9X=`)zBIocoWehNcZ
zT9b!pkdx at F-#rgo=VI%9l!zyDJ}CS>Kr=&-Pd`Vg5G4}Bin~;|iLVKM-5WR-d+cSj
z?nPMM%Vlhcn#?>GmDOneQz8l}##!C`n$70Rtn0wX`|jOt(xYf|*905L at J6D>zU_Mb
zMscyd=YFvs2;OugVwPhLPE&G528zoK+;at{?K~fQcpwmA1Ksgp at qpkH{R8Us{ww1e
z*X;;4w5rPeHoqa*sWLT0-vEhine+N2OdBuNEFN&@luE)f7`hotn=05f$0+?1u+7Au
z{)(z09NSVKHWGjgSkD)W#_aW+K9KMTpc1s2KR~bSaVt%KLCB-E@^#|u^oE!B%9o4$
z(}#3rBr0`y^0gcaplmHSAZsw4lBc~Br3>=(GTgu=-%7)xsB>9mrheJ=Q(7&;x;*ig
zy4cloo6KtyUf%T`o>B#on?nT!R*;M7f#;_mPMK~=Pd}5XEz+yy-BiWk6a#8`^#^T#
zYiH at jN(M%~X1p=vFlv>=9j}~Q5LwAU5J{a1xAEQVG%1Q`3uX0Hr8<d0gDyq`H0EIw
z_c{etJq>edn`2 at -zdhsQ$xu6j=7q2J=sc`V#z92}I~l`y7~C5BLJBHbWolVkRJX<s
z>sDr#3X^+(F5kZtl(t>5BTCoj;iRB9LJr{hsGS+3e|v#!{7qCxnVF}uZPZ;?;2bW#
zvjA*6 at gQ2%?K)lWHgeorIbTcL3&}K{5nH+EVsliFtkjZMM%Rc+R>tT{NthK)=*w)9
zH$C`E9?P;CBfd-{<QtkP1NJ(ylnAWR87|A)v%Kl7C(_?S{tcY@{AXN`>6>!o^stR7
zD!&knf^;6JgH_4=&4QmqjfTq5@=@L89M!FDUWKZz(;MA#wLCd=%<`I1<u?KKug3M`
zl5-Ub_J3&!M|`qB at X%QkRi5271nYD#dFWLQcF3|0A?UgN{cSb%vLaRQw8s_fz24G8
zxb?A4sx}7fz-E7Jl2B6&%an}I{DXKQS}TMI=E&f!2>Aq?!1_AeJ`=cgxJ+0&cS5iK
zCK%D at Mg;4OJGKRGcoJ#!R*ru-{^su#+zB&c!+I$T(+)-JI~&<GKdXG%X6D^b(~Iq)
zZWypUNJl3d+pRdzCo40Dg!LR&`>_v2yIb4bt!B5PeNt^GaPT`&Mxa>{;n`{zRJqXC
z+BKT{WHPDVr4Lo5^FtDD?3%9C9XV!gDF1 at wlCbk9X&Ue2(TYi)CTFvL2y!?kjKP*5
z;wL1|P at gDt3%%AoQHJ`B-uQU2Pr{JKXcIJ+y`@NS{W&x9Jvc+ULyB-j;hLPll}`x0
ziriv^AYeEZJ3ro;N8oObBz1EL_^iLk<7#e4aJZ*t3tmo6%bbkz+4- at 0&xVPoqObDN
z2PoxtLD;lN0A@~5s-j%dH@#d+2vg#eW0kF%=A#n-f59zNi`+pcq`3}&6H#^hiPqxV
zXG?u|RpO;$F%iR66ZXRerQLBCj*JgYYqo_aow+$Vt?Xq at T4=0m7VfK5Z~JJq{7wq&
zGM=a$6pk4D11yepo}=h5J`~wkjxXSe at 0|Rm2a=s5vhmE($c}lXb8<Ih1%K&`x#t0Q
zL>N`WXMx}JK_hM$;%{SuQQC(ftRehW!nIQ)G7ZK7LH9_iNVy+9jC4V>eyg-k<fXFw
zGr7vNbhFT!h~$e|W^Jlnf)~1+zRY^wUg|bnEk}SusP(RO*b!w_f>Z^%BPh+k>xh38
zxSP?}7WFvuo4o2<h>{I|@^SB8fFFAfWA~0<5yjT<VO#eppmHb#I`YqMT8b>#Pg;+<
zSvpmjg at w62Lw7H}l9`~zG>h9Zs3%cKXkjWv+3uxMeC8i+vK>Vn)e;$2=j6(}%=~`y
zxA3Fr<PrcF!hm^2d9C!%*5t<6p9~KzK)M;nPSxPm{iEbQ5W*UG`84ytdGAzd!7I{@
ztXHuJbEeMcl at C@CwoE+tzv;7!u=6*wyIB7)=eT4ytlKK6<4AvJ6G$~=#O5c6STfy1
z<FiCe{N^7pILF*lTGx{LP4$aTY)CP`!nS7S`-)5F_P8~WK8q*SQ_eKONLNmKoM{6y
zWb;l5Mds>)KXE$ZpFfPc%FovBz7+pOV~qxBcD<n>2O6!Cw)9ar&h&DXHH_j0t7p78
zEnEzfRJ@*_4)$z^UR#-~-Tz9i3%S+hm7}R&eHOB=Jonst at b;~3^@~AW0T_%6P={Ly
zC^9xcqYn~=Zp9p)x-sa9r_ye^X~m?xz`H6{EFUL5syVb{p;I%=!cnB$8uMa)cv*@?
ziN&YbcYW28^Aab*x0Z3O)#2<?g(c)k<byczHH7o==2Vw%ZKE9#V5%Aj0Y_lzF2QiL
z*VV~KCSG_Bch*|>?tJrH*nUD`_q;Drz7gL0QVscNi_n~I-x2}OsF+SdjcQZQ2xD+c
z6yGh<uL2sFvxkr7GWCilbx8-s>9u~oiT}|1;o- at QUH>dRnBY4V;&zWSLVHg0TY27e
zv^a~0PWvx5{q=Ttrv>d+OY4m6M|omnKRMa%CGBs_XPfF9G;bvyw=$vVw@?AwwIU`H
z at IG@DbQt&01KoVlVfF|v$<98iHq)W7x4*U(yX?K at oL6*qA$Kz7 at CS}oj8qM=+8I70
z?G;7k5&m<(a4gD$!L5c8b0yw3yfi`o0Dy--KnUdXA9=C97%rH^GZZFqj&?rnS<K|?
zYd4nC^^&>h+S=$teyEuBdGzI(OkjC3lo8`5uH02Q!`|n&J`K#vrZw_nY}Ru6jsoBu
zH!waA%GO|!|8Rc(gmWt~Mebmf#a0vUIEk5AUL7eyC0=5bmQqyZn);n^@Dd#7m80-1
zbGFr^*_8TI+@=BhkH|jpKa24VXic%pzIffUCV(#Fi6k<L=iS~Oo;p#q+$vr*Y0)l=
z3*jsvt)_)?Ik7<vEhpyDsb7a*U&%a%C4WLNJ}IEjl!p`XsvdWYWcWa=KSh2R&w|m#
zf(T28yNM5UPvzj`S-_j}zcHY5O5uMo<m56AQ;_<N8QRz=_QIvFw9Ia&)N`H?_VCSR
z5L0T2pR)gEZy;P0X1||XL+P@!ZTn3fk>gb>Bf6H(>9Q)#xesxwFud>S+nkTVNs%z+
zhE8;KGe5x?x7vc+N8K9<VnDOD2Np&}dITG7++<;wuv$`XzCALh9<u9$$k9U-O%E%z
z_Vw$z%(O at k9ZnnB!>C0P*N*zG5du#Et-b)4xg{398W_7B-cBF3Ii1Fe<B%Dd?%HGk
z6ReY$3aIXh?;Lntn1o--{}`Z;vg1Y0Fg3S-vyP at r=M`BX%j(*PCfXW}b!;=M1h>Be
zVH-uGuu921&G)I$BCowCJ_Xiy;6}Dm?$Pu6tDSs5%@8u5{c^P+EH|_I`ak&OE+g}X
zU2k9STmMYj)Xoiwld|@0gfSRbiCmNARti0yYd+c%m)XE#8J|8pp{D_HlK4GEe7f|+
z6pXu&*7s79e<7ppbYSnYK1Jx<Mi}$wIZ9psU@&)iu^?_6o+t!~%U0)Ryph;B`ler8
z(s>6r2iei-QloBFe*j!E8WIvVN(u{gn}|J3)T+1b<XeajqiR_+KTZNy`GM5HkQONZ
zk-J;KXk}CTigGFEtjNcndx<F#j<*qpu+?5}B|nYP+nFweFXXHLsReL)QcE35qHYt|
z-~Xr(OY<``SpO*W)D#>0f+?RCQ>SY5oN+*DDy;vRSel+xylxgWIm{|S#$XRpj`;XJ
z0nriu>xW}bmNWA5HFEY5V0+hS{Tzp<we_YNb%V30_&)4K|HbmKl`Y(Upylh*A(~B5
zqji4&+jbt60O-f4_JwJKR>pwOy09d8RF+K9yVsks2i!_+<Cv*<RzCdH#xy;rISk(-
zY;*QRq&LAl=O@?g#_nkAf3cbIUktqoA6ee%Fd;*PUUicltrJWqU)jOO*1i~|8oiW0
zA4D1dX6(a}{S#{@*7cd)%tAq1vBh+>=kY2I&*D3zDU!zfO^2`GIbVSe-`$T=M!<uJ
zLaFozhD?BV<6393eMPc8x?r_vdXmU4<0q9g3qv8+ZTjY=1DOaLAELO|oeR~Y3}C+=
zo1f6v-~%GCT}>6bifyPYelt4<t~4f~xjnve9xU;Y*V8T;3ujC0U3kNdyeCRs%;E#R
zyQrM&mcIfldm=vK&iHD%NV5v+eiCt?j<CW$jkPg+0QyUVvVxaeDD9Sn5aj9`fJt0A
zIe>B|yhQvZ=BVm;>%&1bS3p(C2C>}+m$AB)N?to51T43Ft<w6#sNmD>GE9W+mXR>P
zpGqOITU=-Rv`d$zfNGP_#h}uNryjERnCR^322#8Ay7SRkgmzcx5(qme6&EJKF3Z#T
znv7KzrO&C$Xy-nQvoa7?Q%TUJ#Rz#D0^K?_JHGL*31*p}%p at oU&30g%2MQ->jy1K_
zitA>FKVTfNrcfVT!r2vkKInv`AbkZeYo{zhyc9z?iZPD8eZunlqlw3mwasFH&p=BZ
zWqfNHwTOraAVP|pUcNdvc_;(d-n>wbc45f1cv18BDE8ba?U^q&)Q<!Mv%`Awch#-W
zMoG>(x8=XYSJY9uvN5-nG2FpH$(I_m7de&VqHt9&ZNT$$;bw?eD0rz~CH&Np0Dsd2
zHCWB4iA^dl at VLp7N>1>RiPGzSJPFsa?2_tcCbjoP#Lt@@`I`MuaaEWStYel}-Y0cC
zH|pu{jB7*iiv<BnUal^IKtw&OU`iKn22O!rq&_s&QG=yidG^)HW3?#pIQb`{Jsob7
zA8kbWQ5Rh$x?F#!Pye*!2Xb|*h&cKKU!*H--9R_A{i0K0Z{H3ip`5%oYYa at fMWd?7
z4^E^7beu@*gWkQG^Y1ftq at +^rFKmAI8^`YmClDgN=MraX*d5#)3%G1HBsAjJ=944y
z9ju36ndr7<*dUTSt<`0uVLw(B!`N!g at 9jL3(gw=a31g$-d<yAQ4c+HAfd at KZDdpK`
zQoaXmN!$(C at xaQwqV^3GXjjq1NEg#S_$duRD&ZhV%u<}J_b7ktVSI1CGxclxM}TUM
zFppkxY!Bb0;Jj7gGUQO+p5cxVpV9i;wgr1qsd=7eYM{QkcTb at dSu81kS)u+L2+Ro2
z8{hXXnSMqm0)?T*9*d?fFa_jx4wo)2ul-W*7O8f}-I!MRNf at IK($*BTRu#xgmpD9r
zwWc-WsvWa`f0}q|mb|S%voy%u!G398f|4$@Y(kr$7%5G6E{e_OCQji%5rdo at 9hvi-
zGBcrT!W4|$aB3fecn?*b=75ScXKtQy^<TWwvlS*yM;+xmRa}FtKlcRpX-<J<&u`Vs
z$+K35ZgRk(_G2vMS;<7a6AX=|_ec<lmfozGI%OVUJP*b;)t*@H9NH(XYl;iQ%RQkD
znI_t|7Y`lti)VSKI-c#n6kC)nEr4l2%ZBcD3J%(5jPRevMTb|wj9nt}5n{d#Qg*9t
zpD^Z?6&pf~3S)i}607GRC^?PQBi>Cc8)l~}Td&I;N53KCAJ3_Z9NacWy9I8Eq?kl5
zZPVeMt`COLa^{4%HziRQ-F%sg27TO#P_LdKU2Mj>!XXjHGNd_84WH&`nJZK%rcPy6
zVPQQGJvF_*8CnA#*ZXDShb2=;p?Y_cg2 at 8i6Zy>QnUYZ9p^yj<!;n~?9*V8!838rL
zU?I-8Xfb-Tr4OgnOI!o<z4LvVc}@bxQIKV?;f=iqal9f{-+mi<%s-QBepWDi0QXoG
zrhQT|{iZ>DmB)dpz at yJ_M&5p&j=6fgX)G9NuP2{d at Kc;HrY9c~s}JkfT&&=ykR8dZ
z0N0z{#F-Gs=*0o76nJC~__BEnP+fL&f{U3HNI)%mD|ksZISE|gDwGm<L*I2y5ug at b
zNSpOnNK5RJy#!mQC#Qk4N7UJdM-qG$%_3c%p)8k7d}deVf4p+7;~HE0IruGW&*5TF
zn<2bB2iAPZ7#Y-k3I_p%t&<GzH#(KJ`I(S$J#WYQT?Zy%;dsG6`}U2mJdFk-{S}<e
z(2os6UcB9$c3{+2PGXOoELI*Ho(#EFp+0YDBjk9`DjWSu;RkEnys~IZJxSpC*HoTL
zLI!g5I&epX9H=$buOXWn73307iZ5V1<!+`M?A1C#9Ic3u+=3Tdf|!ig2D=Zth&A<$
zxsIc_bOwk$bS at CtgG9J1YNCus<A)r&x{n at xf3}%MREOl!au)ed(?_)!s`U29Lp+A_
zQyyLBv-MrrR_p<lhIEK4;RbGChsMWswo)R4d at 7kwr(Ycf)k9#nHO0m<tRT5M>B|zU
zM}ac+j}mh|9hV0>2tA!n8v?lJwUc~JKfWApT<|Q~hY_RL^AgkwJ--3ovy4mv24WGP
zR*|1YAapr&PwdKMsyEGXf9%EG2)xt{M<-(4G_FSAoS~4-j#I7i<_5d`Ay4%EnJuQj
zt`1)wBgM at a%e`X7`Kt3C))fzUx0!Py)F;*1v<~@E#_Nt{KpTai!`Q{>Z4C6YHjJyo
ziPr+my3>+a1LFY+4)S#Jhai29-3{o892-)efLh|xf5GN(0ZYt}ZdGy7xM1C^rx_Bf
z*|whuuqG+5sn=Qb_*;(7a96YQdU^fXbARy0kNx<Tu<oGw##5)9-s^xy^ndC=>g+&j
zh1lY?LLzibbKan`s~8MkVm*0<wMITXa+x0v-eRb8-~0p~(UaTD1}LaE(+5pm>t%EN
zYmiiRFnRk{xcuT<=6BaV(n0 at S@ee;q=G77NE(Nn11lB_#!P2A<D5W4)0AbQl)?<F|
z%W%n(6;pLmkHpvGPSz0N_>HfW>V(>l36~)Ib+nwk6Yl8E{oxeWfPF`JHMjzpkHOk`
zH at P1z&SBPW{!<6Rf8hj&nNt(q88Gol3xWFan~f^Qg^+e;9CON+`GiGc4d9L2D_Xn<
z%j(>`&5CDhFJ-9JeoA;@IUI&Js+vQEfB!9g#MKA^80)iKN5V~z0Vkz=dn&{NDULHA
zPQ6f2_*;;Vm;HMfy!fSnE9zOxp^fI1X(k=VT~^_`o at tqN1B#q|x)|qz%WKE1CSsF_
z1uLeI!FORbz0a}+6gR%)84j4eOfBLoTN4XmTzl at At!wAG;L8~)526Uk!XdYs+w<MW
zYl*!z=i6t~r>oucH+3 at Xr(}jBv50?5Y2JbB4VMd+@)D2LS at Sg&sk`im7!OvxpPKE%
z?SBog^^BG~Pen+|-Y<JKl7kWnF-fZ4n+(Wy&#mctDpQi>@!i<xUZ|h1I87kb&OaY9
zs`oEr7eVhjb3JnY61CfLfMirwrr-F*J$aT(Z2R~C$>7;Z)n@&gYp}a{7=3s?-urAL
z?ZX7(skIHH1!pk-WexPC8)Tm)BvZ at paB*X=B{n^D?lAISXORb5=ARGcOR?AERkauI
zW$Bb!X4IPqoLYcH5Q0Db at ISBo;gszE;%xbphX0omlGk1K!}>j?I{D8F#A=pgBbUmp
zk`h=B%*RmAYV~4u?d%1ma8{^0jYtDg&nb68^@Mhhux|c@;l at DgDB|0?_tMXsr+wy~
zq`1Rh3_iVJYHaV6wSl`qa^X>*@)wemczM^&M%QTjU;~?xydpoVwD4;<1|oj~9 at _zX
zm5x2Nhu=>sEACYnSVky<0if+(AMEzTPG9VggiAql4rX=0a(;5aJ3xZOKd5xbf7&5f
z`$NUgnV0!Vh#iQGsF*LTuv_|IIwBWk%Biu at 9}kOK=m3ot_-c at Q3jXJ<iOzEaC0_%p
zSmYZF$!}K|B<)8LJlDa+43$zIPfzN&(IUPGQ?L?57m at w)$2YAGEhHL!SGddh)gDX!
zsB`|9W5HB7q*c3WN~dgW<YuYIn5Uzt{q-bn@(r~it%`wkpV1jbq?dN2wL)?Bz;}di
zi%zC_!BS+&gqDj0(S*-^qr<U1EF|m2Jf5esyg;bW%?<EiH`))&f4P;W53VH?{6nn4
zNuf+$$>YleH*`AJ9fG8ZeH-cBMA1DNh=m~2m?O_^pr(Lv at JAbKlB0KV3q^klpJr5w
znz-%Tr7}mdc5QMrD*Z*f;Ld8uY<GN;uq6{SItAUX+Fm}saagv(-O!Z|p$)ndp_<P;
zcGFT5V9Pf#@aQSGUmDLmtweG??ce&hSaZzqg=FovPAXJaJ_K^UfBo*Y^Utca<Raxw
z^lm}ebN|kCc9R8x?L1{<rY~AYOq9J$-S9xl_IfkkvDZ-$v~+KJ#KPRTB9ALNe6$S=
zDr#8vlf$Z&-gcvX=ctqY$eAyglx at OReRm&i at GYfZ49ZXCsR&uESh0z&O<ab7M_n{o
zXeYfX*bgbtyLFYfY_<QN at +lQCR!j`bGvt4-I9Aa5 at ek-inNq_<D()NeJ2Dk?Q$g~q
z)L)KD05$AZZKy6i>uKKQ_HI5#U}0?5=XRrNSp5 at 0i?O(DQ&Gm=R;*f at Wwv2&M&@TB
z$Sg*I(!6rG-?C!UKL*lOop;83WN=S>O#hxtlIU;N7Bh{kVz;@w299^fEfmy6B7Tf1
z!?t0k!S6#VF!fgrDRMnp-{Y@}<*teqyjxxR#x}ll6g-~ygZUh=?A59%nB&_GIh!T2
zsy=b})qvJ|Ob*6$<3X^EV*bYA5(iyvfj+|CBQ at WTRm$o58+<ffP*P|2&Y#cBK{gUN
zE`Z<rV0u0vT(2z>IX#b8K}a$wWyQ)j#$<a5iIUS!)Esa<15Tk29?fHpV8E((WUO9o
ztbXJ_kCRuXvtcW_{hCKVGUL at qk!2pGIaA}yglj6=B6u)|pFPJZuN-MEWr9jDyWAk{
zIYDQT^QJUuZ<4?56~*`8$p%JsTWS7XX?{Cv at 61Cmc6~Rl0g2wxU&sL|OXC&Hr#&B?
z<n+y&LKRP+3)5N^9zCzTJ0cnR(jQQbe~>cjPu!9PI~wpi5a&zk*6AL_&uV4`y06N-
zo3s7gvC#CKkrC*rW?X4OQo0_wYj{zZ3PJ=*>u~XuUt;xA?ggE65yXAcMN=8?3u&I`
zo}#RDqJL+N6(X4GSxat0OL|Z)E_!X<-Fy@`s0&s7zl1sRxcLGR-GbdZ4?HFscQDJ<
zS(|$*h{1AESLD`|&m1b6KB#OogSh6nl>Vz$m2jKgz3)a9mA7#4;0 at oMx(-(vjr7y_
zdH+u?)2Uw*1eZsRFK~)pXsn&1g)dD?G`lXDJhArsmaq0iYwj)+TK|@D+$!}$ft~c)
z$1;loe?unuuK}XAR3hubJPg4(oz=dU?h#7ad=IRb*e>ZPr#+zD+5@~3+!bs#ue0o8
zN{2p6`xPy<Om}@Vqqkwub9C8Yn^RNLdbdLN_(TA}b1>8}J{Oy0Gj>+wh)WHb)!UAK
zFz7L?yui0VX+B3+RnqBA8KVfKri&)Vp;yml+GhtMg!f5xIcH|Ni$Msg_H_r>V2<1M
zNHa4DH+%uZ;4CJ)=V0;(ymvZL61TTA^@*n_kZC1V-E(J62!ozC{o0qJIhFqQX`VKn
z_$z}wb@@{|tWONo%}EIh``~Er9 at kuR!=Be%KCxrLk7!lY$kOZ;xi&u{OCYtcT6ZX1
zeHT+-%-e`DZtL_h=V3Bl+%@`fJ<|6Th3j!ySsH{y47iu0H3Y?%k^dCKnsDNtQH3vW
zQ=iKFG8lkxrRR-%=bBbtMM=uNW%bcFzc<M}s*TY49PXX3s##(9-O<~6?qUf>>y`*>
zmlltXJ&zSJqllZ*+{5~1&2ZRJ-5rs{^k}!1WGOWfVeJym4qdC+eFb|e5qwi$uj at v~
z?VGvDbiAoW;z#v6_6L(6OT+`Y@^W5!$%<L;B&<<{!%tmP7wFlZPqz=5&$Pc{qYLR$
zd$c?GnyoEXglQQ+UG;Llx{*jXFYnyPdW at T?Z`$vJZN!EIHzw7WREzw4LdLtZ(U~or
zHUuPs7~!c5|Nq4{4cyykeKR2 at +H=8;=7Oi+4zEOvf(3T}5c2;LD*VI5|KRe~n?h0a
zX3JyK#a=L2Mb+l&7FeFDa4Ls79}v8`%5)%QUopN~n{`A#Rd3i+$%bQFDo^8%V#^=3
z%O5iHfBm8)OD`|)bFEP)Odw;WBMV>ShufHZ4zDR{c27UeV1u}Bg8nJU!3fOvK at YJZ
zGSS&CNQ?HJPU;=I$08i at H6+i>B=<%8-3rExF4Yb}WtCKiX_!EzC-gQ!EwUod*C)#T
zq&^3Tp*lgiU3I{f+`&avOV)3nge|j+MB1tbzULiil^qxx*gdi90xyX_Ss&+1dv*0|
zHskp7w72!48ucUL7VxRffp8h8LN!?<zf!-&vj5X&+?LI84!Bs*;XGW at B}faFiYld#
z$A1;h|8!FGq0H-2F|WiTNoOS at S5bTax=2VwL{4bMSK)WQOzY>o)T&j-$wr(xs>NJ>
zcOyaje81pRA5}(Pyg2JDruSUKqr6;WUw;k*gC5g05#;1F4JF1NHbGt(c<lwtINBuR
zoz0?~l7bw at WqhYFJg1@uYsf+1yy>@o8XsjPuK}~XVNvFA$w{6h?4w=btJ_k at G1DEz
zTV-)}wl~_ZTI&g}usq_^ibCxp6|f#Bwl`l3k+0R+AxN9k6UC(;uew!rkL)h88QSEL
zzkpHT0(_?m;EqxPh?n;=#NOaPr)3?c)tj2pQO*$e at 2|^D=!t*6^7Dt^-4#WRzeT7r
z)-?YKGZN`RsvevZ9vWDv2mObmZu%Rh&-r)#L5xU?hsI?NM#C}|cCN8)z;+3quF31@
zQQST32y}N`(va1<@6s+<T8dn*mPVI?3A5(Mb-6eAUL8?lLKCNqNjQ87bIgGn_>tX=
z%+p3~1_o>$qx4Qi!7p*@!4Z;h=B<av<T1Ytj;bH``*w+P$N{tdAY7!e?V~S|Ku7}<
zg=<h0h4||i0$;0NUA-F|9J12%HsZ!L=g;2XZ_hGZWmq)OX1Flo5h@*rc!SO?%ryHU
zjON#^+({a1?D!J?fz<mZ5ycgz^Ly6g_i-R_#tyr)GwHVhUZZ at R>bG_K1C6w=Y0S8(
z#&%D$pM><!Bss$MvkiVjgirP8@~K0DU)|vW?(lf|=7)2R6|UMeK{%BCY^(B>nB8mO
zVb>SwQ4oPW&nUe3$GthDD(63oJt;puu?g>QJP_Fy$}|N07l`M9%LLcTgB08~EXB3Q
zG`HSfeoQkaa~HT;szNwq6F0oi7KmplK~=xg!`{|XbMYnXc`Z(l;%@wzaM>)P2{N0_
zj(KMk1rP#mGu>cII$WH<%vs+$dq~n>fiI<M?2<;Q8d9hakFh0XU3D<}+ at s5gcVXnc
zHk4sBkgB at 1ip~}m-r9s)Ul2U)`PSQ*so*m=Z$aKEwh>nuoTqFvJr9e%{o%df=}(k)
zITpKeakF|U33yHe at SP7*dL8>RtVEHbesi&pFK7SE5MKP6<~AEQ#nx;O*Zu0}CWre~
zx9bDFOZ8qIqB8nMpVp&}Er1z)0 at 2W82J<J8H(Bmqj&IGozd7l)6^FU8u!1yD%(x7=
zu>GmVvtZKv!;QZ7%x>m+Pk<Fko80%B7pv}g6Me(*p<mx at _V^u={uVgnHn(*vx5R92
z-bg$3-l5;En~MQRpY-22^uUv!?<x`Ze%&LZ{dCnSWbt?{p_sknTBr~)F(&nL+4g0b
zw%6+(0~`@E_p>ydhTFI=%|x{^Mdxh=qv7h`>}A_Lq+5s6N{Dk$lxO+`Z$!@?H=@Ut
zWg~`1wHZ at P*c)Ma;6Hy3?ZM7kT&4~zZOt9(bdWAC%K(S**1X#@fXi}J0@~Q4cd=;X
zmMNnw-*ny2XjX$941+T}`v))at+n~UdnQbPDcn6KgW}LDteN!)S(Kt6D3^mN(OCQd
zc<%z#W(!Wvlfv6mK5}O7U+rvtf9Cn~UCAYmKlu1POe(yIu%>I(>EcUV|KmT@^LFjV
zENuwaqk^A>vjlA;+%`>K%+M?Kl(V({6(4<KogD4g$1iXxy_rmMwtXafe)g}hEzh>1
zo#`{|Io~&`p3`##_pj at 0G!x>4h~Fv at e@943{Us;YXA#SH!jDQQI7nP~qF%jv^*a1w
zCT;7Iw_m-c58|gxtK5ie>(Rt+MSD_s_{CJ0Ashc&<Iaqvt*#7)!wHmR%hUIPA3Jzc
zeV{W-%cDi>cPts1V1M1>|F-ObXWC=8E&W7H!{?kk)9Sugdx<TN+9mvZf$Jid`&X|Y
zcFNXK=ak~UjBlI@{&(>0rw?kC0b^R>*FCFrRbezlreC|aJamJLvCkHa54A<vYl<JC
z`MPCS10(u%KiWuf;2xdKs_Jv#Xn-HQLV(Km{&A6y_#N+u_WyM at tnh_|#;=%uj>ch~
z_EK7dgiL03RmKkX*vtI1U61;NGTVhM4PKA2H>VtY`QZ0g&o7VIaNb5o8g1>T85d~%
zo->;;_JsC}(j{9rUXzzM<w!1gG$ggfdGj-!xqX3mC9T|mIlc9Jil-zXxuD4-<ntxR
zyKz)KM;glpw`r#u9zKPj_hZiog;BKiw%PuElKn#qd&c~&9g0%71CNa&_!FkT?@8;5
z_QMic{ja|m$3E2FJ<<}r#tHSQfqwr|Aa%S!8^HS`3v%&wzryJ7uFY~<9KEu}x70j?
zCmcePfz$<Y6FJP6!YC{~1B*-XW)7kKI&?^bar;XOqhIn_j!l0{l)O(|HmdPXzc4f`
zBIKkC?1AU^$@Nk_)D;)>CX$;*L~VVk=T<J~@;n)=q0vOq2c4}6Ij2_D&*71IPngRf
zqyX~yh~LrV%0a>RP}$Y@$l~ux&4n|?$4i{s at i|YfxO4Je at IZuC+m^oSX}Rb@$DMM=
zKsVEf at +}={;-~eA#dBNF1Qfv!YnLrl?qxIa2=cK8Z__?{r2T%0QYVkAfJxwWzbA_p
z<Hf}HUoP5AtzyC-TPnxox#pgUazH5g1q6k+2%^k1GZ_XY(+oa`!``XX<2b%B97kZX
zqW84cxE5f#Kz9~zm%dFMpIlBy!MUQXx<~IGF73NrQ5kq}*Wm5v4?eWrY at X|q2WDxF
zh2;jpMzOO7k{aZRvT at mjIcX<dba}T%+ at G7joBDLU$XLp4M|UdVJ;8J(sbV*bhSFm9
z*yuX2MCp#~IfPm}aMoI~LPggo-)<ZSunJTU_F?Ovm6c<118Dd}9+|~i+8WAggsqR1
zR72|xt4ut%EP}~AqpG1-zJtoyz66|o2u?N2L>e2xc>CC<Wp#DhFV_F51-Qcb*i1z(
zjcfeUEN$-PFQ0nLxz2dVU;OntC4={y<nv!bb?LF;5}KcLSPIg9ydT7diyT?fE+U!~
z-`4Y|+eA`OEw@)MU+b;;Teyh#>-J(&Kqc!ZxeFD+KOoHn4zu{d#{xqNHWCVMrpbm(
z+6F)bW3!{Q9aqW(TIAIlhlr+1h=>V5BecxaFG@)X*F6&{D5%pOcBX8J0(hgzW6XU<
z^VkubsS}jl(i}F#Js-V4RZRx4<mJ4&zebi;phOOGZe_IU`*<ByN}%ztgyJXSY~6F#
zQ2j9?vHdFC#{5!)$^_Gg-$vpkk7nzjS&2`-`kaj|;W;Y-!3bTS_*>kFH7@%rB>Ckc
z at d`$4E%;ABnCQdzmnk_T`E>-ho;)Spg!q*Tv-|Wg7F>2n!QFbySi|>3(<9>PO}pC(
z1tx^ypNnTC><7R?aNUjjdORl{Pxd0{YC(BJ+Fy#vS6L+V-cWfPB%XBFJaTtWrvzd3
zwJSx3D&{^P at K@heZ8<6PPdN_?K9h7JK52a^u)js8{W$L{O|$Uzck`DBK0Iga#+cvD
zPRgMinje&_nj0`~?${Q5eg5%+kkS4vSWM4jL57#w25+^UsxDu at _e2vt&+}e+C_`qM
zyHQkWiLEA_?nc<GMyRV4gGUjQXd=ziq?lY>S(#p5zQi5gXXyFPujSpd<4J|OyTik6
z&?x;2`t3a3>h%AMv9}D0YwNZ^8z(?;3l0H-1xav+puydp;KAL4Hg3UPg1aZUTkzo0
zSdifE at HXU}@4NTDdR6ZSRo%_DC40^}#++j<-RPfoahWB1jA9e#_iptGrN`BFx{rr;
zH%(9iyJMrUJ0GEJRjlYsUpge+ytZ0I5L)FoO_0{dB`@L at R!3D6skfMhYk!-81{#N6
z7ecH5L`~bjvq*#5*=Roe+b?q;UhBHT-Uj2z{MYyb=05<vnqGv2LB>CS2Orn5;I~z@
z*A at K*Cl*O)XIf@{9-T8I2v;Oh8ic)5NhP%2S6!K9PM|E~Zvf00owU<>VQM5CMZyRu
z!>^O_R2p9lQoem%wH at X!ec`KhnT>tZpEEp2k!I2Kt)E6^GOLJ=RVElX(-FA_U68de
zYk?M-Ef&_H?8ZJkCb=O-g*d<H_o;@b^XgrlbaPyuaiq%29|rBrj at u@rB{kY?atmh|
zu11^*y69_|cFq?{HBY at H>S>`#eKA78I<m`(1(MmQY4lYAZ)$64vO()Jh4rEkUJA)m
z(N&bC;>3K0ae`jy-9qT;7k!apuyLBn-{w60yPnIsF?K?GziqHZ6fj!RqtHmcPj7Cy
zJoqT)oN?myz}j!tFzksRlhWAHfh+K^wzX%6L5LP2ksqO$f5Igj2271r88{LBq;rbV
z#{O8rib*H)A$~a9tf_ybY=LIE49uo=Nj|V0Hula(K0T;p-kNKT#mkJ at f3iydG9PiW
zla?4G1kX+5Ysy5j^_dd)rmHAfaj~E_j!r|;#dsBWe2-Z1W>FDZg^kc8>uhd!RQ3#0
zUgLvKZYGC{><9(_q*Q53zFW)D?Hu2QBW-VdrjZL5lsvt12P)9?yBN6kUazEY at 3x%f
zCRv?&I^-fO8GVA-G_z>ZtWWfQFH<}<)fDQlkqTCSTS%5j;cpzC at Eegw<9$|%TdFk+
zl7xnwLn$r at sx1?*PTmQ|-5J$@#i>SG1N$RIr?0ROx<=sAe#eCUEh9aM{enCv+wrwP
zlkCK8PL`;`&%sfpI7+x6bK}k=s|e)4x0HoJ5#>fEZG`^ui0zzm2JvjjEg3rCpA+mz
zzWpOZab!i@(tJ^y4s^=XgKievubI}!yBvR14&O-&asavyYAD;fEU}CWO at RtQP=P$+
z2adBk$AgG<T^<<uw>VPf^9b?gzXQ2&d`>f<SEw$sDTNL>x1CSECt?@a!ms4B;bDh@
zC88tvAL=`Nut6`Lh8yqiaLZyCDx*W&cL?@nkzu;|k9;JA8{xz#o}L7~K06mllTTNH
zk{=2s2q!k$PyWy*CPstEP_4k(#b|4QJ<9ks{-^4c9ifu1hi;=6X)NqFbym^+b}V6I
zIumolpNM?3ni~2l5xf%<r1O at i<xWBI!h?o;U+3xOG(0~RB?V2V#~&asJ`8 at 3d{_EV
zy7pp<wtd)(VZ5Ps0zcF;cK{Gj!LJEJz2w94Xh>FrwJxfRDBYY2Nk<xgd!lIY(-$w7
z2&!={{D)U%eSWAz@%c0bXwm_?r2jMBg8Z##0KR6=DfuU}9k&<@3PJX=@7IM#O>1Ok
zN2E%=|LK4|bUZw~BVM$)0azxz){UO985|wpbH>){+S;0u&8ZanYm@|ah6F^vDY{y>
zR5EqLR{@rAl*^A*7=HR8WLLJ=WGK+EtJDh>)ltUf30m_+;^cn6F@==bELl341<?Zv
z at 4hc$_>l?D&f2CkBUWm|Uq#Oq?Z1xfUi_?1sJ6Y;JoLk@=bNYFz#F}L{>IL&J_B&p
zbp0k9ULVHVnhj}(4=_&=uWO$IaPh{*#`Y4milZ(xftCG*24Dl}Ot<4TC()UO2Akuj
zAE!#xGLsRXLXao)1^0x$Ub|)lUwcOCd0)dFF1LIj>T7mA{*kl0)Z}vYJ5i50b9B{h
zxnTL==>*^`#b at -=Y5cC^`kKr8{(MI6GZMKTW!u9I{mAGjOR_Y79qs=<bSRPO_+Y6?
z?lU~O9xHH%F5m}&x>x_NgE0CsH?Qo4odY=|X`ek6a6~yVFcs%8fX6&J{u?<xg}0H<
zZOsBn^!Gi5>Cac%;1-68jwb#Bd?zJ+p0`gHYZnoCeVt)}@1CB2-QUwiUq4^;4{SSU
znvwmx4r9eeS?Z%rp=<@;$+$TC)B)JIfmaCz%M3?ycGdHV+oNb}Dc-WSf8JVpXRa9A
z2azr79~%2j)^O!W%{LWQ{LGkQNzX8Rm%Q>*&yb#r4b|5D1iHXm{@4gy6Ni;H+%>eI
z(D>1N at Ww0hO%&;Bhd+Yr$r;>cAWMORL%q9RZTH5t60fUm_&P$=(b+ZZP~k7o@&;^N
zjc5<ES6W&cx%Ta+GOD{tthA9-E!~9fASKvL`K|otF!H~hQHTZVnnW;bScsqL at Q)MO
zMtU;~8OvX?ULU8#D3T at Jv$1k;!DKyi2+vyOdSlSivfskPiQLf8P+xJu;`f7Pf2kL_
zO{hQAi>PkF?2xa$SQ>9MGiS-#=y7~5cy8Q!edS7YtzfoqspanQvYP$Yl^xGQm$O5+
zDWYXvvK79$An<yge(CZTa?R~U&*A9i?>g)Zl3d{YiNf7L*D>o{9oGw$n2}ZgNxG`@
zhNnULpM#dI3gYz$aBhm=8QlWsA{t<mtGl{7@?fN8Tw$Q6uVpRuJ{-Tu;S|OXLd->!
zdW1tohMt+rg{fU|VTm#nF-WS#QbSR`jME{^P`ctPujW9(2!tBRprZKo;6GWmU-qZO
zSZ*rGkE%JYKvH1eD~(}y>*1^eYJQ)OSMTfA<KD5s#pU5AaeQ(VPhQ3=+MSw+bv*Bj
zw056Je`mt|`##BljHFb5go2!o5cG at 4qa5@i{3|BR<7zM8I5J at G9vpZyk}S@>?gy_l
zYjP0(yqw5r33YmxxT%7}dKB!l`v4l-?-T&Enx~T;dL<X<oce-f3qz$ON8t<QyM5G6
z7TXIm()||kR3)KFZ}u00GHo-nVcQ}iZ!@ev+b|M*RxM|bloUCdnnMCrW!Ca|uHig5
zhpe}-&m%~-ks1dx-Lbx~z1arsI}<Xg`mM;4LV8!1wj at Ix=^{hFb8#)p<=jla_xN&M
zBcja5PmAok&mM`i{=F15%ikQfzJQ?db#)(M6nQ<A+07FV!NY at M!k)B&G#z|)fL|aN
zX-Aerba{bxwDMi8GCQKHsjtzi@{M;}#FmUgirUlb^=wQ2ZJsLh%Eyggb8)#&P)7<H
z^2l2hIo1Lg`6DF6SuHMj%l08Xh6;@dpN at A992oq6Q+ey@SD_4EB>c+9&j5pX-T&Bp
zwwa$<+9L7$opaVKDBWkG at V?#uo_#)8PM*|(y1VsWT!X-tA)szybn_dF&U~cnmp3k$
zP=}PD%~5M)g?&(8ROafh)YsZ<<&+@!5VD50j2s3NhDV)6mn&DlEn!yaTmq)oAbx%c
zrNXEqVC^<ubd2!ZzBeG>>q%o2ga*=;otig|9*u9N4ZuBNO_B=>Xh&x|MnwB>y!eiD
ztWdEqj#x7IxnwB_FD+qr=!5>xL^dFVvVA;4bg_o??(?|VQc at I7NPM5#t~jYnOlNYr
z*tT8ga(ZLnB_Pw*u+T>}UVbu<S5%}muQfBXBuUm=D+$6jR27<C2vC!_gqt{nc!9;O
z%=-+?QF_>e<tAvl at l8ibO4EH@ZEvAu6FVQNpyUxf#Yfq}N#rCUEJ4YIf1r*v-nAh}
zYT7xPLmeT0UnW}L*=L{M|BxnXXpKs;brJAp7E9PMR#pf6HJopekGJ#GjS)nGE28%}
zU@(1X^EcM{-;;IufgcqWwR(5^z$ovWRB^n}%a*VYEz-_2O*@zZdUxEMPLVikiN7;s
ztLwCRkNea!z;1c;A-&+p(`OgbQuF?5sM^fM_Lh-^h;;qx3M%q&88?vrpgpX<fn#@f
z{KaOg8sL6JX}W(<L&<~n>liY^YBfj&qeWmz_=iQx_xCsjo4kCR`p~M67r8LU9bEKE
zm8l{z7(CN>ef*ll&5xtIM6v)#YS|}`&ZVXpJZaXvFp3Ah?@Rm$wX8)8jVT+uJ=|y5
z@%CPc*Xs_{5QX{<<Fv!vS0Yd8jo~5r0l%wXji{Rr_GF=wLG^defhj?#=)aE6o)~aA
z{gFrfwCz;v>BD$bG5Q`Zx*&AJxrf|g+A1|S_?6HWDRPN;rG(x6`>dKvk>l|DPzU%K
zjG}r3xk_xql_fm4R}n+A3M5Y91>(YsVHCUq{N3pV5A!XjTZY!u9VwuzE9Q{?)8Yj2
zJ*q%K)J!r>AkT&<hZ<)p;PJ4c2)*(r4Tt_JBR?k6Be?N)g(ZVetLT7m<all1^&<bz
z5(<bH|LA6=I-Kk6uZ@!bYgB=`SV at ysT1EX}>=K4pRf}XBFHt8W at Eg*A0h-x+DOUxt
zUU#itoL~OjJ^F_Q&egtlhGrf|a- at EtYkd4cQ}fTKJ$0}7wQJ(q1q9BQFub#txxgD-
za?aa1;Lm2qnx49{p`JG)TRFJ#rI60E+CVn(O`zj?*S?aknw4~D;+_#^=+})VrV~<s
zJV~S at 4aCPeU_~qBwm_1D+J#vk=Kpwea>6G^9(mLOt>5^)_+Y~oZNEhs#0v~NxKA!~
zb!W0*?tEiFDUC5_-g{z;s2=c7OTCk(C0 at LJ6y<oJ_g^feJZc=)BT3iiY6=3k_&RFh
zC}XXiq~%C(ipQ3h9i4UIgcuX{m)vyOz36$0;o2n at Z>>nW<idRSAia}#1wd%`W-i$`
zm=jrng(DlhVY$9CVkFH=+RD+f&O>p3A)kj}gRXL4;I<kwgbg*<bdO)q8WlpbJi+hj
z$IKUJd&sVvc6~%WT3thABfu3%UrYq?J|oIFG&<RXx(JY2-7$fRrfq+AcLC8lPZs0Z
z2`IHO!f{H%>68^C=fS<bII<#{!G)R=;4j-RxJvuOk4bJ?)8eqWWSQ%AgxHaAF^!8o
zAToT;vQJF3I$krm-_vGn>zX3=vK*YaFlQ&PG0uLHLAkcN{vO0Kl0g!7ijF+fLEMZU
zD2IOA*g_o%@9OMXd$E_hZtC_0iyXA9E5(9(w0#r{z0#qe+R*?w>cb;W9vgeRlS1Ri
z)pVW#x5$0Iw7cf^I35Hl!pkU<cI23Jv_?iyHKN2vqN}9Hf+X3Jau#iyxkX at eXi1`W
z;wE*~$5Ew_b{7_BFDoko1lv9(2L2Q8C>YZ9sxW=zR7f!JuZ*%@J0EX``#Y2cSC*hp
zPH{PgS|?Ro*Tov{N+>s8;Vo31-;rl*=+G_*?Lzp(03bf}++o7$APN3x&h|NDKgr)t
z7a{z*hOk3axI<K(N0 at qDcHrOkF^iYF&V5OlpHsqK$g1&!b7+d|nIbVnF>+`|_K-sN
z*ANZxH{0~E%9}v=KZqq_l^vW2=r!B$j){m>L`QEUgjocrNbO2v1bpcTle{D+ at ny*+
zF-y%)2OU0t_l^is>W>W=!S&J!#mNjRe<>NO-*kAH1}tfu04rI|Kcag_CVci1PHc1`
zrwF-jV+It-AY`{Ve5rlR`<Ni&&Eyef(eg_B7VF0LoY?VywhJ1rJxXF@^<WhW6%B2s
z+`nr*kM4K`eQhrN1CjF2p4AR=61mnr#F|~8Qoqw2UksdJR0u$*_hQOdw^65yudpTk
z_!hnlA7S(nc%V{Bez~P;85I4M(bm)U^(PTr?B1_5mQ=8;8Y6z$6>Az-H06sCkDJDU
zD7zISO}w3}0q~d#W&eehQP?-0fJv5YM3&O+Fp;r1mgS8M`iw0|?9YOtP4>(w at e*%k
zBh_W0#91R?8n;?Kg9ac3-&l9phij)0W>DA{7Li@)U}5cFTi2Q5u|;+>8qy&BQ4E&A
zdsV#L!Em1x<>@$lru!<?#E>@%-Oa1eJRqCl1Dm at ffkzTA{l3&8ib$<AIHNp!%N^g5
zRU$UQOBpXDk&*jH%2LHE)RU|x#L03vm4qG#9Q+Y{jOf|iB>V`3u>hTFL;dYH9JesY
z#jE<WH79l{It)k^qu;cW5H!B*grnzssYTRTaV_d16sPfP1 at bY7D1T1E^U?q09rFpN
zW$>tKcwIK9fz|Qm1E-jE(^MvudQJ)b*q)taWzxBHe{tZ6IWh)(KGGCHLICH?c=q;y
zD at R2f669f{L(vIk at -<TD3BgyKmwX)8!T!m)!m%$MiEG>=#H=Yi^KvG8*@7Z=oj!}v
zd*0-t=d+f;e2AZ!mQN?GKhA|TWTn6a<g^qo;A2ncu7<D3c+3$fDq|_JAm~B at ie1JQ
zSjFoeBt2Q}rD-%E0PT$lHeptw+EG%?qM5=7_lEf8zhdrgPVAZGl9u$F*TF-F*kttR
zDo?mguY{{c74{eTm|88*2;O^i?51j*Wipg(-(ui)p|Y-i03}5=jRmAvTjU7XW`$gK
z8U7l$h^)jm(()fq{mswjk%XFV<z;hX at SBH5bIu5n<v=qz>XVAN4ezM;!d(Vg0Q$-I
z5C4H#nWG9IWko3F3xiNJ at s{;0OTx8vMY$aH#C6JI@$vEf%kll~5JCMW5XD*T#)n__
z?%P~N{RXSI*NFM(j at ZM#OD-5js8SynTnthN#J^ibpuY~t-7p^roz{rTiSWXoyZ1UH
zK87lvRfkTx#9C1467w1J|27~Tj#yKeBci^Y1K9=JaUqh6P>;J5%!to?3_vMM1v{>m
z(tE2JxOi-DujMWiQIrx{Cil=_pksH5wLt<Id*@FnvP^V!(TKNGDrMMMN;zxltQQ5r
z<#eAeFX8!;)<*q%;KcG#BqyQ~wBBNBg|E&#<P*ci<{75Y;dYYRn=V$$(s|xGP|Q0m
zf&>Fv)y4CdKD3!4vvm2A!n_wBI$%pDaW8^UVR?t+Kvh~teAcZfd2=X=!~c at tY4q>j
z-X)1}&(rTJe3{(sz!p}omTTJncB{N!UJGFc1|6z5A+~H(s0~>MEaETF8e~L3Q7soZ
zw-YaN%(kZSi8bGnKKkpyjYj<;%V^A-32Ph}*_kidrQ*b!7r)xx|G97qzq#!6+-M(*
zb(?g=$`ysJSm_#bddK78&(9#U2gQOqGqOM(U~BxM`bg4lNvb-iqhwr+RCU;h2<H-?
z`GB&1FeSu#bl`!!I|IJZNABqH113P!qy85}^P581@=F8+jL;+s`k9}s7GLs`rxgXB
zwV>ChEt67qMox6_HZ>s2xO8Vfk|@*4{g%p{x;%A>otcWs8~a9 at MJGnc&pCO!-<hmB
z04cKlpg%oDR<y(`{FdkgZl at p}$Re<&|1KjTL~p0hd2}fE(@E5^GAErFRWH5<kjv{e
z`_4bDqRoSWna1i#ccE`C=_q^OoM#?HXF{m^+i4wMnA2h{_h;9T!i9%>P%@ir&i;e|
z4~~KEadT!ZjwRIz=5gMZ_{-hA&IZwO#uTAMO8k4b3x>85;aF_xu0 at V?JMXXU_GxLB
z=BQiWTK{ZSo41rJUYM^F6rXqDdSe%je9wAg6it9j37w(odNCVIPKyf7I;v3S)6FBq
zj+|o?4VKxog(4GEi^<~D67eq+Gcqw!QVZCmNK7^*#~l(KcYdK2LsryM$9jC at B6iwZ
z?!&Y}+g>E+K$`DGc=XPPX)Gq}aXb2!XIE<gGQ3kW?0pl3?&M+RMIzOTZu)+(mn<{4
zU#eT7F062sPY7_2r+?!KfQ{+t=_z3Mk7h~%l9JNYadMw~ol6mYYs!%%-?1>UX|^-e
zhIDcD`japyjgDM>R00<`lep!X!KXcNR&al(fN!Ko5mRL|D at Ib8L^2I(`I0LUUA7}O
z8Fzc$iEz#>1$kon#~hkMq4gDJLrr9bj1|cxi8oFpkBxYxM+A4jewKn`_8_pr=C7{z
z7KqwZU{!ZUd#_Mm at 2#u25I^{JJKt_=od(SD?fq#&<);_1%W_s#I1;hnaWN9nzs^%*
zd{JdLO`VZ!JXol^Mp~7LbJ(b5n3q9picArO!A(Pu8H6jXt;qjgs#9SpOTRE%8}#Si
zS4<!Qt{umY=2S!7tfCw-h|NKHJ=0P9q8CmTH{W8e5>0XZv*tNiYPbfy*cdJ)Usy%O
zECu{EF6@>g`yqY2xndWByvsj)Pd$A%m^O9eDg#oUxiDO6a{YXO>?6D7SSK&rYMru-
z1^7IE(|?IFpQ~V>t6wJQC!(ilk4I=n&2Q<9brFDt0xFtrz945E9TSY4&?Wwu6Y?3O
zFF=Puyrcb5AD=EmElJlq<ht+AdOfSGuZ~-K_Gh+|hdBI>lu$Hi<6+8i7+(RKA{2^4
zCOM8x-5JkcNLPjxj|-{i1rq7uIqCXK;V%meAZncvmOsDE{bMOR2u27usjRRg|Mcq6
zE|<=x<dqjE1tL3AzOazVON7jjOA<8KmT}IMd8f0^RSJsd+0p%Y(Zti9r3KzAJ at MER
zsz3*&ZekW{0IQOs=d+h(y9;<Wf*OCcPQQld7*$C3nNXgZDjel3>Gy_%UKwL}@y+S-
z*JuqoNQLjR;#0QK!nWfN_2JTTA5+%DUFw(vAgZ>O1Tj1=UokEVgKAajswf{pc?P&_
zZEpZ}z_ay#a+8(n3`t1R{Ww^CEVyBCx-IVK*CO-fFMKr<dXua01#yMPq(#OyiaaRx
ze<nl41V`rQs$B_cNAB}Zh<FO-)0%tB$tmuJLgK<Oq`NwJt#MyXd~Gyz-%<oh`n17k
zvX);V=wR%6jjL7YtP~M^oIu!$0%VVzx~lRuH107TxCLQ35e-?O_Zn)romfkWFWI5V
zI%$<9{Y)sGQA)ZVMIe%zCDzF~pAD7wxy>udak9AK>?kC!l~-{mYmmL8M2oAZ&p&!i
zjeMG|1eQ%WHqT{N*$t)^@Gb<Y3jh{e1BF})v(_*s(kvy9$c4}N;no*h-(~-L_tJ`I
zR7b at x@BHJI)r~)D>4D?^-f+H)*ktPiIux^{2U7tZo|12znO4bB6w`oPU at C0;4PQNf
z6qO#>aoJFl4V|)R@*|_VB9PgSX2Jp(&Hqng+KYdUv{DyV1S|mL5IO8uBX8GiUEy*+
zc{}TvG6x<u*`mZ`6wN1zQ&1@{?%uvXD+4l at +2|OhjABM;b~g+fePib<O&{>>6$|xS
z$qn-ZuE6oeFuBQ@$|CWU64eo8IGxpy6N@&nQPCA^T%7y}XtGLt>K+*5;a*qvu0s0I
z7hnn$OCuc?zPHr+oF80UqjuV5QTG~_77^l4p#!Wb6g67No9iU%ZtVKByk`6GQ#vc=
z-Lr$@;V4Jg>BEU-p3E~G;RKj|YR_Qv7T**{4d={MC>!4|Qpnu<>jrP_gode;!`$EQ
zzbCLb`4C51AqHAx6_>f4#egH__NU!!Mb^S*mW0)1Veb+2;ap04*U~X!>{W`}><V#%
z$IUf9q&2~N59xD^PIGD`7(mEceKH6TJ<!ivRTKmz7tJIG1y->%IkSsi!;vA{mXgu(
z%hem+UMjtf+iBaNq~Uy9kq)eu!-|NKk;EqhA at G-7Zj#s#jvMTO6}ADrl?s+d1-MWV
z?T;%+<m46Tb1bpgs+I&~XW|+-BWLe^7}<?^`evA=s)Amcc#(7FPrY?Qx#v}s*_|p-
zWGYzN+bhY_!!oi<ST@`P7ncuwOU`#q2p`w*@h^<Vg;J>LCpz98M6g3?Fiq&CwPbJJ
z3p%e#0OM^ZTkLp?jvhjInLr8arF51md74X&eFjs(_tMzNG~w(x1!7LCK1EzPjon$c
z_Qw0%ZZ!uB6W4|qL8^Av*hwaIW===NiFw3Y->#L$9TIW8rba*AyX$=0o6NksVN*T~
zHW9e-YDt?Y`3l!QbvhgRd4htFaI4UO^mS4PoiafJ<*N(k%S3 at a<JKbS^|Gq>Wejh%
z)?aeySZ92}pDb56$u at Mv!YK9o at ig<T-I?+NxfWmUw+Ow_!wSt%ew6iz+NzxL(@9C3
z7X#KIA_GZ^2r0uYL=TyQa5I-Sx~5#likWh_h;(Qp*z|4}TAuAo24G)+L68WcLBR-G
z)jT7J&f^g`co-*w|Lv?$d%YaGj2>#*Ldw!fCMfUZL-cxZgb at Zk7_sx^V7mt&w=g~|
zV(ulcB6%cwkb$+{b>C%XA{tQxlSuu`S3eV(bG_4lEfWSJBJHoQxw6+5?UXq)GBxNj
zb at b`_5GHXUQT7N0+;CYe0%;jC#G}@srcl;Shsx|9mmXN+;2cDQMwvFYLzM9ug#BHl
z&2^GJU6!|8!g`6Su%cv0mV3qT&S5U_qsya8&RL%F6)*o1s?o%6bY%^+;5TGwzi!m%
zQ!83k=vA8pv{DOAAgD3b>pC=NP%Fk0qx8Mzq~K<f{7wZl-<#*3496a4%#0LLE7<S#
z#%VXH`dH~|kn*OS#7d|9OXVr`>ywZbR4cPkiLwNhS^v3_7uiqqm+v{{_m}wsvPpjb
zrDuTu_T!=a%kw^yy{-EH-0AP}CvX5J`1e$x5ls01=3kzF^z8U|csP at cShs;C8_2D#
zc8z$QF<99a4+f5wSQg!`3@&dw27T19t{8jEA)I2>!bFA#9!Gave$2@&&r|_RTc;DV
zmWbN;oQ>Qw-C*K?VaQIB10ij1N{O&9yZ(Axd at x5kS-yKqVnyO&c#Cp)%L;JQnP`7o
zrl=1k6-y?GNjcY>;)y#tuAp+(yy3v&_*o(rc43L3_Ol$KRxFuQ{-K+XZzQGAyFRV+
z-}CP%i)#4As$=>|1!ZP}8^be@$$Vc+$rD{7Wt?R1u5g%qk|RqKj-^zeH2yS9#Fknz
za at M7)wSks32yZf@{?9Y1S<IN8K0VX6GjRX>8CMyg#Na!@-!9DaMbnAZk4T&n=z9+o
zOL-)Sm<GN_06cuMj%ckaqBsyp)?6MKu%w3e<Bcb_Xhfe7;l%DSpM0|16egNxIY~rJ
zBq7oXqLkdejzJeP4i`{|xju3_O0BMb6N}hRdq)P3o?GxS`s^WIB%>z-MpAJ_cU`bk
z?t8_b3_b^JiE4lP5c+$oW&i6&j_cQ2N}d=%ypM<WJle*6>OZ`;iz#yMu#-j*$$iIm
zKVZas49yW_bN?3A+rPUtu2+pRwY at 5Syjr3`jBh~!KM?vQn=~P_pnr}3<w!q7U*lwz
z-W-=(jDYQ1du4EEB;p6D!12>iv5v1e7$I1O`WDQ$BtS(52xh^TVQ;3C at dtpr=8g=A
zuD4TC%$PomONVb=_uX%@1a9vTxR(bDiThLD)88>Y`a_#)qAMGb603~#R(a_WEHVcz
z><Y$HvCPoz85r;r%x-vqj&7)xYl3&iB)cP~%<@^Q%L<R+UiWJ(JVWL(bjHqC(xP9|
zUks7o<Rg8n?1gSX7G-Bf?g2ss02bCv{lU9=$;TN)Jq<=_dEZZwM%Sk>>Af_a_xXpa
zvFL|UnY~E74`#)IMI1rjK1M&hA$~j^%s_mNmQZZO>EmA>vrs`pVPBE&15%gvm~)T*
zgk$0oj_4~;dE#M=)1ookC>!SLg;l%^)ZEp0E4RR?ZP2OR3UoJG3Q5kS7Uyzg;JKGU
z)WQ at HLUlc(y73nX!gc=)p}+3?d84LGeBY`4>vrGX!+o<b+8AbO at R(_Q3diiCk at DAw
zJGJqYpI*|$r5BoY8+_`rzs#woCt5kO at 2LWw=8slotjMwtvC2<xXEn^<m(m$*JB>s7
zm2S@(jTobYD)oalL&0`lXFyKJL1JK<8NVN`w;C&qGene(-*Xb}$h#sA3|@Q9d*VKD
z7z$Oe+b*A%qWm3QhwZ*{8UXwTgdytR9Aj&B#S_Tza&IUaC{;N>-gqd0!dY13?27Xv
zydhtxVG$(DFp-})f!9mVoWPNx!8j-N at o@%HQOXOQSTgf_h7+0y+&?3oQWsMlJ_MQr
zK7{Ny_l%Cm9;23#yv3(pDEgabb2XG2UF~{1?{y7%iSS11VQ at bv&8Gg$c|yq6J!#Zy
zS;my3!kjo1p()=;A{jJ(+8GejP`mq+NFQ%?P>7L)&~(}VNS2_{%6++hW%T)01#%g9
zDAN?|J&Nm0aAZX0czVt#`7ZLO(W1s2R+V~OdI)kKc6}iMP=^%OnEmJ|P*&<ww$(w(
zJ;p|kSVSH4Fj}|k7;i{dy>m9^Abo6#<*mK{X!pjgwKRGAg2-&m#UmxHX0EnETk8wu
zLg2ala+i_R!1QSrKuR2t{!G2|oa56Wf!tgfg-gGR%_B!!!|Ef)?>a$pi at MaGOnEzb
zMq-sRv*uCB0D at QI@ql38etSv*H~r1o7 at JB2zAZbd!ZR|aji!8+O9gV3r+P6WCM0>+
z8hewEGva;fk#ZG{YZ$DJO_ at -M^CEV>M50GZ!1KIQ+%>$FJmi6H!kr#g at RJIVf{L at k
z<=^<gf$^R$H_%VSRf$`|DBaH-FXcd=gd>8M*gtff;<{EYAn^{yV_qRZ!r{6VK;)=t
zXXuTy{@- at +t-&{R(#pAqN?#}=h%5|Q_K~V)#RzKR!|P~rHYnHGnGw)&VB<u1rMnY;
zx>&q>oNHz{mFT)|_XUjD?RUpDC#O8~@RD^i3%!i|SB{c?<D<EYcL0u6WPXVZojxr}
zQlPqw^_%Tgu9oyx>AnCCLfEceDb(ALi;oj*DnAXgywl4^eYly at h20+kDF0}Jy0!a&
zwqy*!_xG$2BSDe$%X7x~TvahWDTjRf&VJ?)O-!Eh#ip&oVFM{sQ$cDU>2(NxCW%k<
z!(0)s?eV+A4yp2v-b?+i=5i5%t<RG#g5Mz`5`R1Yp9)4(#BqQ~r4Jqw*X4-%LmPsJ
zQ+k(?=@sw8N4*y5XHFA9r12%cNL~deg*wM}19e*N6?P0g{YBv9#_N{d`zu{&eS*4A
z71;Vo&KnV?Ml$=nnjgneIPY0c%FLw=QB?VZTv;Rn0>?4iq4U4u4mEn}#Q?ir)MCF(
zSX!vow5~bCIvyzvC!xn+VyXPaAY4%xMJXJtsUc5>i2?Q(O#|!xfDun5TX;`~k3;cF
z34%i*AE<8J1f`8JKwUz>suEaiuJPx`etA at Gk=K;A+a!5f<O>-<Ee<XDV|hPEv-*cA
zd-*{AL&=QKK()qobN%qHW4f_!tVEZeQr3%AC#U6!s&ZUL$y+Xuspg750mXyg8RWMb
zMtrUyOf3bey=V*uLzt8;nY<8H_QPPQ76hiIC(E?zf#geglYWc>B#`HD{yIaR5B`W7
zt!*H6t4tqxq%Tra1{$i)PF95JvUnx0@>7vqHgMP>$^fe&jc<VsT2dj;eXzZ2&&;vZ
znsf62D7t18f?j1dc#NV?C>SHRf!KZd*K_jylxar49Q4gTQa`A7as4sB at S60b{9qS{
z$SmnMM_f^tjy5cPrvCau^lSl}PsWe^h=p`J`WNG3cCsjfYPo;s52*kmI5C5f(#V%h
zlO6qfc;YGZi5gk2CyH^F0+xvN$JhY$4 at b4MqX@09^N7>=2Gk8C9e~xmyHox+{V0c~
zKCO%;A at Ue|4^_!)v$I^UTKwbZ56Q1vjuXul#R0_!gRR;Tm0`KY%}(C8Z5b+ROJ!PJ
zGV2JwZUV<W4BA<*CFMDA)*63#993IZ?(nJCshzrg#s;a~L_GCb|H$8b<=iU~i{wRG
zFIW#goxB23Eo9%4A{zifvU*j~h+jRU&C at wG`|H<BP7~MzXE5xKG)!S0ggN?tEI<xH
z^X3R=%R}WGvKR?>N~ErV^ib8?oa|-R at S>Y_zKHOe at QuClEY4-Av)@k;I=Azyo1{o~
z3ztPHZ$qjV1TaXF?$vol&4sA%r98i><%3|*w at Sao`$K_Qr8Hv6wAO!4b3=_C?mQW$
zHB6mweFDipyMH)=ZZwfBEszyD`>4pJ(l{PuRus>t at CGz}$u#20Allcvy{qWFtaWpz
z5gz39qt#~;dsdemmJ#=~!l}jSF|2miP}8y=9vfj5_m(asrv_>L*dWhu!7%AekAVP7
zCXT;Jw*``r2<&MUPAcfE?Q23gN at 9%^+yeBZy=CP!-z;+lPzM>S**sC9!=K{|M7fE`
zf8(BDi7 at v5l!#-iAO$s|fQr!0mom`$H2h;_PXJj+)KN!W!b>YW_5r6REcwugTVi6i
zc#`O}>+n-9a>E!u7tC7$tO|j1fYsMv8_|Sf=DGdoH$~WWX}X;s3 at MQnr5YiVg!`&|
zCdTOL6Vw`?*`g+p|A&SUcJilcZl;=0tCgNPIYQT~&QmXG1ZTzYcIPj%!L&Aveq$TA
zzyjwHxL+d}^CvNax(w`J1|_|ne2=6ShE*!-Pa{mWb7W|Yp$-I(1K8l88j?w9it5Ph
z-42&v=8e3hu4W6Om-{8Xg(-YLJxSLysP<IGGU2A6R|Ye{may&l5BIH%(;v{57yAlR
z(})W~LdVUqlcoqewHPgDcIezNP>B5}cxmtvR31hzBUVvZQe{@boh<H<KK5HWzT1(#
z2$oBo*&Hv5#Sk-1NnulFoVGXjXn1!15XL8?ni-9U7gJko$Ueny<Bq0l@{+v`A$8L!
z4wTdegZ-h|=4R(6_t~HQV^Ryis}~c05*4Wt-FEu)R!i$FpwA}IK7R|#>`r#vC2ch)
z2jeS|8ycI&ztT~jDMcr3EzVGBklEWcz6jJ6;Ng)Pq;OK~c>P at f2Xy)fkA9up7 at byC
zAgqMcxm8T{KvUA6sw?Kg5K8_lg7*4K7A`dn5#}|QRa=^Z+d%6YoO`~ebp`SxPAHkO
zN5%5xd+{ZFJ~(V7ePwOQZVk*Y@!}^cWTE;J?wUAUA1M|oUt_?=L^aV(@!-_^X$W8`
ze^XY+DEg|hUTE27NCv=aZ=57^D!n3qj`sz^477(Km9 at dK$G?q=4g~}QV#*RXRqJl9
zzk3hasnRyQ2l52w$+d!EDw+ax?g#ek&EzRv<MG4y9Q!4%s9JAl3p6TUa%D#8!%Mwg
zWE!XpzILxTU!b~l#N7Ykc1N4s&t1&(^0fM}W2m%a^HTr5IRWD3t;dAew0lUX@(BX~
zWd9o5CJ7>P6zG8Qpin5%RW}7}a+C%i-HFzZgRVXc>omgHK{z{osaA*>))tQ>M#U_9
z_Fg?0oy<Q+f~1ZS+{?g;OSc%FnPLqu+4B(e_<%~r<587{s9bcR=vzL%#Dik9J-sUz
zEz+rSrH-EpWVEO`p<6blHoh{OtotQ2DCoa_dSFkV>m4=>9qepm46k1X$~V$R+;=tZ
zrIdM~v5)SWywB0}0qWJS-~9tcPejq%Rk6?Lb3^&rF>X>|B}uhEg2~&6-#58FP-;*;
z!DTUfl20;JCQk+24uSua=3FyF;{{n{<y^pir at n$gPGKvRMxz$oI46_B{59A~^n`A=
z{^A|r<A2d at HB7S?Ur!j`o2!TBwanVlw!W~fH?9u4lR|g6lX$?V<8kRH&f#zIllXH{
zWczmyQa}pVK;qqSk?QeCtyzZK>ZX%>ke<0BRswgru`ga5`_CDO<fJf96dtV2(Rl=}
zrry#Ajm}$)&F7EeWwkCWJ%EntGXKAzJbLuy)A5Lsd61WPt1=nzL_Uvifg7N<y1iV1
zeuLK5J50ziW>Gix;}{3^u&o^qq%D1{LJiVgLDPeDuO1?g2jD?gw|mvD?p-LNuI_ji
z1)Af}CVzZ^IbCr767%23`g at z?SvB;7#o&f93$H*tn=glLTp}e?oq#g%S$4Op6 at u<+
z<K9XE%2<Dhz_ngX-AqsPek9RDUOn8sMYB7kkz{E-K6j`rB>7wC2jmSGp7Mt2tKy5d
z#YqSB6FxTgBzWkCE5pJ4ve3LfUkHl|8|XmZQ=Mvru<eI!eAuQ)oAwYFG_<EDFxSZj
zAoDdMY-?E6uFX9fx*c<$*;ugALgi-!|El2aP^%E!_u&N#3-(Uk0G*&MFq>lza^Vdk
zwW>bB^wJ69^yP7`x?35z2I`QSo^?3F{0M;itp4D6dFxO4@=6?J6ANz7-Lk2M_;~X5
zaG)Ko9<Ag9%eOUyIB`TptrwdEwK#0nHp{fGif8f2jm2M#b71519ddXTTMk9%q1MOv
z`)Q!XQie#4JZjZd-9>!<t_cmW at v&Ui)&#NuA<R7~qZ(96^+M6~$Li%J<uhkMnAzkc
zPHF`yIK_JErT)GrIbu_H)TmwVROf0##qmw5mRX&(iGthY?b^>)!iJ;smf)+41&>5@
z&{C;{g#Gl28t2`OrDwYCCg0+F8D5`ZbfDNZ5m86f&uY|rvcNqONzxgey&h$i2B1CK
z9b<a$L~U=W0ZH8QrNC at La;{)(I(-;TGfLQ;V^d*ce;|dVtx0OB^rmFh5`7(02q<k@
zgv5F%c%k7w<#`;hJ)cT-WbGn at Ike2YoRAx=Ysa|nRP#8ga&&ihx7;QhLeyPH%Q#_<
zN`Of*Bv3w5aQVLKs1E$jQy1mJ<CI7|`0|+Vv<MKWi6l9{EvyFH#yw~BeO*}s at ->s(
zjns=_C7sYIIsqgc6KBRLTEnbkC5z_dL0p(qR$5pYOoBeFUyNjY%qz;mj0{D_aQ?Q0
z+kO4}Hob`4%$Nfo3O50zq(33FR0Eoh<mZ`{@X$_e-!GpjM`I|>RPl6_g7U1$H at o?P
zta;wKnxeqgwiz9F7nd)<OS~0l5hIb-5E_-rKxfi%bYu&o_=SS7_U0!*w^-%O)V(8A
zsR=9INsHo+#(}Z!I2zj(icvwiLqr5ff`s$e^aSqKm<5do;)IYCf}h?Nmz!+9{eg6n
z at +inZ=uEv_ki9i<X4!9zyW9&YPV|eogH91+W`c{K%NVMUU*X?e8#Cm$>?K#1cJ3kF
zN?owsTBfqqxOqxBzQidWFHnCf*p9Y*vQy6Cz}qo6=^>{WFN^5QfqJ~?6>%ur+VggN
z^XO8kn;v?lEA?%yCdcvcfXmgv#$}_1^f8}+<b&rr$S27=cxF;y<wy*WXkxTJeua4x
z00M1#y~fBuA-oqtOGrQ at tS6*!OjkrIU4FIJtr{r*DHkB)<54Rp1g%)AF=NIm#}8ey
z=_U1A9`71#rC~xTg<_SH(n)Yxm=9<|d~*S$n<l+iRRC2D=B33U;kg=p)X3YWgHJ1m
z`EY051m%nWL21Nl|B~3uKBcoshE*-RH3KPz+P#bAuE$;!1!c7#bHmUv8JtwJ1Oj{E
z8y+weM70_rdBkC_CFg!}SlBrquZtD1Tyj!iIEk%F$rZhDF_H?ROip?di`}s7lictT
z76Z?Oa>YV-cjdE|9lM~@0FVAXnG{oid#s1o*_2!ruKm{tU8a>bno5}XPout<=p**G
zY$ag;vr$S+KKQ9^i2KJqztw9Eam`V!s)`Oht<vNl$KQ4)Vy)imBt6;58ImVUOi&~^
z!!436i|{OS74EmJ(`<Bdq?})B4}0VuR`i5gxofhicDM&@v^6nF)|AC+YiizAt5e&6
zNQWvN{5wFDYuQm+BBa>lMqt4i!~h#1tv>!^AlZe2K-vijde9RDR2iXcS$Z`IGdP+E
zTZi$fYhq5pb#K#QVvFa2f+Zo<Ed8HDnneVan!xBeCDeYaW*9I<+f-WpR8>?~qJDW7
z=z)`Y0uD)p*hnmvsfdCg at aDFLrVwu&nIzKB0|`W4oSkoQLgxI;NYEzSI`EW|frOjT
z`i#CRh{}OgPR2lz7Vq?ZFnNfn`1|cx*xbz9_QT?6O1Me%U2pBGChM1Z{Cer)Djz at 7
ziqB468!I-EsBZCR_WklMt30^V#f0MyQ#@7@&-lhL9XkD?kq$I{g&bj-Z!k<QR;jK3
z$}=?2`pJ1l4+#O>aV%EflX9UaP#%8Wp_#93cI*mz%LcM`XXrq;0_Y4zMrrRb?3dJU
z7;kh4#S)4&adoX?Tv8r16rNMoQ&}Ok^51g$g*Pr8R;9=F=lFi&!c~=!_2zk1;HD;V
z6@!hX=7*+P+w^26RM=z!i;Krt$)^X1J(+Tr_u?P&iLXz#zW0!CW`qfij=b*tNxlXz
zG~o1$lH0z^lI4|FfxLX)Lo;_p0o9rTY_~36EM>MpRE<Z=4!UgLPtRDSh!XEo>4l|A
zctxl&=b`uP2mKTipGEacjt6{-bkOJlz?y7}NS4ASyn?-JXcQ9#6irpy4gZQdq(ka@
zcD#40|B!Kr9DqLRIRX3y*wKPc;yjumUU_=Fia|XAZs<>YJ<oRJ^lMOD>L&g<5q?T+
zh`_XMqzrTxn=S^ZsTh2wiDMIhpZljXa^ue|J9j$c2(>JuA<ivUAV&&pJHVo6TMS&g
z|AxvgkRr5#MjsB)$3^^7f&UgB#F9fJf~__;Azx|8g-Nl4nURZ4H_14LQB)Xe-Fbk@
zyiGt4t$)xrwe_p)i!@nkyeUINi!f+$1xrA9*j+ta7{qY%jyR4me^if_`YG#yKMWjR
zAq`q=G^xiYefDmq(0{>|Df-qQjoiBmKZV!_E at Wg1sd-N%QDCNr#;W>enCA#+37r2V
zb<A=>@(Lya?6jd=jj1VZ`_RVs9#%Ori3$36m2BE7KABSn_}S|xT#IeT97G{0FJ(9n
zJ)J<?er#Bo;G7bhrc&621+8BdYo{RcQOWbx+j><o&7VWNI}s05!;(7o`z*ZaE;-%L
z^$%VS+{~RidFW?Nn0Rx at 4sS7_Nlus3ohc8-VWb5mygur_j;Pj2hHf6vGt++m(z1Ns
z{5kBK!F-}o0RSEy`UYO?J?S!QMYYA5Hmqf*LO at 2s-SUncOXld<`?#;;)}rLWl+dz%
zt0=42{P{41)wLA7wD31wv<Y_04S#{uwj^E2@?}gI$9K*ed at 4~k?7zrzn^KgAdos36
z)dmHUnN1)1L890nwDZc7Zt)`<vxu4${V6y8D6eZqn69|U&?}hkK!+E%N@&ZqZ$fPl
zg(Sf#*LR^1(HQU$vTwVgnMn_?nDB9^2zRB$1 at oy_xQD8<u7MA()f<qtI*eU5B6y0l
zi|J|+zf|0Q`Z~{>uT(xhMT;CH`=R}CcP*LE)qym(ys8ROqO7f6{e7J!<AuTC0&eo(
zxZp{A1ayWoxMvn4-cvMQWfD6F9Nw13y$h|e(KUT~HY|c~Uy_ at -CQ6O_Y0ATiFk^d^
z)cIYu1pzd8(^mC{{fCi48U=>^L?Op9NIGyf?%c*PX6h^0b2cUIk+Ed#YhIxQ7y!Rj
z1x<!NiXrt;-|%g>&qdjcj#IM}M at qD0o4!G)db-uqJUASF#hZ1TKrz#Q%sxlD6vfvR
z<-tiZ(QMB1=crK;pcYoAo}ViHax6D+imk&`H=e%8)YEF=HBm`2=x}IK^nFJob{9H}
z8p%flf6l!~kL^@pu9ez{tt@%|_*;)cb^YJ5|3?^Cj?o9sIs3^9vICQq3XCyC3d0Kd
znx!`PJxNvE9wUaC#v8T;LMZ|a&R^PLlOuIq%8iE$GbAE2B&J%0qQgUVM!@$W`h$e7
z>^@~1FQ3@;ie|DeH}?>L<Ls<=Pb2uhZ at AAAj31f^<gs2`hOtdnZa(9Ua-RPJ1Hgd%
z|H;->f6&&}Za?Lfrp9XaypF|V(p7Vmp~eDg at 592v<XVOSx!aQ|GX5L>1By4-^FKJ=
zSE~rkUbnack9Y5xbeqe!-ES}6KL6-`9!l}AhG!nI;L*e#r at TM69PUnrm|QOph}Sqb
zpM`QyaxY+aO}}eT)X`J^bLThDcL|8b1R5}hK^^x3(2O1LR<wCrC?Q@`T%XVA*?D_M
z4j7*l$^3nwe-G7d^$Y=4gZ8p`k9eKq2HXMo;ksxTs7QSFB7d*<bP#9cleWxryxUIt
z-=w7d{&R&nz?4Nt{Ris(BUpK|O8or)>CPF9XOsnezrOlAr-2UF7JtGDuYvCy>;K7g
z{v!_<V*vH4k9fIeMD at J0I$%a+x#V+wAQEzYVZfpZY~a>6|5hRTY-<=pzJM~5_W$0d
z4qBhL?^uX%-`RVgn6KCVgI>%d3c|kq?Sh<aLnTFbTo)kT;FCro$i3XNE~;?$K$9Es
z8$ykVmV2tmd!7paGy^D*cKs^=Leq6c%mo$5VF?`^go%poavcB_^9 at l)oq817?yiot
z!GO%_jkmI;|KnLb`W32e3X<<QE$aN|Jz_q;1{4eiSv%9Vh>K+yd1%T^!vFigsc`M+
zQ5Oql5O3Y9ruRfoh5YguQ+TqNc1L++qi{@>GuG=JJ0=5+83IxVJgqvoAb+gAhJ{8g
z#236CwNcKusGErd<m8!85!By-`zz23n8#kB5y6KN4A);>9Z0{Y%o!~KZ-*svx_SG3
z$}X{uQycrY7NF;pM-p~*C%*;;uW<n=TkoJ1eq@>7zt;wZdo3<WQ6Oc?@TRr6hTl6A
zdbnixi$ldeBj^8hx6j3(;DWwDhpWi?&~`0p5~GSGF^|WN-uEzak(brr*6lq74G=6d
zmvu!N)NF71;F*zdImiF)iv>hqFf;?MLmDrJC|6{L;d+txG3Mw2wJAdV<>89eha)}P
zn<qt<-2KK}%o|w2aXZ%w8d`39*YJ=wU!NNkagWcn3%9OSk_wa?DZ)@kf39qV5D$YL
zt^`CIug)!Q!bg3+Ty~8f`P>wg>>TBuK#uhuj)|629qtlWGVw8F-jzGsbYC40U%KAk
zcmOd|H(ir!*i1!R*X|*c8w3Hp&C7oV;uU-dNqeLowal5$kYg4AI$Z(_XviD}JCg4)
z^eCx7M~I&4k?vv<Z8t{RnlnMs<rQoyrccc&+yXEoi1dAYNN)i_*q{w*)TnS8AGcsr
zOE6v_LZC2fDUVWg^ltwa4d{X6@$jf=fvILU^ZpvL_W0t#W8J2%`4;Qp(`qZ^evbCx
z-lYvp`uM`<!A39P=6-2E at oK9jb0YP4Bejk0@j>QfVNNe&&Bf=!<;o`KcV?^9-mSyo
zV^>?#BPQ^7IcEbpn(?s<g)H&+=(WLk-<9(w_*@5PzSDZ_0WL-Qc(T=*c8Ae+TO*Kg
zQ at pmv^q9{Zgy7SySD at L><kKn8*1|smtcepGM*86W`|!;bhtG9^^hTI}=268%sV8J+
zxoOi)Z$0zq at S%Be^l{e1U*OZar@$lirOeS;LG8Z4D&+B6>h83_2YMOq3ePaj?betd
z0=|V0RP(rtvZ;0}s at Yl_MzeIdZt_Vj4a~n@?4Hw0E5A%0xpX-^nvv66%{+hj3L%>w
zY<pZ)yF1sr8xDQz<6j_<*LiZ&{CIFdf7hoMD)$Jd_c$kYckqA~=v40xferRKjtYcu
z97bG{d!IrFb7-2?P3*$Uj*K23nIM;S34Gl=+z$x>mP!J4?7Q?~M!u{avq*Mr>Ny=*
zy8V4?z1ZD_2kc+F7>w{6(#qXV+By_iM=CdXx%|Ti8dzy3_;s!3TV6-eg)1JSdd;gp
z%P$yPJ;15}OVtzQCct!%4d9j3Lne#QPKRCqEMR>M3!}BJ*L)Q4xV)ScOQ=AG_$XLU
z>qTQhCbiR$T at YIEj0rx6EL%|KQ|*pvQJgiuJ0s)5ddW<{>(&)b6ois$UX{$ekorQ>
z2JtfyO1G7*OAIGGk!?HsSEJOgJfj{}#e=^gK>^W0Td(6g^Y)5WhK9zE&Rog@$K~@a
zJbVZ5u?VbbZ*K2aFQz8_MMOjngP_R9;S^Xvzg$-DA#Il$kC>M{^l-kCiw}5QqO%Q3
zyE7#Wo<8 at lA6#$QAFlcY)}nmwUV9(Ls`#gu3mCGeO~JJLd>M_U$j3bg*~UPT-B;h)
z!?cTf;tf- at 5{h5?qENkK8&Pq>?)x-DaUfm;exsChF<7|~NfK>5Ar3B~`{8ll$lB_!
zeuH>i%kXK?Y7l)pp|zyZ*)d>0&l3{rLQDE{|8OOCC<@+&sGSf6<tj|L2)q39#=zmN
zk+&&cqPDkZd9d(;JN_&&cXdGgkcprJzBhboi8H8iO(&>K?Mn`c0S`gn%P3NIHN=mo
zAbaqeD0IkD&!<Gv89X#}wHnT!ukL>sUySA+`g|2KQRm;vJr;FaI at 1E#*cG-NUK!82
zn|tCNpJ99*qh{3T?2hwpHIX-MRb3W`_kDN8 at B*YG22#hbAA#sGB7sUGL~}>0!BjQi
zo%I}5AJtgN{45cr*=3nE_X^TPv0TK%f-Di0?#Sge$w1IikiGKJT%U7Xqmv5;`wT&6
z!b4 at mVAb0Ncjd7PO~)Y=c+zC9#ACO8vWyYKx3wWdi~@|1L~^~l!``Y-er6cZIiK+{
zRA92m>#M#b!3T(Gk%=JtnfS9wbHj-YalV^}pAQfmvK8cyN)Vz*C at c|Hf%kQG<uH^G
z;aEB6BtMgXyKU}Q*;ExHL5BOnaMnB+T~-7{#tzejZbtZ05C(m!i{n*F&lrS;OoYP_
zWYV;sP;bgSPfaF5C`<r)8^BJkf0$9UD4~-j44NgCP_~hae;DXC{`QF#Q=~zseVHpn
zg4Hh~;$`={QcOyUoXI{=^tN9iFPwT;xRmP7{R0na=PH}$rAI;O{Ovsh>qfzjvv&bm
z$(>4u!#z$|SWQxLa!jAku)YlBmGS-~H?qr3-Lgz3baOrj72$)dDlE4T8blM{vh~oI
z?7A)e6GZNe<@Ptc?~wZVX^Qx|_pG&e_7tbulmbzrj#LuI`>ckmgL=~Xah;(shU}O+
zzQOme?7tSdY8^9nIG at 73<HFJVaaXyt^bUq5*Z$8R|GeMd?<&7%814yVc5dEaENsRv
zuQfG!&%(3ER4LQzl0fQevok=pMOhRWJ8E!HspEL>SO*c<#PrX*T{T7sQd)ZMo8C!i
z^GJ^CLFGn8JSN%u2E~Got}-j?6y^A5j-ds$Dxfvu;ybr)oZ!E5IED96m41C8Tykm3
zXWyt|!odH%EkNq>?ISr|VlAw1VCKESw)m`eiThQ_WpKlZPq*g(L)%*b#nFB3gN;wn
zAq4l3-~@N~BtQs3gA?4{-3c1QH4q at UyF>8cfx$KC1a}$OChz<E_WOVT-P+o!-L5Hy
zf}Wo4d+t5wJkODP_^fL~J7j3RH*v!si3Rb>rYywJnQg6K<#fNtvEQniPoXa{UzP!j
zWs^&i=Rx2r`(N0d+E?arqHKET0WpxIbL_7#AoVB at P(@>)Zg|nGYNxK!5qvflaym`;
zLv^pwKPlz(0i%39v>_74QN`u(jQ+N92t4JgC28B98Iz9%>x92^k-FOD<tR2#RGVLV
z+izH}l2sx8`j8ORD*1tbwTdtCGKZb}twIMq#qiP+KmTbTGuJokCd4mnltD`WUo2;Z
zXaPrv^m026ij0OB{|bHho#SfTBaOQ;_7Qe|;ABl-AoOxyy1aqNkv*lzvy_<*s8;m+
zLZ~|OA&zeVBcQLqYdwQHb7 at JERnsR%T|g8RyI2*fmlxWy5@}jDpcwaThjx<d)~Sv0
zdsVGG-c}j`?PYOOK&@vd0DbGybmLH}Mb&IWbEaE%<AwFRvfdenmpTaP4(KZ9TyT9*
zr?F((!rhW>!xMSn_YkEHQNEy7o?cbEc9FUN^$5E*b;QB`-2=YFpn6`3A_l<a($So_
zZ!0hX8;IK>iHfSPA?uBN*z3a>TW*zJsNWzC-_2jGsCV)w<s0EvEZckMWlB8Jx>>IV
z1;nJWCCu&!OB-)2I8ek}kPptBMIJC5%FOhBR)XIwv6eR7T#P6FK&XgDl#a$m-`X5o
zsv+zs5=U&qEq-Fyg}!r`Lkn?!7{H0B!|!2L&&+ at EO3!vjjz(KPCGRtmAwkg99pMYq
z-;WknJ``dEAS%UkszCjrL`B+87#@7IpF;BovGL0|Q^#I)&f*1{^(fbA?F4y2QAx)w
zeMExa&!0PYADzchny7#&E9Ko=l@%l4xr~f?z+WMc(9>x1g_>}MYI}#KCD`zVsuix*
z(#cS_7&rk*;u)(dp}auJW+5{<Koo9Dh%5p0<vQBGo5b$e3ynLm{tdI?E<F8deR?&v
zJ0}%97#A2%sq4zNGG&a$2m6E#=uI7rjZ=x1H`XL4s7Ge7+1QJT8vz&Sb#_;dmYtQ)
zbh?4j*|H*!H|1g!4)xcVuZ%_Ok<b`eu9&Nc7Iudst%0fQ%K=`5{_<;s&Cv#uUdlM?
zL at Ts_0q$wLFo%V;-u3s4dkcCpT|c;WOUls=XDX(fA{1Jp%q9(65O0ez2hal+O{aAg
zEJ(Db;+{G;R=Tnd_$^eTDqs4w{klKXPq#7M0Iob2KjEK0(Qfp-AH&CV)<}b&Y(#aX
z$x-A=$X}@od}=x#Ye`6Zbnfgh^vG-Ud$^TtSF5oi644eFRd~Km>81Jp7i%1JQCav}
zO-$-JmKPbVjDLqva5t^4$(vUUc7Is;Tlj-s(bA-dxR$6hmMx*ul8ycP^^H0PIt7%=
zc^97Jp-4P_EJThCynhza=!Qg}?S3?f1Dpb at jG;Ppri2S_G0y7hn1KBhDX_zJ-D5`L
zL>EW6|Ih}7ouiEr=5c*gVWkh3E2BnPsZN_MDpMw2^g&9se&9|Yxv!^%<T10}8{>dG
z8l227pV{eljEZEq2WSo|B9*Ek3AAK(pIm&pX^<MLs?65xkJ(EzWLWMLi<NgDTOPRE
z2Q8*tR$?Ijr+zW}dTM at t@d`2fo?^fUeQt<Y>#fR9z*?x$;1Qrf9i=?*Td#L}#Otd6
zwJ+uYm(4RYBVMNb9B=(EYIQ`-Fey8+%CPv~<Ujaw>P<9aroIE!jJI|anhnf+ENqYS
zk<Pta959hKO_B!$*}@L@=zS4Qv!@AifQ7x4w7I)Dy)XGjQbJ%V`9~QjIFj07Lji1~
zOImMAv|b~9FWWT_3C|(#R(CH<bAms})}PD+U^a1=87~oCz=w#4VRRIUY^)$~#&2Ig
z#R!lq&$b;XNI2f!*(@AKY4_3k95kWcOh21i2``Nwm2MDD736jpq!I7dv}1jY(oViY
zfvagMaM8ey!^Vu#e&<n*nF?o``pNY9>d{b>iiMfPIl2=<)OW{0#Zc>&Bak%nMb#aP
zFO$Qq8%I+Mg~Oc&)<N!}a_DD$<uXAgsxD`l#UtKop%4F-Y2QK5B>%#hvJJg#9__+v
zEG2xUx2XJ7O!~=<Vp-!C-*@EGGW70-VOG7QQK7qn`u<?L7VwfEsUjqGs)7Vhl;y!U
zmNKNI?ij8n!$Hi>RbKMI%lA*Gb!mN_KR!+Xjfrh^og_q<J}3UxUlMyyj!w<`hfVjm
zAR)pHscBAg8|_k)NC~Ny3%MUVAVhiZ7o1`V0AzaROn9>|#YnRrY(C)u0&nRX#=^<s
zRTCAM$>XT&<86?$(MP{y1k}u`p8PVs3P+;B$4|#W50D{71&4X!9Gtm``nu#Ew-drr
zID9MAI<4sC657S9Ex>x<S)-^^xPA^ZOKYZ_jrfCng*}hPbVXyGcv?Bu=BRB4Oj2L&
z&`XRW4n9dn?D_GnRwkCLjBlpEbV)PP2WcDeC~VeA)iVA51vLh at k4Vrd7KlBg{Y#dU
zlZ8-QlvC7z!SV*Fq`1N)1D~(q+Hwb9y3YK_=2C^7Qi|E%Py3M_>TXvLPZt(PI6un+
znmg#0aHl at mXCaM_GuvTn!QKnU-jr6(SrM_YIN>x6>RY2NABr!n>V1N>8VqRyWGjW6
z4Z79`j8Db$n^c~#?hihxipW<Py{qY6eY_X)Nehdi;^C`zrrdhvlFu)1i`z1-&;#Ui
zk+MXJ?3vfJdzw?)GIr0fie>Rkbh<E{7&Z}<3Jz>caj at Sc%H$m<^i$a{d^Yty8`V;=
zYFyh<EQO^JS?|kn(7GeVh6P2uMNbxFgOPnVeVlZN4pm*h%Zv!6HzGz}s5;dE_&PQ7
z{)|EZ)8X&-g|sQZ8-w4!<-rV;JICe%9xvMY3YA*f9j&B&F*15LrB@&LzWKNbBOuua
z(5ex2J^gRW2Lehle?O4|AnVNy<W=0?u*#ehZzrIOsGv%<v`9#IHRWAkZp9*pdnde2
z9F8~Ow_op=_~Z=p<r36Ad`7IXQQ&m-edrjO-=0XRg?EnKJ$^yoSHoebNZ&VItmWO1
zcFnnkk4l>|?#d9?2+1p{7aK390<G(>DI!%w^EIOg#RqZLA<09;UdzVwoZ;T?>$9%b
z^6OXTgmGtZE$<2$Tz5NmBC+!=vwnJ-+)Vq^%>-*eJMTHXiHm=$<DIT2t+d*)R at X~y
zJlrT2mea_Vz=Krd7}*A at tYVYmsmu-&GM1Og<|>~y=pV=PBQfCsSb2a>=F^h6?j~VI
z at t$=a{q<}0M|;n4Bz$x2pB*)B`6|?d2|=Vcpght-h|)tR?B2R7Ph)iovORW(u_fIW
z?K at fPm6eSNMt?`QuzJ)X0qrmx!-qWnG<pJ*qkZLi;Wj#<CQzbr`c)PJ$tMP&>AURp
z=27w*zdVJ}LKbXiK5BM5C~PmqquY_nNSV%(VZWnGkStdOEI{Qvm0^YW40_)G(O>Tz
z9r2TY9>V1#zWXIBqJxa3`9d^awh001+V>o%QX)3rkllqxUo0>W3Do)38|}zms>yoX
zDeV%YNH~75#JRRo((_{gagiB*Y~gFSDh93Veae=&&Eb}gvpv$9rED9AtxtpnuDce9
zkDhl+I5_VuP{}_sK1>!8XJQN1;)w+DfDGHy;2tvn+;GaZr|_fntlYw8^Cwr&gpJ``
zNTeJIf+;)L8_c!&Qg={LCGg&>gph1TkISR=xBS6dy55&ZPanw&!p*?{f(M}?@Z3ex
zgo~7wjm^m1JX|&K{UW#0M0r(JaBl8XjoF9yCymL2`eh95Q@=?TBPJ0s at yhwN=fUz}
zMr?PtEMsKnL0rWBA@&k9oqvA=e++YiU;LkAljPpC{&QqIN8jtJe~vN1p8KKw=h&h!
zzITfLIb32nfhYg at j8HELaDO8JP6ap|<oHk2N^a{+A5Kq0jOd(xp0@<cn4o+eMSqu!
z=hT!UR(l3b5A8C+9LNKmPNHPpvHl!7#xWGeCZ-<~_9NeX!7m`DyuYDrtXEOPotDJV
zPJurMqM4z3ka}NEILnGFW<>1^K;j3ywpm^R!vBzWKkr at ri$~3672Posiecd$E47{0
ze6=0qZ%)t6mUrz~EjH`@p6%?0K#{v75jEP7SG1$k`(284lv33+hPpi-xZdLLzQ4lp
z!kja<?>w;iX6DWHbtSvCBFCEtz+o1N$=*tH<mt at Uuv74~cd%{;J!k=<6`%4bX~dsM
zcT&(x9=g*jtJ&9NgPp7$?V4+G&L+gJRSp_BEN&dFffzVX)Q at N0H_*Y6#wFYQc&$>t
z<FkoTz{!s$Y|#IRWA&{&$|^_HrWVz=UFI$OCT|hhJQGiARa+6YzjD0vYqp6hJT<3p
zd^^stVI8+>!EwDsGO~Zzwc)Aa&=!xOY~(E39qC!X1M&>zo_tvPb!Q0GX|H43nDC6Q
zjU!_T!NSEUW8qHswZTvr*%JRq7;${IH&X<PmiIw*HO|!-B^Ooc&#K(>!C3Ls!8iqi
z>-__p$yNn>4u`4}zeI+!(~)my9(17VW&L;lJgZcMvPnr)<IrVW0X#qW_ at EOHx9YGU
zpcx#rP7RURRD3kbH%gDH9fr~e1l%KYiCr=Y(tw$!mgnCe$ViFR>zH_upg>P}B&Qdq
zpFe>{p>qDImWD7q2KajBXhJAIgImoIa_`AO#)1sdfp=T>kD%G)oIsV=7V%Hu`NilH
zRGECuTAEQjT2zt1S<6&xVE4f8$A<{JcDSPyB=9c{^!u7@{rVmL&seuXZ*=u1+4wdx
zk0VeS#u!nBdQl?e9#2n4tX{~5a3$R{Gaf=wH6ZoTbOWYK<Iy)OpwYf=(P$nlKV^RX
zi_S)Vt$qa at Y)r|1BnjNZ-}oR(uK#nicD0JMYDE;@;NxwRBOH+*m&K@}>w4)plPYrd
znNVyFzcclE>#Pr8qMpxlY|#vRW}qD;VtsAg^kTlT36g4!V>CEv>cH5Qt2idgf)NmZ
zeavw~!3TTzmq4nz=U1MdLbslW<@MqK80aQYSN|o5sOr`6Gh;EfJGqJApP!(=noxE2
zxo4&jl)6rrW6LoxJ2<B)pJ}-VOIrM{pipP6V at X=%h at PLWFEr6N?X$5w%7_0uvPQ$R
zmZDRIaAko<!$-VxL%Y*`<;zWz$sT1!$(1|PXE7;V^|1vO0|EtV+Kl0CUp?<;aJB!{
zUEo^PvZzOss@|s6Zg6JXXb2feFMBhH3Q7qC<8TO~*aVoKrslYl!@`k<2%8Z|j7~s|
z&f72a4F1LAUJhHsZFnizPnyh4DZbf8!wEy#pi)`h^j57d#=7Y4T~$?EM6w-bHB&p1
z`t5%*p(!B&!sY5UqEGiHkS!h|BajqgzEOQY!-&&6Ggl$gvi+AQ7;8ceklj~k>wKC>
zy)Xp~7F$(?v2^cxMhT--a=|ZNW-86y`~PFu!O;O*Z&W^L&fj*8#+5f{oB{+K!P26N
zgW(GMR6yyMA~z8uz(Vbtp6`e1`7S)rt<Crr!^Z})6RZS5|ASn)&bQKu+kWjykJ9cm
zk{9=}=-fd4vUQzVLr=qtPg>4DmLWkW^Jb>dKasgbuC{9G at 4E8-XI*h*&f$(F;msFU
zZ-Eg~2RKqHjEN>iZV1}3Y57T2Gqn*vVoIke4<jHW>yqCo(vBgU16e|lm!BYAHVSHS
zgnDe0%qtNbxsnYX-kh5I#iy;NL>xSq<~4_Eu-h<jge!>`Vj=Zfnf)P>V2!&+w`Pr~
z93YT73b2K#n70m$ePJTNq|&jZF$#HnynRjrJdUzUq#llUxs^4QW^0MGS|tP|-rnHz
zB~qVfGrW*GF|Sg?dlkptxq)dkH#;1t#Q4?xC|TY5I<w!g`VLc5&yPo|G-ubY1Ds7R
zJh9+B^l3<X*1Y*1q)z9xV~l0r8;d=X*P3KGU(7{5$SZD*MoOa6`-ReODhm8uZ5)ha
z_kA%>ecHumh$ES31lJ3lSPS3X;I106sy(fDDtsGyd5NI>5h=FgnKSOREH5&{&X3D{
z>bY*t;uHIn8{4<eyy#Z1aB50>EhZvj%eejCj%{_0!`7_Ho{<B{ob|iNoq{MdAw;yx
zCvuqj`1hE#%m~K!r^p+#+``e=$A={S$}0d-RjJLsWyz#VTxP3#J6=X+l&tN<X3cA4
z@<!u|*KPRAydVKt{4NE~q)o0ThA&S0-io6~<N8&|*(>&HvR$UP!mq2pn)Dnpp#@C6
z{*6EjaI$R<dfAGJWO&%<yHJ$ivY~ad{eueaoT at EAwQUdQ*o*5+^OXSFGJpfx0Iv^q
zt8Cf^duJMw9#6U|Hv52j|2b{Zi&CU4>e at wF-5tGOusQEuruG&;m+RWm<s)N5Qw&W#
zh5A!1PH_WLlPk`2bX at 6|l3J#_!Gmi}r*)@KoGj;4Ii@;vI$Io8oJ-ln_+h)(HywUs
zZ3OGr&9ha6V)6~Z!IKdUM3Y)cNlgzq=w0-JGzj>HrXjLk`}@X$AjF{)?g}TgHP!#t
z&9TVFvX9A+!z3S?|H3YBY{MnH$^TK{^V>a1W$;A0PmoR~RGGo at c`cc_09A;~uvQs6
zjLGI?3n`08D)p%g`2yn=;SH*)T at 200;;*pbJwL at OJ`)d>98o#6WksH_<UP4dXGhr0
zCuYDIqh8w#)1d~l-BuQz(?CpY`;mDIa;ZCM=8|65>2<0{Wh$Oi^}=^-cPS<l5Uk9f
zbZva>h)NSGq$#FfKhYe)`t8kVUAjgj?iI{{m!UoN%ln+EU3tLNhXEU~Ke^(BzFGqr
zQ0JD;gAFY1FQ3RQi;bRMqE`$tK6_ipW9s at F>nB`2X=>!FmCll+nLo9`*#Of3OE+xT
z)KPhf^_%b)HjiN^U;W*gml-)v0FnNx76mlJnnO7mnG;9Qi<6OY2}~w`D>De&v;27I
zL#U&W`%)5kJ!Vf_-sH=>rzM0oJpg&KzDVg*g}Zry9)K;EiW)MJ>hJgt-A#c|KdbG5
zR5k54In(ubj;3o5kn2{N+7qJGZIwI70^~R at sb*EdPajR-Y%(MmI)_4guCV~_R44Pv
z!1CNrJB&;)09#WZ<=}QJJI%^Fd*(x~YCy?Uq`Q8NVhrzWCK42c$&mJHUs8I)w)3l(
zWb0Q|+HG2sgg{uFswu;N;C;mTJ-oL<4R}lHMI=6GONTmi9?0o>5!=eWYl#*B04+}Y
z!)BM;t^8h5un<<_LUn(>u5HwS^)`hb>wywYE!%s$;mi8hThy~4-+F}Hxfo+8wTDcB
zgND!TKRA_-goU*E&GgEiK8VyF;8dqKt{8ptCjm#0nI*l}+7vZ_>)`~)_Rq2z;#0SQ
z({p4_;DN7R3&`pM at 3?%NU)h1%`Bv=(ono1$Dw6>_<e85Orl`1qUrWRja}$>7QV1#(
ziMa)(V%g6Z!%g(Tk41ex#J`~ZX-{RymiFVN!224+EbW)e*6)#*-NY6Smqz3sUoi{>
zZT9mkS{j1E=tNrUlXusaKiHapRHS|t3QYyKS<%I+__7}1&KQ01XWne&Ay3?gm^tY_
zd^BI$A#@o`(u^6Xq^_{tP`#=)9U<aELwE)dwv5zb at y#<XW%kTEyGy+|o*yvN)`;Fo
zHS)Q<Ap9~E-07^IaR(Ar3j^eU;E%JazV<iqwJoa99i)IGkCG>- at tJSQ7Wj`-!_{oz
zoZX#GNx1nR#>DSHM&L4rJN8YIel%S|g7pDuybny%S`FCK^yibV;RWLEY$n?j4iP->
zu3re~ReHGyC->A^{Xy3C{O?k6&~_nu)#TbD<Sn`U6t>Qi(pk8VY@@eX`WL at _AA=%y
z&;)hMGh*V9M%Srf0jZe$PgQ&^@a1y#&=>c5g4|-mf3vitBX{n}`7Id`cCpF&=hw|N
z+GXa+;bVWXw5Ex8E;SL{OcXMZrx`!@`2mh}1pQ#6KWQ`^>8mGOi)e=XJX*cOP|H)@
zJHI9DITMRFTCz`z%A6qf^g{uIUX1;^{V8TR?wQh at QVA~ex+6ngecL7LZf_7{PPYP1
z^_vAypwLNkRTwQbD()v??tgLtwtOA=nS&csr}U!FO`)FdO*Uwn({*{uI=;a=881gP
zO2kWqPqbqf&AA?N1-;f>G3U)h$34e8`1W(NywWqGHC1+^bm*GZ*vU*CJ=yeX9rWsF
zF?L!>ds;yoW326YQ2kpQ=Ice6PUWLLqSt!e`LK0hq{QPVBe(-<?P at Dy6S`rtdC@$~
z(n7sWA=g?*Tl{)p&2|%2^d+blg#H7c{tHdQ1FEs#jWP0p-t|x-c7ok+BMPN>7 at 0_{
z3{TMWC+`a0h%}5339*9RipYYfvqY&CXCz+YT{9Q^%jf5qpgdS35xD)eTa}#~SKg8u
z^iYXbzw*ogw*tZQ<$L7r?-y>te*VMK1_YoF_vn8hzcIAqvt1o3>M_ZGao#L=Z+cMs
zrPl7TG5qW+7g1RikF=GFii$uBp2(aWI`qJQPb|DY5dcq=<xA}b`!;`knTuIC66t^Y
z!B%J(vE=SOa&_r{dujgd4HKAF^l-)|f%adVnND^Og4;*L at 1ix!^d;3N&-q+WH#7bD
z?y7Hf_b=UBZr at Vx!!Om<yYKr|ACHJ<o^sIs#h%&Dks$CDJO^+2x09fay**vxU~-^Z
zNtcK1vqYAQhQ;%{@i at HGo2ij7^?%{63mJHy>CWJNhUQsD$UHVn>RwwDdi)W>qx4_!
zHvgUl6*NZ;05h2a at +=ACbf1~uS|ToeTW;(3{b6wGbAiE4elha at K<Iz3DF=|?h97PW
zk#h%d`S~4hD0Pg)BNu6xiSJ!%_d1r{wa#7BW{Okba{r5*vsFRjbt{bp7hs{3mzUqj
zT*rl5?+8YgX~GdT`gf(9adV4!mpA`G?OQw`<QCeD1{{oyQ9y2E#-{d<QQDvh7n-=H
z7s8Tye>P*S^^P^u-`F at 9i6*__zd>xoCM06NP-{*NUsz~^JT5j%1~2PR9#r}GTKQgj
z`S<jJpe6;Nfmt7kQocsDf9;j;>!Ua_0(=+-)4$0L!iLsIsMoG}K^~-C$$w=jwfEu1
z#L>ckpz0UTx*7~+mgbSTy-|Fwv7vEi{>-)V9q#51HZUqZ5)}k15%IVugf%`n>OOOB
zBOmzavoEo-#D9;9hwFQ+RCF{P{f}e(!YTIR*xwGbuV(l?tGdkI@{6j!^`%I;9X`l@
z<DxHlgPN&dbK882K({HCRb)6WgSq8wR8faz61V2Nlh$dho7bHAt~eXCBCuHs{XU-b
zUxPL1|58KF!w`T_R#GUv^t#W4Ya<gJ!Bm#J7z{kWb_HHlhtivCyb7T^QH`8%1`z|V
zyPfkQ9~sTf!x4rNtF|+aNO0~>*r*;NxJe1`j=NB94#e4)3Pjg&WmQOk@#OydsJ?~(
z7BCtcTb}NtdaUasj%Laq>L3t#Z#LrAzzDhI`@D~1Wr!a|;o%ud$NOCU_cYX8(+l1G
z)3tGnM=OX&;Od+n(-Hlm-HEUuIy51w0AIh!)y~mTP`FH*+U$Me-qbI`!-s03FJ1n3
zC at P3(;YXCm?9pV11!c=PPOkTwmMISX7m)q&e}>_KFCc;5Ky<i}huxaTkYKXx5t6<6
zd}Zt$#C}J{G&ksd1sC({y^|P at GwgyhVkPrAlUFx|C!1B7zc<e>&oMUOoBQm<XaP}`
zG1ts{-Y`RFFfhoic`!dWCSd0QhLxpWI{^+yxAz25c2&pyB(FjbC^Kl|lV(`kgq0Z(
z-{|i7TsaULK#*urTW{mcYYZ}DSKOr}e1r{-eR8jfse3KUPLuBBBqHn&xIP!$-c;;6
z%0h0=+6*-67fTm6_7zGGpY3`hu6R)-gjB=9SoaZA?y+W3IydFhvE`#Rxq5+b3WLBa
zycMc~Zu_4rQ%YcF0ei7GcTiQlv3m4+(Qv8QbM4Z#@S)R3%Hwi6Yn3GfsX^zskE++$
z_OLG;Eu}OhOFa?|;X|4<RAGK0Lp7LB8J65FJI8O+{zSox-X05Pkmx0TR(IzALRUqp
zx!)$FvZbkS>7U{|T10~mJYR8cVYZj>RGpQh$m&>^uX9p6ntu*rQAFA{D&occqB92<
z>EA_{_l617iO1%2A(gj!hnHL8ZK0zm5{EOH<<_2h4KQ=A2lH1l%b%AJhGF_sux}HN
z2(SUb at p|m)*_8Kp_B)I_MAzMN`%&6 at X=3ci8UZcG!4v%zzov`eTSW#-gPL1Y;JG<-
z{!YA;pO2qEMul$rCboQn;h at yqLeNl6$hHMVCK!8l;?z6oS<QORRXA=}(o>QBgOfUv
zu6XLoZi_I0-!xtuyZvM<n+kYFj2e(@%Nx|J2>_-l8aoS71L5(K)7(D*lQV;r!uuQ+
zE@~elJ$M2YCfUj?-6`9L!PQ|s!6E*<HmAk!u at o2h%4bWxH`C*{)vpd)s<2E>Bs9?j
zKwrO-w6=#((Drg_BX#`0Lf2xw1SbslROH{#$z~cpaC<VLOxRUp)eDDR*B`SW9Tqh~
zZeVv<w5YeDF0T(#f at 9<_HlmbIKO7L;xSiNvlssisV2&F#&9HB;%UQd+y!- at ZJBhP*
z%w2(bG^gSXx*_|^b;T<m?stebFY0x+mzAwVQa#tVtPlIzuzBT6 at 31>ze_*kld9k62
zbT|VL$+dNu8^poCu2WGVw#j|m)+22O<I!)tmNTanazDJd2^a}!2RC0pH}G-mZmu==
z(!*mjHUlg|+}WwXv at ISISYueAe{ssDnmX?ttGkxL at r1HCC-AK*USVx9q+(<4As92>
z5ynu%2G$>q|HXSv4rJwOY`{s^)IVX{8f{m5j#0RLojn!^5z#f=942c*bm9o#u4vE!
ztol`@-n`UKB_2^z(@iZ;GwEz~i+oOX`mel7Cw+untfNMTYEH!b%kN?*15A-6)=6#n
zrR(<&*N$W!o$o!%Hd-YuB`QJkKy(nH_pF=ySh`@4y=0+2UdhY-wEw?MT+ljxeGLf@
z4<|$^c-adlzH29>J(yg|pi4bk;iesRSi at ISkB2Fso@{q$9;E7=J8a_JnQ378oi%xW
z`@}n}BUP!!9E!*lA1vs(o94K?&0NwAgc{JDcv1T|(3hRs^Y1S&rl(#gLLi5PLH&>1
zsPTTY5Ox#Z!0j10`41lah$o+Zky|cyWbL_B<`?em-xR!b^D at kxpKAXxWoB>L$+_Rr
z<i5lHBK1L;=I^^R);|*J20KX0B5La0`VzIOK1YPN4sg7S9fC{k^ZA6Ck<&AG#z*gf
z=hUG;Z^c^woTkF3CtXWzAYWwN!NjH>cj!N;amV`bZJ8DuQ2k1wq?det>(rPgt;gLR
zvC$a3GDPf(79iI>Tl*NLf}MJElcmff(a4zzQuM-S`xAN04<wrWRfT&_rMQOMAqN&W
zxafnneBwtmv8Hge=`^^!URj at SUp-Dakl-na@O`a~bOB~yu$Nb6Cn4>*xU at Y1nt94G
zH!rw-h~ErBE1v*ADVMF1nc91ImG7OQzmf6bhE?F8KKxD at M)RX=S^R_Q+q+|aP4M?a
z9@?&=EULnVv;|IB(_G4B3F$$}ZSIvP9V2(F8gulLK0eeSdNsaq^%M?meR$=vazWq&
z>gLA8rBRdJDRby5fynF&BUl+mKwD#Igx_s{I|Eb`z5Mgbe)G#eL=SuDsmiF9Bcb)2
zb)m59xWi;<{gJ)@h`r3wOAWM0_S>MAU$IXCpU{ui$g2bP2lMk#6N0vD83~^&^JZqS
zh8hD!;_CY!yJT|7U#_K!kZ-&4js^3j)l=I!`A}dHvguIIoS){mryw0ggb}bl#lmXS
zix}$;Dj$Y)asjJf%@ZV8!i7=%ruX)Kv*+%ue$pq at I-qDkX*gSKkHTys9XxBB6Y?ZP
zZeQFK_?0=wSN>jcuRX0%R|IXkPyqO8W4FQ2$(fcVejgv%vf=pG&+_%9#K6FCrRGYz
zqW1BX)tK<*<_NgG_46swY&^YzIa5$ky(_&_g&dY?33=F}YnS0A9I%L1r&3>FOWm*}
z;7ypx>Rvg_i1>SWXgL_Dt5=Bl;7IvIHfS<`Lc$AyUMM`z at J4tM4=&wdTzLyQ?5g at +
zm0Vyu3p4#;J&}e4E+Gyu3)C>dHHL;{$Q<7pHQ7sYINx42#MF<>Pi3Eqw7kDzj7In#
z&(9lebzr|-9SXGmXwL at +n4#WnSJmfgJ0E;c5hJ|N5z(BiL?rLSx`Ntt3=GUci$G7b
z*zF<^8r>QUzX?`vuv=6)b<X2LTAmHgFK_VsQA^6YJs~BklVI6C2?Lr5UcUPWA;%B7
z#B5h^Nx(H0fj-*WOj&dZIlPsPiGM*dojdE<Q~Wt)I=h*gDVtspBC`n-lS?LvTx*nZ
z==L;Y+OUV6D7~o!VozLeHNO64mCU0O>(MYJ%y8yJqsZlGA(3ZgYdfw`B2Cga5DmqY
zfN at hG_x%kaA9zxxAXL40-(He*`lxl^tYV2u at F4&EeE#1Igl;atk*t{FukBx(;V%fw
z57*W_QnilBEbD(+$AFS48R6fR^7Q28(_pj74F6?NaJ*A$lg+J;tt&lipK3vIuAWBu
z_kB22Aql)iha9risu6~Vi)S}U*5<54;m%)7w5{3KwSGccRv={e^{pgxxUL~Bzr-M;
zDaBsSEqqs6Hltfs1_v{WujlrE0vt8`;mRTHF`<;;l^-W7f?Y+A5lv<8oTD_E+oy27
zn-y-*rnIf{w_W12UT%>491rnd><*=Zg}dS_+blJux4gF|pr|at`0 at BlQG?12!OyJ(
zHmzKLlx7xuyIO0qx4U?!fNH9i5vV-wijpXlRp^Te5ek1)UVaKpyXPgBU1^QEsENhf
z+1TB9>Y-y6Fww_O+r2AZ)xvb$0QbB%krk%<qeW>34-6-Vl7FBH_x6&g&l?b{s$D-?
zAWmpMdBUuO<fpIY`dyO_HzbC+J70 at M)%I=knNiom=Idzl7n#lfW69Xs;`Ez5d at qCi
zUZ(SA2J-!7oM?2-;OXhqo0*&HX+?BAzv~Af^+9do;xfx41`?3KukA%Qu9>*Wsy>M)
z$92TU8!c-rb+jSv`TQH0Qe11VClfCwz$rZoyI75EuMx*^@bHM(^1q{!g7{pId~cBK
z+d1Hc9Fm$DhnoQc*GHq+(?_6qPWT}a_O~CG0^M~=?LE5MqJAw>h!G%Xo(;Y2?4v%6
zfkHC}&hdC4Jo8C|b^Ds`4u&&B?x#y_vWc7cXLz`nSM~EoyLUA;V0hLgulfYP)?M{=
zHq(!|9r1HX(s&co*syHqp>))KK6Fuu)-CO}e;qofEd9Q4`ju0-?q6-J2g0^tK{`NJ
zPfu2as*L10>E`O80QmaEPL(AI;qggbI_Uad$j!H7v3E>ca|*$cl8Dflzg~>X-QWMJ
zUPg3t(z7;x94B|Yxxi(^VmH{)f%N4)t}}Ps^@ypgo{i({)_u6Rv7aaD;v8%!J^XGT
zFVzc}4!Db@>N9^%zXG=&%?I}TfP(?e`hD+62E5xyYcF9x#HQd6<Eo9jR=;y`d=DY;
zV|N0-FZ~U|3o#;a_&4rHH^$$GjRjvAowKbuI=RgaR77`^qN;osEPDp<rION8uKx|b
z!UZ3`N7cBy@}~)Df9_EBq+Uqm2LIlo;Mj?Xi~Oj)W54({@2i=$5>@878(DlHT<j>8
zteDVpx1u2Wp@}bgD-inx7ti=2&i=^y{J~g2S=$tBkw6r3c}4Rh9}Q`F;-iK$=0OiA
z{O<8sYf8$iXPue{1}lQPphSHR(QXshc at 3~{2r9ayDJW!CF4e%iWk}50Sf-z?Wt4>U
zHI0Tl9_Ce12Iz3#`;wqHNe?3Tdv6jwSn|*QKFpWIdYN)-CG}MI at kfp#<QUiMHw91J
z>gp=0s?1-F at D^T!+nRiM`Lv>{#x%npaaH5FSl at ao2F`O(I~Nu{{`frUTvS9v#>pN-
zM at RVi7P;$_^D}5v_mGmzr~YrAqB&NaZMTLGy}i9XPMK-vlIJ_71~sp^``ilNYfjJ1
zcIv;ed-ASCk>{$*XYV)F+1c5_k!h!mwWEK$aPbHQHah9w;5x{_7l2ubF2khYfaEJ5
z?o6`$+1=ennr1mxhL3<3N2662p<?$$EH3K5=rav at H?>n|wHedKzh~g{rK#=Eeaf<C
zYP)*Mu;k)x at k*|Wt5)fokw&@9L!q_Xo{=6EpB4lHQR%B*+E&sFUjKi5DIpl6jMZW_
zyM4P?-kO(@bKzC9XaGO$_6IkH(meDjxsJzLWp25X77_msp(LdApB135-?O)8*Bvk-
zP}kI?bKsl{YlEx6{r-!u at bpanFUj0fL7Tdcz{S_t^mNMmC!?;!G54g{y!@{lvIM=f
zzoRfPfSEn^o%A{7IU{a)BueSAU)t2Me2z+SaWQDY?^ogDe<>Dj<n~Ozs|S(UNgWd)
zH8muz?4(tuvgcJZOnvS}eRWE`b4e)Mp)8L0 at t<^uS2!pV+0J|5#%O)(P68q#KM>dF
z_z+a+dzpiybp at Fm748TwzgW2(kb4m_fD7!xVT}fdj`P=<XUFz-c8{Tu<y*ux_&J$p
ziT^9DgmzD0Nl)<nSaZAq_g=fWUb>5Y|Na4$xyKD+- at g}6{3gId1XpR||AOa2I{<ku
zZd4H=At}C8kY$sl|GeUe9zJ#ll1FA2y*uK6ANjEm8#wUKAatld*PTXrVtVBrKyEC|
z{~mLKT;t9?O~(P!U+ahXl>huqCO_ss;}1@<|92 at L|EwqDzZ}&wC|gZvyA%)@u&xD>
zn0c8}_984;3ljD<-ASiX7_J3r9=ZNj-g*F4Rh at YKiMO=yDZVbmkO2!I>+C>7?dspz
z7ktL{epw3YoxkwWeAzb+pN+Jqvs35|gO>rcMr;przt(3jp9kIQIe1yErOT{y5xkv!
zeuVQvp-83JuQqq^alq|d|Hi65Vd8eIID8SE4JXP%g5dIYt&se<j+Lrhv8?7l2b*u{
z-S{q<`+i&SN$8M>Dau2(;4?_<{LqEeYq%_0^TZ!7yeqI(+tzcbnhm?Q&R9y&E={BD
z95Is{6zm{C0imes at A06*%=q?nY6S76M*^oq41*%J_54=v`ru8{j-~8K$dTlphJV}S
zt*$bBNf?}nao~iyPic8lBZeH_g>>G<W--J1W`^~XFs7WB_KJf52mbIo-*1Gm8y}4|
zjVH62=o|#J at qa1UMqisOjZAWm?FHmm7q-64uz~KHIeh7SUW8I2-Eltt$>+04ywQcp
zy5+vZl54dP1&Ox5xTsDn*Z8e|Z-gLUEIF{V=J{J@#0oL5Y>E9V>uDDxEo!HVwMU!M
zf=c_2#=WR*>14$9n^V)P|MgCPU at Jy`B2psdW+^CcgYN&t$*!^PJQ}PB3;l|FqS$Bf
z{qunIN%i2t=-7N at X=_2Hs(#mmuf<f+aZ2hOXGO**Lhm6v#pv~snx@`zW6wK%2TZ+^
zp{rA24ld$n$7<dra7+HV(b+;xFy<6};_|y}fj1&+tls8zn29M$`y-;BtI^rwy1EuD
z0xTUMAU%|pr*5N&q at pgMbjs{RiF|jQgMT`3Dud};CFa#^(}4p^R54fRnFjv`QQnx*
ziL^ByRT!IS6Y&qjM3wI8*st#&)U&7`nRbyllaEYAPvP<tMPHMsrw<KT?2m~zsTmpY
z)VUcxt~dAN+ZCnr5E#o}YHHYWe*Vtud#{hZ{1Qpe{E$O6+1D3DffZua{QRkzk|TXV
zRDbd~#wG*bX9aC{;0jPsLh=Gi8aQ3HGOeAP$myi at 90X=rPy@(<2!bv6#p0&iutmSb
zoAr3?ZIR0;dppngm57AJ5&&jcJu=qv)W}{K>bq?wfap*O$%8*{sTiU=&dg2}86nE2
zUl&AU9s#BUF>dFm$awNc##I9(rM!93$9TkfKaWfFq#<F!Bs&(oZBf#AY)eeOX(S_K
zyaFYfJ-Hl{6M-EC;T!&}4m@?)_EwaArCke)%ySlq+qX7DIN1#~`OC*jOavCTcD*hF
zI<7ue!gyn2i{Sy40j+Kr6uWd<RVO+nhy3F^0XaE%!98vGu^K1XqC9s>_q26f;=tPI
z1^@RJ^GM0ZU}UcvR4(}VdNlFOc~cCHU}ky8R}F!baMre8c^u<^B#vK0`$`AP3u-Wo
zRaHsG{X3p%+7kE)1eM|<h!5QOsluwXsQWQ+f(cYf;GgfBj1_O+q^r~azMP_pj*iL7
zpH%S!8w^I{*ZGy4;nrg?lz)EERTBO{FPM&md}nNb676YJA<}YZ7FDcEJtrUMyD$dn
zz$cYnuZ6y22njoTZB1~}qF}H^KMO}Gp_4qO3hwwevo9CG$IBU^5l%;)ZHei1(z->S
z+Bt2QczHFxUGi4ZWvh%bx&223e%2XnB`-!D)wgQ56GIDT2+mu@?J{>fB}1!s&+#63
zL#K*W^9Ox#$*3ArPaWLAUC`;aMp2;hO*Yq4U;fOUWzZ at rDQA`CytQ{9_ at lG-R$CYy
zBzC#PH3jXoheoS(0gDqy>k(*PUe9Q*fxT4!)F0T6@%LMRgX5RoSx3^$k`t@?ejA%0
zu5jMZmzp_4#&9M?6MdV(<$f at BMjpRku~3+`Xw#_=Y+0)#$*KC>sPl#uY at jNY$%!uC
z!|^*|WOAM#1BWTPhJ4 at E_?;KB9l~E(o{wX7 at 8h{!_29n2m_I6q7{<A--$H9>tC;|W
zoy{akW`W_Ypb6t8lqJEhi1+rV8^1eYblp at 38W4&EhPB_=QjjTNg2EMuPXcobwg0sM
zbdM}{w}P7TF+}b78&3w9!n<O?W~0Qb<J*o2Sx=tkkGaLHOMedc)!RyCZo^GV+n9-U
zb;fj%za_R<o0Y4#2tgk5?UP6MCb4pD9}`nCn=KFH98_y7u_VRB)<zCDkr4BSg}f02
zeq|Okm<##G6;ln@#L*UE2o3piiD+$ccNRTkB+Cjl4FJ_C(R^328hQV at x`&j;j}r61
z^l&@UpW2<RS&QPiNQQ61tV)8XxiW3BDfQ^4#{mh+Cf?ser8$Eu5+lD7JVOt(gehV*
zP~Y&1g{w)Ng<l)po)u(a%bsRg`W8#?lds(%r?C05pd`8d+_mTnPt at x(AC>FV5(BVz
zR^}p9H1e3X;2+}SC$DR!ND9FabbeHw&R$@Nr2qx)iO75*XKYLW$DK`JhlT(}rBdh;
zuP0^QEuw%o%sPf?%?I|wt5vTAS0Dw$=oj4p at 1yl!)@y#MD?VQN(XQK at sw9?)#=|y4
zi)ri5&u(txXS)om(z4mTEwMy#TiUFnmAU)=kZ{lGjoQ1$v~?cxO|EfVGx?Y7teI8}
z2%z#jId>~h6lt+M2hAnenfI@`e0RgOFh3i4cII}xwL>1vIZ?d_ydKn?5u_N}a>83R
zGAz1 at 8S>tQd4BGAE*8yL&}Wr6aVaEZLM|+Hf>~e&_a0~=)}pqC6-5=hE%Ql-A0cIp
ziFc<)^wkbTerwOFu#|WhjEmvb(=)o~VE9g<Yf24+0=EtuI)EBLm(cL>ZHqWEQ_J|9
zwpK|jWpxN}OlXPQGH!2TMJs;VxIA-&$U&ugXEGXt%Y6|4Rjp>E<9jO^^G;m5q4P?0
zzXMd&SbA%Fpl)!sZpb$<$eN$ncHp%LUvZ_Ec;7%V?g@^Pp)Z5Ar$Me?32)dA7BDp0
z+=4>6yK7;;&v9Mu%JJHm0%bN98|!-G%rLeCpN^v14>o&jj8W6;P{OJ1rH==k9yHc3
z1$#X;t~yMkr1VnHM3L_Jeyf-eu%86CU?!k+`e}NsfU9Ur8eDsH!INR!$0hJGZ+D8!
zzk7|1hCiKD^-Y4cIyL*8dJiq=VX-6q;|hGsP$B>eb&S#4w#+NU_(LV#6C3;zbBb<+
zw7~fp?=W^@+T4QW>+8G0DZmrb(ZLy_kYYe0!D!t5Rq>X0$Q3of7fTjtS<73+RGozi
zojQARrG0*pswV~9un5zzaPT4Dmj^(}*R&e(=!0IeGm}%R&X>aT^j%2NIH$?hp9Cp(
zwWcRP2?&$e at J<Cd8(Y|rO&E(N0Od!UhM?+RmH5S_G at sNsJ0IBkl~Yj}FCLX+>XdM3
zr2VQ`9a-YCmhGofbXI=OB(~8NmEGhPOxyVTFff`FG&>(Ec`Ou6LPqvudR`;O5j%-6
zRTS^z>?hjsYAPS~>(WWGu9_aT?aOg<R?6U#t%?)%rDbRsItC|kZ2Xz>q$|(hbZRiC
zuRf`ztl#Fs&f0`U4sWp7<psCc#Etb!<aVpO4K<Q*aQe2P{-bt2IDM6 at _{0lP`X)dh
z+q_yB49g#z<h3Z!p5TDNtTbri+fGcwM8M<_$NN13+>1;x9l%=NV!hH5bG=urBBBwk
z6%xq{;!!B=u{UbEUBf&nl(^M##hSS6Czdf&mhlpAUZGSM!(i(U?PGs9uH{~-+CD3;
z7Xs^IOIzUad4M?~wwsGl=h3-0mh|O-ETUDe&l*)LIN>$7O+ioLmEaTN(H)1Z78;3}
zkJjBaJ6~TEp~SWdD!6Z}O2bqciGcy8<SEMpxx4sGWQq(b8Ccf(6_adP5Y{iS^f2zL
zP(F~4Y~d;}%57`w_>jPkKX2+YDEyw2S+|qZYNBESO;Mm&ENsagAj#MY>Kcm{ggeY7
z2RE6c>S!n5GM!TvR?gYo3h&BkR-sT5T**D-?J;lI84VgO?YSVgX3v<iRud*uT|R~t
z^6B#xMoWWkssZxf*fw#WBZ`Ev9>@6)<l0V2Y}dZR#Ivti4U6eH#*jc)w3i38^CeD)
zw<TP{NaX7Lz65w*|5)+{e at +){c&1<EjSXMnK%Q`#)jxD;b=v2hDs>i^<>Vxm8J&Mn
zL+I at N{Y{HWvC5{zNS}0Z83xDr)8Lj;romTjS3M*{cBGIer{*k4J=QqDpxSsY>jdvd
z?5zp5CXO2DkF<syn at e6GJmq+V2)E3*aHLW!nM$kXJjTdQQu1Y{-OOG_yO%&T+VO0O
zE2`Gz?N+Lmgg|pFr}0GW8UB+Y*L5$BI;yaTef!Vnxbb<U`K-G$D;ABc<8B*Xk?t~4
z17xW-C($Ay4{_- at M4#{r7QFsyv3qZi7nLNAd^rRN+oz_4=udFCdcN4`A<=w7a(3Uy
zD7YzYQZKT#j$Y9o(f4Zg0xTBG8nEz!F*`fLw=Ab%=xpbTrmfPkQ&ftg*k2aFklu_i
z#n6#AB#9iZMwST%4%B-xD;_*|9w7-z;9TBHV%$ErTFadk2q6k<nlZAAmIl+vI6>rl
zpGHQ4w5+yGp{?ps$U-e+p+myuHs&I*ytUQ!TG`pJq-DF~=9hsl+2Sv+PzOhQB)uz_
z$qtD(w^9q*Yyx9Y5_rFX4qi;{0H0`7L20&wbn@`N7W_lht#S!@f%M9isqt>Yxmg{@
z_ at uVOQbt8+P>lR1B+;Kdd=?yhgXJ2J-|l^6tIEi{VHNs0^q{&#&>5x at o<q7P>E2z=
zM_AihTOad6k%U$cPV%O2)ySY}y{5#0yop{IeWmPF(4-6WQfqyBcDF3zQ?tJTe^{d*
zMF-;6>EM;7RDAdZ<0@=n_ATAr1q)9CYmL$EHUzfFf<8%6BD8I>-- at 4SbG~LJ?|D6z
zw3Uh}g|b5e)_rul#QDg<|2V<jOHPC)L4|G3E^5F8{5<z|@*Titj<FoU>sn_PG}=S9
zQ)>>R#!Xo((nTw8{@NNCP1Q>3t7_{b7d5LjZ(q~1lq6PCH+bZ0xkthS6JfhJFP-%$
z;KGd=3Xa}K1+{i>#9xp+`9<mJM at 99kNeyY{cqwMrmsqRTZ%wM+etSbW5NXwy_vU%-
z8`C at -Sfec_ND$3 at UO3aL)WISlOOco!@2=ElHegae^PRcMR1#CZt<mO-`ol@}YS8Rs
zi3_`u^puw<Tc}CNVU}qetWBG!Ky63Mwzl<LujlnG7qy+DR=NvzX7r)&ZMn*naLkBM
zZzctb>y5CwZFBRW0LXU;N&nS`5yMFps>L}CSOj>R9HJYwid9eVi2*PEfBq|m{9>K<
zs&V#oJ9=n~EUj~xiBSE%cw?-)^FQPV7z6o#to8Ws!2dqS;{T_TlK(Hi#wF179qk1&
z`RH&X?PhG`@=pN~Dm=N~7Rb}-E>p_~s6I&L-or@=5~G{JBjAge^-|;^xg;VD at 2l2^
z&Fp>Y%YMi|?h?^foitc at LO5()0my|j;IomBnn05%LfHo-vOYwP at qt+lDYM#!#9+M%
zp+w1TbATFk2sBBZrR at pP$vYpnoIiqRo8F%uWXtw(vV>5!28~E}J489YYTr9cS7!lZ
zP+OFL39QEUpbR-k6Gr?|qGGuLI<hIZ7$HI`OZfHEmWBYXuSO8s<(LFP%^Gp`EJYwD
zyTZyJ^?DbY-S&sX)W6ldXH(^jrKEF$adevcVzlI*4Lkoglb7g(M~df+Zkb&6vp!-i
z0~-l=Siu;yXa^aK=r=?idye|?dokh9C+{NUg12h1TwbB$$H;-y*M~kJIpzfqZv+1H
z!PlmKTv}A^`Nc at u9CeFog7h^>8J{jNA76^6lbie_12?S;U#+1C^vAa*S&b(%>5!cj
zWqPitR|r2T9;0c7CE~+Iqq;gnCu#q$WHRQ)bd4?e-#b)z_=HqG7+K-hr>1}nLHx>-
zBjoT?w!@*wIbNBvr%azGuc~&OHFMw1&xDOFqc<aLE2WAG$ODt|+-C$*w6E~7hq9|)
zXgKf+^$v|Z{=Ey^XE3yPq)QqFOgLs{LVEb{qOrM!;F38D4-BNbqMOi^7WB2a>l7_0
zVq(%El>8B3;R0g{M-zTPldPYcQhH8A|K|u<x}-m~V0{Ym7~|vp0&(Mx7Xm{Sj}7Zi
z`d?f(PF=7r!6th)kI&~|jeUO at XH)(_J7atD=&N0{GZ3O+0q8B;cOkJF#-1jfpCjK(
z{N?-&;tv}Lq`*hMGB-xsg?P-4u4WW8Er8Q&6aOE_kaes7E@(kqFnH{~3MRx*?zWO$
z=5Q<|025VI$#nR^3C6?M!Bofob at ja~lzU)V(<}R32^N1nVUa~rk69BB?o=QP{p7<N
z37!T{VPR~e5W+&d7^(I>3OPoyj%aywo{TI^ny_0rB-%7c0Vg*914xrjm|`+?R>tW2
z$E01p%wrEV&)saXkFe4@@j(&y81EFA?Vk{LGYVU<@F)5)$|E15S8>EuIj<nz;tzpr
z?gg-5!+Ad3;tAmX`A-fG&gf(P>Ck`{Z*(ggbT`^jE{ZP*f>D%Lbmc)|{d`Dce4aNo
zPq;5fstddyReeTW3A{n#HAFYtuM=1I_;cU%gB(nKloE?pzIrXJT(k&|uX#;tDWBMq
zwE^8yEd99vvSj8TVqX!G%-(Bkz#5_R+SA93WAQQA9;CSg!snB7<&hTO^4ihIDrp-m
z9-70(`1m0E1;l0K$3X2zaCK$>n~vR|^&@ud!!5ag4 at T2d;57>3@<T~Tq+e5j at av>E
zq;0?IaL6Sk(KC9krf|7ux$RJ?uGr7_Bpy=})p(c~ehnQpvzL}Ylj>rFX5(DOuX2&t
zRii$&k_h9K3d0mr_{=Xi#~PT)yp)fD!$6zaR$&vMRUlp@=6>4LG4X_kY{6_9pUjR6
z1-e${5Ib1-ij60_Cqd=AT#~8pt4WL|{8prhp++p`-$zJqrCRGub<b?yX_PvX2z97A
zAh>OJ_<Q8gshT9_OvG4A`IHbQ2&Uc=i$6aU8NH%uO1um-sWNM>8;>r0;(SYN+nG?w
z7B1aFM3h2(y<Z|3=K5nX$0{QPuh|T;zt<5+RVNX~6ZV?_Wa*kBy=0Q5PltBC_u8=p
z711#FKYpOri~2W at 05z;Cu(?7E#N?=q-0o3144(q^nj9<mVT)J((nH`Z(K0%1Ktvb%
z5KUAGZBmK6tCG36LSTME>b?_0#s^X=#n!IUhw3Qpn45)vhryWGLFZXL=c1WLV!R(w
z!Z~5M;FTQo6}QizCJ!zK7W;>T(^Nz?=WK`-dB2)^C3;pNhRmg#Iu4*booQu4^r|Xo
zG<NS$!j~{W{R({6;`}m}xRLWIn3rts+$TT(BoN88p~d%@n;Acnf_SjWdMAI#XZ%yb
zBgX3?9J;9Nls=xf at _NCR9yFb0|1ejEr)U96kOU?9mna`^yg}XyZX`eFaha}Lf{chk
zlLRY+ahx^Bqp>*#Lf=)c7IBO3;-#cXStyP~4-M?FHi at avXbMoi)`0SL&O8Qdci at m<
z<|0ZU;mmw;v(%4YG-Rl46#mGJM7x3QsEP$*T9btxadI1 at IIx}KMoS~3qmoKc8Clx>
zK2Ip$JyHFkKzx`Y*Zk=hgyLe2_ at o6i=gP}>J!m~!Q*#$SuvX<}ph=y%UsQHlP;SN`
zvuyVW8k4(pH{P!0AM1_-M1hKjN33S+n^@@58+Rf2v!oOQSD&4Id&k;I!T1bt8QlDh
zOt=L01LXr`hF7y*3yV;$l*kwfKt+L9xlK=^I_7aoKMnqacYGuh{snc$T#uw5ll_7T
zTNhbR1R46%fekr0)n#Q2&J|p|hAf-o!6pzK7UXA=lRPqJq6wA(DqxXKwj~LvMUu<F
z=`v;l>LBV6Qxc-pT>-05LrG(6q;NzJVRtZ%miC$UyVXzK>rsy|E87P#wSAVA9VFF?
z*q^Vi;=~9?AA9-7$^%MaeA&6>om?y2d4{#LF5^M{m`GW?te<ynI&5TQ<zhPd$p^v%
z8MgnAo%i9G_b;$z5oZcR%9r%D+iz_OiVv5bfA!a{c^`k){fesV>z(_!W5#`N#)}~`
z47Us=yOg9l6((-H=QID*n?L_=?{<FrWUB_lV*aV&4_JROWR$21bsk<=puw|>E4cY!
zLXwsNhl>xev_7&=X$n)WX6wJX*2}ZcUYW`#bIzs4_T;?d>u$IP#%{FUzeB8MpZ)iX
zo2~nNBi&=yES|r0yVLc;v;T6E3~%sPO6ugr7%+HrGjK4}N7%h|yEZp&2kVBur$2H7
zJf at ZU`>~6 at e)*5(+&{<vm;XFD`0wq3mO7p7Z at Xt@iT||fx3T{n`Fx}9?8ysN-n!hV
zl(F)-%=hNUn<dw>zgYY5&Rw&pv*YUy>Bwu<-8^U2+UDwPYA=*AKk)qD%?}OId*^xm
z{*ha^XWn$X@~zdKUxDYmRzA_+opFy>?&Xn;k7c`){~GQ65VxvAN{+v{vLiCi?T8s$
zq*&ztmjbs|)okO}JHFha-0;k%3W at r^Imi8L1sIm|N0zAny!bvRslw*N<BI+FHq5)Y
z=g5L$E1M;sEjn|H??=Von?HZ;*R8)lvtP4P+SdK>p{)(ivyD|!dw#P!yw8YLQ=hzH
z^$c6NwKp?l1xs_{?IPCO^!o<J?-6r}xi{Z;W8c4z->=9XUDmautbSX)b@$D+k0&uI
z7&0j^d|0|nYq7 at Ze*Yz=rBhrbum0O|;q}USse$gn^Y=Z96|m^i{Ol|H^M|6<;Z&20
zF14pUmoMwuq_cR>qmoN6U*D=IKAU^W{$Y)+e(k%@Gro$ssJ%7l_Y*rDDtPgVxo_Lr
z)kdc_{rOh4T{z47WAx$B)th=Y{jzvglWxnue&uS7?nh7Z|Fv$-TV-_WQ~RPDkp?!M
z>mGkSntgEU`)z;koqo at 6TPauOm!HqpVDHDk!cZ5owO=&ee*e3 at Up2aOD(-78e}7}`
zGsBrZw>vIM9 at XEvrabTeowpO3AI{yb8^6BqX^zn3j}HnSeg6OA{u|}&zp>wAxbp(@
z#SEqVldk0F|F6Ae^_QJtJ&Oaw19wwbxy>(?x}^F3yb1F+jK5ng{O+q+cj1?+e#1FB
zkNOVoFW>#Q`1;0q=aaVnUV9<%c+!>rdyf^C0goV>+w`0Ff0}&c>-W2!M-_Be?e3^s
zFaGzS#kA=3{|pai023z=a0)Xp0x5+=V1NUGiVx5?3=9n|oDCrE1Or9^5G|y}zyzcm
j4gsA61RkTB6%zk58vdKWFQ)5M4GI!ZS3j3^P6<r_ZKt^9
literal 0
HcmV?d00001
diff --git a/documentation/mega-manual/figures/variable-added.png b/documentation/mega-manual/figures/variable-added.png
new file mode 100644
index 0000000000000000000000000000000000000000..518f25fa151889a42e3104178fd9ce5c4718ab33
GIT binary patch
literal 112163
zcmd?Qhg(zG+CCh_G9tyX3<v_20R*H-ktU#`ptR6?Q>0hvEd<8_1`$xIfDjOAp@}r9
zK at ma^5Fqpbp$7;7l0ZU|-`080`R2Uu`42v>b&+-Ltn9t^v)0q at bw6<i`dS=pylfy4
zh~x322Sy;!37~si<(HGd$B-ne1PF8m^!UL&laTkDv$XK at tC`H_j3~M_Io7lx{6lQ2
zgj=)QlWDJpz^U0tzJ~B?liT%!HnUF&-djO0vyRW4WzScXOFWM}9rOL_yW=8XSx)`&
zmB-rQ<u4~+qfS|#@_5$6h=B6A-R$AzkI-zf#{}9dj=Qcjx at cab?!0zRN$y9XrlG>j
z7Q>4DkaZZt+z(Qgz*tu&iqO%}UBc~eR5L!Hw+N;dGncSlf08P01HJFCeK4~J(U*ZG
z*bkE`gc6y%$YwVs at kfGp!wRdahL-)kd>Zlg+ngVv)Z+iv5Q0?j at hC2L=Hxi#%08m>
z&BgM4PTMWk`jJzv1qn$EU?%^isl!Mv*(?WF_L+HtOufU~I))b>{=3b>((bUn3EOc;
z&&<4k?;aUB$B;dADMq5jA%`}26zRwYXXzcP-db4T({Se#U40Gt-=4822=?oIdW(kA
zO>5CD(uPJ-cN at nMGre`K_mK!QI=A2J^DI|ZnJ*`qMfc6V%&?S`S#Ac<<B%VQOCpI_
z#9Mq-{YEwPFzHk!^A!C6txo^n4I0^pe0nRo;|T{R=f=uF_HJ0~sPgDQwt~E(;tjMM
zH@|E#E)#f>J?2-uI-b4#RACW4vhlW0nuk9b^yb5jSO3!lMz#NhYG`P%oqQQ|V9*_$
zR#AJu0WpHJtzxXMu3lt6DK97Y(O2<3#<Sg17F4=erB|l3TsK6L2=4XC$LXZ{geg0M
z4)T78^1m$*Y8EQTJ2o-#?%0bc{t$_Vl@%iw$>prcRK|fH1~FGR!(e?8)z#H?Awkn$
zfcXH_eaLhmBSfdqv(3Kf2`pnK=9V2o22VzARhnT*d@|SHKIC|C?bm_+e%C1iW;7N2
z)!@<FM<4U}c at i|8vWlFYzX9*T7JVQ1FRGrDm at v&UpTsyU2Cf7tRj6OSeUUv{PDx1!
zp<a^dYf)2Eb0WteIyb6M^~o94{0#r2|FTyQA=D(zf>#f&H3bvqK93u(DQ;7&wiu4p
z at 3v=~izg>1Q_o7HgU)2KbRXJB(0zKxz8mpIY>^y^cenbKBNtO~d#qpc82e}J-{SqP
zNjcDi=e>>)jL*g%mk$P}x^D_u+2iV~3oTQlbyjUuF{pSy^_pPAiF7+|so- at jCKX1V
z>6j*Q+f(`IliY|RROEtqV%jetTWFp9GUcU4NBlVb0L9dSRxkewA;;UNdF+|}xFsHi
z*jJ#=jC=83x at 5b{Xu-mV&eu=8`ajwLZAI3l1CraGX{_1C<r(1zb5vyXjE7z2 at P0kA
zpfeSx=toj9jEsvQ<uvuPL-ur%!qQZWX;K89CNuD;Ynidriw}w-M^0Y?c6+p*u~dsi
zv3f#mq(1383R=pi;3HvG?3NX_n}HZ{QOlqo9-8 at q4%RCo={q9ek9Qa%Zhg at 0KJ3tT
z>#1>idl#TEoq`FP#*ub}=fnSZ&ok*`(8Z0W=?0(a>28ztX+1%VUxw8FVV^BDzfORT
zZG%`Z_$uPV9IKa4MDewT&{wyiXzkpP9 at 5gF{bc^cm`7{;xVoaEr#hpLd8kec1rsJ+
zn2~!K4eRD$)w01pTV8&CW802jAzRtl20<nU#v9bjpP+e>GuD*q!+fI7IE-z;A9CA`
zP9~u|9OiSKot<UI*Cr;u3AHnK1=(UdfR>e+S&iXmk1^RTfYxQu$P}HiiT(7VqT;d0
zHVv>U?Y$Z;x at xNC7pywOxzm24%(hHb?f)1zCTTmHk#W0ia?%n|aT0|xoslgZ2|JKI
zT=m5F)JNnet-|kPeyC|YgGQrWOoU2U);s3 at 0#afM_A?YJR(hE$)@BxzRW68L{*Z33
zBUp9sJ%7<`%UG4G9NZ0I52c3U{bmp|yWJm-s~9p5<C)bkS{XCEi$PZrvF46sj at E=G
z`S-5sG at gD`<iuDf%7ka0C*<~i(Us;Ig+YiOeqM8M_3$+hwwU|)FkjJsnUfptLSm|*
z0QjTdpE5H`lQVjXM=%-q!^U*`ZCrF>umsg!8}vvuq)rrbI at zW%nY`o#SUfwG-6H<1
zy2v4Cb+tQpJ`C8;31e0&s13}6X!?63gQUK7DPVOlSWy at o3B79{a^O>88EM at he)bpl
zpdhnp1cmuyOL75=1}tA+cuV84yJ$JmD$#)uZ%;3}pZ^9&CEtOz+hN2L^e!P0qx2lc
zk!KRv4x+UjlfS#`*DNL;?1riAO~s~V at W})r3f4^(8I4_tEV`6a3*eyscY}pO;<5wg
zT0)H%d at YLHoXfvE#);#Tp$!6cGsFwjBhnfZFv!3 at cz%Z*=V<u|Fls+cgV at sPMllG;
z*jUYr-i7_4^KG;asM(dXCV+*MVp5okSQy3Whi3s+9k6f{Uneu#s1@%y(vNmvxIXpr
zxE|5jqgrfa<fIg{A&)g(08}JJ8J_ef<C=3rCGpfQ5#ddO;LSrQGno{{Nps#0!n~{G
zIBB*75 at C8DxyS0mRLk~OQPzRPmc;F{H%~Uv>)#23Fw9|%OJF at N=6;#)k$=w6LNlT7
zhR at J<ww(Ds2&)C2afTnYh=eqSF28DOY8o9ID-<Wfs(`iI^<N}L at AjHspktv(b-4gz
z+l+I_h2$pcw%8Gf^uPQ8lh(-G2MvkNYjd@;RixQr-7%VLP*Ilosa)ohSyIFYuw<aq
z(NWmCHca>%9}TcM7-mu7?QEYwyY>2x8kby^JU}X5iP$SkXY3~>(Q@)CDrM_#h}Ibe
z1f}3TzG5y|dR^rt&FFp;HAaDr7q>Jz`Yjm5*aLH`GGa6AYXsG?&qY_MZQNWU>VN_|
z+isVp1d|>O$g3Lpdv#L6<?0U-<r=bPWyG>B>Qik!z4iU8C*ZlP`peDKEcSxOX#6Ly
z=07y3OS31pDsN^y;W0}yclX)K-q?UyAf7K9w at I1`b=erCmGxzW(+lP#ZJU;cA1IP2
z=jj5ryZhqr$^O*68r5{L-hOyMsZTeRu=D4gj3&7Y0aj||k>Cuf$TvLH=CW8sg9MH^
z0hwvOhDWW2EYBs0TZ<z9$6Ys7iT?@;YqdiXFesBa0!FYY%#IN0Yp3D1F!ma1u&RD=
zclFN86BP|ZTOv>lbP?s023(y}FIHiEtB2W%-^%@dt0&Oy`8ALY-d|)*HFwW{qtXTz
z|Ly#4fNk$VCK8 at URh<;DZ?@WYSr~(-f_xh>O)hZ2Q`%25Z1E#ART0L`LF$5teoEiQ
zc3YG0wUft!y2;&G`ju5Ovw6fz3c5OIYrA3f3oqAbo5>IlnzenOVeb>x7uj-n(DNQo
z>m?I9U1TC<@qV$>r+x?@LNUN5lcD*2lvY!rf<=kL%NT_MhoR!TSKjzT790%JVBj_f
zX^*4 at UxTj>(zrOmmbu?MT#bhE1wHs!klX`)D9mZp^R(5l^Kcc9B%ivnd7NO2Sg_p-
z`?M at na1V~y?O$yfV_3M&&f?HZcJX%eIXaZ8FFvVgo|M`rU7nfUqh4GkHSKt~4<$Ki
z#2C7$VuK$7Rw1VHbnG%j`6-VKZ`imeliP|;P$T$81eI0vrO4>i6jKtvH6}98C7Kt}
zzhu#^kvq#RgD=Xbxv-`km9}9RymcM1l1#K;-}-0RRu#y6+kGFz!xp`{BTDqYaY6e~
zi9|Hq!fq$`EgQLQJq({TxbZP_IH|UCc_h6Ub>UN6W at _Naaw)IFeXCMZEOM}W*{^h?
z;Hy)G)MWu<T*@?Qsm~U0IXb*pqhsxLD$JK*!IW>Suvf2MjlN<s4!LMGFzDm+4(_O=
zn*s!br{5knRxaIIaFVB?R%>>`S{MovE+^JmA60#K<j;`AgK-(1jK_B#(cC5nQ=MF#
zo%b{B!yZ%)Sd$tN49(u2>^3{JT-_FdIovea#oZ<h^RWWf2X@#}mjK&5$kas#Tn1AQ
zM1)0Z20<-T!M2r%S4p&<-Ez7;zS+A99|xn$;K-Y~9Ysys2Xg#!HHlIf#z62P-i>Ac
z+b&KST7Fw1b)rx~-ST~VZ0sHP3G2)z&qME=O<vu}@q`*5S97Z&!$t}RNv~h*+?RaT
z<ueE=DXEMno9RfG1h;R~m8 at xQH6J&u<Q31`L-WkT`?$LKIPrs>DaxP9jAE*-Rojjz
z=AW4Khxc^H+FrudBYcO;n|fpVYt+oC2Nzl*cA7ZNo`tXu7>Kr-T^=PlkQLs<>2RFs
zYsNl4olvn?V%fIjFV=VXo7Gchk<Z=Swq`c1Ye5r}0fFD19OmhpT!OndH7(Jbtq9P#
zW!jt{x16y*g*exOfrYgs7GF+!u%oW3l3gn(g89h&eoHPRoPpXe?UfGrDD}m?s%lJ)
z!3PQbM;ySkamsSm2Jx_4rKp}$7x`AQgq1jod?2Ofej-W|^P4<LPwI{uv05Ooaes|4
zC}E{l)LYB&oCa3`If`lAs+BA^YHh>diVJfRsZcq!CFylI+xf6>X&Sot?)TLznTb%q
z3QX at Y)9qeE%_jZ#YwzSn_izcI9?CaWJQjCpnjYKf5*kpfP!BN;KL-m9LX_Q|3JJr`
z at H2I5wag)S8WoXybjg#om7$;{@xJt&i1DJ;{t|W>?xRY5$Nw5gG{(XSFuPjaW#i^8
zWEn-k*9J4R^B1IHRw60FI{!!1{vb(>Tt(ii+E+ZqvYsXYa<*EDw?8au?VmXK;>c7F
z at r-Sq(Q;8A3}^Q+gk0*#dd{CzOw>Y=-9`kHp`LeLlGJ=+&ytB0`x at s<rk6)U32%<_
z-v}eAfg8SQ>>WevDrT-KA#H<U&lPgbm_r|r7>_wZP<V&vs~sVx*WbF$lETIUH$JiB
z at +8ArcSBmT*tO*5{QIfqFJ2C8 at MW3YkP{_z{wAJU7NK$d?O)ee#J`tJIoZ~Sf2w}S
zO^dmZGZ1V)W4QI9y;Fj4)UvX&8t9H%lwL`wBs%3V%Z#ti?tX+K>;;w^3k}9eC(EJv
zlm6Os at gx~`4X<G5O}i9SLI0}BVuXKRNyt59(%6)&MDP~GRQ39J=(#V$aNFhPfZZ5W
zr2hP%+m at Jm-rU^>4RclKO77|Mz*CiQF;UR_OPfZsbGAgBajCgA7+?1h<a^XL86tfd
z at v*tm^tx={G`3Hb0rA-qy#bPg&y9xI;RhpHWZJgTWJm22-X%fih2-%uz#b+a?Dozo
zM-mgSz5VMxWzdyUschReoSzYNNhXLNo$BWPvDh>`g&eq5y+=NL<HvseSC7f>%jD(e
zz|EtIkGBp27#0;`IHsaOqeqohxMum at cLp-XZ%f(NsIB{Tn0_1Fmgv+c9=x7VqhLlN
z)f4TQ9 at hVisEXXgc-S|(68I7qvi#R>f9N2BeB=9sFl2fYH&?Z at FlyZ}LuVRB`(3~@
z0Z*S2^TIxrKvdKkc_|cM<e@%LY49=*^g#UaHSgGqtMZ#ShwDEpbDTH^WPDAO=N0u{
zqQ=NaVIakFOs~#<h-qD<wb?nYYYk=PR4<Mb<)EsXC&k)9<E2|$^r;oU(k95={P2uA
zMENLhO<!R$5?Yqz14h2=>!Xqi)W<zCw938MgWaK)rTl(sjA`L!q=WPgAL|?eY<=g{
zDQf}K&@EclyETKug6Rs9&t&D+G|Wbhd^aNE#oa58LWz&VK<`SES=;NBnc<0BgY-${
zZ24e4_cN2rJqMFA=i+Xhd&CAx5X%vK9C?(;FT)#SZ4MbHXoaPymGLZ3)lp1IiPlN8
z%C^O}rxMpUdzzw=9!W?MffE5Mg|^DRyIuF0FZkdRRW=7l8_oHSr-G(ofq>xg&rp9|
zd%Fos!PKy^f%ZZ*9#t+msU5AA^S`F|A@~6I5wD+ at nVA`#x8-j=w(E`mK>Cp;0I5MB
zO=eLiqiP~a#QtQ<vQJw at 8HOs881Cw7alOEi3>C3IcGN1!@b6k39aEU<i@*;f1A^!6
zv;k*ru|12L?DGV|+-dvqOv0IxH}u9-?q@|QJA;#~GOyWk`2TX1tlx=#TiqDS at m}?2
zhjc*D5Zif8$+nvv6W4v7*;Tt<(@PY)txy`)G2~(E2xO$HTJUF=?^GQ&zH at fL#rew>
zg+epL*fo$o78%5W?@}zeaZop>?=2OqG5N2k at gpsynMc2Wm~_?6YAF%x7 at 9*jTs*zs
z>9TIRc4Y8i&;Qm#TwIWv&!g+Bc$v2KmXM=z$z1i!!_QN;Nbc4Ub85)NmbTKqz5~wo
zn>5#@mR=5xQz&+E-bUx>3ZDQ8wIp5H<<)(n at F~04Z1B3t-ogPCvw?miYLB%B6kKcZ
zNvd1cE{Xr`6O&R8vFh#X<4tq{@h`it#bx}jM>cvyZ&>S#RAAmT_Y^$J!?3-EbHbPR
z-S|~q2U^PRjA!r7SX5BdJrGWuAX(IuoJlo-bzsR~jRRJbgelKl4taP@=~#QTPH!2f
zz}Px^V9NXnokFyOMdUUlciHAc5(GWU6^OP1-uzxlg<X(wPxS7TY*uxH7hPx at F?^2e
zHW$3H(DGE-;zAhe3!wDMcJSH;2st3Wb!)tDHSl0wz?3HjPQGk{jy0D*3+1rJc at DQ7
zG+B8cnD6scEfMVrlz$>U%w at C1-O;u-wL^L&@~)WwBYDpO&=FC*iQL1|Xd}7hx|WV5
zn7e+ at V);T3{sAZjh9zAbQng~Jw1&)Mh&x-)ZFAR*8~cRJC#QE$ykz5S_ at VHUm;!gc
z`fs08Os$vvOnb6_dw1ex#}w?{i!aNkTPG$;R&!^(PrTkXJMr?K?F{S}f{mY-s3|&4
zXPj&!sY={uX+3Bb!6m6z4pv9qKQHLf+*i1fL=ffKG&Q|*KqI~2CN;m(s>rMQ{IJcz
zpo81}w|Y7iPp;STz>dFoB~qt4r`3rjHQjPbm?Ti9X-XKzHXd&c7$&DdC~Pi3$|f#o
z4)+$BOJ5zH)Wpk<w4LYP-`<OvDfSj!tW`s3d3Oxub~$g!vNtASKM7JuEmu2A4E9Pj
zFKMP-1SQ&-6h7%LnJP|47mtm6K~dR>nn~B*J{q}bb<zD!pp^tEd@&`@`^GuqdIg)t
zMXkyrPXrJre3z9(@8d_k at r|)bxg+bwS~yrC=i0dLhRdgfeJXaTwmMB<z9yV9y<mYF
zvqP>bw1(P1$wQb;r{JSis2kx-UD$e>CLNq+Z7pzEPoJpD4HI^{gGNWv7ZK1JY4i>N
zPZ<~3pvI2uPzZxEdpcHjikt%-bx~t}0`h;@G>h$(v!A5&81b<TO~h;~c-w`tp~Bob
zpQ99R2Y7SYg-;O5(;s>J6gCo^#-x-3UbJ at gkbD2Zq&}@0aWHayW4kfSA6h}S=UJ~)
zEYBPviUF at jyO3?$a^&f0r6ta8+B#VVsO?*Ey(wdC{^UbEXG!U|ArEtrXIVv+w at rI|
z5e3!z#E18l!$V+mdsN_R5w#rTE5-=Pqv(k{yibtWmO7W#Fey=R#BsQIuk$OK_0_-%
z7GZidCo=z<<JpwfnT;%~xibNsNzg0kU{Du=AcfmRL=!+Qi~a)0I$SgE9-&;<-;AGh
zQRX%GzFYTegrPGh2#w76rG>XySe`px^tWvEGxGxW4uh at C=^)U=lI1&FH~L^$hrW`1
z%CUCq3aM^sc7D=<yh28kU2uxlN-BxFqb=PIfX4;~Q1}SC+8A_RV$H^KU14n$^y$79
z*gjRHk6j-OZupU24?nkTD88SFw^y`#`w;0dj8}70m)y9@;CAm^*c&-||Fl|ZAeLJ0
z?@6HXCJ0J7g5!mS22jxfehu=SZBlYojg9YCRveow?1egRU>X;eypYU4%1bcsRxZYO
z%2hq)uaJ4RsVs^>gcIxOW^2r+v^Og&K0RJM?&Pej_=n3%Pw7sxn;aJSSERB?lo})g
zV?R&(I>pbt2&Hp>iTr1Lx|}F-nNysHeTv25>cwB!OUZ^AHq%_Le$JZ6+<>0tsiN}@
z$Ji1ZkgV<gWK@!XBEt840v~e8uW^5A8WXs(zU9}LJ6d=5E-ubsVA&{;_UVs%Rq#dp
zW3Hi1&<N>INqr&jmR}8UDUyvgg&XgFnPhS3#LohtilM!6rj2AqZX_jLH9cR}EaWi6
z)<qjM!DnATjBChf-CaEI*H~W$39+e4EAk2N=LN6#@#YZmoj?o>%{P{nl@)bFHBhP4
za>5+ADcrY6`*@T`AS2crHh9=di!sbMp5?Bcmfl}zy@?0T7DOuH#f{oAhQ;AUqG<N@
zeHM+F=7$tDRY0SYkuL6ViXPs-1*#UwI+~Z}BNzHC>kJH~Ptua(j(78xELi~*SkL at o
z+`+!t5u0o?Yzbw=@Ccie4%pd$vx0*?Ce(jH3)ei$y-|}}#nkg4p5$hW-XA+ixW(}6
zyAFWZmKg}&_0MhlV?Kp8GVg7m)aa^i`lj6p-09#jdIwnG2ZXGUhzbV4xB=@1w<$tH
zxUV{`g{}(iAvIv>`SfeMG*)V<p``f{ja_!kya5VEf^)6v6qc7wsE>J0TS(;@2jAyJ
z%6{M*@V?ZH&A`gZ^W~tAY)oWXV4B-ABMBa}O(BfhIYom at Tz=&aQX%-%O&wXRTE#YB
zgZy$sqN%6%9OqU95hQ&pmk&8B^Lll;5dv;dr<=fp$F`;^OQAkVbuHKev4Z>j#x*(<
zT*hI2t%`CgV+t1#sS(|5LNdpr%po2$Zr{OOiqjEi`}-%(o%cv5-rJ#qO{~3JPh<F1
ziX4%N>zxM-*Ds2n*Y5PHu?|UeD3+)=k7Qe{#gGACl^F8di6|hBJj(@ARa>3!-AlKQ
zsRlPBV>|%FetPMx61uA6aScCZybVs?zB<rpgvzL62)0B6>L+0<&`OF3-FCcKH5K2%
ziErJCXi<*gMr^0J7%3k`hwV at 8f1_TnX_~RPTCn)n$wegI)#q-_+rM=EwFyAV=ejxU
z`TIJZkuHxWJi=Iv)Z?m}Ux{r+24w_oO%=Mp671Owh*{LCR<{Zjr)k5-BQ|o$`&C}!
zH*xbhT-;>va!uHJLU5qtsEJ&M`m^#;q79zOV!!p_9}ZTkmie8%eQwT94-8(lU1ynp
zbkrr7)MVqQN>1*A<WQ^o3cbbzJw7 at j0IjH3r#hykr<Q#DXi}JDl`-H=^U4;M8t(;g
zgC2ZJas7iz5xb!mA~sV-v-$1qrvd*wW}Ev4O8{TexFY?Lb-IEt;m`Y50Z$J2)r6c-
zE6EI<x(uy==gb1XMzH|d3r1JY8fbaN*;KNTIx{FVI$N|i{F>VMd`L4tD6$2cRrh6i
z*vMn1u#jj8ku-%y*wPxBYnRt+M5pZz1Q1X7C)&>1tkkHVhYCk-Z*2`+0%=|=l?7oI
zj|hrykgGYb!U7{lu5^@OLh6~YB&gkU#B!QagjLLwwS$B=y3htVI}nF)h|eH)LS<z5
zjBm<))G4;!H`=oExSjW;o1Zy#1Hb3)ICA at ZK1^hJbqS?&CPma)zUqy4U;}=ltS&6b
ze6c3S+8nLk=l$l at 1HXQdO(}I!ilGwOvu$RJZ+?Q^o|4l;o|n7KiKjqIFzSq@)ASyD
zh~*CqgoL2I5MvT9=}{w;8kBC`%AZniforvq=+W~#z<G-c;y|!9utf;xuit`!6OQJQ
zRJ>MOg%p&oLe+q1bP;EF=0>5+l?H0>ZSm2gO>P8SFm>CY<E=tXqG;o)4ZZ3?p^wk-
zW1bDno at TUiP5;T7?NM4*m#*>3XmOaMkGrd(X`Qu{f<Wyb at 7oTZXC{csj2EX<Yx&$w
z)QXKW2$Q(#W9`?;A-j!_?{|KcWjj!X_uh&h2!*<^fjBO8Ns<n($>_oKpGC|_fD^Ya
zhTTbr9=+6IaJJ`lC>J+jUn5S7oQR8q1;bLYH|0R(7z01%)v8?7IS?mw_j7Ai&L83)
zt+9a$q2c+F{JO`ZR?1f{yrnF<$qUT6U`=}`!nIS%4#N6O$*;Tj1X_cyFn3TB!P+le
zR}ii>f>r4ck>c+iPdb?H;wJ<eNJsf0iqooZdE!xQAp7Rz&n;M5VxUb`qKMbDOY8Ow
z&BWf`#~e3Y;O==Rf39!5amQ?`ULz85#28x4jIX&RD)%wII4jT>oHk3-aq+HN#CsJ0
zIK(*l_EgB)zYk-f%MBUtSl$VMs1a&3)DkR3kn4DiiS<(m1?zjXJA?Ph=mWH(rQWQN
zm>GUukkBBNM)xvJgTvt_rX*`s$_yH=I$4}or3L<CBj(|1Y+I_Mt`=m9Nm7$Ee_Sz@
z9o)MdX4Lw1{=?ACUqRl?*~U~XSA#jy<t%53BlC7+y#+2iH+Ot_>Rh7 at xJ=y*67=Sv
z*<Vx^q(aW<UY at EH*}7%EjsdF|V^!(3`eABg48T8?Z9h6KOiwA`<<Bv>B7FgRgnRha
zsg2gq&|v=JZo3*;AE`dg-kzo|cxv>`b3Z+IQ~6wDTHi&$4Ao092P}x7PaBV5Izx`g
ze{li&yHk0^+0ztk#<%?I##d7f9^`-jGr9CrQDxo4bO at tUGe<4FH>^#SRhnMoxdQTi
zLK`159Ct|$50j6?jlfs!P0(>Q%F}+*IG4#EQD$nyA4_l>*1_7Z{;+^<l9G57Z4ycc
zkFzLoDDtqo`?<Rh;|>$0E`WCc`0%qDRFs~S1fIZ5txhe7(?jx+BG1q13+2jA7Kn8i
zOmF4klzm#7tz&3^9xb at lZQg#yb1JYJs{8ic;)=Wix2aBAK4!7T|J%Z+{=Z17f9xgS
zXWR-^T{RU%G<FSd8%B4;v))C$WxEtUC{}i8afiLc2s3Ilh>B7RQA6KUYPe(kB)Y>m
z40#o_xqC5^QMEyYwRkecHJ_MP_N8Pd1`lN^dtDyAdo!>hSiVaNf0<3?WYjuN=eV7S
zx@`#LPc?{n%oA6Xiron+R_AnL$HJ#UgvArVGsU1GT5jOWtQ1V~me&cN+**eG>R(z6
zFxZ1IXFlfBC8wYuCHmYFF3%q>WY3Jg%&f$SEqS+<Bwi1VIPE=xh~XGOUg$ZXqHrM`
z#chC}8IjnyMU-;)2@;`4-VKbo+R=IzWLNjn7e=xwbscK`NSsx4<A-t4Sb at _L6>p8M
zT;r^qY_v_wcEo;`o!W54&JYqVU7pQ3NkjSMV4LUKo+QyK)bLPu at 5lpqZaAss15u~t
z;%8 at w8UK1O?Vz0We=|6;Ag48Kpvtyc7=|h?Efv+%)0<QmIR at 8Vrbr!+dinT?l~-wB
z+v|ppO}1YbZhHj-G2AdXWjjnIuW8q>HH=Yt6p7GJ_j%jrG{9DlKP|RYTH_=6xo`t=
zNN1#af%WtxJfS*;l{9)*R at TV=e(jV;`Fy3<@6S#}X%JU~1wKojjw}uD-$p^{9A3{G
zO+F*8JDqd@&*FeUZf$A)wd!^z7z}UmL{N*gYN5?Kl at f?CiSX(3Var$>KZsjH%#p?v
zVxZ7Vp4+JFJ;VPgv^WE`imvm({5AmU4>&r{GH>;si8fDKCS?|v;*#y;*yXYB2Gt@}
zK>If?-wwo&wtakj-UT=XFG{Yw(M&E1Tz;o;Z2&bO%1bIM{bn#`4f%nR?7iJdy-4LJ
zPN<t-Uavu>yo(rKx`Z)l7_)ZFu;1JBf7SV+i9RQQukpNs0QsugF|$8cI4Jq>0AQzJ
zZB88mMex9enXpn$o^f}OpZg at Rv?Zndb>OtTDbG~kQBw!GIB<p^u??BZG7ArLH5-2P
zz`3{n<o at R;C!!X1-q^{o^S7#bRY{$TbG^+wHWTrnm~0^mQM^2Eg8lVU*RSDs&S&7A
zc%;_qHJA$4xoN~rQ9YI8QHR^8eE(S47UJ*6)bP=5YecxS-aEd{10)udgVjYNxO^8>
zK(bpZ{{2m*k4zntoYD2LFXiEs>N3&Q;YEdkXsa(vfmQm!*r9=KS!Dz71pKbavjr9Q
zU_}0QwnE_c7ON=on$zs#ucpu7B5E}ORcf1UmD#g`8;v2T?dt;3-j-Jjh?{&HEn&6_
zO{niu at v0>+GD+d|6A;Iyqq#FDj at N}R5m7+WoG?6iK-{paeT^pe{szj5OoEtKWatO3
zt!$OKm)339M(p&f(rA}d$&HTgiVQ0;C^^vfOPJ~EoZ7R5+1YDM&t3b7Upay;`pg8v
ztj&GqOjcv7dZpP-TgD50pBW7h=jmhUj6fRNyOmKcud_R|^ZJ{yEnJ4Z5kEKHcm}f^
ziq4W~VXj at WMT8pX6k|VmpY!`(^8^c>RGW68dBV18AoVCRfwCpi1{=f?UH$w<ZoSdI
zb6ZKtEdvz{j at 1V6hni#U4?x_TKGjlb5~beeSEP$FaQX9<=4x+{{`$~^!obk2ukqKj
z0H at Htu1X$Il+>eMe77-*BL;4I2=?-%>w&qfGOje+P)AVEs`|bR(pNm#5-$p|)OZmk
zIcmW&-x{*>8;^3uIRG6okK;tl7S*Sa!usoWW}{zJhkz#3KKW`SOC;e3WVy!zSM=yd
zIzZ~A5;#UM2Y2Aco%#_+FO~0P1Rl+!ek5TNf|5N1L8F1&K-Si~-<vJit&$#!P~O4<
z>K}SX0H4 at Pd<@n{$|`|uw)O~fB2v~&1dLb|OPs=du!a!2rOE3-6a8)U(j|~|dACU{
zq;p|7_i?7PJLuiP+)fNSrzy0?T8o0L`sRnopGL=5z0u_YRm9zE4uJ19RR-5vC}h2c
zrfb`fmMXo5$AG<*zbr(PJ)mK_WKKr$Es*So*xMue{OiEj1G4(Z2!*-2HoSNnKm3!`
z<?(ma{ZRoRrU^`xw2Lg+<G2))Z`|;b4Qv^_Lw^=Q^ka1?pI at m^Lws8h1++^HT6evJ
zM>lYsPsR>!1ZYgEh&)IRV%8lpKRUpUs at p!hsW!Z-$SRF}^{$~-O2Tu}|KQIUU60qZ
zA{)z<k032=j*1fdGoWPxdQT^d<)GybqZ8i at X&TRJ40IvBHjtGm?_$%?9OG-+{klgE
z9fj at tQ~k>`!@^CViiacK4f-TK*Ku}n&zP}kAojnlnYMwabW7)&!_>WIiJ$iVa?yR_
zZ-$;ji!Qi~wRKDx|4{fxx^p!NXEGSPF|S{#DsPdLV%<Cpiq_G@*EKra=3}{Gp~3~@
zk$x6fqeS!GNSgq)PS$0(swmCd-aq5p at S`Is<6t8YkJ<0aWo^c#FTy%=3pTjAp2Zkr
z{jUvMhFWnJkwZT{)K~z>B}Grsc4N&cE~{p1Ylo2!uRn<%IGv-+gBWet{SxukFh}`4
zHI2oTmbj4)4Wip;{7sa5XtfSx{Z6N%gv{F0fB9kko9ybhE1PkJ`X0{n77cJgY`w3R
zU4~8?$5z%~r(zkyduH>LkOIx3VtG~74_!#xAIX2=W9EmQTh;Wba~U>CYWc_piSl5b
zb)PXMPuoRWPusc1`mu?hL6omcigv at 7<SrvPM%mjs1Dp8XFs`pqb&J(ZIyC>P0FUtY
z??+$eT4XLDj)&=rlnH{@OFw?T2h+Exx!R2NLqZXH1g at I`(8}GAJ7m+O$;2mDWkDI%
zZDo1 at 6kTVtuQ>DZvks(nHq5c%DsH}U1~#^6FH*OvT1CP-KN8%QeZ~_TsN#9T)=b(3
z;+&bYG4^!{McVFge+?}vX};qQsWVAKv)?slSQi_&jd-HILWnbt+Ro23SMe$8Nha$%
z3*V2wGhgo6RSH%0Fy1|#d@$KItv^DLQO&gjpmNn*4>yI*8^f(%zX}0I(WhI^;cV9#
z=KherErbH&Nra5s;a^H0scafC#B#NreGg?GvvvizxM0gu$h#^;$)oQk6PN3bMfaL7
zH>x~oJ)~&{uD51vrp(RyY8Jfsw4Kv%?1hUx^AT$bnyvr1+^sP4)wwyT4(ZX5$)@8W
z)bzm9Yx(E7N1?$6ZN3j$2f`N-%^!!?^PHWJ at wU#EW{6enlpxjlU>s(Jl|6;q*uRQs
zS;l|FP#fmZ(^^RzYr_S~hjXX-b#qUI?38~S?(R}yEc~@nV=uiGz+ZQ5p%brA;Gg`l
z<kH|L`d?3pI-jl^;y+LA^uO-^2t#9BBoqL^Dzx(&ka1oG;HimnHz^gqZ1bCpLipQ>
zh@)g%kBGRfcMG4s0qKSit#QTEWbc*e5=H#NE7!<K{k`NB$MKBwD9zR1I~UP}>&Yt@
z6aK{Phe+7LN-c6vc>+UfoXI#uDlSdY<>}j<MWVj7ta!Fh=6Ks4?PA>Hy=qH5&x5Dr
z>c`tE=W<e>{))G-02}<SCQPvQrm6lwx6ak1Cp@^u7X35}7T=>=E_Hc$rsYB$^p at Z6
z!ky07i9}0<vqmi<vX>15yyvF8Z+v|8d(q+HJBXdnpA>uonek8R5MqWX?Cmg&Mi<1z
z#r+}nEBO$Y(JstXd#>^N?iB}nGB5kdWj?|2_V%c*qH;dR-%*igx)55 at x5NjV&{Y?g
z^mKIrrz7J<V}(zyjF9QvKbV<nYLyEM&%?9hh(h%#7O{b)es^&l9lQbp=~8V8Kf<`A
zh&(UJ4D$Qd?Ap!LnAli=%lWKon(Yc?oCks%$2l64+aC4D=x)Az06W~C?&*0<+TZUc
zP*enH->Y>wLFTjw85frT;#ylOv^KbDcYU#Y5hW6jg5qoXTj-NBCINQI<z)ct()pP%
z)cLfQoQUXe at uKHmJpzKEfrl4&W93vl#Li`B07zHLBEBZ_BFyA$oV(o_m_Kku>*?E1
z0AKS}5oEAVjnbt)T?Emey8)nJllpH8Q?UdLm$o40y!v!$QN!FYz~)IlW#L&jN2he1
z-|k7pW at p8-mo7Vuec)dFnlAZp#TnNZEiW5jND~{eFZa&brg&^VEeH(78YcBmDv^p&
z?XOOGCAiS!xw)QyD-s3!Kh-oSR2Ff*5ciOK;Kt_>YFKEOE<XBlOTH?A^7kOGokJT$
z^iRT{+Q$p8ejsOmqemQJ>b{Nd<6hH6=0?-Mfc;y0yiy at 83rWx;m3#JhURxfQITZM)
zvvx;?pjA~eBMltu4ZCVH<3!gpX<Xa^YB%S$H7huv|G_c!H at ODd+}<7s__19`B(R>|
z%saPlr~hD90e`6ml90otOwYJwwA3wqJIuks7yc2U at swXWk}=tLa^vDurYJ%gZMDU!
z%SKa6t3qAx+-Bn5NE5LXNr7Pmq$8`x92%<VbhxDR293#KSnNh>zZMNeI8VXWX+EBw
zy0f#h#O4dJp9MM|fWF*bMU+mqIN$B}7`MsBJYA^zdKsoLqV6Ls(fq4DQye&+FZ<r(
z3Kex8A&htgc<L4ujAwuSfYe0FDc`Q_=_!4U%6a#0bZ4hTSok;fU}tAdM;tD`OJ3RC
z3wV_0 at NSB+ag(esxTE9xF0y#6=(SL(8Jsy*vj69F<-ul_MYkZ7HPhsV at Ia@tak^gr
zw_R`-)>WAPs?)_Rv!?oB>9Tl2(gVljYvj)<j5kk{pAJ9LX1+bRS+tb-Fz(XBlsLrM
zBQq=5JJV-E%y^e;7p+!2b*p<KbKLKIxlvv|<!|Als*y>- at V;kuTI?gf(qL`*RMk^s
zO6P3ek|0y$&okki_z32gZxjtC7nS%=syV6vwgeg~)zs43QkON|l{qw_QvFob(Yxo*
z2k&=D38JO!*FU|KD<&;Z%>fH^QmVBG*+zLsZV59hNJ+uZF*Vsi at moJQv<eqxqV`X+
zRov%gESfiz)o+`6F=>Ju2R+83C}#hvz&ODJPa+YH?yjmgzWdC`*x)103NmUqFNZyb
zQr414Q*Rr7OK`-K2}R{TzOEJkCS^(+DTDhcCd(vl=Xy*XE&I4K3CuiraS)#5I6w|7
zDlQH at SjN<n at X)GPy|!@3`q)LhI_!MW5Yj(U<o&_7?*1B|O{b1Cq9J5QwHntTa|YcS
zC9CIe81m@@Jy!3b<M{H2w+DplxA5osUBBBj>_Kf4nJ2^OXePiNx}KE{LzioOvU6pw
zc=orY9=5G9 at 2NBXd9<(8mGb3#eOZ~#_3PIYS<Dx!- at bjD3d>2i_XdR3-Tjwpne;7u
z<s0HND<+@;s at YOXx;9me=BB32zQ1btnfH&~9b_)zp~hFi7TzzT%b5T@#5yN}0)a5K
zm_=RJeTwc-!0OD4t&l}kdR{=R8sp#(`unf>S0T=OW*l5eH!iTbc}Cb|BaS!{5|WC`
z!}0Y9uqAeW{*6s`!-g&`G%zTz_$KWD6%1e9s4I7*lPS>hU at X)3Ar0li^xh}U`p{AR
z-;0;j^8PE$KSx{@WK#y1+j^!hqw!7P>%_z<S!TLQZnS0e`JjV_Il9QP_U{x?Wq#%o
z=qC{$iZ+6^Op$)Dh_wL1 at KiG*XxI_@`LK@~JHkIjgdrXs(g&>R0Jl~QNW=j$*bk=e
zA;uoFr4nqMu5&ypt|{2Z;0GFsgVHkLxnZ}LtG%#?S_!XTJM()0j2;3+^WTLGhGm9v
zpq<_{ao)?9YgtS0i>tP4bA5T$YSzU3`t_b|qo0t=Pc9nBw-qJi4iOUq>At at Su<Vvs
z>v(l{ZzJ~WeB7Tty at n(I;7hK}wcewn&pRoTzG{&}UVhDMV@@D8(z=9C9Ajyn*@<B+
zWBZJ9r>DbhxqN8ey at Yct4n>Tlw!?bH_OQ`xYcQBwSrVU<KK>AASql0zL`RGuJ+AZr
z1Lpp>&S4elr(T+YLg>`M&{jK at C|+LP&rBO_p{na>K=JI>sN-RWW7}9fX at g3_pEwou
zp2-EI+ULN7ChOw5*m-U9-P=ITK&xts6hw)#-O9_yXO1k?=P!Zuv at Hh%<mIKM)D8P^
z4a9STVFw-wR0Cx0&bYwJhO1Z7Q?Ut2N%(c_7FrfjHay1~Yt)6K(8kEamh{S%JWc>6
zm}}#U at 7kkvNR>6OPQ4-{exrpKB*gw7Ry~ZN;LLn+_bwWZ1}Mp6apy%wCnrl)g122=
zT_3%C`7-EA+CiwVuk<odSK>eBUZsv9kCY8<Rhcn^w`UApT#EJIE9MUm8v>Aj at w4lh
zVgSJS=N>Uqg$ZP!CtiNtWN`=+(k}u?lDm6h{CRZ(Qvatsgc(M8%-l!V(ZOJF-|C*5
zudl)CU=CV^&{D9n;_S}9krO;O+~~h52ULr|P%bD?f6!6Q2|$>gSm-?#hf0o*=G2q^
z9Il0!hH;g5|K$bO5f(JA<K>o7#>U2EJ?S6r>xbuZp%QjO at 3gYn0t8>}q+lgHpP(S-
z`}aSEg at u>)4wopjJ!NjT(*R999`N+~eAWppEAX_rCw&tCI9mM2uCTv>z*eoVyQ%!L
ze;BcQ7(qq>j|(;3^_Njq$Kb?mqrH6^an^B+^Ri4}$5jGHdBApXW?Hh|{Wl@~)rXS(
zT^fD#WXb)cOk>cai%=&H(0LK#-8j>=)Ad<+>#eQ-QflzC_<&o38Hw-*{i{$Y?o@`+
z&pqY`vtOfTs0jS`ITtgZZrP8p&N5#{94SZypAc_+IZg#tlF9$2y5wJIHKv)VrwU|7
z|1Qh<(Sa*^q_}1MT~c5Outgg?x~+<;{!yv~sQN{_xXV&+ at zM9M0*vt+mpS|7^t^y#
z741KxdhR*+ at w~H%yJ++uzo;XpiPq>Wg~rWG{mOWF?N_g?oE+2N&lwh7k#0RF{+|<Y
zr;8Z}We6Mr!v+Qi-HidB`sQZ&$jkO6?K_$OF|;JXcwNcPZ$|-OWdj8Udes)X!>*&1
z-(U8;xbpv%R{bzdd=1I6txM%nzs0-#D6o23{m!=MjN*xx|1rsj6+TMKAw8B at V8lg`
zu=(z>|NMH^J}sBxl?8*De;5(`_#Z;sV3aNOO9_Gg^D6v{drERS#o<4OzOsrG(m4%c
z0qW;~zYE;Q?*8}$f%5+P6?E+H?!(uhvw!z)JUt%uckk}6*Fnes?!Mw-x$<|<;QKHC
zbEBwhnxJ3)zIfr*vAciw{(pSS3Of)_La*GwH!)t at x&=_*im$%^_)qahC3ub<YoCje
zNlQ(=nXg?}P;Mm8F|e`EdA`!2!&kW&9~OaEmHS(OT4g+-ZJVc{cV>kuV-Zgr>S9hW
z4XnR!W3slFwB&5Ld-#}#`_<L;spuc)`tgf)x;O4r6miOM_5)4T`76C5gta|yLt7TH
z%^5gHX#Kh7Q8Z!DO;J(9$Cf!U<{s^LIXf?dZl^g#4$LzDH9#B~U>Mh&MmX`ksXIbH
z173)=A>>N{wR=Av0_ybSKh|z!ijglZb;}1FRX|Bsg-mSU+0#Ow3_r%AI)BwX|MyNZ
z=pVldnkk*TS^C)bi at Dx5|D;AcKSzY%l}}G~k)Tgs!x1R&zxNdWEGWHH<Q?r$RWHp_
zqg~i1G3^0l!_CJqA-p)~<G{_Ev(?69fdd<tx_`Z{i44rIGxhTFIx{u}C(k_(=gX<!
zfZv?1cBRX6NbDvSM~fK3Bx^_ARue~Rm;06~-G)vOLbmx+zL`M5&Aje2Vmj6?kKIap
z#b(`Iy^Wz%#q`eN!Fsbg<;|3N->NJ;oIAlqYf^tqu2ynR<V2-?a!mMiKzFNg;p2S2
z6 at Pap3OHb<tiE<Hzpl=-wJ{fQZuO~V5mjZ{B%>O^KV at lIQIvj$cgN|`Ov>OEx&F6C
zerIfYQ}*aw?i%Tjn0UwD>p!K)mCC^f(l)F!%}_2cc%Z@=sH|4iKr%2=Ol{Q`$Bz=^
zavh3;o=pX5RP`?er7c%8G`3jB;Vl)R687n<vx%`P*?U&lZ(-T;pUx at eb*PDYteJr0
zRjR5@#_Rf?-{8bcRp8U)DusiK{6FaCxFLPz$zZVUN at nR`aIfuG|66+bbW;I$Q|*?`
zPcZ+B8OK?FOv;xz+0K&palveL=Xab_yPCWU`(J)z`hm__5iVp`m!f5zKDJ-LK_#Vi
zrFowUYnxR2^yA<)S81Ewo{)N}V73gjnrN+<b!zB{-3p1|>1wJ`h^8i^O2?+vqi0Wq
zM58)?&rxzlDrZ=?#?foP;~xEOGur7cj;Eq_OTR8O_xxs0zGPD4csJD^pgrIR&BQjX
z?#rv#EY8$yHj8KUJpX2;X66gqR1A0$J&y3zuUKL9sDo^x{cqih5sHNZTi<2i__LE&
z{uc3T4grvMD~A&&{xJuLR$~`w1 at GP9<yST-$g$j(v$2{@4>QNy=_uh>@tdjr9ipPr
z`x}INX3^J^C^R_CNWZ)=sBelHEt$%>etdfJeJI&hZFfqf5FUUjDVoZWedd1YFUcqL
zcvR`&{00FQ!P;)B#4Ysjl$Af(+<)y2Ts+54)@;jjBkdWyHQy>N&D+$aaeXi`C(W;U
z7HIGp%hGWhZ0qTtbG`kZLlDH-fKfatS`oK%W5cviBg$~n_o_sH9K2yHG-s<P!+zzL
zf?m$L-ZrMjXfe6z^4F2XtW-YD*AzLGQ_q|@+;F$Y78T3NP4seDOH~FhoB5|Z6z2!W
z-P2Emd at d+5#g&S}m9yWoR*z(n{}}gCuL2BDEa$p`UR_YSX_>+oDovyc<XboR at Znhc
za`Ix#nNs>gWO!h=8`*O`f0V##VltqTLuL(T`B8cenvZN)U~PBsdFi-j$c->VPrpC>
z-2FP^-3kwOP?+%T{^YkC!T1lCtVTY$Uv>$UXfurdouk%F<<DrK?!h-3N4Yw#WQWEZ
zr)Ydi2|Wt!t_O={^ZRTMTdvB9R~U(2GOh%Ds<q1LxD>R+y9tXp)^4i8U9)dKd;3jj
zXWJQ07Jq6ZPe99Pu1 at 4nqxOY4i(zpv_AwY-c$leNqi4q!<lGkTzPot?DebN`wOM{b
zmGhptTcGudh~fzqH<mm{gD+^MfRxX+zv0t^MNjA9)E;NO&3t~PHSw#Rc6X{gD1hPJ
zQa7RA$l5-p!hOn$-`Q}xq|XoIihkm3pDFoq?wp0*@u(ky09~j^5CoA&mC8kk{89Qf
z+d(DNp{x9UB~84=m)suL6kP5o>90BbOtLk at q#T|u(vVL74HP8Md&e%gtYcFu8_nqX
zbwcTRi>x2jsc`*+d)Z*bX^&p^)|)I206h#hg?Y+c0zfH(O#oH0zt_3y^Q$a?A|<1T
zhC3Lne316Lemv?{UGA46^~g%=DvH*)Yxd7s-Ql?%0ea`9nsZO$(7R}`&R8`r>iext
z_*>(k6*;?L9Vj3Puj at jf{Zj8(<GU#yE|ojWIr_MPTWI}W*~_-~*P6^|A}*jWuT~eM
zv-+{-69(P!qJ3%>Sdetlc`Ydqv at t)i=_8dfDL*0k^MPD3zy?+x*tB}bqL`<_xqvb%
zQ+l3LYRpr&c9Or57Syt?X~*JVvc*ZupIpzHSc0tiTJCC}jB?^=Rf25<C<O!GrbF6*
zr&8G4$CSDC>P(z-RVQmlvl~BJpn#`(<Tg{=_!&a6QT at k%dJP95&rQ$}QTU{g*yN<=
ziTj~*^7U_&Q@{M)6hY+q7Z*Uj%2yK6#{V+4rGDX#js%5WdbJr>=?Yp4i1SY-k~MU=
zKsB3tbyMm}Nn7xo_(7Igx+<&hlNBtOw+b(UDvXJO&fKYfHU0Od|5}~T+I}Wh#-40p
zWb`2?j-VzRE`z<B|Ezc_ENpBVU66YpUSp1Hlw`5n0}Yw%C2O?EHy!^{E~<0a<vCTL
z`E$(j$taH+=<aEdIo>9q>G;GUCo;Wc9er>RVpT}!A^ie!RDND7F0`Y=#R4Thc1Ww|
z_#xf)mrflgqgcJ<EuA%mu+f;+v-6uK1fy-gY|oD4QG at u|=Owb?T=$9%#HNEcB%Z)h
zP2dXnv3mXBk9xG+HlY(gp6Mqz4Q%BcTJsxHsA^#5%Z^c<Sd22r=JF4bPUmh6fz=nc
zJASTZd1~M<pqkjL!}C#ATuQ16c4-n;7SaBnOj4FBtCL5kZ3=p|8)mj2n8H671zvTX
zy33NcH~U6>dEm49DXZB`n7LI3uCkT$^K4;*L?3 at Ja@u5LrzMr31%xtReghV`+P2ky
zc%61$M?1**v|SECJL2kcK)+uc at l^!U;dAE#R<Jlaiq;xI5&StFakrlV$N1%ue2r35
zW8;b(r@@RPVRL_|`{DvVfD@{Wlr2_on_GE}dYpNy{>8Do4_n~@6M}`?<FA9~6F6&?
zBV!i_i)IwIZn(A(9ZDr|TW at P-E*I2lb{v+gYyF%P%(2;h^=Ul=E=$3nP1Zl5xC*1Q
z2Q%)O3rp77|JvB0?#%dUX+G@&F^!E~+L%+*M}M2Z#9(^~(?H{FYAl59B!qXHU}&6x
zo)~e~^!f-gNN$+CI`lKtN|*|3;ia6ASDUG-FXBaB3O*BTVE4y+g{B*(dj8E+0HeNh
zr+n_r0K8xEjD$dK;VE4m4iLtHxfJYazHXB`I=yt1B{pkWK%Qec{No-6g;Mf0XPG9O
zJ))ty+RUDjn(C_MRL98=H*{LQDgn7a|BXZa7v at jdSy)p{L2Gj8$H{-R>h;+%KM>-l
z9a!?@@-{9`ByFcNT9O>+aJEKH2XpOC$D_(xp}VT}Wqy*C7SOTYfc$ziht&w)ATc}f
zS-s+sj?_2xpEor_LC%BBZrd1C(r$!UUv5K5RQZ*uLs<DFL8%`)wm20kx at 9fkZvO0s
zd!PScanLA&d<F>1ffVpnWKbun^Wu7yi3B~fnGf-1t4JmEJ#w;NcP+nId7pls74Bnm
z`S`j2k#&>VEl|IYrs1HNf7w7bb4%>xR8HGV37xHy!6Uk-e(+zmNI=R<c+&)&Q_-O5
z>`aR6gMpssEotx`zsdCvJ5}g~A|6Y!*4(XOu`SsBq^(!E at uGB6Nz*(-Y-}7xx-FKd
zAZ-~0;>jGXFIKLtAf{KIxE8jTrt>HCZ#~F2Jp-a;D6+z917d^BnoKb>!i1f39W3?;
zE6&E62&8p{wUc+9%~~)g<O3^waGxIN6n!e{l1uaB!58M~Uf*FQbM?Ze=}OSxY|}z`
zxtkGT=kp4E`PQ6p<|}y3;Tv3nytcNs$x5X$xV~Dk9J{V5U};vnNJFlx9DI&>Djq25
zyjgWGt?`fc5t*?%@{)YG5gWXwP+uijkx<iA7!msHnGrVWRHS;S&s`eRH*V)=8W1I4
z>&`OY<=`ICUN(3JNE5tFJv_>+tfvF=Ys@>^F0y^U4MHp2^Z^%7O;2qKOiKmysz~4T
zpEPESD5Rs<RgF97txa#_a?hyRC7d!3lMdw!jV6Pw16LewA}pVm1xucUbZl%j=GE69
zgjrjSjn9b^+7FUlA~f}k at 4>)09FCWAxU_e|Ns{#J6$-TU+5V?6$F<&`in4g#ca+#h
z)010Eky<l`y42wMyM%0iqeY!Y_4oRid$z{@3`E;mqd{k*L-UTc=ke|yRJJ<D at _GEc
z3CQ#K at u(a9tiJ&{%Q72CeAyNzp8ZoXLA&=se|<X(DjH2}8YBt){&V<UGhp=V$%4<P
zZh$<y&w<j-Zo7rF#{QkDzF}p#!j|%m#lq at Ca`H$>TFJ-q(i^PpE4|-ypgN{jR&ahN
z6;nvby)D)M$KG2;Rn<lR!kg}p?i7$NDd|=~kVZPByW>#ONJ=P3qbMEHeE{i3x<f*`
z4{(Tg`}jQn_r4$R$NP at E2V-o;ID4;{Ypz+px#mXN6Bqucz2Fx7|HGVQhi)V&2yy){
zfgvy&@Ij9~jy(7;LI1B~4*>t$5e+CRDQ at KEg`el|2_{buk5@$Uj#qwHE0SZd`}&xH
z>cFcE_Id3fO{C9j+Sib<ztI%IN*CeM!H?W~U<sAK8DUT5)h8pkz(6EQaQk)2Kz-m{
zQJd~m39a~4D;qr>!fHVNbx#V7Ux8ZC`4E$%UvcO>aG^MAI3ZhcUUc0v>6b$TF5we%
z;|g6QB&0uw1i*;aQ;LEo at 8-wA;vE>kM}6&9a2W304_x#>3*PNaB+?#@m-^gZy9AZq
z(a%3dl>F{QfifmC;=6A1J#iwSPx&bY6JTg}ccXcCETpS*n}!cKxeN<^ofcorKV`Q<
z1Vb360v;Y7PY9w*VLSkxGji}?>BE8kiG>W%&>?=Vw9<rTpcQyA#vZU2&;)jniw at G~
z2}NA_zfXhv5r5^{`(ct++}*ZSjTC%@h#pZ2fKeh!AxaV1w90Z8SN;i<=ujZg1;cR=
z=)g@{v;3As{*SL1d;#8817(5dKonw`cdq<DF)Pym at Yb+`4-f$PQhU at k>d3)h19~Rl
z?NA6g80>P)4^5v4ferwGY103iT{W+Y;_~b9D0gNkV)op0l1i at f*X84`@Kzy3W3-jD
z78DUK5_FbQhO<BYS_f<KTeAOp>*e9153|~0dNCf&d$+sec(E-WXswL<Is0s<TTQ{E
zDoB6khGpue-|_BOV=7Mb{S_?0?`|SWU-Hs!;T}8#<Dt9~WOXOo at N(3{{z0++JlT_M
zFsa)FO;;gvbODEjWL$nU>~Kj at 7PK}SX#ZzYT!Q?0kyJ>jPPNxtXL>K>nn7djYY*>>
z>f*p+*^EytR3F=X){_LqH>Z9PM2OC9PksHyRV3hR$e%oasTCPG_3^n3!~BCvB#oal
ztHJZy6nr~_v&zm(imjxOku+7R))pDF83EsedzSMOn19ljo4dV7R~NtMhf3!^Rp>pm
zKGZ$#hfBlm2!RomorDKT2<&olI(<7XThjDC<#2JQO|v}T&SXEkp&_POrWIn{)Y-Np
zPF%d~t2wm5&nosCw*}4=zM&fYm;w!pDm3f;l3<UZaL??Icn;-EWRefU==jg|tiKc>
zU3#08hE6BZU?6n%4Zt)nl*w&v%dDw?&6-F?;)*V_o-MYyLYjB>vpQD&bZ*-wwp4`(
zr5G3(@;80}iBZdf*Z?^|GT65^S41hAczKDhX8B0XlE?lmH?J#RQ-}>~Tu at h5siK|3
zZ*;-cuI7B3q}OU}tTyE8EoFv+wXVb$48OW at NLLw3+P2s=-Q&a83bK(%$<au(KUSgi
zS`~iA1m${X2(yYpw at RyxF?Ge~u?8|g at OGZE$RPt)rWPKw-10eKrI_kcZI9cEH{)_C
z+Pgpqu&sptw9H-*a^ilcN$r)%K9#C%TYcZi0*;%Zs#OJZ+yy=F75bVUV!G0e$P+Sv
zV0<A0fes03Zg-q_PB*yFtw?Q`SRbjrhb<9E_A`JhqORPwz*~c4CUSf1QaEBA;0fLP
z9OI*iVIxslzSdcZgtMKR%aIHXUlZ93KvPX$O2dvqN@%b~!J+mt#OQmdzZ5g>MB9 at 0
z_qQ#70w8;hPn-4rhKFx^@}S}5P6{qka^bd11X3Z<t;w_#V8)~1KWE);s*ltjMO9^A
z$o71Uj~DK`RKT28fsYq<?D~=Vn=^6^O at xLO-pMO~)@WXeE>-Fq-%!JW8T#4~J0QhX
z8v}{w>CB_f)S0K3_pY%J at DS!{_|);$o*W#I$H*ZA&1?sXfgbK<&(_%3UPtvSg}vdl
z!8bf2Tb)IeZ~YUSVVEalxT-lYXmXNEfZoA at aE!D!Vv<{NV at g<mq|-qwBoCX!`p$=B
zzyxb_|1=soc-MWeigV55fv;TBaH4#?*8+i~X~tC_<F(pF(}~>g=%%aLxSw}4*zt|E
z)^{H5Xrt%i+JwC4#-9k=a<CjXLYJAuUaxe_8H-ZfZ*@Ktp_Jlgw$&I at rCE2nNfnB@
zcTC~<Pl}e+!oXLnG3ZEVd(e!2Hke)oei^sV?&-zbJW?F1ew#2NdWvx9AhTG$+=UF2
z122|s&u8x}XP)kRLDV_Rkze&o7VrU&^XrFCkb`M5uVE13GfDXieCzu=(#&f-SO*MF
ztLjUe<C~I`LmtHS+Boz2oMz;90UHVW?ny_lXjh;E^TaH6K_$7;>P?|CMyLkxedpl&
z26e#E6WJ at e$iP$h4R9==kV?0Ie#}=cHhuAG&q$gILiTjftb4A?6FZ)hb*+y;5anem
zB+VC}!{36NZ6D*p!Gi*4dnTSpkBTGsQ+G8{unH0Fe)Yj`b<aXulIlZh4u#Z8uGL;q
zkd at C0yCh7^#)+YXma5&A3!&aOGnIuAuIboT)XG<@5mb}LJGC1%&(1}XJHIdj37_cM
zU`^hhYRy*q&9LCbT_xAVrjH$kp13dqHv=7AZ<kSG?Q&a8BS|MyZQGcX=Vo4BC`Xwl
zZ;?%1RdB7)W;RW^KhAa&>grM6h(m&Kaj2_(k~EB;ADB;6g=%kZk1L}cN&DEKAgu1s
z#(p2QJ(n<4G;nU?q+QbMTHVP%r5YU74TOl!_e}E&e?`r7^0@@|nZ~{b1fq~mj(Rs#
zru9cI*!jTJx at c}=2uQN|xYrjqTuw66Z;nho6b~^V%i&lFLN03&w|C+K6sVWxSA|{i
z5z2v%U{waA`@rU(iPM`VLYXFVM|Z^j{t~oSq;-3YUB_O3#MAucGh%2B-4*}j5atAY
zf4dN2)gD+e;HcDkC2_Q#m!SC)tdXL9_pLhwzEQ85FQRSP>PcDeY$W>I>bAHQwX(iG
zveUYBvM$v at x9GqHn<NJ1_3x-I6i>{YBBh+FH&#cpZLnTKpuAJ_RA^|X at 9R%J*O85(
zAP#DqcG8^wtYQCTiR<ljBLF&}Rs#3;LK#g4zVmwU0;N*ShRmg(J|J<9R~kzLKE*tM
zN_dKktLQ^xid)MWdlX~n@|oAuOqi**ujsyU7up?rCyE$zSyOf>%69G%MnRHny2ucX
zS=cXWBq$53jhV*pgRiN1{p9DDTV1K__u at c>OMzq%SF+G)>&`j7k!&QID=?Y at Q)3qw
zfIy}KzKs>(pc(&Ir}2<gfCaZ!g1#Q0Aq_M<+fxt8vqT0QMw)8fh4)5eaHwkQ3T1;+
zfmeqjPgW`nZA2w!e)%R)9e<S(E(rh1>tEWo(*8E{=9&-(pl&EX7nGO5omJi2O4Z8g
ztt>CgD!)C7kpAd at H&4~9SIfDJ==pk<)8r_DrUzg5sKoarsY~zaTgPa at lF`=NYx1Q;
z7{`d`=IHiZ;jNL+SAWu9kXrQ7Wt#Fd at KE<e<e_b*sI#K%(KD~GgFiCdkMc|9uRgQ@
z_rZnd2mL{HgI_!KKJ~W?RT~D<?3h>pKCU)oB!l(yqZPop0Y^ii<IXP%ZKm*T1!rT!
zfqr^JzPh8jsWy{pCvFZBEH`az0Bgaf)w4PO=p6;%w^XfdAG6zl1l66J>DyIuw!Sfi
zQ?DdRwqI9M0rAd#?JLD^O&c#uzjOeVpu*s7c`F};7_)a;T>BZ8y6m(4 at sY$EpzxCB
znQrCtj$}$)M_ee&=j&|EZ$mLV0WG1qJV&p(ItP%XL_E^_VLYN?NHAb1*8}hg#C7b7
z5uW0WVIilhZ?p1wNa3qr+rJYjK+BzQSH_<pml2c&o;ZKR!<<?+ydHCY0C=!Wg=qU&
z7d)0>8*?{Yokh9>Q~d)7R?-INk|plDoFp9R477~l)keEjp0a_d5dZH8t2M6KN}OWD
z+<m+y8G{<Q*rc1wf%DeCvU9&FbfvXQhDPAllXwhj*k~>%P?iVWr{!-qO~M-|xtJaI
zghlr!I(05?wq*iE8nRv at JzsN(JcQ5NE6UD1mEaj&^*F+o;9;L>9SpTpZ;k at 5WyIgm
zB$8v1MTG0_eJ+{2La~RHJu*XmH7I%5z^&`Ha0GZJ%af8sS at M@n*<~L>kL7{2z>m^M
zfG1<2izd<|r%>xq09>I<zGk?S!4(J1REReYxDzYbguM#>Y(ymJQoSHBWOiE;0&COj
z<u({FiTe47DG~CP-`d(`Yu~&hutoTcwt9ZgNb>5~gt6r6u!K1CdXLYkqQ9M<5=koI
zHeD at eU`isAKgbO5;bGbav>-Uct1py at fZfQYLqdS$Vu(M2-7E;5RN-Sy;}pd+E94S9
zS_Z(QVSJ4D4iyP%+s6n=ts`l9=(r1WyN}sKf>t#K$Tr!b1*?IDpw{3qdRkm%L`&VJ
z5X#R^mNq`&2)Wy4(!kCLV&CfGb;ub(ra>8UaQJ9iAf*VvLDp1`-3rROp7lF&B0Q5(
zysVF47h>ZNjFSk6(5u}hFB}Pq%hh*|OD+=gt-C7<dKgHXjZaf&AV$LWMia&E9^_d<
z(>!M~V_biP;3pWxLJTe^kZEkFC`=J- at cU5%QPKl$b?F{`0~J>mK%)rQaH0d6=~O*E
zy;ZG^`ZbO`R9#nB!VKK?i37h}&Zb}fuuvDa+HyIV_r%7*F*~1r8D{K68X%Yj36JiN
zocF?GVM!cJxyMR+utZKyPHwQNf|@r*u_WY}di9i}1jBlr8MB|SA6^MZL_~m%2yisL
z>xv1bAx)I+fhXgwxi%*bwsvNnxax7N*w5I^)xUjj at Oj=<w?$bV{#=P%EX_YEFOS}^
z-3w=9!$N+hd-KwCT%hdk*1-xlru=nSr~0DSWzgNcfLQedqPmp93(@m^{%SJXb|mQR
z&rN~g9A=gims5#J`tsk4>?-1c<_#4cjvL6YclnRmtf^ws`&)a44H%<Z776M$h=b7v
zE~eZex;zpR5h at c`LI;rvIb`#7b&cUwC$5IgUeq%cMqOnFjI*pZ3xv%`H1$}ltf90K
z5j=*+v3)Qf0*eipX_cOfvp+T-Gc8dT)~lP>TH0=9a+3hhDPNQ|+&|LFFeWX7^&YZS
zV?XZVh?&Ex4x~L-nul%O)Y_+I_(rS__8CwD5?89n_XV8Sl*w@$CGA`rL!>2XCx_7L
z%D1EE3wN6+J==)$dpU-$d)$wholNw(9szC8^q>dw4R?fnxumG>WON6I_4Xk(5#%eW
z0p#H1X<N(LTnepU^}G=frU;;<iy4Q#WS}*HVx)pDJ38;@erGP%Dta-NdP9tCLO&%M
zB_dcN0TqY3Tu2yMk7fh|IGL&qfmx;EGsP^Q4ZK=wP0Rae^i4V2=pftk<~c$xl at GHA
z+>1N{7?f2aY+4R?bJ1o4v?5!%c4b<s%Wng87Z|7zOR=|cD7TU{BP^{ug^hfSogIO~
zA at 7}0v>6f0>{h(P-Wr<3(7>gKbJ<h>gm1n1`oNXSgEhluS}Ha|HmBcoDm}F6s8%ct
zLO}}?P04OO^&<5<u;Hno+#)-l6%&R?hD8+`{jvB2xMNbuPcnmI>_rnFY+B5HmRgOP
zgvK(^0e+DuUBT_#^Ili;o_ZW4Eh8`HkL3e!aB%F~y_z%Uw>zU#E^m&<64&?(wj|FS
z+d1YRj>qKJc(&}7nn5A-^*~ec8CN2$m4n#5e3w9_9!Entyf!eqR!Z3Tw8>}59Yl?1
z%I();chYX|NG~T!zfgzwFn<GC0)N&}u!Tn1$_(U=Ab(`wn6J*@`<-U8#r(Dsj+u63
zGS^4+WVc{~uK{>>nSP|muvY;z&MV&$fv@{NnT~AF3)+9x5{WaCa)iV5#E2Rut9=sf
znetJC;Q^7xtTW1!$rY7o75C|g?~tIK?&Gva2iQP$!(IDV*RMvLEF=Cm{9L1~qi at 9C
zsogil@~=43V*wQ at Qm@KFW}Mk&1E=Vr@(8Q1N&PpO?O*Z(r7B7oek0AU-CMn>y_5~7
zK1kaUsd<ebZ~KbqrF*f<8!S$h3iU_7^C9Hc^+i%!(;h-M64pDJm>%yMNt2Oh?j^xQ
zg()L?X}gI_{1=y})`Q-jiFpviz9TB31%Li&v!fpv8WTK=L$4x+-x*G+EG*g-|Jw3B
zo`CS(Eb{{b<Hsm-7Y}mX#Q|F36kkF-T3`#t8Q$5zQx{>KryBuT+DiPHsXg;-zLY&p
zyZtj0qExN5xmabW`!o}_9XsLC+VTz+h2IPvLKIxK;dJaXCn7_=qkhImr=J_WjpG7h
zn&tAQUPV_esvw7!5C3LF4aTA7GKBqDJ#pCB;DX%WroxLQ_C^gU2NpAaHjsu3gT~n}
zV5unrQm!{AFO|(I`&-nJ-sjfrycnzSoXbMn(T%w{yls~s at z=JOm_SR!>mWomhttLI
zqeb-S1$mGkwa$KkN>}l|+SntYYDZkH(4*q55Ex{zD>TKHb*sn?d)WoVu5}L{;5arX
za^d at C4U!>>1|;y*U;4VwT^cod8HqBRX7-L<`e;DJvmgb?{2%fUaQzG|`g|UZAL9nk
z=*?k2nOVi0T(vvW4qWi at SvY<jz&+r at _Zf@8#CFCQ$ND_y=g|Xk at ZP}PE2ILYdHQ@*
z_nSQo07kn|121!q)SZ!a)*Y~eX)E=OR@`8xU;=~TFY0 at aWNG{|kbyUsxd%Z$Hc|_R
z;m(>^ut~Zh^WSKfrz=Pa-{UBRb#7t-smJsk=2dj5Q7H~3#f#MqE42h7JKoQU4oL!o
zu#hD0MsG~DZXMd<K>J&+PUhILkXZV0k(Xir`p1&fSIhh+j%K7!aCb0`xv_6!B_S?d
z86!vVX;g`8b7In<chYbJP6(j$<a3U7xoKaqCw0bvcx;99FH+Z?%8gKEE~8g0Xkp+v
zum^!)6~yhKrYXZ_tK$ye<~l#SMcOePYVExZxM*jpg8SRJbz`kyr$E8Ghnmgoh$B7k
zcn at D(8eo2WtTw7&>V%d~XUV?Fen+Ze at TwxVQI069)vodrXPR=QFffUx_U+=V(Q|hE
z_ZW%-IR?VrVwjQB&@NJz9Ab5zZjT6n)0^Gn*)EZ|)K%;i$m>7G8`+=erp8B~$(7l4
z)IvF$-vg=pZLC`!{sb`8At6o=a7S3pUbNt&1xCmq8JO9;cY?bi{MM1y9tY_ixlYkv
zu9_s<F})%e2~P)#Z`+!pB6)2FO<&;*$(Ov|TS!4?fBRXZ)yabmtg^cIlAW7PQ<!_p
zUaYa*rXl_tSDBfBX7N9=u$H?;Omh)wYz=x|BRk9Q!s+#0Hu$Z7#n*2MEHyJ?676{(
zQz?vh>eWSzMr(QK%fsmNmtWn`gm2D&!+Uy~r!4VY^EX76db8oil!bls;k*R(bA@|P
zyG3^juz7zK<z+a|);-wf32N!wfHo~4N_^uUmW$QK=Ag)mq?EvYL3X`i3?!Nm$r1@(
z*U3iQ(Spc#dn`qrdQcsaA=34A3%cj*X_9xNjn6^EM9HuL5%3{M;oNcf1>Adv)t>|p
zRGw^ixZ3Q1)&jd-GDS^W0D`GV#Ttd@`jAO65pZuwF0ol}J-Q?y3u$6b-HsFo61r&C
zqp{c1L%BP$2KS|vEMp+NtY1_}PWX-nzc;uTAEwvPzDPGY^4qZ)45tN!z;4!A_0`S<
zgGAe}iD73wG7{B|b8mOyfMwS&7Qagl)^M$i>`xiEnvAW&W0Es>v%1h)QzIRYGIP4o
zR)+210o%7vRjG5APPeyRiYIFeWwKJ{s%*=)&AF20h1IuSt7)H>(yBTg34BSRsB2SL
z9K*HjyJTv=nuS0T`5;l>;xDu4K|`$=rGk)Bo_=M>jR;CJ{mu`KD{rygyR8Voe}$BC
zyZ0f_tZUTHCl58mPu=o)(Tq4d)s~*#rj9fxF+g%@&Mx-xGnKA*MB6t#CiW*L?SiE!
z1*yoa>%g&O_`*O*bD)W<sM2d4KfL0D1@%tji)}aQL<+fLM+qgM5En^j!SCTjQ;&l*
z at l}MQqR9ZgNjsC|tuC?hW3y^We(XJBlwi0x<4v8;cLL|Ne^iggZ|_2Vgj_!{b;!!H
zywoMn*-sKKla<b(rTNZH1A_)$^1};LlK*l6I^WInqC<R+%f3BBSoJngLaTb}<gY%K
ztpT?N^k~<!E%)0id;dCm+>bn{pspy|y|1&lu1y at jNRiFZI<2OkGNnW=X8XhAt5pX|
z`4(F|6wi`te=kGl0vi=q!#&G)ltDS$jw_mNyMe#jEzo67XIB<Bs77(mj3gB~fy7F_
zAgw at t4?jN%I0z6>!N+mcf>02n27{1U#HY;6AG23!E^8<Oa5;q4K(jvec=l%zfmdHz
z3L^t^EYiT=`Qa9h#x36xg4ldj^W6!<<NfS_D9i<Qr8c2Fs;A4^TPRwP#iFhl`7>Cn
zPJF8gpl6$waukP_#!0eB+m7*M#%%r`oz+q@&oO6>q6l`ed__iL=<aiVRm207KIRcs
z0{-ape~EhI&}0?J3Td%}Y?J`(N0JGH)Jp!zZJ at e+01!;2Z~>F<<0TW!cvv`|C=dzE
zREWpw8wqc-B?HWzR}J1(Z0sMiJ#sx8J}Fc%zH?Ey?)qU&QXOw;lmNXcOI`;<bVz%3
zE<1jldM!sXvb|47Bub~El0a8&NBB)ul`tpOY031&<$aK?PclO8GnR$PU*a6B(&5ic
zC=>Cx4f*Tx1Gx4=-iHxzG#HJ(s~g-hrYDJ!YR3;N3;>aj1h++v-o!{;6QV#af*AUY
z_cb)0`FrLW=|YBzu6WQ}7u{C>grR|X^^q{XZ4(9(%@O{UF0Rs{Xlp`jW$hKs3gy5@
z_#4M_sUgM at 1%+L2NR6;Se}b+OEVA9k)g}AUv|4o2MdP>XXI#P$k-FQX;zb-pZYjX4
z2ZxUupmX?3KU(XCdH~FYJkue$oa7`0iep-%=9{VGTWb+=U5Hml4b!4`5TQpY?Tp_T
zdx8%`)Qpk8<ck3H_&z8A<Z3fS*;|Zz#88iaKN5kCy8i{5erY`;@c54-HJ^&<Y|$@(
z7D;d;LiJPcyp-_+7p}kD@*5y6sKUn#71|KoVa&Y3$`I+#&B^*``a-zbX2%t#R8Kt+
z`!Q+3MH=2X;j;atm(vsb+aOL%H{!QD>#n_B2BM#riu2~I;WJFh5Tlw?$08Bn0!tTw
zwh+`5$?CJ)DvH?c6nqFAPrSu!CE4#WwyQXzZ?`L-XH?5#*JxiqqX||X5DSHezqqk@
z&2cS4elhyto~H2a#({w at 4qTm-=){*4pyC3wx_aF(bGkzf+21R*%LY3gDiCo8YS;pW
z&J}^<$>K{V%WVKp%*kPn>(<J-C*I0S2N`PT%iC#+5&v2o-xr at BJNe(ow3r{aKg60K
z4(QA&Awn&0^HmN$;9MWiwa=y8iA^eqen+Fz?w0h>c6O4OKAD#E5K+Bx{UhA+pLtM$
zo^U?8pJ>z6^E-)zwbo9N%Rt{-{;$?sH8~e&6~n9 at aoy$}UHva&6B6vD!)y?cTj?#c
z>(}z=#XeDSQyvm!51J*ETsE*#wKYcG9xtrr4W?!KNB!{?c_+<kG%sxrYFQG#9Z%k?
zz+bN{lxP8khd~{+!5K~Xf}cwV3~faRs-C<}l1SA0U9r%5(j0NQ7rN?!8*y+BYoFk;
z)ywETf*jNu8A<(ywT>C<LMmT#kcfTq4^B^iEgNi8Whlq?NMwvZA2&c-(xjZl^sg9n
zOFSA&<I`FI{auuggU5z_GfodcWo2suGp(tg)g=_RpBv8t7<Ro&+G`&;q%YxKa<;6H
zdE}q(@L<?lTQM<fh(n(=Ee<2T01SIrBo$8EHLWyf7t!hSb6y0C14R_7Ms7JimEFaq
zfBre&kon`@c<u-zLf at ajnUJJ5Dz!FTr;g3L>Lc1IJJGQ~isFaoCC${E&GwjAnL2&-
z at o}Pm7>ugByE}RReJy^+5ZB%Cf=pAX at AF3p%Hk8 at m9;$D#P_is?*|W9pB)x^_gBVU
zOgkQkonq-4cI&HWz~3v$;Z4PB7(a<gjf%)Ygzj#6sl(-AwJyzTdCJFrx~Vk2G4MKB
zYOYd~vbjozQ}zvap|YWuMR at Hp+$MGl%|`J^;*1ptU1#v7A^(){(RJwx?YvO`$V=c>
zuX3k9-(J-hH5MWFz6C1?Oi3%-Hod?8q#goQI-HZH)&+LneQa#2xWxB)#24n8b4w;O
zbiA-=kNm;ADj6klITcANXEE8?(#;4LzzUQ&o3Zp*iX+-bi*hW$hMNJ;72P)EfBgvM
z)Uov3kbm<)sq}|>9#XxJfDg$dtz4L*T3GWf!Odv%+x8t5%V8U$PS<zZeoxhHE^eTZ
z!p!;4D%4((l-BGY;+!pl&X=|X5JJboEneJ9f9horJcumQ_AoN+_5L_BuHBGygrK}U
zirUnsFTO0u58Qg*%tXf#;??VI?wPO%s^0Ma-3Aw55uuCOi>>lm1}|%rY>S9Zf4dA^
z=$Cvo<chRmC^(-ctPobwdRa>hw1syA$1{69G3emZyQ at Meii39CRwtQ+Aoq{JYrM)&
z6JeF#@_lrtZ{NAq(je%J_OYE!jE}d3v`BRwk9Av!M+ELzGn22t_~jJ4fkXtlKkq$y
zL=DXV>mc<I_}pGuH!Q_G5s>3ywOqaM3)W37GgW~btekIb4nnJFHb|SPz2KV9UtBJJ
z5efyNu|JR>cs&ai5=WzZG_KAIyaAs7A*q}k8uWjFK!Sfd8AssxgR$TsNudV+eZ&L6
z2BLQyyZ)Df0AQ1T3q1du&EQ5NB|Xma;E#%8>j93 at FG#uXE80hN?y|ui{~2Jh8BGG3
zfq?<b5;jBrJ6=Fc=C0TMwnBMOyPX9b!=I>RlwI267irnqJ(rh)k%)xj25%8o>38|@
zMruS)g6buq3Y9mlZREh;xl9SaNLoGdS#=RMtzQ78Ldn+N!&Oj(>y}CHYvSo3__ at UW
zY0gi*g?aH04+;Mb0vt)P#ecnl9qy9-N54PPum>d9zgJ;A at 4w^z|HCWP%0OEG8+>%+
z%C@!<^Hxt{bmYYTH}M-K(to)??z~4^92k1TH#<8kMTZX^8NoGf^Y1rr6{xMQ4wa${
zj*G*I_?Khkv`C9-08~T-<WOnwD?C5Ud4FuUlI)cg>2X9ne;i`U6D39W>YxJcABF>W
z1f}i;;1Uo(z2-s|Er;0uCaK$RkL~?)Ix1X?fPmI{6TE-810=uDp&lYskHc%79yi7_
z1<b(spLHtaqEZIP5_;9dpk`I^8Ye!P|LvMbQz)px93OH)p!jcp>aC_gpE<_6|Mvl`
z|8pL&V*`dZ>0W4brw(qiExDd-v)>g4yP7D at stXVsHB;E?8WkU&X{l--vF1GbhiW&(
z|ID`d10vMdonM9dXGd|>qhU@*GO{Xq4TjO@!o%`8_Pee$#c{^=_Tz0sBR?LEG(D4>
zae at Y%9uzB1`DYIl9aevUO1ZDWzL5(`F#N*~TGnL1cfF9}GN5vE6(KiIpJyxi-DO4^
zH?G4cEJVtF(U9p6IyJSm{ZsSr4j<L$#&t^@B=EaA%zV+vx7Wo28%`Bdn|ifm{gMip
zmhyV}w^0zwdCeg`r3=`E^iQHXORGVZ5Glt6^No#aDQc$dns>)Duz(U at wSV{bcm)!Y
z6p8Yy3sT_InAHWvWroWo5t`tZ?}i|8#It{2QD+*}6!>p%KNJ3ErR^jD2fN<M7Rs};
zGkp<9!PwWsHnv1)!QJAp$8sUk$eyXfa at -vnj-}zbWjYJmIhR4%#c%&*m+=lzdR8H8
zpCOo5lXq9&u(~<bU?4)fuzOR&5KLVw%I{>zSs#Us?u9QLM9h$i{n)J(dCYJVaJ7nu
z`shVU3np>x-V-+s<iHA2;~d(+9MU#Z<l4r-{k8I?KzQs`!0}B;lpJo(hs`g at A%V0l
z#zKou-2Q=*A at 85hZGUbWonJ$Q+AYH69;3I9VpS~Q)ay#X&~@pU|EzVsMJJHhO`tW5
z7W~pGW$=ky4(q3tQSsQXJ<MRSvCoZ-<S*mmY^c-F at PD`%@Pi3e<CBw54qwhL#%_I8
zcv_3gsJ`xlbcoEL%C4Uw54Vxa at WqD9yJF<vY+aH({Xn_AI2$|i76Tb&?u8{nF74K|
z)l-4Z3VC;TLW-9!$-GD--$*Q=&l`MFs`*y*#^92$1}C?u>P1`K at M*2{Ar&E-G6u^$
z1!b*cMn=Zi>?Cf0dxF=2|BkKgMEMI%O-B9U)3Xg4{?BvA9G7$<Zljv&8)lTep9_9e
z7l>Dsfi(m0NCKL``FDWT3s>M_v=&HNHf-a{GjI6vs)~q_2oEW6lK;^VJC2~r{7Z%5
zO++b-F3#=_8RddAIFmz9 at HazN=`X at xIEYhrkP21N`2>Mr_uR7Yf;LkT*C8?Ag8;Iy
z*Dhr$%!KnXI-<Dd4P_zjeCeiqwVgVdMybSA#G`rEe6{ArE&(B$OWg}~aW;A5?<<Tt
zU*BRs^|omER{M+p)ws(^l;*5xtzj(=WzNE`gncS%uwpw*<bmuHuG=9e5*+o{Ux}J(
z{znWIZy`w)%xLFj68#8!jX#k_!K*VSP~-tTK at U=jU~?0VuX**Nx^c(Q-y$n=L3b}I
zZ(Hjc;0bw4ux7HIR-Y>`ofZ?4e-}!p?xU+Q!j9eh4#Kg;Gi|*1vkbzf*J{rqGH%{5
zx_M+Gk6=0yIpPLq)zopmm(hW}E_n=;cD8c6I>So7juat at N&OvF!GG+X+mD=F^eFDD
zLYhh(kAPr)l}f{e_!|4Xb3at!v~zJe;&Mc_rXJHzT%b0;x|;Cd;9y7HuRj&f^3&M#
zT--?A*2F=^gm?PsXQLV;P4-evRi6OkA+ at +%BeDUqE=pG*4M>E#l=z_AZR?%Xexk+C
zF|lxGZ-V%Z&FQZ%&MV+PO>r-7zVZ_yiI5Tz(vOLs%12h!Zt_CI08;UN+JQ02X|7v;
z`+8#4dQxMUn8MJy<2f9ZRCPgsUL1tGNsw8Su_=;e_3~ylD<`DUs3zw_Xn5b>IWo0?
zNe^6tLdKmZ4CuWv)IK56LKMi|GQ19`7U<n-5-H}bjeeqt&^slJ1`4#Wu5fnp at 9FM%
zM9voF4v+AY`;j#Vf!iizmD9Lr2&v$ORE#BqW=LMra3yhem`mYzSJ5?p*Rwzsk9U#o
zUTRk{+*)R2U$xYv3n|iRNotxg2+_zeIWWrW`zLYl-pj$ts$QnESL)BGdW^(fLu-m^
zDW|J2RAOKA@@=xuaowH0Aq>mtX4ga-$zG=`%?FNoM&|<&Oj8eAZG7r?7JKL4B?zo;
zCH?qkY91Z})WEas7U)s)zReELv~!y=w9jonO*WS-qC&;K_jaj_Q#kOGtZXE;NmD)x
z&8yVn;W8dEgPY6lF?cOCj!C;zF6un2PAdR8_y)hS)h4h7bQj-kd9u$boZ#!77<xC2
zG4UoG)(O_s*RxMW)E!o>YbO-=N()y9;XyT~_?f^Y`i97uNUeHoq7ghjzlCYDlR9$=
zGdzhq^T+vgWeX%lhqdgF{L at vK)09=58dj?LoDUQX44S9w>ZS!_ePd|x)f1ZUkf5>>
z_Hg9jsV10liH&NHf`@@)L~0OI4xxpG#q}qb4 at Ucu|CnKg8Uhr+q504!ycLQjtK<Fz
zC;w+W_UMR^99k1}GM{@Hk$9w|i=p-A0y2mCEE_QJT;bkJEkRS4f3;%d_0)sIOcTNx
zQO+ew at yvL~*y2F<f)Mzyd+l+HVCtSw_Jce+vgn=8;?&>^47rd%pQW?3%1`4AR3H5M
zfXeEtOs!5D+a(>9mnvkPpQ58#^+ZwNT+OD+ycs(_R<!|v9b$fEOr#nj=irQicYZ;|
zYymo$`Vn#ri0z{>z6;1hS?lmx6Ts)ny38NYD}!)jL;~9-MUBK+;z(&Oevj4?P5#m0
z&rk)(0g0gRx#7+xA`H(htNY&Y{rNj&J~o-LPJtPviGIy%<UQh}c((6zq)ImDfNIMc
z{`?7UBung6Uq6~w!EOePC`Fs0f*!<?bgzwvs_n_Tz*t*-!5>Y?W-KiGL3T_ue1sr|
z#ADCTnc5qe)oe*Ao>mxVAd!zT`V~?chx56)m3TOA{raXDEW4+V!rqQ3wT_P^rR7)g
z<MENpi3COSBjm(0{g`EY2U<eIbw*=RGhjB1*OlePwUYK#DRQeIc1H8~{6uUIX2n_{
z!s=R1ts8==z)>sh(#zDK@~TGSF3oVPar}R5G-~4ml;9KU+ZVsrVAl?awyfHfFEM|s
z5am2sFx1o8MvgWAb;z*%Fdx0*A>QRYB66~Zr<^uBHcC#`5l(A$@{LkL*wEgmeUF@?
zDSOR(JM(I+2~kZf`px60Q4V(>6KcQPO%92c)y`vm#FA>`+n*?;<vWqIik)OFRlzGc
z$qDf0ifxyUN6^_NloqfIz}q(j8Kb(#YcuX-foA(6WctQkktU<-)r!)OlV1#pyKUS#
z8#Y|7GxZ#Dt;3AGT7uYv-|$64=b0s{ht^;wq9++#EP>um6h{V&Y4h__67aQfk(LEB
zMcGI~TK%o#Z|wHyj|m$ByTTu4nw-cGTdq4JB at L`jn%zfhydHw^>hLEVtDo(4!%dob
zZpEU^_NW4Xnte>TyP!ffdQXV=JMaL(bk5jvqQx{1eWS&qmlpUC-zwLocd-z&ttC1F
zo~knMz*U#>IL6;G?Gl!6y`|tKL1+nCs}dL7 at GKvwB}5GlFWDe5EDFd;MUPnc;m&=i
z3r7o%445833)XIhC6QW<=RdP7t_t|#b0zrKOQfGP1jzgjwIlADs`QEOH)Wx*kLlYo
zq at ShA@!b>TWDVls+&g~k;?cSap=b%OJ4rw}!)SvSI4#inM|GR5=ZL=BrrtmOu}YN;
zq4DCBtF1h3-`jd}d+ at PmL-5?EDqUrLn-V2QlWq0G=*3dT!gJ>2%B5^D(BWL+NME<r
z<*ZcOXn`=g at nT5QgE*irZx2N<nK$!cB0hp!d>-F)^r!ri7w)Z&<mh at hG3OJlg{+kv
z!uF}azzBQFW)_-BUVww?Esc5t<C4qd1}-oho{YO2MY8rvHr>!A-ywKvb~1LlP8B-=
zTh|j;D!IrdTn~tXa_l!wMSbm2czS5SoTmRHrZQ#YDJh<~W4&s}qQ-2zPJ?HW<y3hV
zcx+;qbs at RxwmONh+@-WVdziCqXP>;s1=g_*i0xPFNC0BlkeuUYUNeEuWd-L--8XjC
z-&y|p_|!(jD8Y75rjHMboyhF3zb|QTqh at wz4HJEz<M^&YMT(Yr&BL26$43CAoiuec
zB`(n*nR6g{OPoXH;MutL;%nmj at 3S7hzv!Ve^^Zmeq(2{AmJ<Bxf17_WU0N5UC>-h_
z7^8K?Br)!X=l4j3`J`smJ$(CS`DNqBoF*{YjQR-I=Ol(Z-i0BYwM5f4hW5lkM`Q%|
zeimfaUTm7Mq~`_veM+wW<zWFO8mK2m7)5VX$VoWrnaD9#12)Nm$W9nb_nm*X7KcNE
zyyP(FH-5-_8 at 83tA-BPGaOoa4UtIkNeTEub@c74CxRda%D_SroQo&XXR=xob+EOsV
z`VdwpcXAQN7KRW(1eaev{ijsq;Fn}|FY}Cq at r;$n%?UK~fg+VvEu8$kwoa*vfX?H_
zVk1#?pkdT7!ZL at rpVjbvebq3w_gI7OxW6wP<qr#AW*{BU9tEh%j0q)Ft<lt^kTEPy
zic~!W{`KN7)vFO!n`i3SZdJ4n*TBqP(!<AJQf~Y}X(NZxzrO={F9i~toN26y_9bJ%
zK4YrVYDu<#+6NWpM;z$e=Wo-fer+Z|#y<|w3Ng|Dy0j4okicL%qy^o2B2mK)udj?W
z<Lb7Fv_0(cL3Q2%aIg4raVtl5S7PHzhxU>w`S~s)REjS;crV;5_P`@Bh?O<2Tk%Zk
zswpI~T>QuwZzsb18-76E;%CYQkZtemz_T`Qzsn*qjv%bv+TC;$;8FsD7$k=HXpRTR
z81u}HXvho2dCID at 7A2l?JlB~#TJw^?ekMBG%<~$V(juEDl~1$=xd+reHhIktrPUJj
zm&nqDRq(i6U9^c5$RpZxPUbNn0F4ANbPXDk%z|FBPYZI7{f?S3kIk|LOxuCVXD|u0
z1u063j89{WfBXjKr-I&{x=)wI(6*&clsdomoQiY*4b-rKlr`=8NYj<+8BRPu+mXT^
zHJnJXJG|;TzD~s|*1`qLhWAhpq6M4yRa(w+aYepq;wj_FWXA*;7xdGF$+?7`925_2
zefogo<ZnHBovbfp9JZOb;+js at gnmY>L3 at BPvdd^=_t<{=6$m2&ComOHIG?nQf2%>$
zR9d$kbL}(dHDfX557^jsL=B at ZOcH&q`2?MfA{IX=h-|IHZm7MZ5d at wJY<0yLa_N4J
zV}9xxPaZn(Lu_8o(SBbGk?N!qYj}FSuupukPOYJOCFGGvY)v$2-xwas$h9J}nH^(9
zR(Mx9lgb4VZAI(i0J-H5))t&!hq48Jxhwjsw!{rcbHU7J98Waw=k%Aj!~^ioO8aL@
z4FSC at 2zST4{vvL*>2hZnU5e9gCY$@zzf{w7M=<Sc&d1rVO*M4%CJkK~K$tb5$^cVp
z=(Ji6G%bx=om-lKO2rjfRnjEt#{f1;$~AIUckdMSH&7yj6 at c!C9a{q9bGES0j_+Kd
zaTSNYDfG=~SU?tRJJlBrWzFbmFf0Wa3kqKSPE&G;1ntt||LT!0E02)-q(Qy7YWxch
zE7wBLSDm!TGO`_8?#5kvxSYfnw at dVhD#1FaojW7h3p#>x^C1q*N;Vw8la!v1iRzOb
zU+r!L;x>;C!xIO)gCECz=%q+YHjgf6_lPc4O5{d_G%f=LF(V>$4(7E*067^k<c5L;
z%zDWv&=#t2$980j=+GemXtrK2a08{&t=?E&i=fH(ZS at T85%!HK<?lx$E3*S4e?x$U
zn08!%%GdlWEsW;--%ioNtiNVR&aTYFL)rsbxvgAn%Usmoq2K2Z^}_1I_0)O1zW_Ys
zUE2d~?Ix;Z at szK&@U&#>bDWD~f{BnJN at TiZ00jxwc-gz#?ou&46Xs;;XPj&6_2C`c
z_uyAYhm!cv^6{!d_L_eCl;hw@^eu*8=v|Njm$R|0AJ{MerX!c at JGQe<>Y})~rLp=U
zAq}?N;xC`fM8QH0P<vw9iYiAANg`o-ePZtiHe;<{bRp~EhA9M`{_3^%x(5KyHZiQH
zq>>F6z`H6vpat at u!R`~`Jn8xa<t-}zSoB&&^H at MKD@URGxaaK2wqi%fu`^muK$eN6
zH+yQQnj~9HfPZV)_Q`FXruS5;D`{nAMyVT6D0*1Wy*fTmI#hvO8s;=Ox;W4hk#TK-
zT7RrI;MI+g%jJUQXlu5e at b<R2kES<C5c$fs<yg$ng{bXo4HNP4V3)t>{?-0(Wm(8%
z?ny#|Ou<4Ia2!X-z3)<q-=Y8XP1OX71OeF-eP112MO?tZjGY35{1L8YS<N|u2@?Vx
zzMOY-ZkYk;r>zi88*wR7eZP1KkDuZkX at nzhWKND(*i4$iBujw7(l7bYpsCxw7+xBU
zBxTSMt+TPLy!`$<`_mXZDIS%ye}wc7j~$q2&5)|Pz7E4(s+_UCg|R!`&Lx>J)#r6Z
zXDkqC^gsTR$mgN$d#9#La<VovTH`3`OOd+W%uWd0A3#C;$~EVY9p-s3NXydJRNQ*m
z>`Veel_FhYftE<nH`pc~zbm>J?$6^+gpZ7U@{n`XZx56`7p$+A!Yz?8At+xTi&3PH
z*Y<`>KIGb~eWc`0Vnq!W05cwT^K{BVSvWpD7y6#nyMIifMoK2bron6^;eEE?N#ej)
z4Fpq0REION-(19|>0^r$fJsrRikq}v^B}T#94A?&FE4l6V7aHT<Y?X#DZ=4aX5Yx}
zZQX`bN3JMdck4O2Z=gG<xy*(lB;B!2&P at 2JX)r8is=+H#52Yb#n{}t=0~uEdvh_jN
z at l969a>zCP+*H7{9D- at IODzRVVlA|``G<GE3-wSM9wwpjKfXl1Y*9bJldi&$_1@(n
z+aP^=MDHl@=&c2dg`TfaEg|&V$}`NmtPb6HbiQ58I(~2az5j9nED at pi&fN&Bk`Gj%
zU1;G(ciCkpBkCl0NstqC^pxi8y)G{5)W(;ID@*h7*}8HRe@|;^+zF>a>G>MI#|<kb
zv>KV6$}3GRg;C}A#~YYj359P9pW&HdVkLOa>@N_9O#-jHM>L*=nlQhsIDjA-a~xXL
zbW7KWU|?-?X>HkREf^(eD<hb4_P-z?h(>34k4zAa{6&fHogrdi1*KpHp>YnS>Nm;`
zIm<N#)pyW6ug<OW&ZDeI_hp=*FC;y3Tlgms-lLiht7<d50o3i5`t>tELc9C<IR_Vb
zK$`cnwaaVuRAuil>jMC-sI&DW{t0|F+q=^$8Mcw>-L;LUbD8xI0U4g<e!>B!a at jIc
zD;uf1^SMLhO^`FpFy>UA(cTxOCV^4&_wSgh8k3<`!r at wiF*PX at jx6-a!weZOu at HMX
zKtt~Fg#at(X#Gc3;u at Bi8n=DuJP9gosRjKfdBF^6f8C^&6+QlQU{azvBWa;7S&l73
zT7S+&kdq!<H0{cV+s1<T{Z{xoBb+T6(#**U&$6U_Sl$j-eyKHBQWVUP7i7$_)(5|m
z)A$B|_Js|6$Z8 at Y^=<8$fT3)o_zkEL{|B_l_f!9gkgH#$rKAgYH2LkNSixE{v2omq
zC0s|K^rRtL(vy69f-q}vEuQsi|Iz4$%|X$M`G2^P+{JnsI$&S><yEeYO}P%J!#};L
z1WWh)4^~o4iVY-auwtYy2_K4`uAkA8o{X-HZX_VZG+doCt-s!I(Vt!b1HOONUR0qm
z4<P1NKv(b+bZqqt3U0C}k7hLfKR<&}S1_{oFZi;H@=xgZ|32`)PlrhlfDGrz)S4w$
zE**ySmRgRGg_f*p7c89hKLAPLFu=3g(-%x05D=hru`xoZmJWlPW at XAg1$__lo?n)m
zo at eOOwRhzfKT2C9TxiYiy!6w}S}P7&qO-zXy8=72;V26w0)RI(ZV<i?fj*1Aup#I#
z3^dqigfMesCAeDJ%~fW#aRzyp+E>7-8Rz$4OKTI3ZKnVXO>TQ4@~x{-QvYL;9<;HU
z8MLz%>T7%*$L8{(yN|9xR%NRaho=5gD{VZ?c<y5Vfs}G`iW(3EQ*#_00X>SQ=$ybN
zjOx=f at Uv_?cW8Kr=C7`=Prsn`zab+Gy>|KC#u5wq=R2owBs_L=r1a{SR)?D#ME!8?
zZZ;l&_Hh$v&vAv}=I at R2JQWTr(M78 at b=%q1#>R;=_q2ZD6lt^Kt;qW&ECC57{#@Z=
zfnsz;lpZa3tApOK)la)TPdav92gJp_8G<B`k_Q6w(<V?7U?03r7t+zr;LXp%@+c)Y
z`ggRkjauJz+_&BGMn>@18OZZh#g;S$yVIAV1}iO0xzp~GqP~x=WnH>xOUQadHj4Xa
zrXG3~)w6Nok1)gWF%{nr>}Pqz{JR at e<v_R5Uah=uZR{o57Zuds9;h!?EYjdNV?p+)
z>>;q~JYS}k=69PmWO$wkrVnKz1>SR}5{VQkvd?^*>96?6-|&$?XUF?By7*eo%~}Bq
z8Gds!W*zWOjxA0_Ff_I%B(F{497m$F{B%ys<Av|bmZLNniwJ(Ep3FpLnK0nLnw+RE
zkpT+67vI24;eflexfcxN#$%nYL;(LHN1-d|w*?c_bQKEQ&6zeu*;8I!uT9tlEArMM
z8AMOQXa-TLtI at g|ooiWJrpFaI<#KpwSIGaq-*4Te*8<QJcvL~CsVO+?aO2jwr$#0;
zB)^*ZsdF*~XZg7*>^mtTqfQ#c&y<F&XEud!cVRuCL;xk at XH4dIlW{>O6S-Ndhg+hE
zVJi=B7*xzOe3-IyRizrew85-?A;xZgQ(E}$CQ<iasj_pR<&KbRErYuocq(^R at ol2d
zs=CkW at xdJ$`weWvN9-|Pwda)y1tPRff_<7WaFK7%m_N+pE=~W~bgnuWt|L-I;aBr+
zv#8|M^@IOF8`@dxM5pp8&uj<AexYO3mdW5zGoF>Z<PCgkZNO?MvLM8<8^JVZ4!c?-
zAV7DOYv++QHn0ih;PD<j{v-kH at BKU)Exm|MskpW*>ouJiOLjqz$xwD1ZMk>7HvHVZ
zot<R7?$qudN7B{r at 7&gbcI->rpSOF}xfTzWinGfUe+jDjPCJL+Z*?^URc6P&v at AO&
zhc at O88?IM#R>}j`-WL4<gHv%)PVM=2yHug`$iHrR>Qij&7kGZS(gSZQ1$C)z$?Yi?
zSpUOy&-c{9+}9+6<Ch%ao)wB~CMI2ebeTab_WlpsgKm8ng9=i60kBmTksok)R(sdt
zOr$*?4QodV?-%~bRU-$c`V?p-?dWtp4 at 6gDYl_8Q-pu5S17OoLjFxbGHO{!$%6!!2
z5b&;$P7d?}(JIV5Jcxvxmw(jS!zw9=!EeBL2XzX#)83#y#2b8sk6E`xC=U2iB0;6W
zb0pqp^Do5=@JOl8mM4_2YoW1X`%OVaB^{nji+f$kwS{Y9CUytD(GVrzN-R^(Q~{R(
zuK2C0R;27)sm7esHEIJq-1o`XJ%%J-puQ%*wie}OT$4*#5t=lRm}#SKyyvPAoJm<`
zcQw5jzxMtSHmv5e`ki46F&1N%jgzgky*>M<+5o})f?DD-PEH%!dWO7(ilRmwuyXd!
z;h|hiISz=c0T|OdMm)3gxYcv9mmmE5W at km{#d?niR3vsXUdz}BF}7EI?794|Op3^5
z2777b^VizQC)5FHzEy4S=Ht<o*ZOssWkxbupab4d?YXmu|G~oU%8Ph(X4^y79Ia|K
zh#nn)uN|X2!ggXLd&iJ5Ot+QJfs2}IZ2LC9vceD$4y*N``0YWF9t#TeBO0$7M_L9Q
z2Ef0 at ma061ZB`ZMl1tL>ZFtUUR|XnwL)ERjD<FJj^OFZzIEzi<D at 9+be$<zTk&r{N
zGshKIcC5IxAemPUz&k^45=1mf8YF0OKN!+Un^Cyj;+aauLv40^51zJOldC>;ho_k=
z<jl;+_xyu2%1TDfis$ZE_|mO>#^c$a+5doDA+#6I;u~3eS%W)7Ibv4a{2DU4%fC<E
z7s2}(#h>d306?O`Wu8Cj3Pd`z<wW*C(@<>6{tM^GImdj$0yLuq9C at Px_o!7~E_Vc<
zo-K7#cfdCq9CW(4 at g8&fH)9_;QK?0yNZIbNt~Zys`Ak*d{YE`u_#nf^q|28cyb&Sx
z26ot at hKm|1ar@<*B$I6iMOOlN+T~|W1tyzT8tZKRp!AQ5YH~D at EY~Zm)Gw<vZVVAs
z`&jEz`fy5o?O8%R&HmAK+qQ!ZYF8;#^{(NeisX~{WpC9z4{fEbH~{C~hFQ0UursRF
z)=?rgdM>^~{7Jqd7_uOZEVRAp`*2fkE>h|YUomSH%cX{I#nQ62%N`C3T at m_s(A9-X
zUu|t(<H5@%q|bAEmBHN85B|U`c7{aN&x>OazQ=?BcH%G)Q~9Jn=2+Lcb;+oEDE!iD
z<JD5<9b3o<g5!$#2=W%%>467{ids}(iePNRx7A?>52lqa=lM9Pr<m>5s=kio5I{yb
z{#Gz1(1niYZ?eQ41sLc}Q~634{=vn4taJ~@s%PgX at tZGN(J;8nK?g&UEyfF@%KDV&
z3}Qm>+S(*yM-J%Hk8N6K&RfqvoS*H<r#cROMpwEvb+I;H9$gK9fhXZ4x<s&z;TY`d
zOLZs$KF+L?$PLG>(FFtuxo99HrZDW5;jQta^a(ueSmE6k=F^c-8*G5(gRxx+Q-<@1
ztWwc7x0#a`F3(Z3p}eCI3~#ODmYGijb5O~-ErTBc{G8&K;KjB!>4q*ev20QQFzaZ9
z+-z_mt*kMypR&t_%7fJ`avkX;f6crat{hSP(QC^`>4&-tV=vWVCwM|gN3#EUZvSaZ
z>bx<*$n|!bfdU8CsweiL?GofCd!N?kz`sV)R2>C2ko^4X<2T=5Ki*K6`>g)BfP>Gr
zXdU(w4AstYe0f6vo-lI|ED4J|-TppT<J64(xa(xfkuSomemC&DZIO*+&u9UTBaap{
z4r{?mUG4<I7mu%3o(Bz0UP`u0d#th<ngbFONlwlA1NBA|b!y}!hU2tq18-6t<s3)*
za;B(78Gq|?s at mqf$MqMx1Q}ui!4!Eb08#2S;s^%&vju(3PAJKca>xeNQ^0}pEi!cO
zGwzvVXnkc&-qVVM&+eVhKJ0|XT(|%=jmWQsrD+^ItN)DqcCK1-U^j%(SMShl#kvYt
z*OM05MQqNTDGqmW)Nxh^b~1LPm6fsd7f^r6%K!j|3Qmn(OhD|FTX!!jAs8E(6o27@
zTW<>|Kigi-*_oW at -xnM?Bdxk1i@@4D=$;N22fls#wuax at MpZnK%Jf&z6*~&hfH@^B
znitf7pxK*cG%&$od$O`z*O<`Z5fRG&!`xd&Rn<n}qHEJB-3>}eOE*Xvh=kG&0 at BjW
zmJTVUloX_-rKLkcS~@qO^rkl($-7WLzwe%L$GGQ?anCr1v41dN?X}+Z#+>tgo at dS%
ziftwBYFj&KdwA)kJX1aNND-}@g96y}At&cTG27;tio|wA6Z=l+8oOacadblg=V8pU
zk-raM#_0m4NO_y>QkLHNqyK at M{vzI`QCrV(K4;s|x%bhKW4OJhu at AMU8JQ|DChZi}
zhRIPth?;gr+ZA6RRM44TN0*Y}L5vg_sk=TqAdDO4V>WWrKN{)(vC(><EDV$!NMS&Y
zY*YDEY;7EZ##j3s3vj<<tR_nP#(TNe3WGF7{QzFsiv$OdbE9XUMpXl`t`6p#pF^a4
zHBqe{xU3yPnq2k8N&d|IF;*CgZB!svsmqSc??;?I{oQEL$lCP$xK^p0T*%%0kj-D$
z%}j*dzKaB5x$TyUWjFCqw;|>{x*NAnTui#E(E>b?l={EqlVCPe>MzmGfA(;J5XPum
z?0;kEC%peBUXXo^(&|a78S_Y`{}lH&bX-lSJ>9UsUYNg{R%$;k;%UQwc7=){Z}^`3
z7q=F1>MZQs>BJV<;yN|5*RdKArcyk^{hxQW;RRly?HPfrhY?K4;5A`PF5yCA`NrW2
z0UbyTbDJLCTT;a-$^iUzSNNW3ZI}U`lIOyl{T;&h*yaiU47_nXhy}nJsQ4N)9^Ci5
zv#cQB&79Hw<{m2vWkW+a%&k`nH2^ul3?k{(aC3eAlkN7ZZ!UXO3$=|<mIQDs)sfg&
zd6L{q2l9xb^jwQbin%%`TS$w#H`V23AdRN}PrqC8a=y>sjvpi5yFJ2X5-~p6%P&hm
z at G(^N^?Zh2wEu>nTt}G`1KQm&J&N_F5HtRb1J>_pK2mlMjsdNWhM1Vx(^-jcTc3Q3
zGPx5GLE~J9T!_Pj&A(Wwy?)XDHX<-shqYybm#jN2j!H-yG*_}?x~?Uazk9XhXgsq&
z`w#y%5=s%^Y(+*fZZAR3NAZ~Xt#5>k?U`O1h5W&BOZ}%9otw~r?ed(ZK6GDXPZ%%8
zcci}ur_;%y)wlvE=A=JdWlf<TxR>TC|7Y9cuV`}zIG67g1L#i525!EN=RP+Fhhu(P
zPWTtD;qF2QmOMG%=zS;|@cr(!W})tN&xapKsaT5PVg8^@d1v6H^jpW?hJC#iY^@U8
zes*B`mZ0m at KJRBg!{cY)kpjB?^QqS~t7fXR&d+Wixetj*hfC4e#|%4Zp3pC5fKC)B
zs8jhe{5+$p at RF=}C*9TjPupT1Kf-`sT{B-pDAEkN?Q4 at iPCJsFu}*43*inY0u9XDy
z8M=*E2tofV1Q*CfGqt$e<I2D?<m9_0E!{O|{53c5e)$1YKr|>c2AylYHX6PN&aFlt
zbN%ULx|Rz)u?dmNlXT*Hm%H_V^hkTJ)yW>FNa>I=xQ)6Ia9RAWz}N*y0V{*Jo&tcz
zaCC*Kz~_dBkx>CCe}3)JxnDh28VL&@(lw`{0TXos+ml7CgY_AzEC*J;J&xw%46_Ao
z%eeCIVWYyafrbn!w<BW_S9MPQ*!2H|^H1`@?)QDXF`s<jDz2Bk`iwXLe5=}I5kj54
z+b%l;D`hgD_cuUA#pw!hGo^03M@%{KX8n at TwhzVodwB2b*a5C7;pQM2_nz6FU5Wjn
z%@?KM^=<^sb<M%EMc5Xfh-q&yNHe_C4rQ7haWX}JNsU#Z6IOQpQcmve7Mm|!K4P-I
z!OrWltnzTrF3DBDtS=;42qaZIh<QJ45!h>S*Tq&sd{%#?;CxPOd7_3BJO((;TC?Wr
zC{u;+tvC_ai1e-#u1X$jKZE<N_<o+!IVUnC-;Q1&n at f-1KW@7GdVx0SipCnDz>Yyf
z at B`OQsb=3HjPB}OG>HI9pkckGF`QwJ-(F{T(b=CVc0B)J&VN!kyPc_(!gaPQNqczM
zw40&JeettQZ0HS4hcH*u?-Q(--B60k3?X07HvCBk>bEKwpya~C-!&V=qa%iU!*q%}
zCd<TuG?6~J%--M~{<0;hUXhpN;JdEA^bJpT`nqK7BGMRY!TT~IgFHor^=Rrly<avM
zD$~h<>Y_J=_=8xC^_V80^elq{L4udvFcRD~SlE%CHgV{PVdcoRoE}KHm&WE(ck%Z%
zL6$&%`6={G?@iV+iQ!=c%H?++9)HfOkc&!8e at SE9#dd;&Y(|(TNnD_Ry@*jVF3XU|
zVv1o>7 at 3Dxc_Q%;WC~1tG}R__;bFKOdv?8MWI{CValEvUpQJ6NS}^WBkEA6P_N@$#
zSd$YqkUsBAK0sl1C`CKhqCk};dFO4{jvR+Nv~pv*s)91pya{5dgPS_~kNAXoIj=r~
z=}4`UGP%Lg+?FTROie^bg6~XhXyljJVQC(e;1uWxF(l-Sk6d2i at r!MtN^4r02!RTu
zylR#{@&AJl+8BVAoyhCNe(82=uLbertAOL3o!aQbK^p0+EMYd6(=0_`S!{D+(Qk~L
z$svpV>zf^BgE>F<`gw<>jfd=Z^QkXta;K9Xe{6VSGpb6-W=5OpuF{tWA0}1iW#Rmw
zct4M8<^xy!w{Y6#f{O)A0ouVh`3L?{7Mo`ff7$-G^{emt274(c`x3>be5ulW%A-OJ
z+8nRA-dXN8y1Ae>AgFEJ(6?|oPikJc4;3mJ_!!7H)kMpnc_#xyOC^<+p*5EK0iW(9
zc;i>U3;d=bhYvw4%C=j)5A|+(*$+4H*eK)0pY0V()16VgzzWtWw&KNrx_3sQ?#lKs
zwbBzpda$O at MLWK=9w+#s1)3;7*uj9>0~(!0JXFVQr^jSmT}^~&n6IVuAz;BZEO(jE
zZ9?l3k#m9bmP>b6B4HRFPf{KBpDcptyc`N(V$- at t&sr#<**4NWPC2J^VbZ!r4OWs<
z^|T}A+uhMU6~pIQ<2GitMWNr^=}NRTagS`QDQ8;F>ak`EC2J5hn+3Ic*6fJOnwqVt
z&F2r{nrrU at wThm5Cn0P=2zYH+>i7c`)x8Cao!B4{3jN`17|q<qfrS-Lc8`e-tu3e=
zmdh(}tamFK&Sek?Xy3Fw9pJ`tQa-#u5{yz at KJ&iYs>n5wS$hAEm(}hi!UHm!HxW!P
z^_!$!g%{@U6V<#yR+QGdoh*@T?QMBtLLpe~lo+Z&FcUC#w;n2b6Bygsk0QIb<giC^
z?*k!XiV4fT6X!ztG!lY|)>eefd3_{LNP7?8>uIK6hs at wP%dbaekBAUM77xeTOSt^^
zmgMc|UN)D<sM75Md}wk`COUa+r*J(WMZ2SEEKafB8Rv$a?9C!;0e~*tvifXR7k*^S
zdwQqU*#I9$kxG_EJsD`D+nS|tV!UW22o3nXS9NWqI|IrWth1-LjUD>M7rp>aQ*t!u
zp6HOlI5b(g&O-Vr{(JmO<H at 8CnK03md#ctlU&r1hM4M`A3iD^zTc=Rgzu(pjQ<2Yk
z>2t~dPqSCnrZ7Q``%`{^l(CM*FU$py72bTwh!t+zeVjyMzFF9s{e??bF;Jh7(Q_PH
z?t*pC at m2EV%uyHaYI8UQE0E5pY_y8jQ)ZOH%H;5wlQ?3S8O!2C`FE4MaY3lPFPjqh
zcy=@`Woi+1X9ggx4_CN{ze#)fVJQNqod at 9`prWAo9Mv8jog*(aAP_g*P7NPGCC@*(
z9sU{JUPjh at TPGM+S_7wc{^nFxe<EquEGQ`=T*2bFg#Wi^UR^6sxi)n$p=LlJOR%pn
zSj?uGs*grhce_Jdu77u at VRGj{{>}%#>2ln_e2>C1rIBM)*SA*mmMjk7D?}W$wV3iq
z7Y&`zG&JR*L-DSDd-8S9Yn`p`Sj7z>7eHgm;vG%od`60cP8#)${VcupeGfYYE<0%?
zdtcBop)a+4rz8qmKEnCCT#^It5!YGzv%lQ{PV8UZfN^@fAwjB$xM>n_z>#+a0WM?G
zy&o2_y1(Pi_4tEGl%ZV<%@ygk0JS3qZ$PIvDqIo82?qtubh|Yy;J3()NL}XlMQZ at z
z545?Rz4xFFYl;%B?MCu!?2~;(u3NuU-C*8M^L1EG?pFMlT%qQ;R?0{H8_DNfNAl0q
z|I#7WPr&4y3a)>19HJw^RloBjK22X)@(^oFLJQfGVod3Nu~==mK)EoeO4i%YQY^jZ
zqf=(|FF~aK;s~X6K>4JG7eAFZI&-1q$T;8x5H_Y3HpZ9~$>jacG2hp=`fx=Acl at Pa
z#m{diKj)xZ#qs|J*@CxYi~t>uB}_fQ`fLS9*rzm~XAmrBPwOD%2&4>jfZuJY{DhE_
zkT`KJ4fc6_LnhA5uj$`-Ug=9b9?$~A2K<=KVqZ;WF6N(B>w<@AUD%+ at oHrF*NJsBB
zW-5N1^K*FaKqcer0XB>pCMp(m<>p0~TI~RwTpa42e at D(BJSg_|4{9co at z2kZhjnUk
z6<z`8FfSy%*;~w$j0w!qrfO;}3aumLl<MHp*gXEl%;^P+|F?~m`$RI5we7iIl<WSo
zBO?W(uR#*@<l9MGh@}7bhbs&`$q3ur5L&xtJpbgLwpEgGU~fdc`NzW!_Xq8n4&;0J
zxWwRmZ@$=ILA)*7v3;NFeNk&F6nwTo at k|P+0=w-pj8pVYPhnr|<9X#mE%}lIO4xDk
zei2ykYj?h}rPxTuji9CBUAIiS#_mN~$j8e^HJZpO>Hc=G`}8vtZ%D11{X1qO?l)0e
zcTd5aCK5Xs5St$Qh2-ktSI_V;2i)%<*OB9CDaM56Zi6k-HJG)@9<k0EDPF2&8$CI;
zz^;DxDncgD^zeSqwtMO1em?Ybqi9)(w at h8tOUufaN;wf<I>EOT`*7RFxEcO%<$IGo
z*#2g1pP^nZE&WZOcidDhQi-8(B<IxJla>u-?LIvQy_9pcc6|}y42gn&8_7()+5-mH
zdp|M0E2B^OK1bW#&DK&U!2Frt at N~QQdxHRwh_N~Q)ZjkP3hYX}Y!KrpcYnT@*rwY4
z99byX?DZb)%U+C9QHWOM$UG|F<UFbqXMT;J->5j)8V{N)I<@3u|6Kxslfhl9y(SrJ
zAF_;oQ#UJ;t88Awj4pz!cVEy8BQ10M*X1ap{w4uM*Raq4{yv|A^$fct!0xcD3NPDP
z2pV8p?sBJ_opu0pPHl9J-<{<Mh^5sx&G;GN0xeRy!Y$^?U6#+Z2 at t9aTNwxXcdG2k
z06ka{IuwHKm_D>zLQv_s<x9TXnY1?;^6Xxs_&aX&w<?g`w8XsuRmzjg$j at UbZr}fJ
z%ajgu&M6P?dAC}f9a4YKh~sg4p{2h(d$)30A*Z5<2Xfg64q(k2-QvyNsV|*poBfTA
z^qX!32U9XY)n^Zy0IUzDXDhdD23X(e%{L@==xfvGG at b)8zA{lE^BC_2SoKO+dHmSh
zS4rYM2j9HX{cAG9L&dxyi+Lap{=QlF3Bl}M?!Ny09o!9vM;|e5&NnTITqZ7G{G$ap
z?2C2U<elMYe0g^AQKO?N)dqS}(!#@XXo6bNhr4OyAHl{xPeZ$j;D#)$EhP45A7 at Bv
z^wHd#`!#7(8D!dzzedjF%Y2VJ`S_~;E<^^LHv=97x*2G`H~%vxzl at gMqH?pKztbZL
z#+>FTfdJKxRsGH;L${&Ef%7}yES{SwmYbeyl}T6eu)@Y5-;Z(swmY=;u|Q<Aj#QwZ
z`FiRQ;Ckv5nY$p`plXgcJgVhon~Mx#y9=McwGI>^Rd#>6d!j%56sY(A6p9&g{Y4A}
zKVKWOqMT`)w>NsM1@*0~-_4g7FUS^+YY-e4aDo9<0q3J_J5KBBu^+Yi`fg*S)%dw1
z3J=xGs|~v+97swm<?SEZ=D(-Bv7$x|etG6S(*xvbGtwPaSy^OaJG+-LSgoZA51M$a
zsb9?UFEwucgtiUXLw|a)Cx3IINdNDESwDH at 0D3kl<$o8ydK-vCefk&B5xo7&bNt7k
zUem?bzWmR=VWi+XJ4~1KU(Z7J|Jk$P{PJS|zcj)-_o69e9?os&;9%xb6zT1<TkiA6
zqlT at oqeCU0-W1sCkxU?vLNlX-QGWr-UsJ at Z<i)8(7F0p1I0 at g}|DeHf^9={7#o>js
z+}%5G at 7_*Sc+j6?|9M79PKD|11Lj-g-lc9FKe(1h_)s7+DDU}}3nfXTq;oYc5>+DE
z32bzBm5?;2naN|jXljFbgi*mnSZIVXU2zGKn49vq6FbLy at 2lJz=f8b>b<(4Y{Vl0_
zQpp+f125OG8Ucri-8-?BcpOy9H%ad at k}3%%$=1w`zLe%p(E4;Qf7DN?vOKt?3x at Q{
z_#K!ijf~&|A`DA3pl=}JruW9`6mJ%agk(`V$r7Sr1%jn7plN~fgjF!KI%cnqc^u}!
z9icXQ*)LNm8 at g<r8GD34XL$ZuV+F1M_rwKh-DKn9BN54RhNfrA53~pwT=a};eX`>q
z;r?gC(pc?R+n2R$3;63ZUY<ujb3G1tTT!?X*(kC~t<u|u{%&c{dWUQ3yOu*BK_i_(
zKQF;@3j&@7R#?BYgk9%on}BkSb`QVjz8;@k*O>^nPA0%vrqT24#x^Mtk0u|*W~i?-
zj_Qh#6;{`)GD3kcpNtf-gxjoLcuVhbFV(R8%ZkoYC2+osu|ZUmX&gLi4OA(zb)zgs
zdiL<$^ZWK1aaAWN^VZtup)Op(I$Ss{4K(7Xn$NzQn>&3Tvr6|CwF>KlhtB>8?4$Ye
zrD8{b=|21o<vK>x%O_tXGgJvs{AC*HwTDi=VtE8UZ5TajO84jmUi*h#di)?zCW;DO
z{C2h)Y|T&PWc#d!=4fEGynglx at 3zpMr&k*x%4+%9(G|$-T>q?-xm%#NIuhUk&u;SY
zE=#cGn;zzxN^mT*WtNy%YPD at 36@7O{-Rx*~9{ar at fSp`0uW|~F3HOO2lEn~WFhPGx
zKd2kLxgX(kGH9F}U+2OAJILKP#(i20<6UHHp+F$d_vUc4JZ{LOnKhk at Cqc4Ilp6~M
z9R<)m^*qO;mv3W<dRyj+;V->^VVTAP{q&yTXZWljZpADc#iyYI^-xEwXJ?bReH!-y
zjPLG-2ZncJhjrZW(77|8iEn%HBJ|P2#P|2+D?XjY4|F$FUR3do&L!`RCVntxKqk!L
z1L;eW#cth`I}vVY>M<QZoLWsin2gqcPE3$nBA||tSpX_!=jd>EBIzROlYlo?3imjY
z;Sa=3O$E}2C*z1~ckL_E7%Wh$y+6SqP!2{fWg+&y{;a5}jyDP)tX*=S&n1U)pA#Zx
zNX{Fs<Hn#`o|45{D=V-g_oH2Gr%K1;P8&(^@=PVf!U%R{+QCSwJpFT+%skg(ttsNt
z(XZ=mMECm`D}cR~Y!JnoWpe_By`hO0u%pQKmKae`z-`|Sce~5cu`L(y(F5C&#yK}I
zk}Jo4^NnHZ2DzdjwW1)g9G4h7qX3_8kjQHVt=EkAiEpYa)G*4ApvrQ)y7&;qu*UJ~
z4RMW~nWy0wa&$G3KXk@#%jO3XK7%KD at rJm|Yv6%<IwJ*heuPi8V@%ZMLU1pC*alrj
z1z>g`I}xG})O_Ter}7ujP5AhfG<mfemQ;ahB9OeXP^p7PfkN^Nf2CspJ1iw~sEu5w
zP4zl>dTEK^Z{E0$nr`1F(7Nu8LlyLDJ^a)@&g)*B_oFhNe-hLo5W at N{8iRU(e6{RB
z`A>zLBDQs4G;!tZf?J|R63t!BAoE#INxmWAKpxw1eoFMnDH3t8<%te;2u8_p*vqx3
zhNWXEqn0DlpoN3qw5`zWdrs|ytYpzZGv8X?sTDOsitW$<gmpl`PlJiF&g(}Hp_n^i
zBCiy~3wQU|9z)dPuyk5Fc5v2xh>oM<I~u?1K9%cv?jVn^a(4DjH)h+F@|eO^F^e)8
z&`*@ft-1AZ?|AUjHdpP9{L>qTg))P>J3o`(8h5$lw!&)T)A<cjb>&=O0sOzsxZrK0
zdO+>DV1*I8>9X?;8Lt4P%xaH=1z{V6{rRy4bq!Kmy=Xk{{7LXYZ8%wOsD5UVz)ADZ
zGcn&?BpA;ztnP8cr(s-AULX&3r+lMy?8nAE;C9Q#;sPjsqbEzom353yN45>DqFw1~
z0lvh?)|JP!dminwR+J%jowVUp$w=?)9*Rn=28pEv3iJX2G`Q5+4_&$mB0|nQDkyyb
z at KQGad@t<H)Na4N3$PBIg$MS5MrR{f<Qx9l%n!-scwnwHLta^uUo%Bm5<r^?Nx8HS
z?1;_YUykF`Ae_6GI16P0swAXBckvk)kt}KJ(+|}jFmEHNk6E{4($!sT>t%p`u0kf*
zj(Nv{$v?40_XsBiz$%kEn!M30R38}Y!0U$Esz+C!iZnSKV6LtYF$QPIPA>kKtq}Jj
z$^K(7$7v!=x6w^Hs+Naqsg}a|#MceeLx#ds;;pi7fHvJgQlLs6)MN0$i6tAJZvc8O
z3!z$tkpo>BFpPdbejxu62W4&qCBb)!H2kT?O9&*H{3PN|R`@CL;$X3CR`df!rCSW6
zL9$>E1PXrGMa9=~FM3Uc_`Kv?zxdcS=W|V(a?iNojNPkm$GAW=Btu|q)Lh;;?WO3a
z*I4SLOh2MR8At0d7omm(iCkR<Jaq;Ro%q=1x{(_zo5S5tt81Gq#Za9rEitHyV96qw
z(d at qoi|DND2poC%=?lWX(c?D$Y?xw|-i*e=fSVh(la`;Aq0i-6z}v8a<hJiD*9!-C
z at +OGI`8H20R2GisxSa<qNq%yEL;y%EEvz1(p6^|7k-O7a3#WpiR^8EitklN}W`}#I
zw<r2aR>%Nxrka=88y3bA%Vb&e)AB<^fq05A8ntqXrG4+~k`eoL2(_V|h#Y)$eh(4S
zqwY$z8CiWE#%1_ms{khSM&}0<oDh_QpN&S(a<5DXNaWWiBsgzav+PuCLCmv<BaUu|
zyZd{fWk><r*h`^d at fSn0QbeSYtGfdfoO!_b&JB5qWOTSQj)ULE3r7PzWu8%)K1YJq
z<FCHPKppEYK7;me=!=>|nHQMjTEc7=v}2>-dvOS1EiJRIeib3Hbpp#Dv#lr-j(h6^
z-F+ at _c)35r0zZO at vkra444S&E3yl6e<G at B)m7dn!jr**hmvryVo9Ez~Ir%uj063Ht
zoMFyf#>p=i-MNE{etz_XS{No};YGaHGii+hRh0r%5E#%q&<CFyRJ3thNzDQ4x}Atr
z@)q~UL+~m?)lH^}ERAcR&*zkYXoFu6K(pYma~O3HxtONoA8My@#|ocVeu*Mm)a;tE
zJFh%!unANA=4kZMPGsj6`xHJKwMX?w0`DY%H~Yza`@5whn5%g7+qtei{@-M9cDxIS
zJbcCQ|FGLMshOX|IPjyP?*$lrTy1AlZ~wd#ZYyvo+^ms|-jY~IJ)@<jciS52u6mZp
zr(58bjFq{G0j>5%eLE{Q+F-}F=4APt0`YqRM1u!|#=2Xcc*Q$*RH5l4KxE|<QtQ_u
zKC<n7O$Ual+Rchxa7rKI|HPa5va{fM`Qe>vbszJ&l+Vtzp?~m&gMGczm*ITK!^m4(
zUY_Fe>*VxKj{IaV`xa(v=*;6UI|Prwn=E)>n83IiQIF8$h}`jU0f_*LJH$+m9xZZG
zDQ+yR_%{?i7<hGg&?gAcbq!V){s4pB!(cRM>n5nrUBy-O^7A*@htJKdwA%(tKPS}Y
zj;YURWm((z8@~bVfvNYbuZi*>fVLr~1TGG4=}7HEv%aa#iY$}~z6(7gL%5oRgh6S;
zzz}(_yy^$e*DuUp6aCsH`@%TmG&nwRJ-iF%OSLP3j?;iA+o1FaJwRC-^rWxMDqcN!
z24hhNfB;83bNlB+0&icDpFiVkh?9R|i at b$Q{2eC6d}N^nr1i&bh3sT*FSiVGFJ1?+
zUhh9(269b|lB2e=-0d~%|MBGUF`Og6FLt}_4*wr0*WBI$rB$yabRd_^cQm=nqr;19
zJW-w?UZ>3AKRXD1P&Qw(pq7jyLNk{ii!k`l2Ih-3I+SYy_x3-gQ{n&cJ&u3+OaUqG
zwUBTXmt8vnRi=>i4VL0-K4~Tj4XjsQi=au3r2rC$2!4X~lo#ovmKIBBjGrh;bIN_S
zjOQg~s?E%ePwunfGTO$CxupD!9L5X%*>d^DTXc3chX43+$vG_wBI)mIX^n2;o+;~o
zS`TA9QQx=(@)>2Fyg<chTn`1&Ar?pyoWCc`?rqmRZi;@=ISZ4KgNnRvm%GDviy@?&
zLHTO3MaR#4zg_a`&yz-$eu1Z?sI3(Dm3nw&_wrR*YH<05?m43~CXRa+&ughAEbmRB
zV+E2F`hDY4#E~UD_pW1&0x at Nh*BK9bLE7R~ZU(o1pVAy58l+T~R?+^ezCI5#y;EU}
z@~5*Jria()^UzcXswRxYb4hL`iW2qrOc6Kuvk^UE=D?Cb7e#r!R4Z)e012Fr{q%zc
zq!j=woll=_nxAeA%4t>+7E5 at j$@TEG@=D2bO$>IhU^$(<NlJd>4}$&C+tQkg33gb4
zi_nvA6RRJMKn-AE*P_X>6JnX!$j6a>O)Hf*TkiK`zx{)o0=annM2hT-VK4^Sn at I{I
zDLfpC;T+EwUynL#bs~n!OtfCL at nDtvun^uN%6=lNPqajc=1G#Y&j2tAS%%H?-hi9w
z^Ay0VIeQ)uzb4`ZNsr*0a- at p)G-y at jplq+9HzVV4(id*`<P(R7%43~?tWSG*{-?Z)
z!vs4 at kl}G&#AIc}ifI!#6ZeaZkt5v3Vgnyf6cWi)&Sgmy6}*T%TSA_Jp{&XzBr9!b
z)7*e#HU0r>JU5cf;S<xjoi@(BF6K>`A!D$PMqvH4FwX1n1opez9QR){Ms8jVNnv2t
zghh=|fzf=)ofI8=DaV}O0osRanThV$3j*MWFWwFNOp)a7DE=~i7?PXo<NI{35JoJN
zZS#oBwOo)9X}vm>xrALdt)wyau(K?>GHcNax~VAjFm2NSUzb53J2v`mZA-^jD#DlU
z5PxN>GC2xKBLV}}hGQ!k9DDOw^C09HXIE&bF&yHD6K)fw(V26x3bnH97wn23e5I%u
zZ0N+O8 at K3jTx&`n1)wPdy(zG<(r)<h<+hRr!40xb$>ZkcX?Xfo4GV|N6(wyyJvqh1
zUMT$~mAvdA+V7H5-b8<~bFo~y4 at 7|*v at z~PrnS^uZkECKXD*%0BeIvg)TO36s3rng
z&`rYt<t(;-TLPRb(hqlS8sg9Q+$x*;j1rrlm2X}K`B$7h6kZNw6eZjhOHk<T2FF~q
zV>81Y{(!#siT@%Kg;@`_9Hsn=R<|a@!T at Zi2FlUn@h!3HT0 at 0aCRwN8F-Ns3`A2Br
zB#wGw>hx^_+X7t<Dw82%XiK5#gxh|3!Ob={{EcMPlDIjApR!ouaJM_2*8e<149yol
zI$-7S_P6={{QI5KP-TV2_8A at Do)-ADPa~w3EEKBM)C>nWS+<E8v3OhsMBIdpjR9*7
zIY~i`*zS^{cepo^v5DTOvIsl5)HcaO%hpKQeltF!=7dxnlRh;=+$T9&5KA?#ss
zC57`t6|nBvxn0PQ71(`8RP*s6{t+59!w)&V1s<RohY+njR2M3KbVJ8|ez2n`Bp6eS
z^XK!f)){&pC96j-jUBPpy{6gne_Jd%l3%M?ycv>3ol<We#FBM)3|$V(H94fFat{jy
zZH<x{;<jou<+|PlL6N-`8#jqtHkmWz=@LeKhVjA=lJy0zbpa?RbSv^X$UR-DeP9%r
z!r*`8BrKdaSaqm?glEp=Ujl^A<P|B_VwI|RVoXy50)W(hQ1E*u(7*)MK7B&?0=pcU
z)-_j8erPSX)B0 at M@UaBO#c79(IhJR8a#yOz$Dy%53NeKFuSHOS4^)qOpeHlL-=kb|
zdaTI2*AUV?YB`IJ$Rco4(y7TG3F-#~``A!y^heHz&oXWS!LLQO^Vgu=40k0tveg!>
zYTjzd>dcA^ZNxI1R2lXGgivonWt{y2Z=JA7zO#`!G?13WqFW?2N6bpeTkYP5g#Boa
z)V1fR4H({Tjj^Idt-RdZt<E6aJ0eD2{-!9s<3Z1B+xyfmLAd;BBIX>6xouAHw=VMU
z$#WF-pF=dBqdxtK^{Nm0(ZQbfr!@7}6b97Us<)8Ds0@=nR?(}8689)r=EnzmBd=3S
zf at 4gmv)rAu9@|GaV2`27%ja3)0FZ(ued735%Cyrq3KX<33XUie_dYX)Giiyty+K at Y
zLdO*{z!My7A!{-;tQ%~SMlvW%Sj+c`dczye<|DDXAq3NEEq-_%%#uYwxr<4ZfQgVm
z`Ic8#mhIJEtiT^q&Zv=v0&w6ql;@+|E_2bmm!WxeHaGU#`>IPS4I6_9FZ9LX0oB%8
z`{Z8F$AMu{Gmj*d-Gw?2#Rl?@nO5nqJqr;`7S^1utHepdpXE$Ad@!x<b|FLfg^Zt+
zX;*q at u00ewbX>BX`e<*u*}u1oW!z`8dwWT>|9pO})S_Iy=zU(T3&wPbDr}&I`w=2m
z*ZLf9hs&O_*#lL(eY5)U9a|e3)2K`IAS~nFO?#t0hr*%cPvIf*d1u+0hXwCWNjejM
zzJA6)1^5pnfCM&lco=_;ls&Ic at dS>7)`00>MiR)#Xd~X31Mc-g=?H^|hn*hxhMrnd
zAA=#UTHzB$q_2^FA!F*Rf~9;G3vq<jcG|=i4x at x*CGBuGIL!m0hS0?$7X1wdt5G at D
z$7De0u~fXs5?oAISEl at y;K>JL&_Ne`#`Nd=Lja$8(=`EnnZtMMu+wA$jEX8n&z|Fq
ze`RI`i&+J&q;T6ak~|H{jomFZw?AcO9n9#Sj(E{=X!XMVPKa{4aFErDpHY2vzWe5{
zY)!|;oS*u5ka-Mx$baOV#_zi<nUA(XzA`_E;^p(IA#wPkRy at vFHa{{eD&a*n$s167
z^>gMMxy^XmF}@ty(9Lm1yN74?k}peU$cafd5fPQ4yCS~bo#V7N)wg$)BurOz4Vo{}
z2V;u@=vxG1_3Uv)SOc*z*y04xpk1&7Y at uS@^z_ajeaSEOS1R?4hfL}}O0&q^bMI)_
zx1B1mH$7eUN|OqpCz(0BOJeona$DCxr34(I0sAag8QCflu8j0f#8xuGQAVIT_}!9z
zP at Bt)ghUI~*#NM&#lo^pS at k&W_J$BcLi~{g=*h++0-g!skv4|PD{xr?55Q2wXT6R5
z$A`(r$*iZ2nc_gg5(S#4=0wSDvsTjV`=-g_Mf`S6#xS`fbSNC93+=GCQ^~A#q!LV?
zMQL3M^Q}XNlsZ{OxT7;!?Y`u`FzTe#2?=QWvKRZyY_I<i1CMa&M4-GI$a_y+Fiw_W
z#rw`GBfTjau0)4W0{H=w2TOU!=aH9b3#$WR*1}`Q6OJEECx0k%ug|88%eR4b^GuE$
zuD%(1QLSAMERzL2r?oJ(wXkj7*}iCC+Y5_G{koh1jkJDArE9imx--wUp62AKi>R&V
zV>@?LA+a(Ha}pb%Ak@`Lef{Spw>+Q&M{{|9znJq;HE)TVK^kRuXSXr+%(M*9__O>h
zBbCIauD(D@;A*<=dE;(zueCLjyo$fE`BRZJtbhikmCe&>Esgr}k!6-(s<q%dYx at T?
zqM6;!)uRmDb*~0;w2JhOQXz|z91Q9Nz2W+F80zZDr|wBVliv8-PnVgNHJcgC6AY7#
zqOeez<^v62m0 at R;W79rWGPns5a!;NWG^luD7(<?KssXhGNN!g8I~tm1f+hb1J01JV
zL#7$&DE}ft4H}9zBCQr56QF=mc(q-pssU!k1_*|g8QR26UidshADey`zr9H0uWk-K
zWi>+P?st6&O9?;1eEE++z^D|&9Wa8Jg74a(2Qj%F8<d28&R#5)*4*WCp2a^reAuPy
zyecfeR>t_IcX213BMrBZY4m)>aLh)Ci*2aLRI3y^Yc+0*^hRa(%Uf`JvNaE*86ejy
zAy4r3IG%ZJFj+Qf%W1Ptaf)X<o>qe<TENW`V^*Kg{Sz$P8@^ZXBI>b2I~Y8)G<cB2
z0nB}Ues%GMc(a=NJ6MD|Gcj)9N4e*&^n-&vV2 at KC@VtCL464mM@~UzNR+1}tieBc=
zlx?wpA2)G3|0;FSkn{>fePOR4iyCHkaj}Z#`HOe0S7`3$oqV7HY#!$AO0qM%B|#S7
zf3qyW4kU?xLhsywUqwc$p>7`_8!PTomZpXb9t~<PH8YU9HIYNN%oLJl<8z<rXP~(J
zBfLU^zBF?pizu?HS$j7Qhua_Fv1_gVRvO at H$Zp{U at TLb$^%chg?|5LnJ~mS1k$(_8
zzUxw0N%JL+Bydqy<?CHy#c-`eV)b&JF5B$%?_0D{vR_x#wZ>$h5YB~LMOmX-bKW^9
zyoV$tYzxu3P2dF%sekgkV3EcJPgoXDx2i?dFA#=>NGo|yTz>Q7hlMOn5PReg=7XQU
z#!nL{L@@@q)An*-Fn<bEtdGEDu%P@^aFvM2FFM8v5PjJjMZqs77SS8a#^00&=g`*g
zusXf;W}4HP`Q*EB8`v(|Pt}Xl9-E=<KAK_aH`EF$I`p7VIh%ajBog16wB+HH6OKtR
zQGUw<rM0q0J6Zr!dz_K`gab!k5AZw|#)&d6ct7)2V6(U`190*+Lm?p{p(J>;IHB<v
znEJUJe44Ib|1i{%rh9p!9M~&<j$z^$ZEP&pq$U6SSO76ZVYO%Nr=;IZ^98kDX1fvx
zZ~>J at Jv3J_AM4zdE*j1bOz&?Ed3~R_#cd!JB(Q=95Tw6W?pax<k9nWiLGle*66J+4
zB#b%}?n6h2MsX7znic}f&7kL;YUuN>+=nt9Z6?jb!>nIWDwlyC#xVStmX?`iv7F_#
z$dEH9Yjt^9e%b;b&P+)JzZJ}_NW2HTX*$JN=GJuP$1FqgCAZ_+AJO4z7TEL+)X+R(
z3`{7vVwLZG3sC<+h-QWM>9ul}z(go at lxy<ds`-LnOCQ-_a~;36!xBFC-r0+DCe>K0
z{|ts5Ao{{(z6!1G{Xku6i(n~SVp8`V^_Nd}`;Cf#sJ~d47Rc?}l86iy`5+&0YpWZ+
zqb4LYlIxw4k?NsQ&YQxodTk}{bDrq5ReTD|w2VA;IbC8V5viDe3lYs|t<ezZx7@}D
z*y75nt1fGX)%sythE2HxX=f@@<qFTUpXzs8l#^uGGxC=nKi#Gk*6_(fTuEvb&6n>u
zmwp^HDPBF=dN>XVi$@Epb1iet0!x$X&0jg4kE(d!iR?U=Th`@rq-l23Zd;jM!`}r@
zo+1SSmdFqg5M=(^#Ael4S1VhZpw30A#+Agxi5c+t>NPCi$1&GHss8%&Qqrzu{~>d7
z6uWEl89G6k8Rcj`<+o({R7lUWmfw4 at uoX}p(Y7xTu9Tyf-cdhgDEZZ0^)OwbemqdH
zFx2z?<2$GRejO;SJC1H##@fiThu<?84-01opA|x#fAW9*fzmu|xpa$xGO280)3YG#
ziK)T6ckQ{>I=IU`=JJJd{+{{-71_z9rkh{cP9xeT4>y?@t?(+bXc9rpD`*AV?ucu&
z8c(@wRjsIRe$PoV(zchw*O}D<YiLuaZcdEw2W{!CRQ0dZ|7Zc;gr|>Q`bviw76D~O
z<Htantb<U_vClFt>DOnHJjv>D&BGZjL7QOW&*wR8+91kUqr1+Vk^bTborqiPQZPM7
z$u^3Wd7vD5Mg?e;Jutfpy1Q<zw#mJ{UhOe8e_eeUlt5|4H~>@nBozA<$1oA?8uhaA
ztnJcu$fyu}Y+)g{BFKOCeDmYyex%X^{O at -u)U`GXCdX&u#yXT(OP at WuC=wz4?r1zF
zFXbk at toXg?5s0IYZQ|RlI(j at l9k;|YGWLBHs<C^GzoBovy^m<FtSz6fRGGX3j5X(s
z%yq(hu}6#Rd!wun(=L%3JN5Jm>)X#rtNchLObwZ}M_ at 0ma1ob%6jza;hwhzzEzRnd
z8yq#W5HZcYa(DsBnz5w&YI)-g36my+baQjKp1j=d>+gCcF*B!z_I5+5$?5{Y%^Y_s
zGs)~7vh at g=?v1M7^FSeIw+9_6l>467M at XCGQHQe*!vD*j{`|SG{D$M`p1$E($@F^F
zdvwoJgk^w)9!E5*-UIw`8?y0qY7h}j at Gi->N0%7C{c)U*z3XzrZ-?GU!_j)z=3|Rc
z)g^mSm(s2#U9=_c1A9#HJ3_f3mYVht`Hf(OW-cz8aNEkW^vL6d9nXm@!Lj}As?jH#
zq0(cBeJz!t$pLe7yUJ33NBjI4c#f&cS#$Nm at Ky6!b0&oGxdlh@&h*-`{LC(Z^BYmg
zHs1l6`!cohEjLZ;DQ$%KCZep2H>hk9xx4kS>{QxMQtv<T-v1VT0*DA%ALi;7YlA|&
ze}ob2*TM+=|41ott~cGN|B>pTfFRris8#$^Nn0TY3Tp6#{;e}S^8bE|KoCat$DW<l
zEN}AbP!lmd`@!8I<zagEh19O){6K6*^q!1E>+#?cruxOjXD{ek760i|n?0$PM(kPM
z3`><5?f+n=P9S0q`|#rQbvTl3H1w2sSJj|{M&<&o#uyed;6dT2teAGWWeBgIEx$N2
zpYng}9VvX{TP#?)NsQe>^26yP>U>_m2!^xc-N{*XqWr6&MX=tBz-UUi>PmITWgd&(
zzq%7rPz}Hr7j~x{LCvZP3mg!MRRq|j)H21yV!!C2YBCH-E7F`HbMQ^}H at Dwos^^I}
zp at 8ZsGlxtcD?Uts-~e at 3tm#|?NcCJPZ`la{w`2r0I!Ja%x-m!q37DLo7vJ$z(=s|D
zMh`tjG|>Tef*nvUxHJ&E_CoyiOL+36$=P#a9B4g(%*%npFOb=L9jgtvvjM(0W at R#i
z;0#wNvoZl_vqSkR7by)N(4o6?fpBA)P<Vh}DL3wp<QWBGI^ZX5jj?V&*Es^edcHPV
z;Mk$<c+{o*qPt|tZ!g#6Z1VBgv(GYTXf*-nXf-ekr_;#b+AF at 2g~KRYunSqh8%Sc#
zwipG%Cv5=Hc_3k%)-EHqdW)eA>_UWpW2!C0=T_SK(N?;CxtH`t4Wd$^cBrLs!EfkS
z!%FGAWxM~Dv#<_O76#^e7lPoE#_h*N66F`0<aSs7G`E1S&h*#%ZRwAuLY3i at yv64E
zhX+k9rfa?CX`*U0&!-k5S1x|yZ*N~b@@Wo1C=!)jF{95Gp4k+5K3B!xzI4Hf(#Nk#
zm7w$i1?DXQp%Fjv*?l&1z8+&NT+M&EltR6#dWC2r&yx`e4l-vZw+-m{>>A+7;46?a
z^U?ISct{kd5P+lF(h{Eg?iFr8dMJES^W??NFpZKD{8m_bC4zGI68T69=sd<C?|TII
z#@#|vI4xUgl0z2lrxr5WUF%D0pX%v$(#SO2n3cHS$X@|P4Eh|;u#-8T?DM`3qyP4I
z1~XIdfNl at I%)CGwwKM?pixCO%z^B;l1E62 at qrB_J2Vvb?@nJgic3Jqc at mndW`fawD
zHZ1tD1xjHOsZR|C>`d-!$=B6CG!p^NkI3z0QrkD_fpdIqne-rddaCD at zr0_~lP~GF
zsB8pT&9_BreVRF<o&r-wZCiSxp3Cjxz~bPS`X#^hU{7krg{~=vaer>3cOmdA?JJr`
z=pL&N>MHYie6<dcriTNIs*ik}9ydwX7Um^>{VFxJuz?L+9o|UF@?ZJ(jdk?_Hz3>K
zL{Qe0`c!_x@{z4_Q{H#y|KU~dVL<g!^&OY0c0bX-DwNZvuJItRKs6B;z96;#u<uZV
zJ=W)WA;VMD=K~`j39Z?#twi&*x$zJmuwJ}tp=5tmiyWg0H6HjF7JGg~GPN)S0VW&~
zy93A_4P05&{KtOSsk=88jGsfMx>C;&as>N&qDVQVD`CY3|K(+JC^@VD6}sJ(F!rpB
ze{g*h7!byIz_yNV1r<F8vO+zsJid|w-a8-VzK=VpT;v7(L^D79ByO}Kwhgck1Qhb%
zU)DaXD=#&9?yxZ|4;J+M<E|7s=z0MsOz6Q0QCGIuE5Fad6;YgZapRWLLi8)q9^NRj
z^6c(=!r#g-&PmQshK!d#K56&PEewzc_iG{HKNS5KT1YC00og*1sgFVxnwsTLHLZ3y
zLVh$mdc%X50h0}H>Kfxm=48-MRoO-i6JdiY-C<s%C+o1&DBiu9S#7=-oUysxLKll~
z=)hAm9RPTSysWChJQ^_fQ%4XTn(wmtq{DqJ)t$7dsh+cMlS>I`g{j?^?h5JUEWg;Y
z-bL;CyB?L=;_(3w=jmqK{6l=;Q6mE-DKIFdNW+nK`9PngVY2hvCM%C>(bCjhu2>WP
z*p|*%QX`MiyFhrlplYW`)fy=m`7<su at Kej591tkc>q8C`irrv^I^SUHN`?RwEFkiJ
zcJ$sO&-^jqx%>w6v at ZF<Y~4GKqP8_>5#UMEO&8!~+PwPWq>%&g6`4dEZvT8KbtefY
zHAR2Ev;MHw^lXxMZwF3H{t!nTtW#}E#paEaq<#M%XSBGE0W}_IKhDISTKJqd(c<?i
zBCsam7#wRpO!U^H5RR#ZX2cVF6YipnPiO8ZH5FoRKjCZ~9UQHr<v%~EdBET7??_CV
zN?ZUqP=tPF$MFRIlz(C{99C-bu`Z&h;__B2D7MbnFa+?q67^db$QSl<5pfPC49D02
zY(QvC`eGHs4s=whY<Zw&)rP*tqv}?x4~^%j3t5fvLLgj*cj?FsRhDKqQ+OA0a(tJr
z73Q=f^2Wy4{{>ymsEZD_Ojnr<PgWIz(($VM8GHsmP2Y9{PV27rAEQ|gYT7Z9#@>2F
zKLQVB2`}<+sq+>ItIu|)?pif(oS=D?ZuAnxB)>e;WnZk(Jxh3XOxMfjX<C#)$JF=i
z=I<VcX<fFv?~=(f!;7?Mzo0iBKP1xJ^kUX&ObuO&y|41z9`@6<>$KtWNLHrA)33(G
zvrF1<I7z%V8Q%v^h0;38In&>%|Ge>HjhDaaefmuU{jjy~RsLA_e9X!6uYB=$VH#Ff
zatp(j7u5}6(6ouuTDFzDt~id$6y?pBK*PyUf$+);AG%%TJU(*6RvT2nW-m?hJS*m}
zCV9jJbcnu=*trmUM>3JU)%!xC4Vst<Pwg3`V3K)NBo1I~8i86J4}#Y<pZjznc8TuQ
zaXXGFl*Z~-K-XHehlNvVL9_YhDAm+LpK0l5D;uBZ4(Mh0=QUIYbLTXm8Mqv~@Uv!6
zErKjf1Tq1>L&Ie<CDu&odCgIZ_OwZ*ejyTWfE#-5&P1Sf-z?>*CA>*0AMnw)0oEU`
zL`U6{`hW&(bJP(&wGwPjofbxr_<#c;dSw^TU3TxUVb4~-4o%7$R4w;TeFQu&q~Hnj
zZ(KZAj-a}}<cJv`@YlzOo)=!0?NW{m;6<PP12EVw1t%#KnlBgdRA~za{saPA58p~m
z-dL#BuK%A2(?*E)kmT;QwdM8o5d$T+HwT(7GJkI-m`Q#`Zq(KPlk(A2BvgS0oj=6l
zc0_{Cdi_LhLS?ve2Nv4-FV5~jjq5bw0Ydu at N48{vX%o$+2q-}P&S~F~`DQcI=PXr)
z$yf_7b}c?!kq8G3EZjr5`)WYiPaw9pykfmk1e at Qu;yk#yC3z+55Sc)IJn%oLMOy~x
zf9uJbzWs_nZN^Y!`4^##*Ho^?9Y72{jM2IU+ez^tw1G?^ZQeFe3efa@<~@O3!6u0Y
z at GoyjJ933Fc;(hUp7=pgA}>(nf1*j|(n8B5pZN at Jdvh1e(E`}>@1ibj-TjDitrcy?
z4m7q8Sl6M1rHW6%`d*lv`&6DwI4rmM2JBgtQc0Ey{9)F_vHs~rHJti>rbOoUXE>{P
zFW;sGj(QGI1 at fof?(AR6VAJAjDoUXg2oB>pk!Lz-D&2A1VJFqhL=!c1sGFa67BdXD
zMBeYjgAo#P`oX?OxZQn3Wy(G5ilLB|9-`mSy>rA2o<>Hz*S_F2LH4C-iZYFdV$MM%
z?N~L{y>8B-&XA|BQN8CZMsdi8-~j1NTUEK*QcJJTSvjBOC>%Cm2xmWR!l38nrM%lp
z>)x_j`lmA^e|6^O6go7JZa at 1o{V3_;^Cc6J)Q^md>u>Sb1cSril9Hz`kOX|c9_6{b
zX at _~~`Z&L&*cmo}6pc+|Q&1}Sm0TLvCL~|PX#1FVGi2U0tb>jpJ!86j;<43KRj?PV
z;sh)d6iFI1`6IZ)A#C0utYhgeBkOy7+1~C&_s@$|xQu+Oq2QnAcc5&9+AU><vaO)l
z46exjJxtTKW8+v}u(T!V5X)!&R3gnmMq{Rh?1Ju+j~No{A8X5Hb0VUy^dz7Kq;>Qe
z%9?@l>JVM2Mg3M`z=U8nH8rmKSxfHrD|!^mhlqRz!CxD(Z1dGzG^m7xM8UWX*950N
z_**w0K)Q%y1*sx(v#ng&J_he&7`_QtAR)5n$fv6aB&VdZBskS<s%)5v<0N}xL1nL*
zxxE*b6Rwy8ViVy?%;C2VrzSy84@`7J%{m$Y1c&@x+ZZC56S?(vtO}5$RmCTO`TlFv
zR(F1f6AZSrP`*1id*gED`qI!v&+lsz&KMhgp9MfoGA36d`7=DfFo}1VS&XYxjR~Jc
z0K2E!p9Rh>Ke0b8V&@sKZQ(X2Xtm at SZL+Gs;z9eJ8buA-N-*uIn-g$lA>DID<;f+9
z5hIGh7<*O`3h<FR*$B)tTgy*awYs73=;Ey}#n1z{iRauQ;7LT_$Gt74{AOwrKrm<S
znDP>mMHBHv!T1{u at u7FY^oErf*$&T7_*)^$#C}I%3~1LYhn5P at X-F1VNHvw0X^Anq
zCwzXNFVy8y0U}G&E9)_l`(z^~b3TXXdFj3R7r5bM-*aZ{q`FgTJj{vw;Sz at N#Y=SV
z!C&rxhkKj6v!9;d9U_Sbfaw$u6F?^*t#a;=SD at t;oE+NX$Rc50CtMl0I*L#8OBpv(
z0iM0|<x{~5IgodNZO at v5dZ|jej+YY`of5>ma$xkB^rsoQsfS0G4rH at fRLb*Bl|s>4
zYrN{7c^YJWACnNv^(#Su=yc`WM0+bRj9rNTp{oj2c>Bi1#VVs}XiB(Q|H>vds$m=+
zZ!HKb@{t>N6PwgCGE?7Zojt_Q1BQvpr(h#5JN5Kvcvp%Q(TS2L*5an{#o#wY({0=q
zOp#sc8;u=1lgU0HODBQKY*9f%=siXi0zh}BKoQwM$&X8buku5vZ$m78U(i2iGtq%L
z2Vf>b40u#n;D?@7%>Z=Bjy2?gv>i_K?Lz2A#sUtgNOVn3beAs^zD-7z=&M4o+z-jZ
z{Z{Ea76+(ZC>1*1FBf3Uj>BsG;oJttra5L$h{y9d&J(~en}967>}sb3LW^65kC2}n
zm!E5?o;K`ONi6PrKUyimgm%dr;F%L=G~`~?qW12D`i1+9=fYw@<t8awodJ(%I!~Px
zy{Du at U6Z=xCr{<I)P9Hw8!0-JxeHH#Ec&=+lFJGh?C)nZN1PpiqeT6Cl=wS;kJ3Nl
zLP7m&abd|2Bd%O%Hg68uwyI|%y=N6;0g3pu)QhV3jH^2srk9 at N4`{6W&=nfzr_EP^
z;g=~-WZ$dFN at q?M73;uztjdi6tSm}oJ7s_2`zIoehf25nU at eW!g5#9oy68|$x+n+0
z8mXYhPTf)leLy4Moux)EeM at buU93T*^g?3{xh230*}-@>KRk^6B1gi%w48k6>pZM6
z!mKu6r$Acu%M;Q|ewl2uX}-Q;almdZXTIeyfx7mq#?;YnYjKQ0UO*Cz9tuwcxeBL8
z3pAIG!M_y<*XC18=p7_WlfYl236h1E^?I9UbiAGR3*`=FsSh688cL|9vxI%}8~Gc_
zd>GKd_sAm#=5H$igi&qeF)(3u>-O}{fgv|z<t%={j at Wk2E@2#MY>1t=hoczE@*aOV
zCLb3HDdI=HDq1_ytNQJ{eIbTn)390dDVGtd&^Z_D$Wi!9O$JPEH14j3hf(Pcp7ZmU
zp&!0BgZG!~G2ISoa4d8#(?ZA%5icqxeAL$wNV`l`&F6nJOL at 5)^!puvUs4}iP}}5N
zCD8F$Vt%|FO$Wb^RG~`OKBK at JrR)XvMz*xXU~Z@{2HZ at A!0r6LTatDISNpDW3JP~a
zUu?Otp(PD5XQ(v3juI!lk|Tqu73blnFCxz`I9<=y at SY3I-zGkHP=-mQXT-TrDJIhc
z;^Q5{IGFTNWWk0(Ekjg<VX-d-1O)*F#o%sAgBiNK-E9o$jXM0LtVP-&3!InmJ<s`2
z4+%omMEtS{>OeWfWktal((%LSWN}TxXNd{s#!!+-xN0(eRwx&WEHLHQXi-n9BSUKO
zBHHKbx2Tqm at Yga^0_$&Z+1Cd;SA;wNpi-@~)@IDrxTl*G{8gGWnBXX~Ch$Q$DE`Cq
zYPr>IT#M at 8Vo;dHjC5q2!e47w1K1NIf9|%`5m?YbnR5(E at g#i}OP_=q!D0<KWX4;9
zT109pYO2EDswm-J-bpd+d0$t3_DYKJm)8-`xSlHHpbRlw?GvSo7$_k={kn0$a#nnQ
ztY}%R#Td3VOb`7bDWN-Nxh!^SdFMC&HnRRtUJ^Ar{8PB~%|L5|s*LJMP&pRCNc<?v
zx06-o&y`WXj3fKsUFiQ3Jz!%3;N;_THjGM3zU5`(<CFR~Mvo4rpa+s3+>-P<`2PFf
zo4s$?*b^V{o(B9qx2$X)mjFl|V5OJ#4QG3tA)E9=p1 at hBIG;l|Y5#jKiKOod;eh3#
z;??fo!`7;OmLQB-q0n3nY+GAf&|hokYD6qC{2o-I=vT?a{~(p%`Dr89hxn=JB}zKn
zbYMh&08;>Z@*P-^3P1HuuTL?*{uv4dTl|*22pc?-4J{~n&*CKgUT`3mQLoIXk6!L`
zgF5D=y=8gy%4D+?ZvNKa+Ntc3>(lO35~^qQ0Lo5GZRd`i&ggx{E)p=uIs+}Rjqo5W
zsfD9%pBBRUyImtiU>Y*`6k8EOJSC^IE_Co=b2>B$!&1h;)a?aXKGB%*3oYsv!T*cB
z_W)|@>-vQcT>- at g(owKdmENm}h!l}tReJA)4$2=;X(9sBL68;*y%UNE2uKsDfdr%z
zdI*64;hvz+^WJ%9zL|Hv at 4NHfJ9Ezr$ssw}d+oK?-g~XzT6=B2DZ;fk+utT59V(im
z%Li%AILzBtk&zCGe at 5oAFY&;x%Ob!L;NVZ4#|2W%k!{OleeOH}$t- at kw|CB at -kstt
zOKo|b(QD*4B>y`Hhwtj<iuV}5u1|66VW2)0jpi>$74NpZSwV=sADm3sQ8rkNC~+$0
z*O+_wn;K at KdQBu%spGu`x8^$o<8<Xaj1TT4eqEj9)*H*1sTXYYqj$moEc050vnDc<
z{*|+fr%VQu6sIQV&u=S$zW65<XS#|>TN!fII11F>C~;i#Ub(~{a6$V-I_PW%LmAGJ
zVQ%u0g~d%h2o=PB^DHdN0T-j<dfgjLEH%yJ^Kv;&d$oq6{zChgaTUCjbEz{lFe(}c
zm)mcPwn4>~)kk_{@_V+oXr%vmQFu at s{TG;qGlD?u_Xl)9wQzBT&)K%;7xdi`aL68*
z|5NPO*5*4MLDYfe#kl7e+O}DizXg<3hYFDJ=W(8)?7EI+9UtOWWu&9rZd?Dn$H`X~
zH5IaQVGd619DL;g*f(hzLN%_35{dWFyUD?oK8M4~O{14dn;SiC9n$`$;Q;5%8=u+X
zB-hF!CTPHJx!CR^Zw?d`{|<eAAx?vFEJycoq0sS8BN<Z2K>6Ku#^jo&8o!%wW~lB~
z0maCDplycYBX1Hi(e*mxgGX}X^9OtP$g{$OZ$}Fethe{_4VBJ_M;5N4GU0)Lod;Jz
zQ2k=E0i{QYNWc|Z&i$dP7XvaLA$i5OKoKhwb^U5gQ~2n at _4QxV`DcO5C&9TJS3i~R
znj-j0UQ}1n$SZJO`KD5-8D4c+;ohe~>+7;Mz&HzmNwK9iC$j9o+I2|s?H^g^#2XO}
z)_8 at sDQDSN&$mu0AaX6vCJ^Kj=Bky)9+|KfO?zrq$U_14e{6Seg;|2<;?Xzi|L9?z
zA+f*koSQW7-j*<8__>9mkKjKq1~psR&vhj;8{X_#IP*o+DMFC at qD5ix$4UA^VZx8k
z-(S)PPxboWRMDQs(TImAvuAh|!Sp!-1|-IW--?nL3&}S^j at eB857#_)H%x<7#*Qim
zlu6}f;H7lPiL^0X4f1%V;d7(;GE at cJ4g}YC7Ge*~y0)*y5mYz)TAt(RcM8ljwPb9c
zm1M?jAL4PFyeUTtWfEWj5U*w$@(_TzpL%hlX)|eQS>}T`SyiblJ`4swo=qm1IgWkU
zu$V;ebCnvnsXDMb0&k?Y-bAytc>8uCF7vU=Kx?j<H}1vUiicn~!1GrvKjUnMFccw6
z;lVlt5 at Pvge5d8pE@mVwEt~o;DalONKbRw^v=n at WTQq-ympJ6?G&M((hiG!h={3g}
z%J}0Ax~H>fkCDx=F3ro)Fw<e|eDT(LVTPW$IVVuee{}7Lj974!>=}SWIPK~W8FkrT
z)ed938!8a`s2Y;VMGRu49N-<9pA><693xdRzw~nHz+x=j#Ek;*9Z$w!@Dk+=bbD>B
z4K2Gnqym0#{wvAMkkAQuR2A_m6(yAi&gGMPL{3PJFib&UE~HgDo92yq4mosmdL&4i
zplpXR*j*#4f2^MG*EEa!**&V}Gz~sXfq~V{)E!6yN1RC;R0~$uhq5p1Y at 5OZ*He&i
zxJ>(2I|SA(cON)fh8yFN#$s5^OfQ+jwOI~gturIapk_B))zhTIvEN9N^%2Db`cI>+
z at xP&6et9;2_<bJbO2H$R5&Wv1uQf_)ld2(UYAi?Sb!(Toi9pwJhu5?k2YRB?#xF(g
zCtQjn(Kuub at eaEN75t}ZFXnYe;KD$L>OjUSv_l1rAwlT|Mr^^+n;!!=gR&3JWh621
zBWrwlGj8-87A7~CSrLK1{+BKh1(2?6S^y;haoDIVb?ybzFWg*lb2n}&F#qYc4$2k=
z+qUlSZ*ikm?tRM!rY(-InPp|#YrJ+CnH*41x;i^MeAqzPK=>acgK!NWx}+3LGnPZ+
z%=aXgj=rLvxaiXdhth49kja0QBQl~D8Vg)#1=A%TJu(l(Cj8tj at 1I`qudwkuT8?9v
z at yk_-W#^Hzn6Wvq_+lRTrL_4m))q$@r?$V_uIXKKjJ)+%Iv7Cdn7M&k)kH~~*51Ys
z$0xzriNymNO2C=Z8=#7j<l3LR!I$JAf9~WXF9M{0ZuuVm-v|G2;y<&8f5!OuV4F)O
zU`w8kUHVr}SMX at 9fWIp7;SiyVj}X|hf5id-r1}pU&WL1EQNQ-1p%)m2H~U_)lcf{R
zjCdT$MaEG0b>czuQa46A`j!V at W%}llN8i#b2CTx)gSG(JwNDQ0{JI>3&zOdc{2@=+
z4HwTrL0Vxt?@SS`3qR=pp<!e3+mtDOsotgJo53@{VbA=nNVD2E-v)-8x9Ppom(P6A
zEFE01ZJFnjU|ujV+u}B{h|z*hHbKP)ErmZW`7+1cPEqNu-<(UO!tHMNu{5|@<WC<N
z;Mk>Qak$gQB!vPO>Nph#67MfQuk_<8DaxpS*uU3EaFk>0xq8_vCTf8S9aka0hZhnv
zh=}UYhQZenEM3^AnHFYhIkuNAt#^vs9e7fq$KNrnhs at aXC&*Qv9&c1($u%j5Dvu1l
z$X`+w$Tm-3_smK{XD4I*3+}sPo`VuQCv65@>|BRC{Xtu`!y5qy%m0Yc5DD5>;{wQG
zZ at xq96$a#CQd+eZx|v>Gkrft_rLUzdqN0Qx!xas+Xl8k_lo`^sx1snSqmDQ4(k&Fr
zVLqFHr at P8taC9>9G#iWG#5%ON=`2Piho`F>j6JPIOpA8K4a>2+JKd;M;M?+;$2U_>
z_ai53Hmh>BiWLTYYw8{J=jz(aZ&{dY(7*J)vY3x8Jc*XlsNG)E=o%95|Jc=D6f3kP
zk{q?*UE7w;QoNUV!h2Z3usi*8lK^f|KZvf7BWTpxU!Q at i4D|app0c+^m{fk|-FUcC
z%x8NZTbLV!jnuoV=VnLFhKAL+<e+gXU5&0wyp>a=y<mx=yv-FcQhB*I%=E4sj<=8e
z6)@*t>tKO0Arq4$W%@{`FX`)r>=AsOsUk)x`T0~KHgd*B6ghe>71J-9QhLgrCK7X2
zc4BYu-enG+^MPD+Fr4QwP=Y-z<wDf_VtXjn;*%#JH$fSYDdWSf>i0qBSGx-8(T5D#
zeMgoHK}TQS0L0a7W<(J<V{#E&X3qlL+8KS3Eb~dtsM}OO0sC-xRVtr4O#49hg2;3#
zms+9`f6`;j=ZnCou}cL9L1webH}S5z&_dX+0-)-US at RZiY?l>FwD7qB2{cU4&cMkO
z*`I4!|4Y!YaIlbM#&<xEPOSGiOl(UyS>>^V#M0fs8g%)n?rX$S#*f~6!lk6GUXLc%
z9mF&2;#hq{Z0N9Vy0egHnJ2Ta*pVmc&M>*dxo4`H8)HR)3wn0A()>P=;WGk}M0wt;
ziICK=Ft&H8&|!})3c36JOGlo2A9F!epZ$mz!THO03>Qh(2-~_-8+ at uM`Jt(CqEl}T
z$Uj5<(h<^DrM`3hCf*Ew)$3(8nG8OU!5G9!)gDgldOLdkT<Ffv50~-3PC5^rJoa9|
zk|A}O3qD3`NU5J^0Q7oIbHKih>d)iGT9(Yqr_*dJG>k}5KXt?!!Ju$e*V?r2s#@6G
zx-w(Cc>Kq16uFyOomiLsMV at z`D^eV9168Z9M(XNCaPF85^S!4*wda5m4NW9I@#O$!
zz8)4%Rl_kx-|JSbCpQ_%UHyhj`DyMA9t~<>Ah at RFMvBAo-pGV6zrYjC)n}!^T7C7>
zo=JVX?;Pda%j!YT`9k!X3G2^PVHedPyjCslYfI{5cD0|G*n_Uawiz-~c_IgWzFZ(q
zX)=Ike)i{kI*bnyC7Hgt8$+x2xg732!@Q0*qDZ}Qx3Iszl2U;S;N`*C+n|}$hI4&3
zd at F@@GhAF4kmmrYc8lAy>DTF?e65YwZJsvDx5rjk19ip{kk!hCa>^L4t`&PD|7 at tO
z|6KWTC1hZ8F09Xkole#y&#i^0%WZztnUlXFEWjp^A$MKOMU@~roK8j`BIYvvvm`Zw
zn{4yW;ok33HX^xO)7Odf#Y1t=YsE$*&dpv8GFU$=1oFz1?ngCfJ)(g1$&MoT&(0cc
zfhVa+A;ml^6=mLpDg5i`r4;@8&)s_%ICU%XQLklT$IEi3?g at n77nAr6(Oi%Ga(C4O
z?w?tcMpL>bzrYDiRVO33F4?BON5j9ylSSNUI$N~fww$_XYw#fRq!x2Xn<F$<X~0|6
z<Du at KS`ThWPNn{)GuO9NlRquCi(RV46&<n5#_u||NN(-f&<Sh at -zL&O)A)cm-r`V&
zMI*1_>qQfLiDovxrbtts6kTw*r<M{(SKVJm``(`9c_0nCxMkXXbsuw8%!Low9grm3
zN at MZAsS5R_uVb@M<@<qv_+=Tw2uYVSoi;>kXN_uf4{N_nJid*U at Q}%q9=;bDE`_dQ
zKG}#lucIE6dKWoCdUU|SzB+q6;E)uobxcL1r<9vGVHxPy3}CD8csKv3(X|bo*x;+@
z at lEZ$-7trha4*a=a}jv%j?XEQEMW)Eqit3e+?;r}g7d{P{gE+8<)tzASNGA>twN!S
zOGki~b~*LJMn<fSV|~1nd=2AfOK8z?e&(uN`jKO at bx@0&#!JKKv5^~-|Ku;>Ksv3B
z-zJlDNsMmb5-D@!8&4c`2uJdntWC6*!?HshCr|KysN^J-2a@!`kg`iRyB|+v3vD%{
zef4=v111%F?`U0Mb)NlPPg3(;yX3<IsIH$htN#mXtCh#971}B6{uR&gX}1OhOZ2Y#
z*4*~nT3Eu*@9|C7`91>^?+^ANGM6g_P6}>Y1{1ll)x!ypyLMQn?6P^Ws`NXf#hEFg
zNpN}McYxU)QhDM#0AzK5s at UmW2m`o$o!$XPQNV>iceeLQ<^SCM|N3BQ2ItT?MnrQb
z34ZCccr$<U5Wq~v at J=td&f+WdPqn;O2cohGy-jDu!Uf(D9}HOn^}d-AC18IQzZgeJ
z;5!~cWTGQ&1pH6u(2!@~3}Abw;>%apyQ)3<<#}A at Fmw+lJSCilO)5b^^QHP|py}9%
ztMsrS-}ycDr0iSmlXaL!hH$h5$&CF)Q2D9m=9h$ITM3U1;^rG*M?(*`@o8;VS9Ir`
zmd=VGi-$Sv*l((25XcW6Z@)a2_AOGrV$1%mM_{*^hA+n;IhWJaR+7C3A>GAYisya(
zHeetD?Z>Q6#&#fNG9_k?-b6KIZ#qp5Y^*+0lqa^wX93h`ZNGng6}5e(UxvxTvN#4G
z`pPdxmw;fmEsrOCm}7R3UOvJ?E4&ODI}v48HVpJsr%J~{Qr*_EEo^-s)IUR{0a`H+
zZ0BPEVF)Mcu3W98DfUptt9S=>ysZPX5<Vk}u}YyGMOUz5smQ$6D at s?+S2uj~kCs+T
zlzJx2q=Oc!DMgvj2QIzhwXhT3t_?htnLuxMZfnPz9iY5x^MeKq2S&zz`zp2Gj>VR?
z99gmuoF;?eP|Zx~rEy{#LN>3ETnh>3-GPSmr1LYQ7J8FeEi5IKoIY1`CVyw->Pi)Z
zj=X!2VH$3d+MJCtjAhw;!rWUO9mRAfE`~e=p#>A877&MI+o3+(Pwaduq+{}Ade!&X
z>v^4FzMQ!z9`^MG)3pZ7Wu)b^c}S5jJ}0Zlr)lu8pUZ1BkSZQ8^<>`b34QLUizfev
zWXaC&OzTaU$O7&YXLNo`Q_kk*KOraW`I-W9qC{F}q*OqI>BZ$o6K1Ykhtm8?WiP<f
zDDCdOzc0f!$(kAli`wql;-;}=;j&?5%kU8~jZNJIkD9OX8_0CAk at Vddd6Iaa`N#RO
zjW9E&e%}||R at suB1yW|LYmI5UmQf`K6ukgfOK~SUI#ppR3<)uV^)dh0J1psPqvPe>
zaZDx<Tr_t2#_)$HMy30WC7A?4SXf9cHaO^beW8<*NZ^t3sRWbVRU6Lfnzq_;;_9Ut
zJBboW{ztM3+_5etsAm|Kq?{4uc7;vqfmZTjPWkUAy1;T**hl46!-d4z75AmC+x_X`
zu&5O~->l4B?rXbWbqtr&r}b&PqT^Uh)?R<8AT4VV+XzGAZZSGJI>BNsc%-+2xWKe1
z(x&^56Q;LH8SuxR0V*hebRx2G;Ccv=tgRw&av0R2R81Fp-B9uQhkN_v?XbkBSt~v_
zP#z<jUQmw}QH1N<3zg2DDh^Y&GMFd&pt&K{t+=i2am%yCm;mF>x-POZ=?|6Xft(kH
zg-hpEn9oP}I|=jF(l%ag$`;=N&oijQ9bNT9p#j$_|1&xEpj+sw31tYuZZpV2;Ha_w
zGAVK>-GyK98j+qED{$=`)Y4mJqd`0d^-Rh9enzIo95Ymc7^|Hmod|~)bWmW|k!e_N
zoiti{DrRM$Iy8>g!V;SwZQt^2N%khN=1AI#)tlBREj25Jlwl9a)am|lwK<DZ9R3M*
z9D9$f_5x0ktkt7kj{D at aMlVpi%$hB}X2<1O;`J$^r!wkEmu}jI%eOwRQppGx5p?D=
z5(8T%<;OI-^da8CCSl%@ZoUYY;EIU{{`e`o8TP3l<3cBr7?qeP8R@!`I%cUxgZ<m-
z^nlq+U at 2Maj6CWp1E6;`=)x&9BX3NUgK?9`Znmj*c7 at I0!W5^&D{}AQM%*s<?wUQz
z#-d;(7tZyOa&gRkX7ZIi+SbnIag#Y%-2KE`y}uPbu6FM(Q!stFQn!b{^xiQrIsD5(
zxqF+Zo>|ZKS8hOHtGNXYY%M1T|MO?HkR<kR+1cDDkX)rWohI0~)LY74-pDqZ`=h#E
zo$RnKRpEON^TZ^?oqhL^l2em#3ZI-eBSLw_i;aU*^|ws9EF7bAtWSId?_`cK9z4B8
zU*4eNJeeT+V%9L}A69QOz-RK1;7ryUi){R|3HN#?N7pQUf&9{GTU*iZfD7_U^pBXh
zpkg{{mfSZM3_mBEhd-^6LhX*0Sy(>N9~OUlz3{sb-|L}0&hvA&mv~2OxAADVKxNe;
z#jqXE!ngVvjbm&b=oh`f)}S)W!Ap~vp%WB#k77};`8{GH?doy?YE$=^GQR$(- at AFC
z%3OBod2xsR at zILnoI<|Il8 at Ug&d(X}={c0;0chbKq^%ei5<=guMc`%$%c^N`mYfwG
zR_PB0VoN~^LQsaw-Q&#++d8JbI<vp>un`J#0ZlLIi%=4SE?2k*II+ByC2R3j)Ln>3
zsUqv{)Ncp{j6ux(1w9m*=n at H`w1p7NFAVYRpE1eF78t+?vue_pQmel8lX^Axa&heS
zH}%Sef!|7Ml4FFv?j#?S?~SELfWeLUbeodCb%Y>%C3%VY at lTh$TIjo$wg}uP$zPzV
zX at iKnSyuN7-MFi!Pc(BrB<u)X%5_Z8Ij+EbxTU(1cfu`Ghs7#7$hvGu>kU+hyo>$u
zvCqn>1`xY~@VW(EGFxgZ6gX&Zp~(!|@9wWbA^u3nASpQrMS7DJdf#!OmGy&Vj>X+K
z<>S9lx3FznYP4x9WpTI;#WuH$WH$RYIBV|a-xlzfAr737tFMT?%g|7&bq)L5k$<@C
zP$_I%8!D_ at aYkef(TAbZOnA6ss+j>X^H|XQoYP)~4LrpV&Dg*iQ}l$q8rvBtwZncF
z=J#(%`0J?<cHNio at Czk@sMF&0DZteSnt$h`P4Z65?sb3Shd>iKc?j_x0RAs#^#6pE
zZB+yw>cn!${0gO_+nt#m!!LGMCc!!XFpX$QJ<hY09r=!1I8chdEz|)GIP{9+P8*;n
zSIAM0eBf)5rr3LLFhEwn?h#9-z}FoyjBl21^Tt(j>OK79o_PD_18E(jwIDV-S-B%q
zi at r)w8HxvC9rZ;cYbn&gQpx}sA9JW<#`VFM2^>CoeUnSnzeoB%M(+5IX68p~VSLMQ
zNYR06$r^8&k>df2={h%y(rNtsGnpeyZCB7KNZ8ta26zSKjQl0^a8aJ+NfKK2)f!h|
z)QT;u6KT_v4Ba5-dIb^X87TyT%^YeZ2SPCG(2TyD!$D2~#tO%33(OJ-)SgW at l4~LI
zt)$8*nhFZHaS!za41>eBT7^c&ob6H^pEdFB_6+c87Um9C#x_-An`Sk(?yCBIMg=x;
z9El+Kj%QgE<%uk7#hhAmAQGdHA;sz-xVK<{a25D*b0Is;%ht+^)vM7|qDGgdQdGep
z??wJm at m$!4T-WguydivBav8CQAOux at Hkor4dQOWbc`oS^9 at k%Xk)4~yem3(9vNe8b
z&vJycW1{HbiP<<UkUHRcgtE%2PnU~4;-3F;L%DjUa?W#P-8psGO*n>yC+UXF(b1mh
za$}%A9lPA!7N0$v<Jn405Z^JC3CfU at Cel08Lqx0o(aC_HUAl!>Z-N%GA`+b>Qureu
z8Z4?H)LZO?Cn+7K%Xf^#7ipC`;t8*|G$-kR=(MLz1n#LqqyuHhb^&7FlzzFSkIEZ+
zU}=cRN_zsWmdx2-7E<l#AeFcHWuBj;3)pT_hQ$1SMqt(CSoNmg3jD0{A=k!lcji?E
zwgz>$UBXQswHfTuQ$QpNU_CV{5v|3veSTz`@xHlL8E at H2665m%q15o7WU~eb(;5lL
z>>%%YCvOp!HK+SX$`GD<^y)XHEq5t3OAZ!Sc*H%Jwjtw?$Xji~pRm}cHN3I6aGsKx
zmeQRn(5pC-BBWEC+M`gM88AYx_LO(dm3QXE-NJMr at fktK2Q^<e^@<P8gG=UzW5+TB
z^K3q_Pr>WgJ#JrQd39<gC4r6r6MDnk=D_`^2IM`h>*-8 at -u0w)9w`QZStZ(H&;EGL
z83O+ at _R}%JZjy(r1BNbi5Fu-oW_KE(_yJ-$%!AB#CYWmHR3x9RC&yG{Naed&?8*o(
z4)^pM7}?GObRznVw}Bu`L?hL}QRBfj$SR$mwXs)FMS&2shfMu^<|%jp5N%!6&-LLO
zHTb??WG$D;T65?_q-+*Ol&Usdi)QgZ<ZNbO0~}Q%(PUl_ZlHGL-5>PEOoVW+|Ay5L
zr2ks6G2crNgi-z=l2JGeSvYK#9!T1xD-xm{0P`TV8yvhe&^^FTBZsJ4GmMcBO+ at uK
zT$?>YD|Y8+Z4OCh`ZRmrZ*FtgBSO#qu^<OP8?BCd$AGLWZqCyo$@LM4kwn7Q!=#oL
zM#M0%dFLW3DJlApbayqEz(_ZUN5A=8aqFXA!xkonNhK at arVI}@U~x$Dg7j2zTk-vk
z8g5svLT9NO$~GD>0oi3i=OTt$G)fLc4*VXd{;X8No!0}94PI(ubb*A4(8y!>Y5x=u
zN8#%L|Jm>nHtxGUv5~r3VNU(`?EkR}RV}z-$Q?uKJMFYJlFIAlO5=P{zb%!hE~O)0
z9~<<9cJ?(-4{2*xnHe(yqXU$lr+5t7Thw8hyXVWuR0)3Kxco!Y`*%7*E{$xswW7{p
z7ZO+z?QoW_Telft>u at PyiH@HkvZ!R|<r3Xa^agUObjSbJ%Fq(WCPfIY!Ui>Q!b}wM
zkUiqidsA=RLjLW01$x9$&$oTUcWJ>ZAmQpZJMwjE7@?+gfqMd-<go0xlqR~kcISs+
zv?xl7OXOvxrFOK;r<)(_17jVPHNMbLgb<QX`1$M+akV7Rm!gD#=&9$pEAlHVV=agY
z(f}1)OHhG-H6qw$sxI3Ya<c!DaEd|zCWho8tqE~<i#V%wN*!<gcw06tQ2O|wIc=_b
zjXyY{ubX1b<w8pb9m~$Or#&^mqGNiU+PXalrFqIyhM(>qI(>P`v@=pN?^JUg(uMZG
zYOBMMNWXMKL6Lj0+;CZWNxfM*BfC$Yqs#h;WYPM76)=8=g05=Od$pu1cz<_BZ)R2d
zy%bLTkdDZbttoIS=gHSfgnhih^JQfNd!@9HbId;Bj;dadS)~eoZy?rlb6Bdu3$rM>
z-&lyqoYLLd+U_+w<!9E-{|*d;NcMk*PqxzBzd#>Eit9BQ*e6&o?Fv*G at n7kR`|Xph
ztJhSPaAo2#_}!HbBVPT6 at 86X(TFSgmOWEQErPkGM`&)ul)DP#%h7|t2&{kn)s7F at I
zoW at 7lvB%o#l>M)~#8bX4#il)>671A-HS<18{AsJh8xSJ-QoQKQg!FxO)6h&0K_B+h
zsz9OZJEJjXq$Zd>wnqzw<}oXQuJ7oy6_^JhGtCNKy6_Cw8B+!!c}MeN1Wdv7-48nr
zQf}EqHKmj)Ju$vca*bGaRv5 at u6UDq2UEe)#N3`%WtTN>gcnyQ!_tZu|>5?;8sb$3V
zWI20npSed9$Ye1eLG_UTB{nK<WgzBAGQoz036Xd|{VFRUI~?r48Pj}H3Bm{F(!OzI
zr`nzCb at C9PX6M0+3vAOdjqj8wW);H(eG`YC2Nl~Cy}Dm9m33qz7<d2STt{3;>6-<{
zoEHH@<gmdi8_R~doRQGTIIdx)mBF*Yaj3ZaG96H@^s5aN`^iWa)K46;q1;&vJ76vy
z_%!rC>f$!k(Hk}lJ$_fu%bbX+_fQ4BMTQApZz-#(TYcugGuBcwL`pwP$?K^AyT{}u
z*_NcZXQ;iUm0^)^-$(s+daCxezC=rbAGw?#kH3<(+B9IgWsb|JPgbvAO9&zIE2Kr5
z6f_Km3V1A{C`a~8RSoZSF(&tyQExNMd9|qK;+30~Ykn2D^fEq6hhL at TH8d;Wj9ic$
zMTT9UD-#`4&h;?t)cZtFC2(V<!GcYi-~v~kVE)k?yd=O4Oz9DhZ9Vnn at P<O<M+5;5
z>CHb-oeAhA4Pi at F6LIX*TWE=hiM!vAWb)01%uvpFu{<;s$#7vYoHp|%bL|?D*7#_Z
z{6YCzsWIj2<L=+TdCq}&6LgG+tgFojcBAj(m$zTv)}ALnwBL~C7e*W#O4ya%?3
zEOjOiYP|kD)*<|KiWMLM>kLfo6_O;2Zraeu(l-j at nn0J8Zk`iK)(~Mox3DK^b;g!X
zhj3$fkpIx|xcgP*K6M{uO;kBOtCaTEo4!OV3tn{ws)rhR7143)6bP?U7XkK;YQg{;
zun`fAy|6{)GChbgKfzc0>Ao!!P!L&lcyEs+PHx<B4oX&8NSxWwis0Yqi$B00zJ1ph
z-PZZkXZhCoLdo7zsb&NEnOlJ8(Xwsk&QTlex1u&ffkl*LP+jHB(pdo4-a^EL<W4?T
zp4#<*03Fzzc0Ekd*HSS<(dJ1<xD3xdwIwp9;isPxj6>9Ie70^OqYX>F9k$+949Xd#
zj|ar8_?6f(Jurgl`IAvp at Y4es9E7I_rxUBs1d-PF->ajdM&c0ywYxD6#*P at DI~E5v
zlzz&BhEy(SAzc4iAoP{jEKv3+&kA77yuXA0{C)=4hP-*b%V;U;-Pe-!FpfV~SBO3n
zNS%yFZIez8?~!rBi|6Zt(G{eFcWX!3<5Z9hq*_KAeu8<89!x6J+A<cum^!;8(+(Od
zYtG+}CxS!^$%&C+4E|1q$~w-Fz0ff5zn?-G&?*kXy6C?=`maIrtbOrAl-aQ!($Yw8
z0DFu3#$CQzDyjCZ at jE+`)kQ5{!H9H at HMa9?Oco_BY|WoqtF4}>V3b<=zV7gTZChJY
z7_|Y|WpZ4{#OQYQ!M>wI9fEOHlXRqK|FF395;!o7p at zO2s9VcW)x1zaMiYI6vQqvO
zzZBzL4ebTxY|eqIDC^Zym*Wx_7PBaS!Org+bo93i-+k5skG_$<Q_CpT{;X!2{e7tm
zuV_s;#sC~VcLe!fmxF-cC)igE==WW|c}<gjl_)xN4>Qpkdk;37J>s|itS&?>Tq}7u
z#W*mPTK#a(Ps-^)RT>M8RAeq09&;?u%<H(kDIaW%-2H4E49P8Tg28LgH=^&#-u%_8
zG=X04x$V27C1*kvB$pCYnAsBeKNq`|M#Sg4-3xE1ezaa<%hJDNdXs2(>#dl5ne`~S
zp_ag#WRy`Avs4BHED-|4iDJe}9t5%JKREo7S<f at Gh?=?<=*x4wSV+*Rwh?gpqu!-O
zfb%*}u9h%U4_4ZDNq7uPpB`*_`g1^^o#Yy^902&wzW>t?|I48f7kz|G0N@&+`anVF
zzx<>BvmY#$sXwF%+*)MuYe5ov<yPd(_P!FCHX{KVyudZp9{Q8{bMO<flPsx|u0uQy
zhtfaNlp8s8Y0ft0_#)u%Mts=S4%D6K<M<W9c!<|oNX3p`qq3*D)JvFjSu2O#XW3Sa
zwn16ur%@2}HoM87q5Jdq_Y~1U#gcax=<`>|<31FNFCFY1remYPND9|D_Vvqrmlkfr
z*A*jA4Qj?x?`EUBX#-$n#^axtN8LO9X>-CVrjv)mtmDf;D_V{SaV9Vzy!gb>M#5wz
z0rU=_(*a}Ri`0tutrFU^X7iws8qmp&bcZ(%_{lfCIp2Ts*~I7Q2<Ch|C$~H%cU%~B
z94iMaA`r|6MpQOV3StS{rM&}$#V)JNOhTwEzQd&@zM8mnwn9!_!2c0sapNwHCC7?I
zRGiEw7+Kkq46mll`>>xL_&No@#gwS~?(LYv{kGMqB`8j6lZj7EJYQ2~Zn??z?%4N<
zU5*0w$P(*g`{Eb-!Rg?38D#ayvnq{My;s4xnK{>-2-7{~V<#?Aekws at BhnMO5m+x!
zDM4t7(7>@q(&;#B(cpaik-*Qeu7O~v`AMI3<EA+p6|`e<jL-}!Hb0(5!4RO)cI-rd
zp3rlg at D8IwMASp{DM_xmDnDp`Msq~zKK-hJ4T>+8GJE8E$L2D@)6d;hA13ww8BJEW
z+pW99WtC^MBv-u~5sTvPcnd3=T{p>?PPb8mXI(29h_2Ohpc{KiK~s-j8(Vc}FLTqN
z1uta8mM at V%{4|)AV{L9+kB`xT at _7WPj*SF2P3`gtufV#>O-eKj)z)Q<(l_ufzl%`o
zj-iGEAKw{F+ZQ)KjDP#kEco!K- at w<YIOgi(4<9D77;Z_r2bv?ZjQvNk{?HSd=(rVH
zD0LgJ5mhW(a4F~Z_(=qtT*KN)k3i7T?^=AV7;4ZZ$RA9(43i4Rh0AUg5{MnQg+GNO
zoa7hp6jeY?=G3o^u<?{qXa||lDD7yaW0%Z66|qx#g-3D;jpFyW>m4Mg=EfVojCfu)
z at w#G}k9#)96#K+z^Rg34i8;FFl at TOh&wIx4us`iZm6&r^tcJ1LoXn_FNdU`tuK=s+
z1N?CAYBeLyY9euMqu^qXcas)3!>Ut8*B*1iJ44~A at b;WA at L<qMX%G&`WCx5i%$*0~
ztPCrhRN4<JL=P0(74&PIx+{1MYf3hr=PuyG^0##Y^SKb*Et{Tx%n{Jeeebb^F at dhy
z;+UqD@)OOQR<&5D7)omwfpS<Ol*sOH27fu(KT7gD={qT&N4j9qVkbr?gaerlIbWrg
z9hXeZKOj$lt<}Fw87-u+eB0zzU_rMSEnh^7e++eHq4b^ApvamY^AQ~Kk>*F(=GuJ{
z#*ZJzeHPcgq71G>FPe0Q4B~G>#7A>QJ1v{XjUifJ)atD_@<^R)Nw?O5ur{7kv)=vN
z2024I-5QyA|M$6esG_g1%G$<7W(erh=Du5^Pr<)4JnEihuleC)2XirxkW+0j;Auab
zR?b#WFi=SQRRi6KN}$lSU8Zc*jPI@$8wt&Mh<zUD;Py$a<0cs1;dEu`gWirPhFLA9
za(WV8=vl0<F1fddi_aCe2r$N21eZ0 at 0-HyB8NW|<!jUK4Ez3jG!9#~G1Or at fu<;lw
zKxxS3kGbB|OtiROx-^!|3HN8B)f4;pS|f}gP3L{ihbdIo$Tn{HaOfBIpAXeQTL^#R
z$7O652ieHwRO{cYV*&IqX&1bmYR8OHzSJ)sPwt_fjkzNmMPnABg1?O^+9wm2{19oz
zAW{XbJUkB`JyCX6)5+X!y*5Vd=krQFUn10D$_aR0DW<*~`3vEAe^Xt at GP@!1CSt?B
zhF>+U5q+Ud=og2W2a{Tm7G>Y%+I-mXuw~pBL6)o|`J+JRh}6Wfu^uQ;=EY>KCngjj
zkUs`sQzx-azl%eDY{d53*I-Cnk+}`zmj3)8y1e9+inbRww#TK(ce#z0<iMm5P-2+L
zeQ6NZfE}fIu~^La$9rU!B1_B9)h>ySZZs(Ixu>%N8U6!~C0}7nbkHp5Ttt59!au-0
z$6V*+uM-BL8I_kQCEx8>0|vacv!6KDA40Iyoz}oOQ)kcB)FLglz*-2X<(c)>vEouT
zg*AmUqvp at y`zo(GnH#PbxAz at s44CStvrCe>8b5t>8qYXW1Zpa<H-7Sq8cND93hqT!
zJ+hBem)W13N`W?ctF0~WL|QX?j+a-W&zE!$mGiJL8~YDe{4DvNG%~uNzU*n=vRLo0
z!oOpiMq&_KrROeYtf5)A_1TwYt0wyD0YSQJ^k=~&0_m9A8DI2znCYQWzqCY5j<bt_
zRIk8rz<3G4JKkz?iqu33QC<!=us7j;+33MG`A&M>u+OFu^gtX2zZBtcBx|i=Qj~(5
zRd=qVTnoDgr|Um;6v&yfpJA*;gRZqB2&p`AxbdBWdC_I-<LmTY+^GIK@^7orRZkL)
zco`6hYc66k{^~WihO~RFJkoT{gkQt`z95Pw%@EJh(DUGEVtt}`Q_AC(VL9sdU)W~m
zS1K<qW9j`uE{e9h_*D^)q=sSd5YB+kAQj<zI9DKvb9vh5;*hZsli=`k8rGNI*+X+z
z^D6UbMm4PhT`||Rp17GXAY9WJL|1sE{s>KrJzSOO!BBiz)SH*%&tLUs#ZK8BMERPS
zTE1*-^PmdZ)<g~-2IB<$b`ilp!9i5AangLWAx0iTY at L|}Q46?uklK51HOX>KoC|Oa
z%5YLj4K2yJhuD)~2fX_kbEK0t#v7oiHe;_)g~$DfMaTNK1LJI|pt;T|p)Z(D!^n|6
zR65SjlTVVsPF5OV4VBY<O7m5eJ~&bL5a-9Ti8O%v3VlPEDh0Duu^D!~tPI3`Cds-l
z=&e89FKWyBL%+Hu>FF3&#IrGayVeF^_VUXJ4{Dk0oJuvRAian9Cm{Lb$x}lk%F>C=
zUc!mnCJuk{5#5ja6GrPJ1HS8j6D?Rts-0!mrpXPDE-CG^7rHyV)jB%r<Z;CsAsao2
zo=G_`Cf5 at KYc$X(nz3QbL~b?>mdr({92)4UgwC!VRh}@fZub22G305HwjwqpXIAn_
zCEn<<Hgos-<l)@z(Yo(zs!ndbY!e$CBoW^(j~H<dMzD?52A0+!iZ#a>Oes9!&RmS^
zei&}swDXeDUg8 at 0%yJ1;pZxrj(#1Eb%IT+=oNK_`0w`=OMM#I~F$&bj=m^`vKX=Aj
zMtAVo^gV~b18DG23taWjFv5bO2PA3RGEq>!Zs#*G;k^}*&BFtNGYKCozwpW>?y>Ki
zCfX<5Fe=ezL);9?@MK~OzP+t6J at 1#k@=AokFi*J8GXNV_!K<5M-O$R#&W2Xo>;hL8
zv3|SYk^$M4wN#=h9FhcT=>Y%D;oQxFXVcCm4s0szGxO?SOD at Gyt$Lnsx}49IFDE<u
z`(sl6cR?8mXxuUJS3c_hy;02KMc<$C%^A3{IwTi=yqd&fQ*CnR9cRb3VmG(Hf<y1X
zk?er>&E7B&w6dzu_V$Jlg&i;ggA-dx3iDuG7C+3;bW4&VYCL+c at OuQtykY(KCW7i8
zKmGxx?x;QCs*mw<T{m^fyLwsfG>~Tte+?in%Nfkor?f^2YwLZ?T(J9Gh>E}ekWEfH
z_>;8u7$ei1E%Qz8QH$F{Ix+VJ^Pu~Jy1vkQ&|@D};wsQ*++AJcvDo1^Dy=Kd4u+H<
z(#>CLpVDP!P7b;y-z^w`0lJuxw#~V0E(=!WrGFs3Zu*_$lHyM!lboU&<~k_!lX at zn
zqnvs_^_u~ox|EnKgbmqY{3f9FY at Id#x{`hG$;mog3Qri29c>BPo)3%q<6?pkotNz|
zrxNayvBjL+u<|hMszK?wM at v4mc5Rw;9u=#Yno)F!Jc@~0xoZ}-%4(p*;3wFr>o<>E
zX%evDr2x(Gwf~GtAr**X0PJfJUHk at 7tjWl=Wt{Ikhg@*!haQoK$2qFT*>;;RNuGn?
zom2OVTlCp$WDa)@4N}-t1 at tQkGzCCFo>b=4FdcNOl$})j>?x%_Sg^G5XRP&^T$+mu
z^+D6y5?5bcF(QA(uoCyGLW|AfS7th62R#i4&{Y at S`9Vh&!p*RNUwid6mtd7`CH}!F
z>WNEHuen at B$<g7^GAwAf(i%*3ZZ2E5`~8&B0s7z?n|3!cpLzFiRnprx6}G<e{i6SE
zqi#r#n*8T@*gT&wnuTc?)$h*>e9RRV_aSqw-<$QAB0YMt8SNrQ+A at 8i4B~Bg<FqsZ
zqSIE0FR$6}xY=*IU-A*!zNYC17XG2)5m_VcT<2{wlBSeK!A at J9&0t}`#O{|dRYH1m
z_}tsP`10^(Xul-+T5OIQZ-CqpG$KUK2OUlz;Kz~}uM!In*#zz5kYOttUp6iaKO>Ve
zYF7!49>Is5p2DVS26vMvRvB|*I7H>-E&&gfR5}^YwJSvciz)sKxH+1HdmsXZLY*ZE
zCfv0FPYVSvGgI;qz+O=KMXrSkF2S at 1b2zp24eA;BAcxSvU5ZBU{%+H0kBKXvI%auW
zIn%2Ctx&r6``*`SqzF&_Vw0 at bQpCS^+jxN`)$BZ~xxdpdohFdvlFkU^W&5E^YBz+N
z$BinUo8I>cLhr}rDh|V*x_FN^P at m)D^3VqA;9H at 8fed1ph8Cz8Mx_n?j*{g$r%?#}
zP?X4<;%6=9_i%WWx9~E%!_3(JqPis$mz;rZy+JV#Loan}<yb~{ZM5S_lLrz1ntr(d
z2dgqA3g9O?UJ&YXy at 87Cg70X@ba)H6G=KWOLR$sT=Nikku`F(*=%@Z6!X(ZdrCD&r
zB$I>@jPO2hVhp;`Vz1nTk!p4_9xR#49rckNj~I*Xw&R+A$;Ix4{%gYs`X6urJ=3ip
z8?t5R>7$`n&K7<v;@ztz><B>~sm^!*8kjfEyli{!*1Ne!FBsXKhqMs^WyP{p8WS1*
zYYa2I+O_3-CdyCms3oPGI|KuqkPnvFmG<YegSJM`9Y5c#->}r&-H;Od7t+K>Di0j~
zd}KBz>x#_agRt7y76`;f2<BCmG#U3<X1WKN+Y~s3C)tflSoy<7L6?c^7jx#`O*W&(
zr>M-8+{1`W>0fl<Y8{(rzPjXsy770zN(~X!)16P&Q~kUkIAou&P7z#MfuD at m^((I~
z<pCzZqjkW`mJF<2{MyN1D92xd_#t4zOmdC*{{I!O`9B+ZA-4a&B^IMqSC?00FYsJM
z^TXl&pY8Li*H9RdXuW)bVw=yMVDaIiy4@;N9Cq at k{P)@=xd8^|!;J9wNBJ_7*3H?k
zZ?t?nwH$#oqI2`JUgfK(`{>0x4VHwDVP+EH3oBJWc;j7?Fn%xm>Q!5WlAExTQ!~FE
zpe>QZLGZw<Ny(@9<7rr`zBcGd0TaUH5IlYB<2YMbbLKKx0q4aaENQC=*OCNycyD7F
zVvC>1D8LEa*JYyIt&?a+8Im`bX;3}tnLOAVoS;<7sh?=wBTz1r{3jrGi<@XLWPOK>
zW}~!veRRS?<`$R=^)v2#ikc^Sy-g0<-~LVjH-O}1k8z(D-Z4E#NmdUl?UvSi3ayZ0
z_oFu=_vo`0qKH%qbnj?;QfZi_>x6bse2@|ou`}f!ow4K~e9pU{nYZeUbxOaY)rWV&
zqn68sC|uQdF-(8;qtwmcAIob;-Yb1kHu5(o^Cc{|R;IB5)~dPPgTv2{`y=M+#ko%-
zcU_-?>T*J*PB7cPmkN!lD%J&Y?mU4rva15ZLpj#xR!m0nJWmxRJC5>9voD?_dEPwz
zIiMiLS)`;Ble2 at c{Us%x2`UEpb=3W!n<(x+o4R$5(aqeFYlwicDbj$|ab3XYA-b+|
zlHz(7X{%z})_7V?XHrA<sh`AEm#FDJVfN8|FKlk30S2K4kLorVlYa_Z{Y6>;lltW;
z8Ha+TwCV5_AYyDR*I?oCg}1mgV at 7Bz`zQArQs|1j`n~xX&7vC7y`q$lZ_xK{dz<ve
z$z|9|GC2%RhrgfReu<IyU*cf4u!K;)!yL<Ra9V&)Up at WyZJl^G%miJ at 7Xm++N_%8%
zbyp<iiO9}jb=l9Sk0?)<Zt;sCLiJ^y88UYLgV4{sJ1|huZnZ0muhB(>MGv{&E>l}X
zimpwPhZx?m!6XY!N$B5;8<XGzbl7$09La<VgTkM8#okbjd|F%7X)H{6S9l|l{vDe@
zagaG3zy>K=cSfDkBL;>V=wsCR7bX!!ZOU#wvS5r}s+RjbU71+E4~F!elI{EZjYRAS
z%qj;8`{SR!)yFlyy-rTOPJE0X1rN}JJ*(>HY3t6liIO~La8^`Mizl<89_3l>Z`^+=
zYM?(c;=*XwH#+d#?!(8qt9D=paw3E>nt1CK9*yOo1w#tb*E^`d*u#5!qJZ?yTI9NK
zWY8zJG?zmH=)DTlxxziF{^9kj>Jtqj4S+Zq$d#~fx+1A@<!smnQ!s!A>sLJx{l%{0
zY-tUNF2u9$H!r(nA5cc!cHZ%JB6C9E5=F=e1y|=!Pg9LrR$L7E^ZMV<xl!xAE93sP
ztQ^z;6($|tp)xQp<+Qe5i5sI2T9P?@1#JD}LEej7H(edICf3^uMwg#4VR}nBdbaHY
z7<PI1Vxqi^Kl%K5s*ptJv`<M@@u(Ykw5+*@?~Cpl?Q$_gJvbqFZzHeUiAUk;ZtQRK
z?{Zl;8S0sMtJ)q!-70%ZyP+7GQ1+>n`rW5&XZ`E+fiI>Nx<_n%FIZq|3`Smhy|q`^
zc-^Z*KOFXWnA=F**!8BPB6ut_zw4IrYw~B04YhXyIT>HPz2 at rLPXgUv4Y0h8V@6+L
z$ex`Ak485bV*ro_#*a#!&b3Ytn68sHz3?=1^4sL03W2Nnv|j(4?XQXq%(&qHk_pM(
zp5q|4`5PI*@w<Hzjf6MWnZcqV=X{%Lnvuw&na<gsD>Iy}l8$r*_NnhYsY0qRhDX$H
z9qqpQL@<_v1gf{F)p-egs~onf_cq%;*aKX#c<5&O`joB at WV~6mYZ6|oP6B(V6+Vz;
zzz-c;aeuq8b7deC%#vH-^yd2CyaSR%TCTT8jD4GQg9j{4i4OFpL;UNuXC#<Y!&$Fn
zKc7AeOL(S at 0bC7@mo_G+6E%N%*G=C9zE#q7JZe-jY2nY~Hm^5Eu;x(TEe))bT-;*%
z5$ePRG?IaHPou2g=41rA`e?U(6}ibOVBGs5eTq+o0ZE<YuyjZCrbON7)V05PQEb7~
zVh;|pM0eJ9!s7w}W`|!`5Z(>9F7R?)xD}(>(aDm3yH3{;(53-Wa~99LVhH7DiUiZ9
zT1E`yT=D@|t1+aRix*iucdk^OJ59$<*u=_NXY)p#pv9ljR1Qm0YCv6Yed;iT&J|5i
zW%?;|&RHLa)YjKET*djnX?#I{L-w3=Qfi%}QGDE=R0_8AWb&V7w4Bq1#%FS-;qJLJ
zH>dn5f!@hwg^S^A!Y5O-)hRjS at 6a&kv~qu7oK<2BZE8AUV)?dF-*0*WjdeZHd*fFC
ziUb%df~ZG~ZA!JaDPRT;mRoAjPK7O<68t$<uGju_!&4rx at mG<TAn)S*l3c1?G at g1G
z8S at PCLb^?V6G|K$t|QxKy{789^3Ihy29!(J$2vqnUrdm|rW?pG?u4aODasIR+}ord
zhkTnHbDarl=<F%1)R~Rxg6Ll~K-%xoPPEOwR at 52~N~*mcsxI$5gNzXC9rDu+H0^-T
z4X=;!IIpY(nzS^ri?W-+-)=G8KKYxvVFSz;H?&c4GegGzUA|`K?+MIwcov^#=IqLF
zz7Kwl$qd&_Ke40pag#~Ip~F~qpw|^oJr-Q=VdFzsn at C=DSf|Y&z~KGyR|d=%DF5=+
z<=^@3I5`_y|DBNT;ziTv|IU>A<_$lX`{qvq4)FCVBbof4v<94<pJ}4N#0Gz_Aqrxm
zjlb72sl~rj3P13C^<S^X|97N7^9=a6PrUh$7v!rk-~X3I{)_bg#gzYVT+P)^I)P at T
zBdq at ZDztP9E0*uGJ)Fw_uYOAflTq5zNz0vgJt2^#rCFn0GBRcea4H`^{G}z@%net|
z at VOb;*YSN<eS%nLf?T5#f3DBx3wPRNN_VzL(2bd85*E~&e7Z4zlY5wwgR-;NYUgtq
zZbp~nB4g+;(B%8ZtTaNZt5+yps1B)A3Sk>)ERA7-v->TE_ANEIg_sRY&6=Qt at EdB<
z&SweCrLiZkcW?Hq|KX|UMKEE<B#oxqaaIKK3k%P6gwQ7{nO**AX^;Ix8M)5T^oQ%|
zzZbu-^H0-?v0p?s{ex^%PjkD#8M3*RucAAMix^nk--rl6ZsJgZ(Q<(%aNM?ydHTWH
z-!8jKLY!XWVt1ulBQ&Ak`K9V3L27v*F(ka(GoxOt?5tU1=xm7VS$!8|*CqMAT_qFQ
zrWh*CjXC at aI(U2PetSAvyve(kc0D5u;<~V<O_)HEoG<-!CX-AV7;g+<TO3i^CfqcE
zZ@)O07y-5nU8(f>=@;svQgJcHn|F_QG_6{3%iT!_=0TY=(9+)l$1R!7ZMPR5wZ?9b
z;Fe6Gf9Z6QBd!piX%C(CheO(plZMcyUyqksyVIe|SU>S5KQhP$vJ>0u3qZKUJM3Ja
zkwbjzARR{+PJ%F({HVls1~(=GO;)jkjh+;>8&hq37-~N_$g?xVX(@YuO at Tm&hWcvx
zbT?%t<uCyJnN$6-a8G)0i{`fxHJPU|Blq9Qy&$aQ2m%2|D@*&5giD&=-n7aEf_ge`
zzgSdptFkotZ$6(P!VBP0l~~4X=NG)E`Tb+ujuY?oudVIIcl1f6;jv^Fo9G?R?D3<%
z3T=DKRQ00dz8wqZNOeSqg5070x--wTVX~e*))?h#C^vQq!jBu2s*ADrzxZ^c9bpU8
z-j^ZlxE-bhXA-b-+hieE%}>5;<1`n$5A=Ed$n=nL49T at 2c3=0y$Fk at 4nL_dp-n2U4
z?4KgsLZoV)XI2y1-M^X308JNlpt~g+h&~NX*OLt=lNRrr9OuT-vs&aKVggv#vWm0c
zSK`zQOaB!MKt>ek+KjZ(ey?|_5eK_-y-9R#K0a at HlLR7%Lamu(7bnSDyM{|ifbFGB
z7+mc5-66 at JRE>Z5p_wt=u232Qg~YlAED8F-m98Y4xnkVw7m-+&T36ggbONw-iT#)L
ztf&fr<R@$A8GABS at 6QrZeYaIifd0f(;#?7?lp-WT-}M-e-LXQ}kqkG5jYPj|A*{_|
zFNVaj&u-7DlyH%q;Lqg)|8vFq-#n+(lH3l!;WN_s@~V0H(=M$4NcI4xZ0n(q5qQoh
zNk}ws5A{4(wnP63Ni&n)nBx;P#p~1v-vXa^4*?(az05=tl<EFH>@B*My?9;xXn4hu
zZ~kz<lChO;A3eF;DmUBcQKbAg-3{a{aXfjr<BUY$wX8pHleUIJ>#nlTb%!?A at y68q
zNws2PfO~aunoOdbvaQ>0A*uQu=bIzMTq}x2NhIq0Xxg^#vrmb1q`a<G4lzhaufUrE
zl3>${22$Q$)NZqK`LU_bLgbDeEQH?w#wL|Y948fgcrM8P)q{0Bh9>ylSI at ZS6-Bt2
zVU(+Mrw{A3clsw1+3Q<OueTW$#ElQTA{1HG at 3F^Te7Jp(m|&(pG^+5XPd%NJnk=e|
z#99>+?88<e-g9Vhp{lua&S~K`*eFRBqC&K|OLE>{X4g;O&E)XK_AWu4^`q4Bp6kJ+
zh}#s2te<P;eN#ptX49l_6bN9SSyjMJAZJBBz060U>8yPLA0G;Re%&rs6VdJYss)qp
zTQj30ldyIflLkMU+dRX;JSdC3mATQoEgfi0%&<Dgtx36V^6(o9_P&Pg6RG^u=y>w?
zk%zPmWQ{kfFn)1Pj*^m9^p8G}*K;_Ezec{f5yCmyz)@3;WDWc>x(QjPD^<F*2WC88
zy~*WM;;;XO5$kp59kol3dIh*b^AlA~oo+$iBsJb7PNp9k+ee-jJEJ?>w7om~pqijL
z_OKuPE^WiT-|=qDw9|e&#C%{oUy~4`!ny0eyL?|ZJt)TICx<t`+>k6Ij{YKl!E&Q4
zWiy$2VowW=z^Z(!BPGgfMw~rQiWd6#mWJ8wqDXaJK{sKL-jVYIwZ*&k6?cU%ex7h5
znF-LMbW9YRvU{+Me%}{9sC%vfrj!7k(H!wyZlKhyyysgoU_q_lSGv-Kqyb0wkZ}l6
z<rqS~c at Y_>S#iJMbxFsCl+W^UBD6NXj2|9weM+G=OuXJJD4Y}fJR_KszAfy9#1`x2
zcf3l8^q)2uhg(B$$>!MJdhJUO`xbxwiTcGQo#*52qeEURj%Q4Vv+Nl1KEGf26_IB@
zSS9=U%A4C{pHjGCd`eG+$3xEw0(Qb7c}4fqufKkEPWeNYL`#HC@;y&7vip;E2#Fp*
z>;BC6hz#@Ig${#4EO1YG2A9n}axnE&XZpl*ye^}Nd8 at r6yyo#mpFmrCUGpOAmsb|_
zV<{PQbR#%4W{iC$rc_C9Tr_!B3d_c^I1Sb*I>@L?_Qze{J=97lGD(@uk_~Y*ma0uS
zY_ZkPE at W;}b^Apd15<b=vOk<#X%@#fW86 at eK|TDd_nwmokcMZ_QRXL;*A=@bP7rc5
z4b8*dKOcTim+8YIXWQNq at Tpxy*tUTpct-J=<)aE(UC6z+isKEOJ<zZ0565q%Hhg}<
ze5-nKGAMA~$!bOG!Swfcq|-b1E=M at 7c}%dvvOi*PK)F2~LUMDCMfaG%G2(|lRq`ge
zEYu3s at 9R7_5T%?u``ak*{r_O?t>dElqPNi at 1Vlo*gds+xyHlkF1f at Z`yPKf}q(iy{
zl$7oUX^;|O=#=glV90yW at 9(|ud+(q3@(&*lGw1BH_u6Z(=UFw3W|19VXw(9VAKOl8
z()9j>=Q7Z3>(@>tNxW)>X^yuXT$cte$F0b~Eg5BI`aSFN);wNyMR))C(&dZ7T4ytM
z$LQ5>(}>SYlb{N6-5DQvUqo*qkJjXu$ufS6$6NV&L`IBhXy2aEm>DG at 5y<E^N8cV7
zaOezur?E+0nbB6dzmU-xtt8c$P*+oAo|Ak3tXsIoS*P)Sh{(~_85JZ;SME4m3J)hl
zF?PP!!3LS5INzomw<kjLd<OX1c06!mgLkv%F5`9PJX=|RJI&g|oH1AiU+Tx3SZJ#$
zg;UxcI%kXOu{ZB5Ysp;Ko~Me*bO3fx>yy96^nQW~vWg`xBNqS55W+U~U?GHsFoYn5
z*8lz0D>~Gzn2r9`3T+K#XO2-W1<^cA$6sGFtP0Qjj6P?vPyI>YOesa9WAxGeFiMUR
zHlAEE_9C^x$Rv$fdTn^{WX5nFi}ANu?+R))JD5NJW7hh!+Z8N?m!;KyRvMB4A2{hk
zCDP=HZYx$_8;b-h*;@|uSc5VCFV<*i<5s9?Mh1nkM33_MAA!2_Xd4Dma#v^LA+PGu
zQxxcYc1U2=CvGLBt_7b?d76KCiQe96+;2`fe}47-D{UB3Hxi3(sGUHH>B9cJ`awe6
z^ShA_td1Ii-u|vdTR1sv>YBU72Qphjd{V23#0GO``BBHiavcIGa*#oypBQzhUlT0!
zds~Sn8*5-dnD>MTD;L$0hXIyllNsGIMO=(w-JC4}p>fd)$=xFT6!6tlv$*N9xO%k5
z;kVaJ(_A at xX7%lJz#=+C{fkPxEyT#W_S2(k`%b8rEy*x7*Q~sDeoqdLty|(D_Y-e`
zcC0 at Y83`F^zqM4w^HBpcetW4lIm at H)_%=zAlvs)Za)CD-{#2G3#-LzE;{yw^v at q?c
zqFPkTE7~zs#OvO3!D)=CB3`Y;NKd25unMhx7so}YHmqN(%y?;r*^1Y&F(DYb;v at 0I
zG%S!NqwSGyNle-hN-me|#H~~5<QI%hlSjpA?St>MHymsgr|P_Rg!+=#5~G++h|HF{
zct&;`N;2mLb-{9*GSyY=T5D3~t#@`GTI{Krlt>c;T&zJ2<aLu*A%ZNkblW~StFxOK
za(V&l7;=+%olaHwRkb>}Aom6_&{yY3bSj&np9Rz;u6Y8oRb^rtk9^%o4}bfXjuHb}
zvz6eVI7YZ&$^$x1D5Q4Yl9TMS_zjWw2Q*x`0UJ~PS0*<i(A4W_E)d~_Aw at uMwOPd%
zOLA4kAVbnIUfu7fb-7p{tyCzYkhpjXa^6%SckxiDge26S7_tJL37);#f3|J`c*Y85
z4UJ7c7h8_05~byLabQ_AeUw9{&NN&;Pk$8!>HIJU73}K&9v!DfnO~#^*J^jOy{+YH
zN%-0l4JdxY4i1;C{Fq5?yOILk5j>?n2bNai?)8<uKP3llcFgX^-39rHhKCSflF&>+
z7P-Yeg5PH?MrzAypM%Z@$5Z4souAf!9JIbQdu}pkpaW_+zH)^A$weLJD86DZYp)$u
zGj;x9V*19}`?^+42N0pNw+0U=wT9h_&c|dysuH4AhcOuUI*sCUjz0 at BKXphRksrTg
z%kw`L*q{Wa*rJ#Uav{F&Z9#I at Z0|q5?kORCtfnB5IGiKkrdOs@&)K5$*xF4j6w*Z^
zF_io2n&-nLPC6Y`L_{xv0Q5;62{j|%+wF)rkL{Xg-}29bqV`qio$K(Q*6zQY=WDW~
zy4=#aof?*&-6`6Arm_^6Z&@MZDNL`@&esEH&)jdZ-2CIzZGMaoEichaj??$;#UWm8
zD|X!*AqH91>Q*F-Y*Kp<1AZH4&9|mygOr35zlqTGUC$eL$fqo#y&Rf~Znd*nAN2H#
zhq9EkvvegCO#M-DuehWmHZX*>xWAN4a at s)&W2?l5D at 8%5wC%IMUr%ChtqTRii_#T`
zl^MWzXutVT<J6|h(B(@8-KRhmr_YRdKHI5U!{nOS`DzM7wI;o+;=guqL~)TOlseiP
zKY3hi*yZ~31ZrHth0IZsUon{WXtdgzuDT`)iFy!z0+B7oQ7M-`6=Y?!wib2G$eZn!
z2-$9^7`9UE;Mlj at R76_d2_c`Xf$hUFyB&aTrduIxe3{;B(DG8GLOwqEZ7&?{f<)Mk
z>dmk`n!mXR&hy7!O96A`J9_UkX3722uReU3lavg!xx7 at 7x&C`PdAa{Pq?jK|*HVAM
z#B#y1q8WD?(-)Ku;2sGohFkhG`iSDbP&MZT{T@`r?v1W=8#b(YE?xMDrRtqd7aNY@
zZy4L>#H#Pb1a5DU&hrNjHe(?Sa7C5hV)?XTEI(Kj=egq<ZA!^1ilupfagonj!^_~I
zrLP8k_IRSz25T=r_nMKX30wNG;oK&=QkrVseO<@gSMhHit at O9IjPfqLh$?eiRJEfn
zvHg;hY<S294;Qepv7sxOJm`Kazm at bh!r*5IkAySo@*86tZ=9(s)z-JX_O_ at 7m2VBw
zixq~sY+A+eu}ZJ5V!3LJT4i~0shh9nZB)JW9iO__fd7Jm)@DEz?8mJ;ecE;j2g=f|
ztaOF?9QVKkTY)-t!N9e3CqzE at l)FE+`^nGEC*8+8Y&Dadjx8OuZ>RWTJrG0rVQY_8
zFDKW6Akla)(g%IBHv4z2DveXCd0w?>Qoo(EVwH&R4qHPlwdYp~7Kn~>p=x0JWXwX$
zsrSvTE{jfHYQc7kVsm<A5{T7j9{DY8-g1HvN8j|gWs!So&#L2|Jyb=gb=wLX^L^N%
zX262Y5)7^5$AHCqH?#esH%GJA((T(;0Cs3(8-9au_PIlBdfZ$d3lsk<ayl*sZ0ed9
z`4fz0)nskg2f{5L$H+j5+8z at 9%`>m#)khE4ewuMB6io2nHvEH0yblBeK at 64XkL_(n
z-^-OyeqF-cC)=T5-wxmcFfnKO5wHKE at ZUfIRSTtuTDR<aEglm+)J<c+?|@KTaND-g
zzc$hTZiWjMlT2z&T_5^%E|p~ZADgyS3e@?vPy(Ljb^9ONHa-^yVAU*O%x71Bg%hCF
z>hT@`R3|8Q3uxl}uQQiD-2?Uy1U|a^KfOa1r5|{f?tIYE3y`1qt#I4z`CJmr{gTF;
z-yP at fdV9%T=-_%!=IhX*n*dB{Q<<r0>;HV_G$H5?n!2*JWieE8kM`!;$`{qa#U=Q#
z{Wkw}`rhMYX3AS+s4?vS at g-BtqZp8{r%UjQY*cZj9KAeUnf=@2OVs+M>-F9Xzt?&%
zW=_s-Fl9*orze&d#osk-M)jAPcD?x{4gx8Wj2`b^+zao#nvK|dA#m6lnq5V5xzGjj
zyS(H)xIefss`(PNouEX%sgT5eRC3`Lm6u01?|az3a+Y4MT`uZHN`2!of7z at Qb06+^
zJ1hf)Ht3mLZsOjxJDIH7`<=3bd_f?ev-G9a>vi|b%Y?_#(Y{Ea%L3dxvda~3kY@#A
zZs}GBF{9t^hrYy40FnY-#t4Yr4GlK>vFvu2J at PNvygEyW;h)-^=yATeb8qk2)c-lO
z78KgfzO<xXW_nJy=y!iF<#fgBOS5<nTe`u$Nx8+i&qIoijy_uS#%V)b&7|(8>4E=R
zD1a360X=PMUX0*_eCd%pR5(R1ukB0VXD5u+p8e-{=xrG3cX;|Eo0l4RsKj&_$uml{
z(@u^~PRJU;Dz<ssRL~Pt8JTuTycVPm at i1r8eu)PC_IqX@!R$5MY at hHvZNVjiO;I7C
zAIo%ptTor0F?Ww-WMnQ+6O;g%_v>PhiFR-~!v*<^Q{C6z?CD1rq$Iss_G8`s>RXn+
zUfJhy#L+Q6jwgn=d}R&2JHGrXa<SBQi5w$#hw|_`XMaXB*RRfdaBE|aao0t`l$4$K
z%h^ZkH)MBn-t|L5!t%NkyMR>xC4T=C$stt#msB26e(vSRo3uwwrvdCgI;?`1kKEU|
zsBa#|SHILe+0eUx;fH-6q+hCg-GhtJ_8tJr1*&<3?R~`P^8IAg4F*jgF0c)yCa)!T
z#Atbfr7SK8{Pmwv8gkxSBW8eNQ`j;xeE#4ekb~!yE8-4TApeY#a^+CpZ$<z%Ar%Qo
z%+2R->y>_Dh+Gj^@#?&|>CnlcFXP~XS{W_q<|Lxf=e`w?thqzVM86T3ea+|x*xA+J
zv+;lJz+<4*akf%c_|g6gpY$B8b$^jquakkiUcpuSc9I;}la~8{m^natW5lj7z&=Mv
zVpm&qoJL0&wtE+LYj^fysLGKTEi(*r)jh~-q4zjCk-@@cQJ|YYYfJpmwHngx&zIPa
zLzV8rnvH%NaXPVqzg^&3!;hZ4!-YFTnWWDU;Q1b1M{y~wS?SsJO*=b|lf~<HyWfZT
zPDDt{0HbT`a~@MW9)jQm*oCR4d|1$bWPEGXgNpx at j1A%@Y+k;j1g1cTZcH1y+TTiJ
z#RkE;c;69v-zmPf79-B4uaqUy`6BxU$(F(;<7YdQ4DNYM^ih2RqyL7>w4dK4D559#
z-N>ZVcQpTdU4_tF*b>$;LN0jgPXs_#(W}=!@<&wi-Q~H7``!E@@HrWHaVZy^>uO68
z`Fp6T^h1v*EU0Jl`U5s-^gZm%>;E;o)UitJaPdp?o7F80ec$8clfy%w<#I*gTh(Bb
zp6mOQ at rB-NKv{4K3);2b;r4g+iu>F+iv3bn*d7k5-%vHaZk-blyrc8qM_OJ=UMg2S
zzTJypA9@$n!=nq-9?3WQx;Bv@&OegqcYpye>Sy;wm2SVb-MzJW0%{&~odO!zx+<2V
z|L4#6Pfe8roAh))!YO&l3vkFQ=s=H}msa~&x{@O{1%!l{f(m>1my(2+?v%a#TxT5?
zbSpVS?mIJ24)4|mI3M<l&++rBJ(-(xcie8ycC-pn5X%%k7S$bvZ$DSYXW^6Cemx(J
zIn+NS9+fvZORW0K;H75WMeExS;^9|~w~OLs&#v`#4o!7H(}0*#&$EJVj=$}sje!5p
zK{liLw+jgU7&tDlKD_N3f7d9czY?9|c2zRV)^fi_2Zm#FMk}>3EC~Zz;n43w$0j{q
z+ol7LJuAuY0);xT&WPj#?nO^@*OH%i_{HMAtFeg at o(b{F%;j2zIvNFVbm8AG^y#-<
z;sbi8LvwFS=X=-1EtjPz%$=R9Qs)paoHBMU{~p;Bbh&%6WPPJ6+C8UUMnX%yhXX3f
zOc>RMx!f(DgE%7SP}e}O#?Hy<GT0Vf at GO^1IDa^X^_<^(B7?f$g*lQMuH^tM-7|wM
zJE3JC6UX3V0m&ALRDJ1ZA4!!q$~XUr=SlJOhzu|@rpFj+v6-0{R>O2hH*GnwIgX%_
z1y3N=PYns%w`tc$jv at h0s0VOBSt#w{gX~ULWxgwFJUV$<oD$NUeu|yvD|Cu*6TDMI
zH7j3B!@64xt``L<{1Ai4&7SP6)!vv4n{AaawOF1Ajoi6;MqQ*yqZC#J3`iCCLi{0e
z6 at dp?B(o>yVri(c&mZ4Xj=0h at +olEcLF57{+vZ)HW;tshvhi at QtR9W{4t_$?MVC+s
ziNYwisFi+v!WZ*5sm^7a*(&6o>lcL^ice?lE3h@%gZ}p+x7YxO)7oe^MmyZHtlj7E
zeAdM<7kXZY?%)3&cnCx;j;&Yu`QtZ!ku~QR<(o|e4DqPmCuyN(t=M{Nt!66d at n5N1
zWa&J+3tKHh4fP0Q0wBWEn$?z6LYdwMHNWx)x&t6`4tiBl&9j`qn#@THwQ(|jkP5U>
z;-jj>2z9ukC&UYxoTJ4BYIX7R0u{VZM~iGGXr0p)>tfWQr608rI6__A(tz`i;=wRE
z=0aLl>MvNlySmk1>9e`L2dHPUA4Ycw!Nl0Dg^MY4e^*+Tcl)zp86KE at W7HAg!{S95
zO`yG3%H^1vRHRE>&JI)|9DHht3S$vtmKaxvG-v!(gj-8$$S|agjr$k`LDYsjZ{G%x
zvL<v)@OrEe2DPEd{Tc*My3Wu_>T3**T89K#jp>GW)P5PPYA8eQBBOhBa>76_y at tf|
zj!lb`Bk}}S2IWcdiourFBs7g}qqclhO0xuAD_}b^mT=Rq8D=(s=LIcva<nBnui(qI
zl4zAgDX}5ZQeUaX0nhm?A+}htp?(;Bg at bko0??C&Cgfo%e&mQx=C9RRB`r_MQB*!!
zVN<;Nu(hRpcH_%`k&sk(YlSI4$(ivj>YDvfZG8D7;`iC7yw~yA4bd};G7}uQV&P+!
z#^A2ryC(HKR@*BDRF$;J(40YQsD+O3-mmC5`&Yc^vfanUcE-xPF(KSPc#a0ez82CW
zze8793NF4_u`SLk-A||=@8`_<yg9WJ`h+^OLpAXxqY7Ed65L6OAm$nNr`c&G>m4z8
zgRkl?`qHP-i+D8m{qJftbHY-RH`8~Sm54^PIzM&=X!Wz(7eh=p3_U*6q4cv)L1xAz
zX$%G5(~i(_c#dy5!0;h+na_mAIzcOn#eBS?s1gNxOX;%}aA5{r&)!&rJ#ABpp<*0+
z5$2`28&RO!!{Oi1g;lkD5W%?JVh>1}5xIjUkkMCQ2Z~;18wO4m%4hWN5dcr-Z8<=}
zcKV|z$ik?xKPFDVxk+oC&f&3LKL%`2RZxY(%{tB{Oj0`I!`F1D&F=C()JgZpcDyUL
z90;EpE!R($;usvgKB7EE`A}I2;y696Dha{%Tkia2f+r1GFU%FubXf6*I_l%#hs6Tf
zGKUC<Qjz|#d6BR3^kp9UANResc2{Lu1touZl`EdUqoQUA!CrFDiSUN!Ggf at liw?zc
zQT(jP%NaS<Rcw2K4RKH_x at qA*G6)yP-H?w|AdCN+LvF)6I%I?eD<e1q$oKFsvMiF`
z{kM)X;+B?k_9tUy;9k)C%Up139r{wWREi<>p#P`5#B5$lT)pvw_)iR7Z$J&DF}4Tg
zCCrE4SZ&GO&vI<{pYD%EBV=W~zlk$Bh~Va9{5aYC{ZT`tpt#xTCPZj<R;*+C{otM8
zk?s~PgxtpstB<F<Uksp+tb<prtK at bqevYYAGahJj+;PD(-uBe!^!Tp{aeRiq3sv*1
z^E0>cF5|Yj*Gq|dMyjo6pJr#oqr_QSYltsoD%cu;D^D=$-w-oa7Crpj!Q^q3MS at p*
zvI%xjUtW~$w0ew|wqLKmqd0rX_f!Ybf}7B%!eN!S-hubv_^>VA2e0uzB(t~<a^UL^
z3cf20f4NG1zf$b2f|pTLyY2nhrt#7z16}wHxca1;jb{Nb;!Y{&&7^AEs<y8x^o61>
zC4#VN6}>QgJOrH4v$;Q;rjA%D!XPkMwTe}(C(lWWq=_*2f&r?X)i#MMNL<l4Hl9mY
z&oeCsuSq$mf)i5=O&DV#WO+STt!0?|BC-zQD=IUDNl7syGkWYjJQ73+*!t^p2Nbf)
zg`O0NtSzL8ha}c1T5CQvy2s`PrYRbHr>DkJ`f>%H9;;H8e;3iqBKhqXd3-ECbv<S$
zHQD$;>Y~|v at iM*=t;kbX*5Q@!j%E9<Gn4unymK|xxVE;Tl(X*?T+5I}$%1kX9I2Lz
zYOP~f$>LY3rQIoQZNbNx)akWj{3BiT&I0JMooWz<5uChEbs6KNi~KUwVOR4ab3Ec9
z_?R1#P8 at a7;w;bc{u0^3DE$2JqZOvZc)l71 at g^S!>zsFV+lPCZ(Bjr1XXZ(FXGhx!
z_B%YIIqo{Wn5ep^*4%@=UyAcw(n9l!BWl*X1H-}=ZU2J9Jein^4{S>=oMCJ=0OSYo
ze(Sc;p4oFyMgtRMp!>Vy*fX>J6qZy&kt2gtuf|>t&W{2WC2=yqMm+ADEK6WEe90g^
z(O-<FsFq`;Z9801;6V7eipYk=>&~<FJjiQ-7IUSU537|)LlpEKU1z(y=%WG?q$q|-
ztmvLp>4bOeYPgCBDTT6|A}Ho$x*s5W7|2=Xx+HCMnp^e4tC&kwa+?pDn_{#*CN#P2
zk#v%%w|(`9bpjx%)^w{*j%(9Cl3&!OW;T4|zt`_;L!YOhA%vW?1!omeo1?X((Z2Ii
z at f2YKtub9E*Qf59rYwfJ+~7I;`~D+tHb4QS73CQ-xqT1U=N$9zWpri>8rZ#!(XG)`
zbZk9v!pB%Gn!8hXv{2QmkQG&OikWy6BR?nXj at sK@yGvg<x88aiwknpm5kP&vjnvg0
zYl8~QL?h<fB49gh=bO22HTVaMt`uPxr~tb<^w-`7xRdtVeS7;RQc058rMq)}g#zKd
zSOlNuV^G1t4(<m~Ex3H(>+Je_{_7)jJ!ec#e*w(pS at lM~R7epidsQv?D<VemQHW_L
zlOB}9tv%-5*>`S}e(`o8U2cgqdRcC2mi(Us!0h!HDDTs2e|%Ou{Mbr-vHqU)5Cika
z0f<9<9gD6!jgLVN|NF}KJiYjlWs5mzeF#6Z>2N_=aSFuw?D^xJq&U5}a*22zg$U!G
zCcC+7ISsOntq9AEaJwIF=%fv`ahbOJS&BLJsQ$XHk8QTgOZZS#(yzwO-8|qRhg!eV
z7}EI<GIO&9DaB1fJKXXrUoEE=eba3)L7`@J3=8L}`*5I%lUn&KtZJ;@_UxKX-CW)N
zeq_tHtoe1*DGq2s8Z_<Ge%kC23L4X%`SkoAof<o#=K8P1>i(5jr^fEJz8KEzQ9+`V
ztqfDG5QI;3Uktcin9df4{IWEoS1S#dI)d7QR(ecT<)XWW+Z_3;${8=E-ah)Ok&OnO
zVmEHT(HreQ+lb#ySBC=#jQkaYB-c=^p3e<eXCogqb?gO5CWK4h!2>iE4AUXyRG?x6
zMxIwJ2i)admdn1LhE$N)nQy7hfNEqFme9^OCiCmx<0iY%Lwu0;5eiTu>|b2~+Q(ns
z;PcS2_f<eIvjyD6O4aHW9BuRpOK-pCVM&1|%RdqzJ}VI!LcQEd7q~gqw44i~oNY^o
zzUH-;X<JT=7+6^gyVS0gp!v`3T3BEI3<WGpZD>L?Pk+I)W|hzT7nmykUA4RAer7N)
zH?_y{8 at y99k!Vm&yNbGVGnl(H%=wlH$v|wsRZy)_?2!Q2)_U^p__=<$g9 at nOmQ1I-
zPg*Bzy9I7J`7%Q(Q at yw&9>9j<JwS6eix|MOt5BdK;&p}r82W$y at n~D)bO0ab{^AB@
ziXRDYB?eM-Bu(?9lASnIgF_o&c;V<sxeUR^VcV(2QCdv-!QrFQ<EU+FI=gImG=b|z
zJXy5NWzTm>LsTSJo`z)Dt8&b780EjZ2}?9V$&>qh7{(+QYeM0O7o2#g)_hB at 7bY<O
zj0rUpiJAkvk&fP<7IkbA7{|;<@HCy{`@-&<@rYqmEb}l+LK at O(MBuHPX6-BMR*+mu
zsA>{_w~Ou9+4JiWw=2VJLyK^?$tiv-&Fz;)w$-z(c_rC3HMXT#Jz>m~XB?ksBZnw8
zh%OTv>c|44U*-9J_7Sb=)i$5osrt7F`_RG?%BI<4ALI^2*Wd7G!bV-8chns$n1&J9
z3Mc*=^XWz%V6^lC1$zebMR9fh7LOS(w2i!*85ISR1cuif{V<^qlmqBr)`at}8+{Q#
zwbgnf0gNAC)HjVLNGrv1wxgsn`3ug<^t`<(%3#J*77;s*ycsm~383idBgu=r+Uwb=
zB!C?{0D@%zFGS3*r)j_E6{u5jz9df2oJt+vej-iA52ckYbPL;~KoF`khs8<eIgyO4
znl>0$j`?6IJ=56(kt_M&2 at p5y?2t-N%JL4+i6wgBHLTBSAUqW#d$heyE9u-^hxOAe
z!>tEMp*!{%MB$1re><5(d$_NoJBEyLQ(Q1w^X0FjPaW3Mq<3*o_HGijUfpbXAytqj
zH&@j~sm{4At$p1Oy_K{fR&Ji7%^<g>xYHn%v0>vZEPd8kn=PViKi7L@#2BL9YDbu2
zhGzjko*pWo)QP%MS@{@|<ZN3$w14ZWR;}0`UUvcL=COt7xN=}xn1(?PuA+5UoIUgu
z6uX6Mg3=-ZYIByF at g~z<#jUx9?KbICmMuDiT6-+4I&0WqAstZ^GGv%VO^#86C&rY~
z+`}eVfVV2!{KT^p at D<w9fW96-U1*QEs3x<iRc9LxwCx|}1?|EPthy!-zf9K2nmf3B
zb1YX|TH61sZxsKMvV}B?_z<}&J}>P40^tHVc%I;=^uBM~8>4j@*q<7vh6ZB0IaljO
z&B=Z_?Q?;&0tIGbv08qAQ-L@}LZAcBiK+<Y;#JqJ+Yl%4lkf}5PqDULSR34g#@^yH
zS2H}XJ_w7IERBX3*JapR>t>a<XLar#_)#c4djyyWJ?BC at KG6xNj?dOio88lmf;SDi
z4i?#2<>T at h<4uxJ?GPhRH@&`XHuc!-b)N4`#H(C3)!;KATULGhU at HavXpY5j)rY9#
z1WurZe<baGqYYk19aevOzVa_&L)!f5HfRE`%4Hg=95};o`YI{iD=npX&p?2x6EE-d
zgs~o=w8j4;DZSY;y$~VnMqPMb{8A`S(s<`N5)s(p5~Rfeb)xEQZG<ZwA^BlNlU11B
z95c<-p8*p?<Ue}zff)b)DY){T1o0>b`Q?!efk|ecG-- at Pw=VjDo2ldq=?aTy?WoN0
zpkIAN-qSUXofaAGxaTQSDhhdItB~?m8?g}6#*|EB at sytvrvfvh>=Ag;5-fvFvK(Z%
zE7vFrqnochOIimut>$X=%^MdN4?7R8M~1{YhxDR=H=+C|3T8O+ at ziqokeOa>pQPb2
z4K<I6n at uD9*;vS9w+2CrIbCF(cxrf1@{Lbq8{`#NpKvB~jj8N=zgsHHJRb6wtXH8P
zWO^9XA$0P}8As2`PKs}r&FfASs2>A2{Z4(TMIghvTMTZ|wwKRCQl07e!}`{G at sD%u
z{_Li9nfr!!#dTXk1+HBD)0Q4+cv#rTKW3`<6JU>iKhC|~w?USQH&8km*ZPO&={GsG
znFI1<l`{t9vkk=_clVPxvUxjG^SY|aR&~X(3#Wf_(ClN-rq)te+2R6t1d?yGsBxUW
z>sWs#uRBMr)>HdsKxkpBSTE6(5~;WE8Y4x9@^K(?uP%vkAwCJClXccgfSm3vf9OqY
z<6a7ygxXuhR4E-t#D;DC`0JObF(=N!)m7_e5Py`<{Ti7%^-8&0_PNx%FXVb_GR8vi
zl5zbitjVJzg`1<v?_yZIxIrd89UO1cU at 9iZg4iPrv&vOBq2*t-wkUcE86Sm+60XZ~
z)~J#$*61;$RMASWLP%4{75u`1P at 3KjKI(`Q>!c^J&oqn_zN7^}m<&PRkTMU!nihP`
z_f+)xkqfq-K+l)*SMhiJH{kmS<QIjHinW5<n369luN!%S<wC}GB@&;%gE8$HmWm14
zSb2j|uIN=KBsg479E at FgR5+_jvyOV``qwMDQ-Clf+sAD2j}@c>bkT+$`>1?;ziaHc
z^*Rn)0e>9#Ow2}wb;t@)drGe&5JG<yhSe(0AR|z_*q5{h8%hJ~oDpdO41i~2HR5TS
z6-`RCVG;h<d$qp%wi5-&Heph+v4A%wtZ=ZL!RXIo(kV~`^JwsndWcEEJ(BPxPet))
zKU0g`uNkG?{I<txhh5G;PecF$g<*rKzTPje()tzSReEt3#i*6}!rg~q87PC-tv94=
zddk2<N{60Q(9F|UYH|g(W8~eOxu2RPzyz7`pYyu^kHiR^{YPTdGC^k!I~T4EU>61&
ztyAsjFqDp&{*UTs?32O9yRneO2YZ3)pL<*;{u8sWa&d(&E|fD+o-b6B4f!m>;Ptq{
z^)U5|%qWBK3!-8F{m`%;+@)3YhC}%2(|0!*N(Fj%ZAKlAl%(M`ro|tSHCTN$cLDTY
z7Z<AbMm&3Jw;%t{Rbd;CO)ydP`xYQ0hZ}47MoeuY<WP7_a+$iw*6<ak(vaU*ooMt?
z#z2xMrz76@;)@Z~YTP;U_>f_C87iW at kMnX)z0UCC>zu^<dc&>@-K|xq{jBJTh0dHg
zh(20fPd=U(D>u>E>`7$k+U%@bhmS at 0$wn>dEGDGKwrE1++2_a`ZCPZz+`{$WU2)GN
zgv#J3J;DDWezM}YFfNupR*Ba$<hBhlqjgm6v*&FV-V^7`-gOKG0SqYd6+4IVkhL_#
z{qnuGCq38ri|d%z0{ILP#hrWJDdv=$>{$hgcjcZck`m}m^vE=m-5ghD*5bNq+2J-q
zR3d$ZetdYQ`}^Vto3LbFg0jt*1c!64+D6P^&P2cnX8_Of2DeDv=PGerACjia8-uCI
z5p!sM`bE9(J(+YqmfSC8>{Wsx8qzK^T+dI3on>Nkzu}_OYUS|5PBRcGx*GzjBF+vF
z$GNu;T_3|N><K%Q)UPX(|3l4>Kngi;@H3(U;ywIKchc2$u31lbjwQ5%DV;=PH9OP+
z_dJY?sQhxJ1m+uTeuOQTQEm#TE}&5&nm?^g{O~L;0`jvfa%%jwBUK9{l+ZYHwc}&H
zaEht!h3b4z__)ZuWi~qdB<|jq^03&Ay-fh23pj*JEmtwJDE2vY6_#sDxz<7PVhQO&
zn|`8b1o!ZTbLt>krzAeV at m)eQ1O3uAhz||*oPJ-InFjOIVvn%;x?*GSG9GgIjwn+>
zm$HYack+5ms7*_eU at IQAt6aKKsti-^{ZmM-|6AvGQ7YDA1jAyfoux{f^Imtf&%R&y
zjicB2)M$w5s`Nlm>MkbWSL{3A^wSsHNjG=fQ at duou3s45&65W0XekzOKpw~M&@QYr
zYG?aud$UbA+ at 2m|ghM)?jnvoARac8mEL>zudy?w2_$lAaSn4_)vn&Of?*(Np1pzr(
zTvv at kb(c66S^T)~A6iB4KcpE+N_x`;l*q<v5GN}Y*zpz@;OW(9dbVp{7hl0sLWMB{
zB~b<cZzTF7?pjmdR5|j47Nb7?AMsxc+ttaKpon)m=Ywciuk;ri_|y$F^1cxc`>&DE
zEj1m;%?GJ1NbrIGbpEhFGQd$`;u{jUZu|uxZc9c0GtN2I&mYu{b_rLzo at q+db#%NR
z!t;XrKyZbAPhmfL&x!2FF?up4 at 4mc+Z{m&Ioi{7no4apCr!1vu63Y3SGhR`h*P<9x
zZDO!!*R8=9tlL*VImtu%V>^AU+hv57n(?YxS4mzyJ2eVgwR^LF+y1Uf&bhU2_|`>N
zj~yY~rJeVZpmW!%mFS|W$x+TRO9|{Qt}z!_Jk|7lX3Fl?@2V#?d%Nr!ow&mEaXhdc
z>Jx`YyHeZGM`zKS+t3q|u|WJ8?mu`zpTf=`J$OQLTgUN`KeB^CQ!(Yf%HjU<lZIOA
zh at CmUD=0|`w*tTI{JZ at ML=8Z5eC|{>2a%Sck<F3x#pHp?Y!i3)<>JGSX%89->b#%Q
z)kf09r|PG#POFJi at NvnRk$U1_DKd6}tp&Q=7HpT)z=+ad1O|s(;C3`DIum=C>r692
z%IHi7q?GUloAxJ~5M)wHfM;ktp!D|3)Zq!WOu)Mm?h^a1gA2~^sjj%Pwe$ygJ^3HJ
z?tKF){1PXe$q1TvyGvRo096rMrWL5$8Y+5=>nb6gdTFLoWhmw(BN<dLhMUi6&rF)G
zZsdss$t;Yj=_s$4i6ocM?N#x#FWK&&i;Gz;xw`9s51RZyDF{y;g?PcMcvRO3>1XCw
zR3g^ky(=mkZ}k$deJqg1NIDk~^fOEG*UUK&Nztaipb!r%$YRSc_$G|*U!t<a2h<Na
z>+yPqhkaEsZ*V%R;dCnFwMD1`i2zqj#+;Zn)Eg2ih=kC}DN~61^jzuLPCS}myh_6<
zcT<X}WR;c>-ESy32OswI3k>zc4#IaYyhEHHkn~-ly6J?EWKOH+Z_R2u{(7i8h;(xz
z;W_1+=QT%lOX=AZV+W{P$hv2w6V%NkuN6<NvsU$e4!NU$f<}%@8qOvJ?&LWsDlfSh
zclF6jlJwhwy)O4*DhTIT;Lrw4m}z2=op`(EX(gu+Ur at RHx|e+q`~{iN)%Mk?jzR$3
zN at AJo-F=#{uDu`Uev?>f?H)>akV)t!6IjZ8^58|_J5;+<L*Kird``>Q?1 at Y}`}!WT
z>}|>e at XN*z{$_t*RCeSz-uZ`})$q=P!_H{01$@wkN`%IUHGeV#HEnK0#DmLqoQjdp
zHkOxSZ2*-{gC)2;Jc^<TxkK{iW&MZ9UX^avyxsWO-}MLv at phx86iK|mS7K46&@|)P
z%T}8P4C}s4>o027tB6j*i4JD>wRv(-lC{2EMGI%H1#-RSjh?Hv+iK)#k$*g<Jt1v4
z{ZXmae(V0lZ?Qo%N9Cl+qY~ZNQLi#1I`l3wBXTJWG`BXg07_&nRF%b+$FDW!+<|qq
zcs1jIhf0SP+I7QAYE;EA#qePv!=RSDn;tbj+A_omH3{$z4Wi~6m-ZQ<;A!=7WYA)U
za{Te(4%M22x;$HQiz(hV#FrxVPGTrW_QS77_h%lJtOHtw2>Jcl%@y}Z8KI4w_t_Uv
z+#}VEM6Pb3$&cun@@*=fMFm>9zr)4sb=0}m7>!!N;!H(#=<elg0vjf87HeLQob{$i
z(bzcpP|bfDuZa)7qkek0xd|Srj&>8?<z9f^H(EL4$yv|+%x at hA)WGO3^yYT-<{eiR
zkR}wJA>^{{IO6Uh7{&tp*RedyO!m5b`u05&N{;36T6x`+b~CBov4oD}aiV5|-EF9S
zC7xu+%V5%VZPSp5b5Z7QTzxfm_xj->82eDN!mZOjOVP6;6;vw3W(26>${u8?8uA1|
z?#;yWjo7Cw2|}JId_v6LMHw;tv~EG=Zmk)^hKUhPx^3FmS$dspG;w$()#}tkw?^NV
zAozT0Zt<KzW<kIUv(VOm{A5rjW1X&|IL?Q)o1QdYZ!bJ!gKi!|hl~1d!F^8kkajx!
zg)dp*8>tG~{P%SWeRXRZm|;0;<@%4zDig|o_f347z)#}I{`B=2YyCoFVd(s{PnNR^
zF1=8kq+hyQPns;eeje12m(52+QKK1km-pid3B at k<HV_<cBjyKlP8>EUsXehIwvi~?
zq08!cZ=Id|fU(={ZR@$kCJ+{|;R}5RiK+3rNsiGgQI90C>08l;R=xBkXk0lgZ~=Zu
zp|(y>Eh%{ogdYLYE;ji70sJmh7<X7V=%wY$#xIm7gO`X+TYP4!d8E=HtP?T(i8QaO
zwl9+#3RoWjDVGl*`LlHwQEosRZ#T2}HTi5C=>p$0hv?;vscd`;bmaPyMe%8$S~JP+
zugv6;(}?qh+Nip76~k4ASVDBmA-FrUeWYT~wpZCNh;+-h#R-!+1aJ;(WpCebryq*r
zzgo$++$-Ps4t1NmFmP|RW0P*G75x;pWdy|C00*xNO?L&+Bj4S^To~)ea=F;E&eTBC
zD}=({)m1_blMZSHE1iCf)6m<Wz-JGc{-N44tJS9=R$ojHAA8A5KHy=SOe%$!LU3w%
z{NGbif<U;-BJ{61{Tul5FGtdQ8R6)EeF0tuGCZ<tlz^<FMHCUy1*gD0!N6<WBNxPM
z_`hf_Ny+lRIWi99i<0HAu5}%ysl_MuRJpL-m678lmqQ at a#7i^<H><t({eMYy<GT-m
zXY3+9 at E|I$WV<h9E22T3V-knI6m6o;lO7UN<}v;Y)B at -L>%WAw&(|d+F&}M3l##aw
z54Rr7GzQ6wG`LcRqN4*DV_TFTeoUrcRHFKu`pcVw8oEPaxQ=i)Tb`AZ$7R6(_FouL
z9d8rNw|EJPD;<I~em2jcNdHUmq4l!;`vk7Nl1J_<r9)eAwv{{Q<v$~8XI`Su^jZUi
z-R;+|)<rN{@G{C!{R<jA$GSSBz6g1)-4c8t>0E-R*E_6fi}hSCUx_-Xi2l22ZZ;6*
zklT8U#m_cba2>wgo@{UY7!QqV at pU8q@-`I6fL^o$c@%}pQy_OFG;09qL2C0Cf2N4e
zypo^V%vl77ZSjUZPy at 3FFm;tj$aqJn at mz&1deAZ9wqWA(OeGE+H})aKz|)V$!S7nS
zayWk+lfG*y`fM%$)A|>ez^pM+l6?3b8UifomhQuR$A~mSpJ$`pV08dz*mAA6($GaV
zC3=JNE?SwMAmN1jC>03JNF^?)YpB7;BdlvE*|Er%jdoV$v5!Q+ilX0CNk|=*+>UXw
z07I5XEJUv5&rZ7<MMQQZ%O<n5emr&R+JQs at s0xw;wqY{;$1PwVwtxK_bHJzPzDdyP
zgjoC_{E*bvDh3GK`9QU|z!uyAe!vOj8A+GBYeo+~u?y$D#$j8#iqdKDzUU=G?x>iD
zK=iGT at XPetqj!6TS^_BYKY8~(Lzb;+f8P*}I+JztT_aNnfQ7Gqd72>0#8D5R1$uIB
zuuE;F14Ks?xYbFEJ{nohZNye`MeFB_PP at F-UrzzkHx(G99+2^nWsNw&^Y2WG3vKp-
zpX at K1KkR_N6w3J^qaEcrkY7lajO(?f+sd3Tu%4rLc-6Wyw&|(qL1&|da`YY-oxd2Y
zQP4Te#UetShjloKel6M>YOP_v8hlz5wusD#3=3q6z_SBF%mKH4>~QFq>XS|vEcrz0
zA{_j$q|L;Hf?(_d3*tb;#&%8)ER-oak%;Kr0rM+CN-?t52c>sd3iu#d^35bQ%0&<Q
zk;MNkg5W8A2klu7v(yZ)K%N%|iLn6%!WHs3ZT$zYsq7$*;alR)&k)(Pb}qPcNLzlc
zcm@(cNBrJk=ykzVQD0U(Wj2X;3e{zm!LtfMIVPr$#+2h*X;jyeo^%;k&#Zn2t}>$j
zP9&1*rEEeJ#PBGd at tFkkC>=9-3kSHMVKJKTAdOt1o#A3b%%3NiNlqE-NfT4 at rknMC
z6?uiNT>|!Pj-t at VZ#$$T at 4u>mi;awUs9rK3j&^VqGZ|BPtn->`ecTQ|;U9!8=ry0E
z4qw#!TNf&0XB$3L4`_uy?8elDW?1odD{lDbx2XQ;8jkEDy$R^<j#|&0;cosm&p|D&
z(?I5Jm at sbE@<7m>z;~r%QE2QvVi{8mD{EQc@~H-}X7I9=KZ=V$;SG>kTO7L5Kkxd9
zK^G1IBxfQ8x#S|$!=Qw=uxdp}%Hf;wEZ0jLv8t2Uv5J*zHkaq($rpX%ot)S}bc)=2
z!*kJ}+y?U+Cm<Q_6|c8s=hLquog}kVQDdMt$1z6XWq-MWRj6<zk_l;=la~6D`<H<p
z!bM$aXVW7%Z5YoAc3;>=L?Q=A0G)j7Zr)ILn4oZE081dv&WMxGWi;bpx)M#6fVNgW
zbTrg at -EV3huFR6TabXp`vAz at qxL{3;fRvl0?7kY&%Ped)fY(FI#bVvRykARtpXjXv
zeo3CRA6uV?qWe2fSgwK`M7(Zeoe*`KQ+gWawHL}6FQ?`^?6l&2+j1DDT;`)cwQ?n9
zLw6{X#;?n$FXO#GW?r|T	{&Z~K;n{vlwH3ea6p6;zkjlEVFofPxGA)t9KA4++ra
zx&(cc%XfZg>xB9s0jN{K2Ut0vj87(+0Ug{xwxQya9qK-)T%i#hkZ~t}rk>J34w)>?
z&!IQ&ryXMmA{riswGiZWsumD``H2Q>&|Zf+w*%$ik0X-Zwtt=7JIGwXw(h}G at lUv!
z2QuOY<KLcw6kX$J14=dmRxGlRq_&>x6w+2cvXKh>>Lr^%EuJm-9rJS-hjlWZKPYx&
zSxcK$B!OBEQ^6gAoRzfwt at foQABPo^**je{h at 4c4Dv|+_e=VwNt at rK_K4gIe&K*Sa
z$-3Yl=$@ti=Oyp-5-$4;Oe at 2zPc4;N5re#Q at IoD*XHBj6_bI4aj1;0)yFH at Chj0tR
z`a_9wlErjfg9mrO3e at neb!^65=;|3)cZ4AEaeB({hoo;8K0w<Q#+z!g0rfJZxKc7#
z5!+5(o$?uCe$f-_8%6#F1qA}4rbjYoby|`SSv&9Es at bBk*QK~?-)O!23son-e6q}W
zGerNy@{dMmYHnwhsKQ2VMG0{);ile#jnQhM5k$wg#pcoE=A=(kaek4q8c`bk523~w
z0?wUbJwg4k<k7Y)og at Q3Y|f)SE6Ef=$tgUBkI`u{(ep>ODN8!-bvga#@SXguq|i{t
zSVdhRwb3srF*_4YLI7HAlR#_n!M1P8vYF!QB_3$ju)4Pwsuk&?^LV<hW`IQJx+^>h
zRDp$q^p!vcH6vHwX8w=y1&CvNk9+R$P=qgp1~?I~8vj|fbcUSRYEuR?Y-lLn&q1on
ze`wZK-)qS%RT*dzvy|Y at 9duEa#(;i`^K|t)8(6#{yVL9<1JK-*$8(U28s{%--WEK=
z$l?g6Kjm$<c}woc+jIq(l{=dR6!tEU{AYZyBqmSb at HBo@rDVR(k6#Mm1!%D#w_RCq
zg8F0gAOHGZ%0fw@<|<(KXm%sLiz8+=?hF{J-I>X6 at RJYaKj*i#nah`a6 at iJg6Z@
zF_%#1>hBvaCiRGZlykgI95#7Cx;et2 at 3SQUm_JXYJcxNXWhsFm_XlPw%oYCq9bDs>
zA^T2H&Wc9f(E|i<-B>$u>R6*ZD at s!uq7i7&t=rkg1V#n9KqK_^+9Ae{h?^$3WftJz
zELT+z%5T~0;TgRGHCv2 at uA}v at auUh~&SFe#RJdgzXAGlTPrQAC(EcctPYe2fXz~F!
zE}XH=S2fXrW~!57q`Dg2e_b?vY~3iTc_-~w+k<>k`bk->u{=Xv5pK=fYqp(ty11bF
z+JWP#yNcCFBm-yEEY0?Jbvgwgdn<OA^VDcD*rEj>x03eH|1mvz7)n@?^mzHNYKMwf
zK8C>p^9Zw&+Lta+ewq<@n2DMGww>vx0VBQWbO=e2#sjiRwX`2+5u)62bkLTJ*a}D}
z&?7w)%^obi#w$L`$28x_^HIU>apC+#iyGwH21Ke at e4ae%4a<G}p;9pTt5Ddx at 0|s-
zHi{?&4ce95<w3_L;oCgHFp|9WNTjOSreI%=9-gD_4GLOi{2Vj2_El)5T=xvhO9L^U
zp<xke+T%ApE(ZS`rlKVu%Ez+1n;-cDf~!7<+I`X&W at T%KH6`O at XPvNrYbZ7Mdp-%o
zA?x1{>){nuFvpWFt8^rYE#0q`$ex+qtis4|*`??HI~9N9|8qsTz`{l^^ecyoEyI;1
zd+kxoMXBZKroDKf+_)h>&c~HzTCgGp7rb35R2<tZrrCpvsgVGk^gUzFq0h)UT%?~-
zy7ki&>ZgWEp1xgDjRlhAol}2ypjsdE|D=aQwlG1bCk at Q&qwcxz%BTDp3ed{*N{`Vo
zirq<8<oe^buPLMvu7~u|O<d%a!XOs at Z(}X9oA0qoy at 2Qfvr11nu+oc?{S<UVQ;Yg<
zxRLFH<po<_YorTBv)_EnN^O6QgVS8WNh;0}wGbG}OGTTTI3ttYsMBIoik*F9>i>xa
z;2nZZ>ghtwc5jK&^FH at ISnRE>e~t0|bQXy;V(WaQe*Er%^GCx~Jg=Vh$-1Xrq<oW&
z|0?9SxneF*FW~opq0VtlEW>%^^nAn3(hMq7j4P*A^9kji(amTsV*$V3>e;h=hUvIw
zYqcs0i?>LC`%kXtYlr#k2FR|vM!G%u>m_nZTHUs|DWTC18_V{8vP2&K_}`1M+$Xep
zZ(Gt0EukN1d{%4?l-;9CO8S9WRBbpOH%(nF*Z<=SwP2T0FjePQ6o}vJkbLd~)Fw-z
z`T^69%ElC+eB^slhoGRtUXsDg&2|B`^%F`A9?Kh_ukrYUWkRk#8J1ayEa$CffBi!b
zVgM-fXdwT?iaJ#Rt%{{<->qxi>3F$wEf}YM4qGcJZop*Z%KGi!52}VBQNIi7H{sIM
z)a=;UpwAs=SUncNr4o6&6(*fGJwM<5;|H?Dzv?qrJAihydRoO|Y;FBy+l9RG15R=A
z$-{l4Kd^<m2t}2avi4W`OzFG-1sA!rz=1*@Jhv~+l`1KgExw!oG*ceoLp5N6Z&!c)
zJ^f#Dk81G402~@W^shUaFJR?5vnCI9t~+JAas#sn{Dl8~CR_58;^Hje+6b?j+5^1{
z{ETaaK71AMm$+R0U3uUV3`p$x|8S|0803o<D@$L|-mbp_WGUZ?y5qcs5QKUy1YEtS
zN<E_~gCkJ2T|LYlm9CurL!w*OK!iu(E7d0;0x}{xIy&CyPHv0+WCTG+e?JD!`I at VK
z^B<jZM5IjPl$>CM_pgD!4jy3g^&irUuva-${O?g6+)Ys1h(`4%3RPUDF`F*#K)vAk
zQm;F1$?U?^KLfmF(bWwvGO_-_WXUsL0Av5A#vuUhbS5m-qk=FFq>i`xLOIYa1>xMi
zR3aVbyrKMTxJe`=M?1s!HCCO5{cVZ4*7;n5H%Du9k&%%GH=XwqTvTNqhcGtWmWWd+
zaUHn*ayz^4BOtGp$=8d^RF%HX=a}#%73gR;B3YpSYh^=KNL<_ at 66oIZgdkQNL>)Ms
zY`;i;2t8Ya;BYa5yg(jc-}}CJ>wC+yfeOY*=GLj5L8G3{0hEUOWhAHT9+kNJQxkIG
zIWQ9Fu7emD<k-~)5 at CD!s^}(3Yp?g&X&x at sa&?;M`}D1||4GU!e at MzgbNmc)(0u|*
zm_1uYQ3-pV|1&&xzwgC_wudXYSy=e8oEUY7D3}ahP28YJ{S?FC^%G=fwYo+PA5yZ$
zC!!uG{=&1hs$nnp#$&_{+|AL4m`g}GYfl5*7UJUYe%=Y`5`Vcp+f at N3W!Zg+sjmLM
zV<8SNGIAaX)N)}@dU(5)OhfT%xjj;hQ{TGZqZI7ShAS;CT~Q^VQ7L}U%N1DAerIw6
z6;JL1miwd;YO}XzXkvnT?|rJjx4*x#sqZ&&MgPuiv>CTI%KY{h-}v at Fe&m0xzW@?7
z^^b1|{?YKevQYU1rTkis3T2who8cC`r*{tn6DMVD>bs1I;kf-1TIIcYVzkh#>Vx}|
zMkF|GBCxu7jQI{^FijZ#$!-48oodwP7)sSBs0~ckxi}JXyoehh&cVfnwX8%3`U#=y
zMaXgm0j~|AZI*&z9`peJGE!Yc>NpIrUDN)yc#R^JlaC=73IaJ%hi$(|=(UEs-k<TM
zqqL!mixrcDsA?5mn*PtNCSV7;^rkNSsF__^{sUtjgr|T|pO=D#?Sm}>RB^<`QhP6h
z&@bUI{o_9a1UFZ^<=Q>VvOU+h;-q~gB;26zF0NMFoL14F&5MSbB_5~gOdt*7dyO+~
zXMZ$M(JfYz#^PF~dTk-PGws)Al_}gM>sy1isbX<|;3X8qJtO;OPq%D~R3{7XibB(}
zL1Ez?{(h4JeqZiBMRm|;wR>2q(ope&M6A-cTsT1 at f}b=oPt5S&2t+8f-R<H^DCX1H
z_vQrSzTF5c*x{~oPlyeYv+2W8zSg(5g1oq1P{zYVTfRVlsz_z{*);d)8hV5tec8tT
zMLOu{+6M!*J^J3ZWG0Jy3k-k}FJNAH!`9IJna(IJ2`)vCWX7W#zjYESPpfGT at 2vsy
zn&NvxKukgs)wOwQXlhE9$hU>D7aX<I*%^m-gBOcLm_HH?$Y7>5j<>hB)c$v(SR|mw
zLimxNzDS?h%K-dow#T4Q<>L1s20h`(=M$$b`dXcXgP3C0ITl60^8C0-FHo+<l=;)M
zt6n?Ub&P(G+kQP&QBNZH9^`THWLC0Z^N<uo|2d{&TDRBHa2aK>M+_#ap~4n8lz*Y+
zmFzg0JoT2!;LE6*i*Cfi$B4I3=-4wVMK<E>Y{E at -eYUP&*LYXCsCd~HOa3h}!V+wn
zA$$gUuFl)rTrB6NEbIQU<(FD)qrp*idR5Iw!$UvH<{q0;CM~)WmM?4B!Pnm$bI<Gc
z#b-VGO4ne)?l+?2gp)cP6`$Sgcx&2?f%vUSx^zz5UaliHa)AH=bt}tHqqs3z7ZDBF
z<sR7-Du%bU=neeKKYEHVVk1`K&oe&4BJQxP4%4HE%Dx?-Mfny at W+^ySe`jZf8nOJ|
z9ko)=W=qyrIkeZukym-ru*{+wx@)|?XhtQkr1569DzHdVRFmz{JpzhkKe5qVFut%G
zXlgORGxBC>Q at U?LcLK4q6t$)d^c)<Ayox`|d+a;_k=B98QgTb(l4Lr+jMrWs00oeR
zZj0hW1_HKd4wBDsh}z4G9_5t-RmKmuCRd$@H8|IpQLS?tS1<I)@VW5<xnV#^igfF&
zwHjCm at _4v@Gxj*@bv#5s?;|G6)0H9~V#pO+G^2jFZ^k32K#^-IVi5<4yyoJaLs2~h
zFKs2pXOrOc%^P|F#{1UL-&3&<8-&D}=zcYzbm?n?+MGYkK%cFUtaz+DiOhI=GocSA
z$;3U7sw6tnXz`<>h3M#gAT&(n`=$~6p+_Yu6dXyn?1%fs4V2RV>@)DCrA6LiayVlL
zhhomKRbq5!$DtGq|BxcUlga5oX&IiLOq4AnVvj{f=Y9+vDjatP)0c=KFnFcaGE?k!
z=Kklt#$(VE3h%8^mw7<TA+FK<?L;um at MfaEc)twBPZip<8kBMvKj>BEh>&IZI75b)
zG(UkHuOJjE%k}9%kAzL(fco<YO+2x&KsDp*FT&xMZ;KnB)fuls<+-1HG+=89dg4aH
zHY^ExW?;~vhX3Z9Lo4i21QgHS-OaJ{;0M1pLrv+&fQ7aU#_u0^kkf*za3WfLK at B|B
z81m&<f~j3 at 9DzE3)b5G(dxHAu at P}xsnj<3INXnYm!XVYMf8f5l99Nq?L%6j4s@=|Q
zDJ~Ja`Qj*-k-_I}c?5>L{}*j<9TZ33go_SNaDqD_K!Qt<;10pv9TEucZkqtXB_udO
zgR at 9ran~dS2)4lD0fJj_KSSR4JLfxf&L6jK-MckK?H02$vpqfC{XE^j?(lD>vSUJD
z+f_}t!=nan0^@RreW8sBn1I}YAt`_W$G$&z3=)AEJOtpBG5$HP2%}#Sj`hp6-BvIY
zDNErMRku;~oPa+v79%fA8#FUv?m35*N`SBOFiFs9-aPr<oKKIHdAQXU{$L~dY(BIp
zKUg=^Sf2a5`)kwjhy%uZPttPm<aI5sZc1T+uy!hil*3=qj8e_Q(UMwdxeTjkk3S=~
zAF?HWW;>w7)jMpIdF%P=A;n}uc~Tf#0qvovJ^HA|u?9&Q1K`*lD-rhkXF_@&-V39W
z-!%4bCRQO5lyXm(`d%v#F_xkr0hnSk9~hUn8V!h^mxQ}8 at L?}|*P<$J$zyhw?=fr7
zJ|pj7l}f7YE=JY}YGhS>y%nt2_MTE5T%B0|#HdA#|MCgZ!{n4M2-&>q!;DHXd3til
z;=aPu9#$!^uhTt)PuZJ_3OT&Vsu`>jdYv&*G(Ozs7bT%f(h{Hv`eE|CMYBLUFqArI
zyp3qx4BV`<tQ|nSqxpSum=YKa?m*w%fUSE&#I^XtuF4M;)ZmgTrVY0?IWt|t=>?u_
zxuHVUOh{mY33Hq$bHvrX<K;KsR)>awF%_5JZbzB8x>>*o=&nz_k^4vJuFo-7 at b^~e
zQ|0U>Lib@)JC1CxkaFAmEo~&iCxYRP3vRRb#*+%*v{D>&FjHx^Xrc-;S~pQ`!sJAd
z9l*ar#8*a5$=Fv~ipbKXAA1C>dJ($ol=vEF7(xnNP|^b*E+R~;=N5U9pSHPg{TWZ&
zY%-~yPUSfq1T822v_R!CMZ#W-1;w;%zYf&b&3$U(T at NY*TaF~^MF=a_^l>{up5~*H
zQIv9@%fUatf9^ah+KZugJBf+$JrRd1 at BM1jAq8k}j`;PrqSl3tfY+PJkL<r_oy)fj
zLjqkRYZ at ViSW>TdZ$)E8_jJf(_KQeeEx+qjrX{2!cm5g?U%mojg5<D6V7F;ec^QT2
zat1rj20NUABB^7+Mz^1)&Hi**nfJDs?C$q#M%mYu7bR9n;)-)tW)1p|GAK3*5b?dO
zW@|8~@iS`11TvR-_BLf=7`v9Ex<w{%O6 at THNi(vx-!Ynon@`Rn;w<vQ84?{S6wo1C
zIbn>7uiF_|cbaoZ%t|A?I2vpZcD$7ps|`P`dq2x?4p9B{iyyf&V^>J$?j<*ZJ at 2Bv
zc#91L1ZpUMW5Q|R;3~;$%hN|*KKA6o^8<o-kxr%M;P!Nz??<NkIm&FmP|fzPvQEZr
z`MBUx<SxnWxG?_fJa{DOwa}r`tlPPTL=@;YS<6)T)Zc?EYUQd*aeG{w<`6j;hi(C6
zj~_2uo6U;po6{Z8e<<^XdaCgwKM%rK_1AXFX-j9D?PbhRAv=kgUE{5cNeZx;l!)`X
z0mH(B(;;JP!R3|uD7Aq_LBMl4FR6PrRUDM5D9-Qg>~ckXKvkPou5UsZYgB#>Ah`If
z*R<X(s4arIrd(C?HvSPAd(d`~q&hebh^WgDvva4>7`v48(4vg7<XM9P_J(kl_+dp0
zq}lHWKw#)OYr0{;E9ToLxl^EbaYFIc)@{EXo3w>C8tH*t&R#P_gw6cRLb{%&0BzXA
zc*~_q>=bc|Sw9bv_}dHSRWE}}_~FkcAjVX_mpYe*831jI3)$D#Z&EM;j|lP@=Q+bD
z3&r>)C>Ju5U3QsSn*{!>dZD$OojqYnp4X4c9V>4;vRV&1x4fr-i2|l1^Yw$&T}~5T
zWC<wp!Ja~^ww3Rbh(qUb(L2GIZEv#nPcfGECfNDqb&m_gW at q{Ag9YR5heuIMn+O_7
zu)9DvyG3wko1Jz$ixZTxHK!4i){Gd#RX-rG%aBKfa2(j*u{=D9WN9vF{|vSnCcU8u
z3};IUOL;`tnfxyFmn}zPhBK9R!aB84W at UV;ZneLvwoBCzsw?@zEJtGHTz{?p$idFc
zGtmIiFlG**Vk-Oc=0h*ReO-$%%3p(IiQH-Lj<6y9ZC3{=u^KO4rX79+#}gTwjQ4Nr
zX}x_p>zmZRkn(<SpBf;If7M#@1wHq|M3n at kbF8{T2^{cp!AC2sA4{;4mjn(>FsN0n
zf<LRA+?GC at BjubiB{x8Hy}Cl)YkhB7!xahqbjG7o-5o_P7s<5KEPP%UzB`mKfCJ#W
z7LSButBp51>Y_+`bW|>xj$XP-TAdLIAD=9tzof3(DDO7%^bsttMDm>;(XZHScoSAX
zY#AZ)Hb92cq=XFkzFmEM;TrTcJZ6}lcEM*Q$%7`fyaLI<js3LQEpN(62bZ>9V*5n9
z4{)_1B)vlB#AUZ1c*|otBT6dQ;hg at qSh~Y}!)ryl3Y%<?6n?4g(|5c$!<TsQEgVuM
zEfTvWf8$pcC>Sqqyk7OH4lJvQu+d*aIryRDRD3jqlV^xMSs6b}V~JHAwl}JX;}yey
zmr)r7LvNE|+FmjJ#J9IjWB-nEp3}&-nlB7nlyp2Qvr0E(fvS^V@$Ce!X9*0e at 5Gp1
zap<+3-Dteci{C)CT7dl-{@;6aUqwUN>xR;af9nP9t_oDzoX1#sH69*CIRids6UdP!
zSU!8vtj)V%lu<?soYL?D6EC|jZOE-2Clscm8K4Usz&YT)SEs6Djc}+L8T!Y%G(<U6
zz1Y#Y)5^S4%yzRah7I6Cm^K!!B5|Z$cn4CXv|FP>E}nDhry-j_kzEC{`gT^|o_i$E
z<o`+1V-jrli2VeKxqAL^u8%2Tc^?c3P9(Wd#2CS~OLnYQj=@&J3$dC=jd;q7=qV{L
zA9rTpzEcLL&RHLthPQ4%z41#69-GWYZpDl-eU}s)wYecf^=c9-x6e<QnNVTH;tly}
zLqHZ=HY!X4VJ=*ZD=5?HvnfLF<y)G4_G}}O(NnZiL#X&2_so1gG(^8+K?@(qG^+e%
zbmk<QeMDt#gzAikns4U$;^Aku0{PD0P4gytPy-#L66kJmM8wMNSXs;GG<T8JKFi4r
zWRnK5{(!QR|4q=yog)O=E_65ND7So0NqGUg?$$20M`1=Uj?d0~@PHEwxp`u3j>RH}
zoN`5M0NYX(i{^BUe-w|kvPDlGdu`9 at cU&h&Xg9HWO-&>w;KJg^s3-gUe8_~-9&Gd}
z(Pr?buRT`R`uk at Axual$GQyuUk`*1rsx+JraM)PD77CeGTh61ui7qP}m6G{^Bexp7
zg--d&E2#ar>h`e?+S;43S;Yo7=t^+AT;}IhtA63&RGVJT&QxW%sLnz~=U7WT<V&Tl
zX|#9^jw8c|1gboQX1|qNKs-DrV)F^GmI+DgRy{I^J%<k>Z*DmNHg4tJoYVPlt38M0
zm!KX<q%G>RCZEGLTikSRzm+F`W){WMyV`$CKt1GN0*}?#RbEeOoM+7Y#-qQB7OtP7
zf+R4G@(l;Fku_b~V6EjyPMX%rT1FUm76qto`Qng3*1cn<Hy%?EYo`vfQYFwfCOaV~
z9p at Ti1KY6T)l#<O{}z3!3KDaE&wcdFDLSWOEpq-~3g&hE5!CB3Z>0A17;D`HxwFLS
zJpHQg(P875;no|~F*NE8)^?6h<RS^Rym`t$Cyoke`(AmXT{2_#y)mYo56Va0GBrYl
z%>O}xh)OTB^K$E|2VF9HYkTc6ph%9gV!C|8SR?UA>~*KS0V9u?>gga~DwSW*02yr9
z at e)hIt}EqirifL>jtNelE9LvZi at M>T(It`FuEhZLQr{e&o;8LBQpqNxGj7^clt^@U
z<(JuS>?tX|l-^{vKS&@7cY(@2ie^DgS|z|l&tzVL6|~DlDNyY!G%{l$HR=_iVnNB>
zc7mMX-i4Kcu9bn7l>tJ9%!xp&NdkXS-3z7D#1D8nY at hjkn(R=(urYgW4_z<RZB&nm
z)7u?yKkco9RB$b8zpoK~kzfsF?DFW3GR#_-MGf3%W#ih)$WdFcRkH@$_2;_WSH7>Y
zc1^z}Ify!IDe$Eg4;P6ZEn4#_K5RCpsYkA+ at F4k)cLHdv#v+O+wPFl>xG%AWlEQ2T
zp1lN6ZJJ at 5jf&PE65<CK*kjw>iCruh_O92!IS~W^+;JrD667KY2|wZ9Q+oFugEp_g
z8ox_7OAC_PmW#{vZnxI)Q1YXi^mq0MLw%ib=+gUqeL{VM)L}CNL6^-<_nD?`4+bHV
z3`6$HAIj021u1#B$0x}uZTtu>@8o$iL$2oEYZOkO#GzJ0Ca^QBG3fjg{8zQz&scfB
z)&$N7yQc1igjMK|*iBj$j<_oiKdNoYLleKGIr8;2uP|-MD4&pE^Cc7?X3h1RYuV-u
z-a8!nqAK}aVi7UI0SEY0-^0CMwSPv7A at q|8E9tL^F03P^PSMk|Cka6L-u1pe-vD1j
zhZnx3?!q3&)YM)3mB*Us{Z=OABL+lH8!|MK1n>WKL!(2xVntbX?T*$bqJ{Dzcuat7
zhRbgexv~R?s>=ns-|tq^rN8l-7uxcKpCsJFUUH|>nD0h^b`9QYX6`ZY^et;HbLfG8
z>w&*AUIN*hk}@=i{!)43%YX=@=;BG{byvA0dauZ#fwxu8Wb;Sg6H7`mo0z5S-P62R
zRjrPdE=IniG~gh&V>zApFXO*jf)W5*+7Jg=vECi=eO52O7R-B<NHxwozvNY at qI;Cz
zGx(C%wPoIRKDI-4h8gqHE%JMl|AZ&rYzxcRE at Fl!jd`#PH5oi+kRaOXAP1B}RXnEk
zUAF#^UBt at rVl$<MwPuR-BSOqK7_&t}AiML=>^l_umVR=wYT?5QPV|4Tc2KeAcLCRL
z==0NMg0<|?^DGF0JLsgezk%Sw{9-ih+ZV5k_|dV?jkfgXOd{3}ytIVede4pUD1PWV
zsVCop2}xmxd%qXPK6noHjTvsHkX=X6g<K;Uri_5^|Gwn@(oQPOq2b|ZJ3BkBtlXmy
zv~@{DL_|PB-=dJ?o+u{_^19zEQH2 at BFlE`hW!b&S_h89QI%0PB9s3~8-Cv%4qa38M
z|GoqN{GYjme`}B!ga`iR|L%|b$r`-8|9oed=U;aE{<_xxyJNk_KOO6l{wJMQ77=31
zjMcG-5waAye}y~>p%c%c%ll#O-qPG&e at gHvT$UZp at 7V*UEIDR#ciz-c>R6ct)kjIU
zfy}#)85rz6|DKgHi!v}gp7}x2XFAoit8*;XB-8<uuh&XHJYOVMilc*%EOpV at i$q3@
ze6RhK-q$fY$L+t_ at O-5iM33XmINEKFbbp*DAp)MIZ8~$>uYdODeC~k at axfF+ZF(np
zGD$xJ1Mo(gGwBuemqxh?BoxM-!ZeJ>M0Dn|i%4VJu_m0<`vr~01XVX^&m`p@$_#0J
z6S{fbZ}P?8m{p|n6A~G__l;}8$|mPS#LPXYx)i4jk*JtVWh-)Mc0Jq^PC2eG1c@*o
zl1~lOrj1PNtaSt7%4dSPAJL@;`~}E3 at xJ+zvEd~y46%2E at d>u}B8M1<b4Q^Insz3J
z-2NbHgGEitPo7lPcH10mvSJ1jW1Vt|XI(>I#CgmzW0sOe6%>4LK`<dhC3j}*-;5Iz
zM4{YYIJU9p)x}$9c-%ahI#_*7il96U3hUeJhGdn`!ygYWkFHuB!kByd4f{A!=al79
zJGaKy{s_EQXiyJn#2QJ#)29w0ZNVnXTITYtH(D%2!8uM|+|Pej5yX5lKm}%B4F6`J
zCcg5TnY?Fwp|3#rq72XpyABSUc<L;um?%su!{1gfm*l!@NT6{85(kaETT<x21Wtb5
z)2%5W8mK4 at Kp%ZcjI>BituO0Kj=c1L<0k&~$ft5hjE6r)aTJ at 8UC;sP#(8$Bq-H|o
z110R6RtjKLs1A&M9G>N)WzT~38#39Kc9|eN<zB&mM0sp&Q-T8C>ABR>8QQ~ko5OYu
zpsK&6PpnN*HWcX`1qrn^VU!(&wwqGi1dv6#-q9FLIc_&g_y3KA!DhB0jh4>sG0HFu
zE7X6N^}|wxybB77+?#Gy6j&vUS|ga5?~`l6o|<=)O)_Ns6MkyY??a%tPCqDRQV-HN
z%-*X{*n;b+KMrv>N612SFrCL67ucjzT~wvAn{NJ#5^8S7#FK0M$kJpBvP}LVe<@rt
zZjv7i4+j~D!EIbRHw#lWffB&OiKMq at t%%5G+4TcmB}Z_+y_Ah1rf at Bwyx;uV!54#U
zhtnh at YQklk@RfjEwXedr=+jmAX?Rt#`Y);$?9?22S-SPUX-%Y;R`(XL-p9IeVY at s0
zkp819mOFQp#-2x<?V!v9=DeMv8oo0m5J1qfupHJJ++t@#PkmTEfaIM at ev5u9^F56>
z>=0xc(t2+s`2X4k+#iDeXi1*B*rTkUTCB2ShJ~<n?J4k$7$4|6cL>XF*n(Z!e$Udb
zJSlS_PMQeQ*X;a<K)Bq${MO|BVodj3m*cr7 at dAb}Dp>m}Oa1xs2`svs4ZOMYBX9ea
zZ$2<IQU#r0&1-=SLOIMRah>OKAc9o!ZBMOkt=Ox5ZL!xWjB}@H_KYyellrr-uR at sD
z-b|h*;geo5EUdLN0_=X~mqeV?rW*nn2J*U at LMALuBeru?1j&X9`nQf-ztP#f8wk-i
zkw(Ll=&R~(9xP%Q?64U at 9*}qCkrt737joePsjRvpw9kMEwlPkLxb(f{w_uR#W7nn%
z22}GT(m&A*E(H?5JvoHVqYd706olB<pF}?V1F|M;VwnQ+oa#Ykhe3n-(B_I$$L82m
z>V1_4@!Q(TTTb18xYxFAhhQrp&(pugm%my_f#~yZ=_L>m(8+)davj8}NCw1E&S97y
zG8|T0_R4~yT|MwhJEWz=sq?6``~Y034W!((jLZk^-6V?AgNY3UDd{MDj66mUyN878
z1WakTN{g_&ELGZ^x=e1GzW>5oc=SRGyVb~_ at FcRdtw7m>f3^SvQkBn|`;L1-v&5b6
zC2QDQ1wGmq8+l)6j~}2zzUI&FNe^f>ALK{prRd46U84et^K_t*I^g!rVw4RK&^}q(
z`AkLHf<OD)8_!Yt6dGfzmNDDG*{^v{#5rr)__8^^xdr5Nk!rgz+rh6vMN9)ntT7<}
zO+%FG?gc5LS>%+o<FJnLg#V`&0PJ<)<AAi3PYMR|^LyP59y}^>AfLt^ksDKeT$yYA
z6-{}udDPZx)?er1vu60k&;*_|6Wxh%+n76;1_@`23$+h2yP1j3vF^f@>DZaE4 at tF$
z!4`Z$Uvo)$A38AD8zB4xISNQnB<WEVKA at JaPylq5FCGfpAj?%9+(TdEp1rM&xx8XP
zS)V#Bi at J~BNvw0WN*0#wv!Qg@?5qEzkLyNJj9od!bkIbV+?Sp8CZkG>t;M5XkP{)a
zS3aw>f(Ld_oiF%6zD2rCBw(8P#;92Al>>&7zNWy+`A1|)kEibLNVx`7RV7JPN`OJL
zv-w#x%O|0SPQr(Yu at No;Kl4n_QryG{mCS-aAQKEQwP4d2B{uMBe`%kahvpx=2(zYp
zkHqaYWg>Q7h?I++VkXFW+zdN8ZFj|Tt-_x7Fm8P5V`*WBk-CfBcqA_%Zcg~JnL88x
zp?K5N3f{A>zHjqA4JXh4*ok^>Z7*>w<!N1KmG33=HwP_>;-+4UXf};Fh#4Px=wJZ}
zM~<)#Ww3pW%l*?Ig!`|`j<GbnT2}z^JxyA=+iMah60^@BeC1%>j~2u&WsJ%rtx4~n
zjK}j_q>Xr@(b(csf|j%@Nxvl*0dm~DtOBH(Hz4da39xBzHz=<5djYmBq^r!3Zg30v
zR<$&c=3b8Br^=!42E7uX9l4P6)hrhCM_a13zyw`*UygFi?|mJlw1gG+aF$LOE70(Y
zus87PccXR|46AWLF3=-{WU5%;(7AzNwWLLgaPM5}>*o)Rlk0C^y+Gx%+A6_eq97VK
zj}Xw<$g8M{H)iyK_^79<I&1}95HI;8^R`=~LmK=|$u-7&Jr`e9=$AM;ljnV$eql|b
zT!RuO5ZY)_Hby-8p31je*D^yQBE#thIo%aZcSW;&S1z0ywmsCCW&b>z%Hcn(6lAtN
z^F6zO9S|L^y;pVU{bPUZ^|xeTqBAy*{cW<t*+l2dyy#sen35Fm;+OY_Fy;Z1Pa-Mm
z_b61c#wTLBqQH6#pFZ at E^nuoZ%5vYR?Q34$Wk2TzNszKn#fkpjH}<{X8r8W_8=^`E
z<}dU4K|KEl6``$$&xkdSyC_U%QFE2Mw2IvMqiEXDOOi)dYt70ESF-Su5~980%rkjv
zQ2S`G7|4XC?6ulwP?k4HpwRy^=ECZnsK)%Dv=|V?5~p-ySZ at 9Uj|5;<DE&f&w8X)b
z&>M|;*q*K|gS&-fp%<17!W4acDeRzJb(;3#U6lYMBzi!ye6FRz(64zPx-iE7h%MY6
zmZRz;jAXI4pLCm{v`qr1bOB>abL at W{%20ws5^8BF)k4WM+VhPghL_hVP*s!^kQ)(D
zy&FP3aO at A&&|<W{hj{4%t0k3zh{|+YAo_($-%5OUMo?F}gVl|gI;NzKvHm{mH7g_$
zb5WS~3JDn1kIz5Bmdi|_0_>@BK9)?<J_aTh$i@&JL!#lAs3?+yH>wrr*1mkTtZx}O
z0tu28#ariNt#zX;6{9TqO(ep27s&3>GfL_XCrCWiEwTNJpuuo2&zkd{#`CyHJ2H#M
z^xx!Mn;eVh3&f1q>|3dwPnuob`s<`#I8K#397myWJFV4|YKUx5Z2Pi<QXdznlvyuY
z7p|fi(qHrWWX5~+9aZv`wt2u_HkVD7F+wFKTGQ!Stjl8H+g1uLas8DGmy_n79CTo+
zi+Gp;MOznfs-{_j0sP6F{6e4;Xk+JjMk0V;Is<=<#nO_dtM&DD&fRP=TX at _vca|T`
zk1-4TC<FbO7Eh8v0%{pCQdAB at UmDH1ck>U`9uvps^>CIc{3RVuOd;h7f?xu?>Yr7D
z=*8&fc?I8E%}lj5mzdydZ0X%)yU31a>y=H`#8M<L(1Q+q+YVA_+v#;)a{CqP0n=Ko
zEQ;=U`iyO3oT2G^zw^D-E_>N*D-{znsGsg!W%k}@KJA<Ys%DGt;UR0?<cb`9nZ48k
z$vJD0{^ab3`z)%F%J%Im?oza{epuZpPS7%EXP?6!$I|6sHDP_!&(Dp~N;>9id5-<D
zkio!vz?@<87cfV#Z${Q+XI>DD8?)_xzU=b6efr1uxegPc5^Wl_PvXRxf6{l8i at A0A
zqlG*|j=(RZ#R at Hzx1mhcSgi9?p8bekxx|pjaYp=t7a`WBR7u-;tv_fpm!B`_o>Qj?
z5N+(UrF%Qg*%Bt?KqKjEr90-5Jl28|ai}bJijADa@(YUxUrjZO7weANbroOC^<7aF
z9q0x+7h1~)8(z&QUFH9xgpg!I{mqN>;MbhVRZe!dJLL%tpRA9cg3<QoKZQhq&fln2
zO7>Yq1&Y=)Of;}K;Rcgb34IWpK9rEM<$y~o$44$nPr$9qLTi3uLsP_E<%!$Xkt-IG
z9{uJc>8Y;aUA&sY4En=M9 at pd2Sz9^P_3F0Fx6~?+wCYdIX+g>d4E}bf-MmA^h1T<`
zK)@IOcM0A-0t7EZ=)Xsh-PfQ^NaEq)RoB*r#>L at 2jqYB-NdVt~*mP-W>8XhHziVq~
zX#Qq#TwNje|J>VSpp5%-juk&YZwmI_=0*j5F8Im^nQ9QSgWu)8zQRfX{|O at 8)PF~z
z35)&Zg!}vZ(<4kpS?Q>#sBFbV|3RaF@#_RVv7FFRZj8d3jONE$TH3#O`QOSo0vw=Y
z;Xl1w2|qFaL)$D(1^jjQ_op8JTh+x4T>Iny2iJOL+{0*0bcp#rNF}tR|F3G2+k<t?
z$Q|aI=5*PoKD~m!-4jFIzP7N)j^(HqI{iH_0RG%}U0^Yl7&$OD^Bsg*4D8<e%V{`M
zLOzf;;`)apan at id!ms)CB~o^8GU4A^{qtZ6gT7x5_Ix`vZ`aTtk084DB^Njtjn7uW
zQiXyIFJ<*qFq>e_LfX}bb=JbP-Wz}s9TL2Gi~g}SI4(J<zQV%(NU}wSR{H~X(UG(0
z#PBNtL8ZO*{*zR~5`+jzgNeJD{3>~l8T7XGb__peK5oWf`DDxar|)UlpPF;AwwT6R
z2J!OA)V`6Rd%&86kQ*D=SHHh6!vE0mspt^ncDdGohS=Q$OEbE6t*w}TB7r}Sp7=Np
z4*H%27u-7Z%o+rrRjOq!S{g3c058^+Y_!89eLk`Sl0$3NG$JJdoDbEc7F4A)-`*R?
z6;;%~<O?4!0=78xdU^S0(P6C$JDN~h_o*|^RDfwCH<-y%lfq*r{2m0CE=5y8tBvga
zg4qXdcp9 at v=;*Rv1xVm*n_3`n0i*B8hD}k18fu1?7VzlH%_8wHcw=PE0$g&iQx0kF
z)A{ZM_bIC^!qS<s9}MhmysIzq{ul5<mJF^%2F0R~$#9<G#TnVj6Opw3Vi_zE0841d
zHSi!{Vi&~j*L)0 at Ok9X!J^woY9P_walRMME;KkNhs;ZE`^#ILsR6U9+LlxatKFbR>
z?Hf%Ep at egk?p;=AQo|^nhgTo&RdyKt{&6^DLb70IUojV;aulGtU7VG?nHumu{4j(*
zyZXImIA^uyj|-J!eaK_-m`UfOJqG7#$261c0{hHQ;1 at o`L{2t=<-eCAieI-GRzD1`
zSHXpCzxKI)+w0~i<om1~1E^syn=vXcrVV@&C*xEjnQGhYni+e~+K;7co0`+FGUWzl
zdiz`I7T}Su%L6rz7vAK12llrik#RnkBUv5$fy~|(j at 28skHUUR^40IK9a~NN>L{P9
zvg&2rx^J<MshQ5ue3FN}2#92a^)~bk{X!^%ezH9V$Gt35L0MfS#h<!7{so4adB(%Z
zVuE8iu2Lel&*ekz4Z`RQXv-$(K^S)3bM)8|Ok!_ek+gUrSNn>_&SVPA1zxvX8R+d_
zE7H^$;EaCqV(&0lV5F_OK*;){2|5W}@5Jc%6`5WKDmj5lX3Ls0!MbL0Zex#;cl~H&
z)4j-IP<DPE)Cb6n1uA&U&f%Xp{jBXY7&mn7eDoL$k{<hR$4Dx|jp_d8U3Kjr0ktd6
z9DoTs7BDzlhT)e30AGxCw#0CvBS at sCg{1-BW%Wi!pXD)?3WC5ClkIp?tgU54%&IMY
zPG8%VRffxpfHmVb;lJoY-7478FC?S*d|?)i*C>|_S+Wh;brjS1 at t3svK-;5SQ9zb-
z9(>?aRB~2$F8 at mz+~xpo(yK7r#TkpMb?mR$AF5{@eG7>rUM_bs+}>1$yneK-Dtft3
zb-iAMD at a$xK$|cn>Vh|JRYU&qLUFE92xs4UdA)@$xMzs!u9NM8$f|{on_m<{Wkm0{
z^4sTps3qKh{hjL)2m0-y3w!Xv(&Alp*J*-XMccLDW&Z*_al&KDo3Ot0kQF*X=g9iG
z#;9c$eDOZ37xIe*BQ`xlqYtjP=>+Q>@R!KW6gU8!WwP;Sas`@>e&$Q&f+r5R7WNAv
z6|RX$^q-mnDe*sDX1HMcmaO9W;FVAU(JY_;qLBt)%4!WZz_V*?yFc8lK at +M6KEwW|
z8`-nnAb>$p7HM=e at BAeArNp(I2uP_koNCj;Y)Y|Ff={=!Fl9f6nwPtu7|&e#pC(I-
z at ZG}^BYzN%gjn)hgaaC85rrcW+hAhU6aDa at ohmhJyV2we`qD|UF?kws&SCf=P07=$
zK=!cABBgfg<0tpN>>v96S0j=|;A}XR0G0gR8OGQ*e!`@iIup#@Zo0b7F2REym#V{G
zsTlGwi^Ub)-U6 at TOx7b%=-nL>;X^h((=DpKRy^Rwetm`RSkLn`irXysNhQDd338RW
zO5TV~=#T(%2xGiD8#rTEZWedWk1yd&VliyD-#YA<+f%N0eL)I2ODA_`OA-6BzGve~
zm{DH?uC)X9hen_H-dvK+H9fi&uWdHQ1ac}K(I!~$_qhBL7gRVLbm_1-F7kzX6#gN$
zLWdmtBtD2Z1lxca4D4yFv%Zrw^gL^Jy{E9|kQT&D;qYJ2%xm<3*V!rl<QR>U+ue|)
z{(>t`>v^eH9xED1xn?!>95IqRvx4Cl-<6+%1jehU-^klxF>&$?K%)9DV-Q{{8+zC-
z>4B+YTPzYt?J~Q~6SCeMHjdELkzaZBqe=~2#>;3C`=NiZI>AZ<f$BO&Dx^I}ZWB_#
zjNCwKU{#p*B1s+-teyJ3(r99db)fm*hR`hw)cu&Qvu&U1nf9ItUo5a at JUfc2dPaUZ
zp_eeGulm*<RUi{rd%x#Jp%%Dda)`+NJbej0y+{JMDdQO4WB!s5bgZ7g-~u%^a)2Zj
zA$yP#dG0!3)3dS7v10UQ at zSDpzE|sMyx8Ih!^f+2?VZ=_64&lT^;8{8+6<4f3-<+k
z&(7W}6(+`WuDlz1H?Z&XKDK?}ZpN{Z=XSW!TbLDDeYV4lA?y4l767CF(~tTV0XseO
zIb1Emt#7wI_v~er1n+|G%sj8a+vgKaSdS7Z at qS4cn%WJGE2uvLS_ at a-8xU%%b=(7@
z6m&>3oQ>UiV4|_*X~lSGH4Y at wWuEx;nwv`}NELnRE=+1^%+*CB6;lxBgfCD{mwd^r
zd3~1({h$vv1h|O|JDp2;qx$lXoAs9aCb32B7{FcIWH{X`>l1r>A4vV1`JjFR#Db!j
zCz$jklDLb_3Av at fuTyHE6Pt}3Sn<8{pmVGjIT+9eKY-f{rt9-!QUvry>nhL>Nb9_e
z*|(@Yv1FoFI6gDCterVnl%$T5MgF!*d%fUyef=6|@x*T2#VN at 5j>QrcqV4cY_|UiY
zDWJmm at La~QZ_u31x;HJ!v1es6kq{6!jG?C`Tee|%-}xuRxzl^)fwwA>1;gQkj^i1N
zmeH8~_U#^t+e7 at ovw0tc&XU4(W$gkz=-D#DKAQeuWqDagW3ni2O1S-d%|7Ru4kn<V
z!`WkX2XT6AFjf?f=agQAG-ZZzkj?c at m+2i7)4ReU&rh2*43gU^_#iKfW&0i}aa6hy
z3=Qgg>>OS8B57jQtuVvKBh$R0{D}84OJD5Pt;8^iY$Y5>-o^N4qSnugJAL at b4#}z?
zUc_2$W%)YMJpkrEyTSY?#00B$4^!H%rrz?kHfqt7zFHpg&-Qp!hzfhm3re{h{qBvN
zKjl&173dbwKlpAh{6v-&>l6+CZ=V-W1W;<*pYR|32)W&(=stWdem#bf=|ru>pow{C
zwJkrnun!y7F9C1e%8Q%jcc6(WSfgLfap|_X!uKY6(7S?kU4oV<xF5UxZO8a}e^YGQ
z at y-?t2w27~B#7zzj at +4SC-(UYk0`<Ru;WgZ1P#(AKt+3X8tZlaV;{e`TOLSL*^2 at W
z?%D_NC9WY+Q4g*UdhlJ<RF at _0E^u$TL9t&M_&1xFl?sxT2Mp)#q8gXrh?F$8RPi<#
z at dh;xQ$l_h_|Oop<~iEGvH13A;0yT%TY9#=i36c>O=Jx``+^|vm7hp`syO+2stu{-
z=Cl2GY(+n#zjufhF_WoGd9ExMZAAR|Eq{p4_;n?Zl%SGXE+>7~{qXi33%6LjJveld
zRG-FvG7=@)tgtb55^FN0(1FgZ`Ht|*E&Jxm*?-&Z5- at rq?aw3xV<b&fEsD?McHs7s
zm%{f`TlI|d(!4kF?YfTzsJq8!uFE&uRx};$rTi5gC2sA~z|%57V!1(_%5f1yc2oj^
zXLAX at qVb8OFK%u9s<_e4`y}MhEM)NkmtQx<vf;o15x68Q)Tui(C<w9lBq0s?`jMj}
z^4Qr?fHpwh88(D&yvQ}Jya$TA<0L9h^C1GJRZ1+daEn1yyU;9x_YC-46_+t=86XJ8
zw$h9~=N=&}ZAlf~Zl#Q}*X45EEKgfl!s5pyF2Hm>->SvKS)RQ_<$D}a3?eVh(C795
z`JFW(82KCvFFsCIdX%S{r^@&+vZ at 0D>W7cSRU($3+c at ZIyfLa;>F5K%K?UvK20rkA
z7KiFcm^0n$(scHeAa)bd8J*Rot3f8-+}RQu96q(|cj>ar-{!kH%g+idhA8Pkmulz9
z`$QIn#o62XeT+opbD#{g9FE9;_Q`0!Ztov at s;Cgr2DLDi-Nv$XK0p=A4-y;*?#ozA
zSQAX>9qvj<NoXYkb?6>6fUx1d`y*wqCUU0%JNnv5nn8eiRPydbriycyUl021(7^fQ
z^xo`iquDt9oNST!kOcxHi!Z|$_DB})>e#Ed7sxpeA2_MDV=mnMv_)*5G4~JLmEK$s
z){9>|R$!EvD_rc;Z~!Wg8jrD^(-4RA;JO0|j+Z8LhJ6yCpn~s$MjiI9zr?=gwbNk&
zIVfI=fvZJ%Ri~Qe-y7@#3?PU74?sND1zUqo(8n7grM+N`{oXMq$wr$%HEy<Y_&n(w
z<LMbu<lgS1hf!4H;UB)eoIjfE{vylp23-7fa})HKabiC+R-vYWOpYPB`}S5m>F{~J
zrW;+`kiUUlaQsW&s5*F&ujm_a*Uuj`1F;5rD?5x at PKn%P#e<|pYg|MNZmAVlZt^*<
z9vrT}V6<#axi2cXe+8-DL(j+pJ#e(%hHlx<XF22M4%rM9`<(%4N4mxI4(mg2GJ+SC
zrb>_fkGxph8pga>Z(7HmZBKCq?P~Vi4>A7x@<jYS&dLt*HH_B3<eX_=B5EpY0)(^w
z0B1F#zpy+Tx%0^T{{a-1(<F$J9TwgBr5Py8K=?mTQug;GpFYum$UVz%sjuMtrv%wQ
zI*>o!eGloWsi`g8+z6xd>8bH@{0=5J6rNMR%YSNMV$$2y)n$l}|Iglkv(5a8puEll
z#eGF-!Q?%ytuOcn{J68fpL0 at 8|98iH4{-SKKa%>tF%tj$_J3E!{c~hc8~<NtvNcgO
zwT%yc1S}n<#rxr}Lema2(th=|>c8>-?(}W1!g9eQ=}ghm=~k$y*!I!DmWgg$m&ksX
z8Y!UjbivOz*<kmKI+-%mXCbC-eDCWs*D-6^IF_^=bD1rJ{iFPa0n at elqLG`A{gO01
zeK8lXPaVhE>s`xNs#hirWeF7>TZ<z1F8wd-Qu5|=YfrTilqBJF*{=j>?SWPsVYrQH
zzR*jT3vj at P*Ddy`Uy3_e at AlW?_-~o;uSu03HWR;t>KR~&J()=A7OT)>yWEDYeJ(X7
zcXWx+7Prsx_I+|QQ`i~`9`%5_=G&z&?I~?B)9-&SXd#%b0)9($S9x=ym9}Rmlc0U8
zyytx$Tz=P-4e#&)<!pXGwpUgbmk}m_UOtI6aKuqE!>%>MZY9Fo?~ky687=F4F`#k?
zg?a6KoisQp`9od-7x0B?QQe5od}tER+SM~?DZ<zP_TeOd9y4Bx+ at Ut#X*z&`gN08~
zhk|v0P5tWaRVBDSq3;0k?bwm&kHJ+`JfXECH8?!3|7f}<d-A#|XN<f=CXVGGD`u;f
zof%Q_n#Szv?^TYAPt|Pg3PVHoL1k~hU+x|mNf}9)_K}gJOw>|GD?Q}Vf}dDqJ!kP|
zsx`?`&!-KyX!8>5KOV<*F$X^ph<BB at o6*{4$uq%q_LF{4=&oyJp=_U7Im&QUca!%3
zs<+Di;*nZGIaIeL_({JR8%ef3K9Sh2JQV^_$J&z?Ta!K94QoMPo}@}WiB7Dr0 at Av#
zWhD?su+w^<E};%IU^<;n-oZF8nlRvK!`?yeu3~|cqzXf16#gtuM^8Q^fGpeP)%)b)
z(S_fg+ZTqOTQ@)9q3hA5wr8#6J7eYKvphSV-I~xOu5yd+JPBhqgfLCo)P8}!SABhc
zo5IzOR$tI40{)=bXXM-w5zv1yH&Zp=0$cTnwDfKq at O81hLuIChR@ZOlDUxPK1=lsy
zQ|3sGOt+Hm6fNy+g^jaWdsh?bIXr1)vDiLA6^4z#VDoQkmN^ZeySm7dBxdXMh?9{5
zC{53ZTw%I+w#XI6==g$Bjd^)OUI8j(CZA^%K7*eCm*T(T`YomIK-DiAP&A;)J-rZ3
zTa5FnnQk}U at H6mr9Is9!>p+x_Ep~_!%s;1%jY#C=2n;uP;r5jK^32WH1d>JMWVUM~
zo{#1fIJoMS$0}Pk7ZZh!kHp>8c7iwQc9WmJ1zjN^^L4?+mF<@ke*&nJm|TvFl6O87
zMpLU)|NC6WC%d4wjgHoj_6F3q*@0^Ntp@)Umx>`Q2U`jBlaR+1P8$@#&exfGlz<)`
z*W^Int&2v$2w$iym=U!9yExIFev-8ao at ENA1ovI3Dxf_@=Jwj;4zPT$Y3!F%veOgr
z(5Ov29ET1I{jz$^?1a2>?JKm_`8VrIqz=~Mxt2eL;-Z2N&xRiyDtqa9M;|$fk!O<2
zsAt0dc#c%O<%#fyo~k`Z|1|yWsq1S?>8T}h=63;g0bWwW`8L3FiIVWgpYT+k55yk4
zoF<ad!&bt8N!qT%NH0Bw<(6_;H at +B+3jF5Z<JpL#xT(Z=Jw7Z|X9x`^P)!~!IFY;S
z<zq%~iJeMScNyxQDQ)xq at nAiTHuv;#^$8^&#|yjdovwpAGS)9?aI<}KZ!3gQMR=H)
zhR)H%rczF5^m at D=M;1;0 at iDnD4CqC0BHH;mF6-ND$;WHej(zIwchx9@$|aPI*Xc=r
zzl$5ujm;Ezd|W{cYz581pT%x&KJc`g^7uZ}d}9=VLn96x<1|nOaa$fYkSoKkT$E#b
zhV2T*bX|^mjg+n`qxSWeujt<v8{S1^fVxndIpTw>MjXfD5FnA&Z(DkHMS6L{^IYJK
zWrS}f{B}y?eYb4Otr<pEt=jXtjuG^0a*yN40OQ%dv#QlQ)SnU<1KZurK}R>Bk))X}
zdnT^E(Crba at kb~{<wnotnqt>^mzC1RDf9 at 4M(H$KDTF_tNF}bW$Maz20Ua<5^l5~I
z`~+geueW#J78GNM;bAn_eP=13e8T}dC;Rnh)2%3%k*R3ZTa{S)!}^WsMowibURv7k
znRtF{ELYoQve!2V|HhICWa!OPS at ZyM=h|+>UIn+4L0_0%*&@6G6AfMUjm(e7*=>U?
z`uG6M)_ymgWA1TzxW_KhSNk_=4jq{IzpqXX%CNs+l|*9_WGU5e(8?Dg4Dzaoi%TMn
z2a!caXc*G?!-LGAA>UCt(=aCy=rylIXHkV)`l}0(A+g>bUo%Z*QYWLcH#t_YzRQZ-
zn_ew1 at raKK#}O-j%cm?=m~yaOJEwf at ZK|7VQ6tqLHsmz#)&)&XOs*D<uem3QHSWO1
zWOoBkTZKyU=pqX%o5Pty8;|E#KqHfL!MPcu-o_GUG<p<RKKvYx(%oI_hdyfoixwaW
znd<eTMw}HdkXH&89Uqwv!=zgf6`*jXs}zVGo<^5WUEUNWOZz`j_q1CFpCdBs;nzb8
z4&&=4*Eehp5nXyba^}Zlr2Z8~AyX7N@`*D-mUS&9i+KFE(F3y|eZFb{0EwEStdx#t
z!sJGAH_SeP%qPwbvm|nN*MiI2e|!%#_3gy>foMK@{vGc;0{-sw)O%%PD+eMze*6<D
z*Qn%6t&#EQ8hNkBh~63%)fs2S5%b&k(&U<Y?<YBnj=a311-!lONwlE9&vg8`ss%<X
zb;;6qJ1xWTl2IhvLX-pv37tqt6tks*#v$bBP`zUnmE3vza1Z4^xaX4!y$DPKR#b>}
zQPX=vsDvmBbWE$IT}`*B92F8C%~!6sDJURjp5||Q>==IgUTlO%U_-K)@H|?h48ESL
zZ;qRK9AR4x^F at 6A)py*>?ca>G%X{YJ&{4dBfHGzBevHSht$^d_^Oh6c^r%(rzEs^W
zhgY5S|6E3ve9Y&vFKZhhf|wPF6L+LKo}d_jG(Ya{z6Dbq{Yz=Ico`iIyWusVm-n`o
zRiX+FV&rRz*f)bF)#!!{5351TMxrf2<HxMs>C@}Q_sX`I++(IY31!^)G8ZZ?ezHz3
zfE)kCuH~fPeAD+RQq`7u_2Z at yY+%qk&JFClcI*ST^ooouc|&b89_Ej<Bs<D=X;{&g
z-Je at 9XwWf;(DkFK_ybhSH<sM-E-ZxK-UhFbQ`7b at Eunt=@|z5U;E$}`Q*B?>?MKL+
zw;;FUn&0;MOBwD++sLR5?AOTxEwd4HBjePfd5~BDBm#!=vYI504+f}DU&8FW?M3GL
ziSe1=UB&T#tAKm|*e at kP?xew~-*o5{;uhtJnTetWyBgkja3f2)*wNc(FjuOZI_=8d
z9iZCSMhqg8A6-WG+gb#}DUou0XGzUO27Zpu*o1N4j5KT=|Eu&lZxM)asTJW+a$4Hn
z-fgJx3OP5cKtT3m7?bp8Lyq&Z6Vr0RciVBLe~#8h48+lAe_C&q-*#Ez;N$&*J!IX_
z$=H6aSA9l#dF<y`fgAqG$00$zE$%nY<@t*GoeFjp3pU_zld1iR8Z<pOH2;*M&?ifW
zYQ1s*jILB4g;}Z053<&7Y*F&*LQ8$;7j1Otb=!S1?XX;TL1CFzKyA&`RMKf=@4||^
z_i_r6ENm at VE1hjgp?YkH0eD#i8KO at 9s7{HVxd<r(zP<g$$kGW$8T7cQw4PMogys=Y
zF|hyxF?cO6x=70s-%X%PaHB?3$-F+k-wELGlh~fM$i5;YN5+xX2|Qp7@<*B)J(En*
zj5<Th-4LfOPAB^fBdla(Ngk$g(IKt<j_=x#<QXYX+>FYcBpB;+^?9KBlw5d~c<Cbs
zcmRK!A&&U2O;-zl4(~`nBgbqu{x-Wl-|Lq>1_U;6pojs9uEo}KU^B~%m>qU_?hjfu
zy^S2D#XQQEUDEb(JWtT{Y)%Ncmp&6`(~Tev_x9>vlnvOdGiyU=<{+Cl>Ol{GRq^0~
zrr;LuA8VdifDXBAw!m8#ttaMsCn7hgd{sSVus at 6t!WqfHnYp5l7pU>Q(+mFuIVsBw
zUibJKU_Za~avf$sRyD-)hF|WDt)9v(+oxgu&9+N~m!5-2R#n>prAS`=@(HcI4%eo`
zgyHD3Q)&kX+E}kBiz)|1-FQ_!k9 at fdDl*UROmxv<21+MZvM0;9r)sY#!gG*QWhCGb
zF|AquhZ52Q4Y$?)$ggsi34bz<Tz-1{pfx-7{aBH4y-1dUHt`RtDQ6K`i0(#0 at VY4R
zD_o+>BAQ+6NQ&+6Crc+8$TQm0 at 9PIP`K1Ls`f}PAER7RRo7A><OR0gaOvmF`v51PN
z2S4y)RMpCKo at QLZz`L-+Odl>zo^@*B;DD><6dL<LD4+x&;7O<v at fh*6oSM&=toQ17
zZL{T)Fc$&%_NEZw>t+<uXF~o)FqjmZn0EMnA`FT#J|afqgDe<ws^?ICPK(^%FAPq%
z$V2X=Tv1;{{S323HXA3e_7)zzY=irj^5f;Py4D%R#kt)F<oBa>?*npLKrMA7kN at eo
zX*j*~e0OzwOwr_hVD>J+2-{(I2#>Vr)_(k;XsRqM28@%(ipuf)t$vYh)f;t1VU5VD
zFC&az*Xh=58mjmthf)1;v>Y%hH#iRQS5>Epp5n at UE!Za55?)hTpMQ0#@`KDt^x at HK
z%c6Fv(00RjO%K0$COC$lT=&|J+BvG_I=2aU)4+_3m&rYKa2>RxFJOgEv0bGRo=!wB
z9>uKR>=sSccjfJ8IMRfbFRUl(a?j1!U&hXk&M*teDI$T<JR2p-C%gz!6PT4aQ)Quk
zfbNya>}<IUGP2hI=3K1XPktPsaG7HVD9_8=Ipu!I(u%jsNj#$xyWv>WR at 5kxq_twd
zD28eWhZbRfwkK$NPO{ss17Se*&;1&h-Q$vpVlfGQR$ce*X*826U)^kc%9V00wCcvZ
z`Zuwp?VCZ`4uR;(2m^%6N&jM)0JLH7ILL07nh!3 at ad}n=ik}DXWGM7_ADpK2w{HrF
zpC^-5`v{bEuO{{6Sd*n$y_B$jl^edSHT<ll`#pN=YtcQ|PEv$B)#8K&CgNsR=1*UI
zF+L)v^_J%Gswqif)lt$7G(SBUVa_f-FyhaYJH^B=wyFK9*OFSs;Lx6(AziWHt5K`4
zZO$K~!|L@}Aan7G$-2Zfy~9}rtl`6<OSlcXbttIdqRfe)4za?a{<T<Yw6dn$4>sHz
zrTDk6X#epiD=5^|RXika=0SvA#@`b6(bT{5Tx5?)BEOA{E>2de+B(WjE%AA)m6jyk
zQyY}n|6!rP5a8c}^uL6`|5?BA|1n$e4=wTk`)M>$2Ezi=j?VM4y<~<zF}98{^YHP7
z9e$%Y&)->&o_H$iL0cU#oJJY$<BaFw;gObkloCX%*`Y5Yh++QJL%<146y$S(+|0eR
z_H!1LN}`U`6RLVAN=_FPYtaW`Mj2Ug`+-J*Nvv#jU52Wd^wa$WD}(Vt!2%=1|7He~
z<N;RVRwYfEKm0Rn at h7?Cm(c0 at gKxfWau2Qbk}|mUkNp^V{N*H`fQzPl^q_xF_HSh1
z7m at LZA2-kFHtBGI^o?X+ELYTQQkb)P+;I`otH1*Au+O@%*6mMiQNH{BWappS!QbCy
zelfNiZT<1aulsnU;FrE|RGtmkP~k2lz^7z|m8{b3Iv>vAieds#nnuaOmo*y8GFXX=
zii*%frTCsmB@*EvzmXJGU`LFp4SEXSc&nw|aZ%JfD-2KNXAC-Rfq%a{F+>6&`1AlO
zu!PU{P`^JenXcha|6a~h4kkq>?eed1-hN#pow9NzU8exFt9ngSGLRazG%BfN)734k
zPrcM;9f|pv6K at m{AItNnV8`z3b6sbd at D}Mwx5rcD6f3MkI;W{Yr9V$#gV=@dT||<y
zB>Tv3k0+&;&;9y+5!AbGx}@LS0t<@|!%g#kdclTSz54VjsWzB<s9EK*i=7USENY<+
z$yWyb<W2(_lPe#;HTe&lomHr{SQI+BX^~brMx-?8E#O#x^Zs*fAm^vCF at wh`IBmKo
zm)^IsP9YThIiH5{L`g<{k9Ab2rvg99<jKz(n!1EQzipNAA5bnI_j!#q_0UG~R0mNS
zwI+te1re^fvYHMZZGEMw_}B*@r(k9HleH{bXsI<;t19+?oS_|5ISCG8g5r1UwO}v8
z2&i86V{7WB>?aagCRY(Co%`8nwJRPaFypJ#fV$|j6}M+AM<L4LmF4F@=du*CD^?Y*
zQb(u&2ou9UGEdqj+j&0k(Bl0nwm84R{4}oV?(n0J)_Y(4U|ZsKXfs38^=yLocY(ZE
z9;`3>DA4UIVWlr^Ny)e_c+k(BbTUehSLB4L1$fu1^F_Y%%d1su8tNmS2;?e8t7#QX
z^Yb!m%<v<8<@=)?zfPnYrO#><h*fY+T|D~~wBM33eHIMM#;?4}9BFN>qGFxhuj7^P
zUo1;?-jhpwDeQ<s at kEcUbfM~1tY)J~S*5#NHgwc3 at g3_2>)5OlGt=5s>)2~m%k2*d
zNb5q?W4WHMUg~X*OeO79olO|Kc)eJ0qxRBDHAk);f!AvPB2S-`FK&jHirS~ro&;qJ
zm~S^73h9G?E=G;E{b|kWw9TlUO#2UA+v#$^nxz0zQM#Nq at AmgR?O*c8HXCUMR=V_-
zH_xf- at Z(|)&AX*e!bPp?76kD}2mwgPTYvx at LH+}sDZYN~Jg!6Hdpas$N^34t&n4U!
zulaGYNN1hvq<l!|=|*y66_mzXJZE0$fV^W)!7l(e=DHW1RHih!R%=0Vtv{8A%~U^n
z8|L;zN-=e|x_??@`MJ>AxHtcUYvF)7a=z9cvyLln$w0l4neFU5KBnyVZUxFqn$E4t
zfO|Vx*RZ!2-kN-6hprD^ZPC;W&01EEpyJS@=FP+w^p{XE_~Hzr9;0R0@}gho;4s_&
z(9iK$iMl}7A2(*bsI)_0UBo$#%HA9<fjRcu;U+LJ*nE3^<tP+JtA-W(p2~EjK&5pS
zajSr|RBPKcekf#SD|+#`tX8A{JT?A%@k;GC$LZz<pHd|h3ZjkVU?TuXiTx{>9py%M
zGT=wJ;So}9d22_z^9rR97b=F_&H_4<^_iOJ17HQ?iFGlri?eh-!=ZC?rW(~O$?t`T
z02!7=az91C2l!*=JFGlZfcVAyj at L*?#>0W98Li894b7gZL2YCoR`z<b+#W|RJ#04>
zp%m=frK%e^*D4-|kI%{T*0xt5O~)aPp0wJabP8_I=whIy;z=uPo8B5>EU7?q5=Qjx
z?|*3p+*;ukpCXvL1J17v4;%wei=nYR-<eedg3{;0+eZ4=bJ_W<KkWz?E))e`WFY|t
ztjLl8a9a%y?o;pU at mzJFcNeqyQy7dRqSrDY(xkRl6F@{<AMqm9R55_cLKLgdaX{bq
z(`j*++9Of*5l6gwkwJ=LRyvnr6a=2M{u`H<t-IKkKRp&PAm-ab0rN*W0`ID)$ZXy;
zh2 at Qm^ewbxYIr|&l;ndqDD8Tx4v<sSHjAvoy+<$Jw2~G3NE|b{UQ+VTxC;9Dss|g7
zRC3nQOl=1cvoE&!*TY8!*3V$sbU8U?C(lVvwZfF%JG`8$3b`{!SveFArUDkku(RVv
z^3(=cu0OPo%XmKH5Ag;E6JB*~^_3n206QI6G7N;I;R3dBfNBbEY+HDlH_kGmtKRHq
zHSo2fzU<1(Nq0koZza`V!EUAm8spYhJE@#WN?gN6^x3{yZL)DM^+D|*--0dDk`T9n
zQ~cIDsmVv_Dkv2sLh}8yB~!V4)!SY3><{2%sVr%Shdy>)j#H~2?oI7=F^gO5+d7>o
z{!|$L$P~8^=Ni0W{AG;1%;Hm;sSr``F^#yBIo&Y}8LE{<Z-e at QBjO*)-+ic<b5J4U
z)jzU}t7Ili_w8x$*Z6S)i?f4D85hbbj8Bp-4~@)s>jU-vu>$)2>$dhz`vp{cI;OXr
zaj`yh!2g()*XgLz(3NkO%bWS7@|CTc9p(G|(2GCMB0tpB^etR2{`$(dSF>XpHwG`P
z-fLvXp89adN$(kZBMpFwz7?G4*Lc`S<{KNcZn&<vFHa<?r~I<)l_#?|GN;G9s1LrQ
z^CsWihofZ08%O8x)hD<`kKXl<Tand1+t>3=-v;a0q6r7{ZhTx5{95K$Y#Fa_pOnhe
zjq1sNvQHSy*;3ZiBb_~q at m=%ov&{EO-g#Bm%<6w_S$;P*R%`$I at W2%s*}U;)a)lzP
z*I)M4?wn~k-S1`9u9 at Adb1!<W5|L6CUNU{bTJ3Gg4~*VETC>&6E$`3YTYdhv91P~`
zCQcWbe0|QAd3iq!W!L9l33gt2Vdq_&Bay1B+U{Sis;jYE{dM)@&&*q=g`~bdZMoy2
z-*J;apX3?-Ezvu9*6+sLZL2-cE{X|Szp5r+{h|viU#8Dzz4YgY%&eG$U+gL;`py0F
z>c^J%xm#+>cc(Bgh_wMjiJ>O at MU-jo?;XmyFRq%c-L*0L#ht6g8CAT0-wMVvHG0n2
zWc^huDg4~81&+<X%B|+M`Q_eTRlCso<u?oIdwYz0e+s_?`TTq0HB$l4H)(Qx7k}OG
zaQ=Vo+=klgt8#D4U%&k>;Ps36+;z9MuD$iHaK`7!RdIbUt+)CXf1X#r at R~DFk-bRQ
zUDh`9h1qk?+i}O)L|5OxJwLx{Q at r)|%d;67emv%2U}QMpUYZ>7@$awF_@@&mM*d%S
z`lb4-$9|qdw*?M&e(B$|M*rUayxk`c{+fPyTKx6b8+ at l6dARiP=l_fUr^y7qp8xCY
z<_EHWHG at UeyO^y1ny-EFkD1{Cs9<EMxpG0|R-Tb*zR8~}$3u2M&R2i9 at 7<K6pZ-q0
z=D93B=g;r#_wnWHYqnqA_%GbieZ3CXll4xy-=0Rt7W_X{Z``-ytN&kMdhFYGO614B
zCWC7W7k%evXwU=|OCXSN5af0cXkb+a*7jf^2DTW)i~tVDfap<$0~$QP?K#f<a&;`y
Q3I#=lr>mdKI;Vst08^GG!vFvP
literal 0
HcmV?d00001
diff --git a/documentation/mega-manual/mega-manual.xml b/documentation/mega-manual/mega-manual.xml
index a75ebf1..5c1faec 100644
--- a/documentation/mega-manual/mega-manual.xml
+++ b/documentation/mega-manual/mega-manual.xml
@@ -35,7 +35,7 @@
<affiliation>
<orgname>Intel Corporation</orgname>
</affiliation>
- <email>scott.m.rifenbark at intel.com</email>
+ <email>srifenbark at gmail.com</email>
</author>
</authorgroup>
@@ -46,9 +46,9 @@
<revremark>Released with the Yocto Project 1.8 Release.</revremark>
</revision>
<revision>
- <revnumber>1.9</revnumber>
+ <revnumber>2.0</revnumber>
<date>October 2015</date>
- <revremark>Released with the Yocto Project 1.9 Release.</revremark>
+ <revremark>Released with the Yocto Project 2.0 Release.</revremark>
</revision>
</revhistory>
diff --git a/documentation/poky.ent b/documentation/poky.ent
index 07c4f6d..33d52c0 100644
--- a/documentation/poky.ent
+++ b/documentation/poky.ent
@@ -1,7 +1,7 @@
-<!ENTITY DISTRO "1.9">
-<!ENTITY DISTRO_COMPRESSED "19">
-<!ENTITY DISTRO_NAME "tbd">
-<!ENTITY YOCTO_DOC_VERSION "1.9">
+<!ENTITY DISTRO "2.0">
+<!ENTITY DISTRO_COMPRESSED "20">
+<!ENTITY DISTRO_NAME "jethro">
+<!ENTITY YOCTO_DOC_VERSION "2.0">
<!ENTITY POKYVERSION "14.0.0">
<!ENTITY POKYVERSION_COMPRESSED "1400">
<!ENTITY YOCTO_POKY "poky-&DISTRO_NAME;-&POKYVERSION;">
@@ -67,4 +67,5 @@
<!ENTITY OPENSUSE_HOST_PACKAGES_ESSENTIAL "python gcc gcc-c++ git chrpath make wget python-xml \
diffstat makeinfo python-curses patch socat">
<!ENTITY CENTOS_HOST_PACKAGES_ESSENTIAL "gawk make wget tar bzip2 gzip python unzip perl patch \
- diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath socat">
+ diffutils diffstat git cpp gcc gcc-c++ glibc-devel texinfo chrpath socat \
+ perl-Data-Dumper perl-Text-ParseWords perl-Thread-Queue">
diff --git a/documentation/profile-manual/profile-manual.xml b/documentation/profile-manual/profile-manual.xml
index 38620df..7f9b2c4 100644
--- a/documentation/profile-manual/profile-manual.xml
+++ b/documentation/profile-manual/profile-manual.xml
@@ -62,9 +62,9 @@
<revremark>Released with the Yocto Project 1.8 Release.</revremark>
</revision>
<revision>
- <revnumber>1.9</revnumber>
+ <revnumber>2.0</revnumber>
<date>October 2015</date>
- <revremark>Released with the Yocto Project 1.9 Release.</revremark>
+ <revremark>Released with the Yocto Project 2.0 Release.</revremark>
</revision>
</revhistory>
diff --git a/documentation/ref-manual/closer-look.xml b/documentation/ref-manual/closer-look.xml
index 27f674a..45dcd9b 100644
--- a/documentation/ref-manual/closer-look.xml
+++ b/documentation/ref-manual/closer-look.xml
@@ -1059,7 +1059,7 @@
the root filesystem image that lists out, line-by-line, the
installed packages.
This manifest file is useful for the
- <link linkend='ref-classes-testimage'><filename>testimage</filename></link>
+ <link linkend='ref-classes-testimage*'><filename>testimage</filename></link>
class, for example, to determine whether or not to run
specific tests.
See the
diff --git a/documentation/ref-manual/introduction.xml b/documentation/ref-manual/introduction.xml
index 5250e26..0b16544 100644
--- a/documentation/ref-manual/introduction.xml
+++ b/documentation/ref-manual/introduction.xml
@@ -154,11 +154,14 @@
<listitem><para>Ubuntu 13.10</para></listitem> -->
<listitem><para>Ubuntu 14.04 (LTS)</para></listitem>
<listitem><para>Ubuntu 14.10</para></listitem>
+ <listitem><para>Ubuntu 15.04</para></listitem>
+ <listitem><para>Ubuntu 15.10</para></listitem>
<!-- <listitem><para>Fedora 16 (Verne)</para></listitem>
<listitem><para>Fedora 17 (Spherical)</para></listitem>
<listitem><para>Fedora release 19 (Schrödinger's Cat)</para></listitem>
<listitem><para>Fedora release 20 (Heisenbug)</para></listitem> -->
<listitem><para>Fedora release 21</para></listitem>
+ <listitem><para>Fedora release 22</para></listitem>
<!-- <listitem><para>CentOS release 5.6 (Final)</para></listitem>
<listitem><para>CentOS release 5.7 (Final)</para></listitem>
<listitem><para>CentOS release 5.8 (Final)</para></listitem>
@@ -250,8 +253,15 @@
Packages needed if you are going to be using the
<ulink url='&YOCTO_DOCS_ADT_URL;#using-the-adt-installer'>Application Development Toolkit (ADT) Installer</ulink>:
<literallayout class='monospaced'>
- $ sudo apt-get install autoconf automake libtool libglib2.0-dev
+ $ sudo apt-get install autoconf automake libtool libglib2.0-dev libarchive-dev
</literallayout></para></listitem>
+ <listitem><para><emphasis>OpenEmbedded Self-Test (<filename>oe-selftest</filename>):</emphasis>
+ Packages needed if you are going to run
+ <filename>oe-selftest</filename>:
+ <literallayout class='monospaced'>
+ $ sudo apt-get install python-git
+ </literallayout>
+ </para></listitem>
</itemizedlist>
</para>
</section>
@@ -267,28 +277,35 @@
Packages needed to build an image for a headless
system:
<literallayout class='monospaced'>
- $ sudo yum install &FEDORA_HOST_PACKAGES_ESSENTIAL;
+ $ sudo dnf install &FEDORA_HOST_PACKAGES_ESSENTIAL;
</literallayout></para></listitem>
<listitem><para><emphasis>Graphical and Eclipse Plug-In Extras:</emphasis>
Packages recommended if the host system has graphics
support or if you are going to use the Eclipse
IDE:
<literallayout class='monospaced'>
- $ sudo yum install SDL-devel xterm perl-Thread-Queue
+ $ sudo dnf install SDL-devel xterm
</literallayout></para></listitem>
<listitem><para><emphasis>Documentation:</emphasis>
Packages needed if you are going to build out the
Yocto Project documentation manuals:
<literallayout class='monospaced'>
- $ sudo yum install make docbook-style-dsssl docbook-style-xsl \
+ $ sudo dnf install make docbook-style-dsssl docbook-style-xsl \
docbook-dtds docbook-utils fop libxslt dblatex xmlto xsltproc
</literallayout></para></listitem>
<listitem><para><emphasis>ADT Installer Extras:</emphasis>
Packages needed if you are going to be using the
<ulink url='&YOCTO_DOCS_ADT_URL;#using-the-adt-installer'>Application Development Toolkit (ADT) Installer</ulink>:
<literallayout class='monospaced'>
- $ sudo yum install autoconf automake libtool glib2-devel
+ $ sudo dnf install autoconf automake libtool glib2-devel libarchive-devel
</literallayout></para></listitem>
+ <listitem><para><emphasis>OpenEmbedded Self-Test (<filename>oe-selftest</filename>):</emphasis>
+ Packages needed if you are going to run
+ <filename>oe-selftest</filename>:
+ <literallayout class='monospaced'>
+ $ sudo dnf install GitPython
+ </literallayout>
+ </para></listitem>
</itemizedlist>
</para>
</section>
@@ -323,7 +340,13 @@
Packages needed if you are going to be using the
<ulink url='&YOCTO_DOCS_ADT_URL;#using-the-adt-installer'>Application Development Toolkit (ADT) Installer</ulink>:
<literallayout class='monospaced'>
- $ sudo zypper install autoconf automake libtool glib2-devel
+ $ sudo zypper install autoconf automake libtool glib2-devel libarchive-devel
+ </literallayout></para></listitem>
+ <listitem><para><emphasis>OpenEmbedded Self-Test (<filename>oe-selftest</filename>):</emphasis>
+ Packages needed if you are going to run
+ <filename>oe-selftest</filename>:
+ <literallayout class='monospaced'>
+ $ sudo zypper install python-GitPython
</literallayout></para></listitem>
</itemizedlist>
</para>
@@ -336,14 +359,14 @@
The following list shows the required packages by function
given a supported CentOS Linux distribution:
<note>
- For CentOS 6.x, some of the versions of the components
- provided by the distribution are too old (e.g. Git, Python,
- and tar).
- It is recommended that you install the buildtools in order
- to provide versions that will work with the OpenEmbedded
- build system.
- For information on how to install the buildtools tarball,
- see the
+ For CentOS 6.x, some of the versions
+ of the components provided by the distribution are
+ too old (e.g. Git, Python, and tar).
+ It is recommended that you install the buildtools
+ in order to provide versions that will work with
+ the OpenEmbedded build system.
+ For information on how to install the buildtools
+ tarball, see the
"<link linkend='required-git-tar-and-python-versions'>Required Git, Tar, and Python Versions</link>"
section.
</note>
@@ -372,8 +395,24 @@
Packages needed if you are going to be using the
<ulink url='&YOCTO_DOCS_ADT_URL;#using-the-adt-installer'>Application Development Toolkit (ADT) Installer</ulink>:
<literallayout class='monospaced'>
- $ sudo yum install autoconf automake libtool glib2-devel
- </literallayout></para></listitem>
+ $ sudo yum install autoconf automake libtool glib2-devel libarchive-devel
+ </literallayout>
+ <note>
+ For CentOS 6.x, in order for the
+ ADT installer script to work, you must have
+ installed the <filename>liblzma5</filename>,
+ <filename>libarchive3.x</filename>, and
+ <filename>libarchive-devel-3.1.3</filename>
+ (or older) packages, in that order.
+ </note>
+ </para></listitem>
+ <listitem><para><emphasis>OpenEmbedded Self-Test (<filename>oe-selftest</filename>):</emphasis>
+ Packages needed if you are going to run
+ <filename>oe-selftest</filename>:
+ <literallayout class='monospaced'>
+ $ sudo yum install GitPython
+ </literallayout>
+ </para></listitem>
</itemizedlist>
</para>
</section>
diff --git a/documentation/ref-manual/migration.xml b/documentation/ref-manual/migration.xml
index dc75eb8..21763e3 100644
--- a/documentation/ref-manual/migration.xml
+++ b/documentation/ref-manual/migration.xml
@@ -980,7 +980,7 @@
<para>
A new automated image testing framework has been added
through the
- <link linkend='ref-classes-testimage'><filename>testimage*.bbclass</filename></link>
+ <link linkend='ref-classes-testimage*'><filename>testimage.bbclass</filename></link>
class.
This framework replaces the older
<filename>imagetest-qemu</filename> framework.
@@ -1254,7 +1254,7 @@
<listitem><para><filename>bb.MalformedUrl</filename>:
Use <filename>bb.fetch.MalformedUrl</filename>.
</para></listitem>
- <listitem><para><filename>bb.fetch.encodeurl</filename>:
+ <listitem><para><filename>bb.encodeurl</filename>:
Use <filename>bb.fetch.encodeurl</filename>.
</para></listitem>
<listitem><para><filename>bb.decodeurl</filename>:
@@ -1485,8 +1485,9 @@
Recipes building Autotools-based
software that fails to build with a separate build directory
should be changed to inherit from the
- <link linkend='ref-classes-autotools-brokensep'><filename>autotools-brokensep</filename></link>
- class instead of the <filename>autotools</filename> class.
+ <link linkend='ref-classes-autotools'><filename>autotools-brokensep</filename></link>
+ class instead of the <filename>autotools</filename> or
+ <filename>autotools_stage</filename>classes.
</para>
</section>
@@ -1794,8 +1795,9 @@
need to either patch the software so that it can build
separately, or you will need to change the recipe to
inherit the
- <link linkend='ref-classes-autotools-brokensep'><filename>autotools-brokensep</filename></link>
- class instead of the <filename>autotools</filename> class.
+ <link linkend='ref-classes-autotools'><filename>autotools-brokensep</filename></link>
+ class instead of the <filename>autotools</filename> or
+ <filename>autotools_stage</filename> classes.
</para></listitem>
<listitem><para><emphasis>
The <filename>--foreign</filename> option is
@@ -2313,6 +2315,427 @@
</section>
</section>
+<section id='moving-to-the-yocto-project-2.0-release'>
+ <title>Moving to the Yocto Project 2.0 Release</title>
+
+ <para>
+ This section provides migration information for moving to the
+ Yocto Project 2.0 Release from the prior release.
+ </para>
+
+ <section id='migration-2.0-gcc-5'>
+ <title>GCC 5</title>
+
+ <para>
+ The default compiler is now GCC 5.2.
+ This change has required fixes for compilation errors in a number
+ of other recipes.
+ </para>
+
+ <para>
+ One important example is a fix for when the Linux kernel freezes at
+ boot time on ARM when built with GCC 5.
+ If you are using your own kernel recipe or source tree and
+ building for ARM, you will likely need to apply this
+ <ulink url='https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit?id=a077224fd35b2f7fbc93f14cf67074fc792fbac2'>patch</ulink>.
+ The standard <filename>linux-yocto</filename> kernel source tree
+ already has a workaround for the same issue.
+ </para>
+
+ <para>
+ For further details, see
+ <ulink url='https://gcc.gnu.org/gcc-5/changes.html'></ulink> and
+ the porting guide at
+ <ulink url='https://gcc.gnu.org/gcc-5/porting_to.html'></ulink>.
+ </para>
+
+ <para>
+ Alternatively, you can switch back to GCC 4.9 or 4.8 by
+ setting <filename>GCCVERSION</filename> in your configuration,
+ as follows:
+ <literallayout class='monospaced'>
+ GCCVERSION = "4.9%"
+ </literallayout>
+ </para>
+ </section>
+
+ <section id='migration-2.0-Gstreamer-0.10-removed'>
+ <title>Gstreamer 0.10 Removed</title>
+
+ <para>
+ Gstreamer 0.10 has been removed in favor of Gstreamer 1.x.
+ As part of the change, recipes for Gstreamer 0.10 and related
+ software are now located
+ in <filename>meta-multimedia</filename>.
+ This change results in Qt4 having Phonon and Gstreamer
+ support in QtWebkit disabled by default.
+ </para>
+ </section>
+
+ <section id='migration-2.0-removed-recipes'>
+ <title>Removed Recipes</title>
+
+ <para>
+ The following recipes have been moved or removed:
+ <itemizedlist>
+ <listitem><para>
+ <filename>bluez4</filename>: The recipe is obsolete and
+ has been moved due to <filename>bluez5</filename>
+ becoming fully integrated.
+ The <filename>bluez4</filename> recipe now resides in
+ <filename>meta-oe</filename>.
+ </para></listitem>
+ <listitem><para>
+ <filename>gamin</filename>: The recipe is obsolete and
+ has been removed.
+ </para></listitem>
+ <listitem><para>
+ <filename>gnome-icon-theme</filename>: The recipe's
+ functionally has been replaced by
+ <filename>adwaita-icon-theme</filename>.
+ </para></listitem>
+ <listitem><para>
+ Gstreamer 0.10 Recipes: Recipes for Gstreamer 0.10 have
+ been removed in favor of the recipes for Gstreamer 1.x.
+ </para></listitem>
+ <listitem><para>
+ <filename>insserv</filename>: The recipe is obsolete and
+ has been removed.
+ </para></listitem>
+ <listitem><para>
+ <filename>libunique</filename>: The recipe is no longer
+ used and has been moved to <filename>meta-oe</filename>.
+ </para></listitem>
+ <listitem><para>
+ <filename>midori</filename>: The recipe's functionally
+ has been replaced by <filename>epiphany</filename>.
+ </para></listitem>
+ <listitem><para>
+ <filename>python-gst</filename>: The recipe is obsolete
+ and has been removed since it only contains bindings for
+ Gstreamer 0.10.
+ </para></listitem>
+ <listitem><para>
+ <filename>qt-mobility</filename>: The recipe is obsolete and
+ has been removed since it requires
+ <filename>Gstreamer 0.10</filename>, which has been
+ replaced.
+ </para></listitem>
+ <listitem><para>
+ <filename>subversion</filename>: All 1.6.x versions of this
+ recipe have been removed.
+ </para></listitem>
+ <listitem><para>
+ <filename>webkit-gtk</filename>: The older 1.8.3 version
+ of this recipe has been removed in favor of
+ <filename>webkitgtk</filename>.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </section>
+
+ <section id='migration-2.0-bitbake-datastore-improvements'>
+ <title>BitBake datastore improvements</title>
+
+ <para>
+ The method by which BitBake's datastore handles overrides has
+ changed.
+ Overrides are now applied dynamically and
+ <filename>bb.data.update_data()</filename> is now a no-op.
+ Thus, <filename>bb.data.update_data()</filename> is no longer
+ required in order to apply the correct overrides.
+ In practice, this change is unlikely to require any changes to
+ Metadata.
+ However, these minor changes in behavior exist:
+ <itemizedlist>
+ <listitem><para>
+ All potential overrides are now visible in the variable
+ history as seen when you run the following:
+ <literallayout class='monospaced'>
+ $ bitbake -e
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ <filename>d.delVar('VARNAME')</filename> and
+ <filename>d.setVar('VARNAME', None)</filename> result
+ in the variable and all of its overrides being cleared out.
+ Before the change, only the non-overridden values
+ were cleared.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </section>
+
+ <section id='migration-2.0-shell-message-function-changes'>
+ <title>Shell Message Function Changes</title>
+
+ <para>
+ The shell versions of the BitBake message functions (i.e.
+ <filename>bbdebug</filename>, <filename>bbnote</filename>,
+ <filename>bbwarn</filename>, <filename>bbplain</filename>,
+ <filename>bberror</filename>, and <filename>bbfatal</filename>)
+ are now connected through to their BitBake equivalents
+ <filename>bb.debug()</filename>, <filename>bb.note()</filename>,
+ <filename>bb.warn()</filename>, <filename>bb.plain()</filename>,
+ <filename>bb.error()</filename>, and
+ <filename>bb.fatal()</filename>, respectively.
+ Thus, those message functions that you would expect to be printed
+ by the BitBake UI are now actually printed.
+ In practice, this change means two things:
+ <itemizedlist>
+ <listitem><para>
+ If you now see messages on the console that you did not
+ previously see as a result of this change, you might
+ need to clean up the calls to
+ <filename>bbwarn</filename>, <filename>bberror</filename>,
+ and so forth.
+ Or, you might want to simply remove the calls.
+ </para></listitem>
+ <listitem><para>
+ The <filename>bbfatal</filename> message function now
+ suppresses the full error log in the UI, which means any
+ calls to <filename>bbfatal</filename> where you still
+ wish to see the full error log should be replaced by
+ <filename>die</filename> or
+ <filename>bbfatal_log</filename>.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </section>
+
+ <section id='migration-2.0-extra-development-debug-package-cleanup'>
+ <title>Extra Development/Debug Package Cleanup</title>
+
+ <para>
+ The following recipes have had extra
+ <filename>dev/dbg</filename> packages removed:
+ <itemizedlist>
+ <listitem><para>
+ <filename>acl</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>apmd</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>aspell</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>attr</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>augeas</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>bzip2</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>cogl</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>curl</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>elfutils</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>gcc-target</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>libgcc</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>libtool</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>libxmu</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>opkg</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>pciutils</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>rpm</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>sysfsutils</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>tiff</filename>
+ </para></listitem>
+ <listitem><para>
+ <filename>xz</filename>
+ </para></listitem>
+ </itemizedlist>
+ All of the above recipes now conform to the standard packaging
+ scheme where a single <filename>-dev</filename>,
+ <filename>-dbg</filename>, and <filename>-staticdev</filename>
+ package exists per recipe.
+ </para>
+ </section>
+
+ <section id='migration-2.0-recipe-maintenance-tracking-data-moved-to-oe-core'>
+ <title>Recipe Maintenance Tracking Data Moved to OE-Core</title>
+
+ <para>
+ Maintenance tracking data for recipes that was previously part
+ of <filename>meta-yocto</filename> has been moved to OE-Core.
+ The change includes <filename>package_regex.inc</filename> and
+ <filename>distro_alias.inc</filename>, which are typically enabled
+ when using the
+ <link linkend='ref-classes-distrodata'><filename>distrodata</filename></link>
+ class.
+ Additionally, the contents of
+ <filename>upstream_tracking.inc</filename> has now been split out
+ to the relevant recipes.
+ </para>
+ </section>
+
+ <section id='migration-2.0-automatic-stale-sysroot-file-cleanup'>
+ <title>Automatic Stale Sysroot File Cleanup</title>
+
+ <para>
+ Stale files from recipes that no longer exist in the current
+ configuration are now automatically removed from
+ sysroot as well as removed from
+ any other place managed by shared state.
+ This automatic cleanup means that the build system now properly
+ handles situations such as renaming the build system side of
+ recipes, removal of layers from
+ <filename>bblayers.conf</filename>, and
+ <link linkend='var-DISTRO_FEATURES'><filename>DISTRO_FEATURES</filename></link>
+ changes.
+ </para>
+
+ <para>
+ Additionally, work directories for old versions of recipes are
+ now pruned.
+ If you wish to disable pruning old work directories, you can set
+ the following variable in your configuration:
+ <literallayout class='monospaced'>
+ SSTATE_PRUNE_OBSOLETEWORKDIR = "0"
+ </literallayout>
+ </para>
+ </section>
+
+ <section id='migration-2.0-linux-yocto-kernel-metadata-repository-now-split-from-source'>
+ <title><filename>linux-yocto</filename> Kernel Metadata Repository Now Split from Source</title>
+
+ <para>
+ The <filename>linux-yocto</filename> tree has up to now been a
+ combined set of kernel changes and configuration (meta) data
+ carried in a single tree.
+ While this format is effective at keeping kernel configuration and
+ source modifications synchronized, it is not always obvious to
+ developers how to manipulate the Metadata as compared to the
+ source.
+ </para>
+
+ <para>
+ Metadata processing has now been removed from the
+ <link linkend='ref-classes-kernel-yocto'><filename>kernel-yocto</filename></link>
+ class and the external Metadata repository
+ <filename>yocto-kernel-cache</filename>, which has always been used
+ to seed the <filename>linux-yocto</filename> "meta" branch.
+ This separate <filename>linux-yocto</filename> cache repository
+ is now the primary location for this data.
+ Due to this change, <filename>linux-yocto</filename> is no longer
+ able to process combined trees.
+ Thus, if you need to have your own combined kernel repository,
+ you must do the split there as well and update your recipes
+ accordingly.
+ See the <filename>meta/recipes-kernel/linux/linux-yocto_4.1.bb</filename>
+ recipe for an example.
+ </para>
+ </section>
+
+ <section id='migration-2.0-additional-qa-checks'>
+ <title>Additional QA checks</title>
+
+ <para>
+ The following QA checks have been added:
+ <itemizedlist>
+ <listitem><para>
+ Added a "host-user-contaminated" check for ownership
+ issues for packaged files outside of
+ <filename>/home</filename>.
+ The check looks for files that are incorrectly owned by the
+ user that ran BitBake instead of owned by a valid user in
+ the target system.
+ </para></listitem>
+ <listitem><para>
+ Added an "invalid-chars" check for invalid (non-UTF8)
+ characters in recipe metadata variable values
+ (i.e.
+ <link linkend='var-DESCRIPTION'><filename>DESCRIPTION</filename></link>,
+ <link linkend='var-SUMMARY'><filename>SUMMARY</filename></link>,
+ <link linkend='var-LICENSE'><filename>LICENSE</filename></link>,
+ and
+ <link linkend='var-SECTION'><filename>SECTION</filename></link>).
+ Some package managers do not support these characters.
+ </para></listitem>
+ <listitem><para>
+ Added an "invalid-packageconfig" check for any options
+ specified in
+ <link linkend='var-PACKAGECONFIG'><filename>PACKAGECONFIG</filename></link>
+ that do not match any <filename>PACKAGECONFIG</filename>
+ option defined for the recipe.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </section>
+
+ <section id='migration-2.0-miscellaneous'>
+ <title>Miscellaneous Changes</title>
+
+ <para>
+ These additional changes exist:
+ <itemizedlist>
+ <listitem><para>
+ <filename>gtk-update-icon-cache</filename> has been
+ renamed to <filename>gtk-icon-utils</filename>.
+ </para></listitem>
+ <listitem><para>
+ The <filename>tools-profile</filename>
+ <link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link>
+ item as well as its corresponding packagegroup and
+ <filename>packagegroup-core-tools-profile</filename> no
+ longer bring in <filename>oprofile</filename>.
+ Bringing in <filename>oprofile</filename> was originally
+ added to aid compilation on resource-constrained
+ targets.
+ However, this aid has not been widely used and is not
+ likely to be used going forward due to the more powerful
+ target platforms and the existence of better
+ cross-compilation tools.
+ </para></listitem>
+ <listitem><para>
+ The
+ <link linkend='var-IMAGE_FSTYPES'><filename>IMAGE_FSTYPES</filename></link>
+ variable's default value now specifies
+ <filename>ext4</filename> instead of
+ <filename>ext3</filename>.
+ </para></listitem>
+ <listitem><para>
+ All support for the <filename>PRINC</filename>
+ variable has been removed.
+ </para></listitem>
+ <listitem><para>
+ The <filename>packagegroup-core-full-cmdline</filename>
+ packagegroup no longer brings in
+ <filename>lighttpd</filename> due to the fact that
+ bringing in <filename>lighttpd</filename> is not really in
+ line with the packagegroup's purpose, which is to add full
+ versions of command-line tools that by default are
+ provided by <filename>busybox</filename>.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </section>
+</section>
+
+
</chapter>
<!--
vim: expandtab tw=80 ts=4
diff --git a/documentation/ref-manual/ref-classes.xml b/documentation/ref-manual/ref-classes.xml
index d87c9ff..b2941b8 100644
--- a/documentation/ref-manual/ref-classes.xml
+++ b/documentation/ref-manual/ref-classes.xml
@@ -52,20 +52,22 @@
and a C library as pre-requisites, and splitting out of debug symbols
during packaging).
<note>
- Unlike e.g. Debian, OpenEmbedded recipes that produce packages
- which
+ <para>Unlike some distro recipes (e.g. Debian), OpenEmbedded recipes
+ that produce packages that depend on tunings through use of the
<link linkend='var-RDEPENDS'><filename>RDEPENDS</filename></link>
- on
+ and
<link linkend='var-TUNE_PKGARCH'><filename>TUNE_PKGARCH</filename></link>
- packages should never be made <filename>allarch</filename>, even
- if they do not produce architecture-specific output. This would
- cause the do_package_write_* tasks to have different signatures
- for
- <link linkend='var-MACHINE'><filename>MACHINE</filename></link>s
- with different
- <link linkend='var-TUNE_PKGARCH'><filename>TUNE_PKGARCH</filename></link>,
- thus unnecessary rebuilds every single time an image for a different
- MACHINE is built (even without any change to the recipe).
+ variables, should never be configured for all architectures
+ using <filename>allarch</filename>.
+ This is the case even if the recipes do not produce
+ architecture-specific output.</para>
+ <para>Configuring such recipes for all architectures causes the
+ <link linkend='ref-tasks-package_write_deb'><filename>do_package_write_*</filename></link>
+ tasks to have different signatures for the machines with different
+ tunings.
+ Additionally, unnecessary rebuilds occur every time an
+ image for a different <filename>MACHINE</filename> is built
+ even when the recipe never changes.</para>
</note>
</para>
@@ -101,55 +103,76 @@
</section>
<section id='ref-classes-autotools'>
- <title><filename>autotools.bbclass</filename></title>
+ <title><filename>autotools*.bbclass</filename></title>
<para>
- The <filename>autotools</filename> class supports Autotooled
+ The <filename>autotools*</filename> classes support Autotooled
packages.
</para>
<para>
The <filename>autoconf</filename>, <filename>automake</filename>,
- and <filename>libtool</filename> bring standardization.
- This class defines a set of tasks (configure, compile etc.) that
+ and <filename>libtool</filename> packages bring standardization.
+ This class defines a set of tasks (e.g.
+ <filename>configure</filename>, <filename>compile</filename> and
+ so forth) that
work for all Autotooled packages.
It should usually be enough to define a few standard variables
and then simply <filename>inherit autotools</filename>.
- This class can also work with software that emulates Autotools.
+ These classes can also work with software that emulates Autotools.
For more information, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#new-recipe-autotooled-package'>Autotooled Package</ulink>"
section in the Yocto Project Development Manual.
</para>
<para>
- By default, the <filename>autotools</filename> class
- uses out-of-tree builds
+ By default, the <filename>autotools*</filename> classes
+ use out-of-tree builds (i.e.
+ <filename>autotools.bbclass</filename> and
+ <filename>autotools_stage.bbclass</filename>).
(<link linkend='var-B'><filename>B</filename></link> <filename>!=</filename>
<link linkend='var-S'><filename>S</filename></link>).
+ </para>
+
+ <para>
If the software being built by a recipe does not support
using out-of-tree builds, you should have the recipe inherit the
- <link linkend='ref-classes-autotools-brokensep'><filename>autotools-brokensep</filename></link>
- class.
+ <filename>autotools-brokensep</filename> class.
+ The <filename>autotools-brokensep</filename> class behaves the same
+ as the <filename>autotools</filename> and
+ <filename>autotools_stage</filename> classes but builds with
+ <link linkend='var-B'><filename>B</filename></link> ==
+ <link linkend='var-S'><filename>S</filename></link>.
+ This method is useful when out-of-tree build support is either not
+ present or is broken.
+ <note>
+ It is recommended that out-of-tree support be fixed and used
+ if at all possible.
+ </note>
</para>
<para>
- It's useful to have some idea of how the tasks defined by this class work
- and what they do behind the scenes.
+ It's useful to have some idea of how the tasks defined by
+ the <filename>autotools*</filename> classes work and what they do
+ behind the scenes.
<itemizedlist>
<listitem><para><link linkend='ref-tasks-configure'><filename>do_configure</filename></link> -
Regenerates the
- configure script (using <filename>autoreconf</filename>) and then launches it
- with a standard set of arguments used during cross-compilation.
- You can pass additional parameters to <filename>configure</filename> through the
+ configure script (using <filename>autoreconf</filename>) and
+ then launches it with a standard set of arguments used during
+ cross-compilation.
+ You can pass additional parameters to
+ <filename>configure</filename> through the
<filename><link linkend='var-EXTRA_OECONF'>EXTRA_OECONF</link></filename> variable.
</para></listitem>
- <listitem><para><link linkend='ref-tasks-compile'><filename>do_compile</filename></link> - Runs <filename>make</filename> with
- arguments that specify the compiler and linker.
+ <listitem><para><link linkend='ref-tasks-compile'><filename>do_compile</filename></link> -
+ Runs <filename>make</filename> with arguments that specify the
+ compiler and linker.
You can pass additional arguments through
the <filename><link linkend='var-EXTRA_OEMAKE'>EXTRA_OEMAKE</link></filename> variable.
</para></listitem>
- <listitem><para><link linkend='ref-tasks-install'><filename>do_install</filename></link> - Runs <filename>make install</filename>
- and passes in
+ <listitem><para><link linkend='ref-tasks-install'><filename>do_install</filename></link> -
+ Runs <filename>make install</filename> and passes in
<filename>${</filename><link linkend='var-D'><filename>D</filename></link><filename>}</filename>
as <filename>DESTDIR</filename>.
</para></listitem>
@@ -157,25 +180,6 @@
</para>
</section>
-<section id='ref-classes-autotools-brokensep'>
- <title><filename>autotools-brokensep.bbclass</filename></title>
-
- <para>
- The <filename>autotools-brokensep</filename> class behaves the same
- as the
- <link linkend='ref-classes-autotools'><filename>autotools</filename></link>
- class but builds with
- <link linkend='var-B'><filename>B</filename></link> ==
- <link linkend='var-S'><filename>S</filename></link>.
- This method is useful when out-of-tree build support is either not
- present or is broken.
- <note>
- It is recommended that out-of-tree support be fixed and used
- if at all possible.
- </note>
- </para>
-</section>
-
<section id='ref-classes-base'>
<title><filename>base.bbclass</filename></title>
@@ -211,14 +215,22 @@
use for this class.
<note>
For RPMs and other packages that do not contain a subdirectory,
- you should specify a "subdir" parameter.
+ you should specify an appropriate fetcher parameter to point to
+ the subdirectory.
+ For example, if BitBake is using the Git fetcher
+ (<filename>git://</filename>), the "subpath" parameter limits
+ the checkout to a specific subpath of the tree.
Here is an example where <filename>${BP}</filename> is used so that
the files are extracted into the subdirectory expected by the
default value of
<link linkend='var-S'><filename>S</filename></link>:
<literallayout class='monospaced'>
- SRC_URI = "http://example.com/downloads/somepackage.rpm;subdir=${BP}"
+ SRC_URI = "git://example.com/downloads/somepackage.rpm;subpath=${BP}"
</literallayout>
+ See the
+ "<ulink url='&YOCTO_DOCS_BB_URL;#bb-fetchers'>Fetchers</ulink>"
+ section in the BitBake User Manual for more information on
+ supported BitBake Fetchers.
</note>
</para>
</section>
@@ -552,10 +564,10 @@
</section>
<section id='ref-classes-cpan'>
- <title><filename>cpan.bbclass</filename></title>
+ <title><filename>cpan*.bbclass</filename></title>
<para>
- The <filename>cpan</filename> class supports Perl modules.
+ The <filename>cpan*</filename> classes support Perl modules.
</para>
<para>
@@ -574,6 +586,8 @@
using <filename>cpan_build.bbclass</filename> in their recipes.
</para></listitem>
</itemizedlist>
+ Both build methods inherit the <filename>cpan-base</filename> class
+ for basic Perl support.
</para>
</section>
@@ -707,25 +721,20 @@
<para>
The class is not included by default.
- To use it, you must include the following files and set the
+ To use it, you must set the
<link linkend='var-INHERIT'><filename>INHERIT</filename></link>
variable:
<literallayout class='monospaced'>
- include conf/distro/include/distro_alias.inc
- include conf/distro/include/recipe_color.inc
- include conf/distro/include/maintainers.inc
- include conf/distro/include/upstream_tracking.inc
- include conf/distro/include/package_regex.inc
INHERIT+= "distrodata"
</literallayout>
</para>
</section>
<section id='ref-classes-distutils'>
- <title><filename>distutils.bbclass</filename></title>
+ <title><filename>distutils*.bbclass</filename></title>
<para>
- The <filename>distutils</filename> class supports recipes for Python
+ The <filename>distutils*</filename> classes support recipes for Python
version 2.x extensions, which are simple.
These recipes usually only need to point to the source's archive and
then inherit the proper class.
@@ -733,8 +742,8 @@
module authors used.
<itemizedlist>
<listitem><para>Extensions that use an Autotools-based build system
- require Autotools and
- <filename>distutils</filename>-based classes in their recipes.
+ require Autotools and the classes based on
+ <filename>distutils</filename> in their recipes.
</para></listitem>
<listitem><para>Extensions that use build systems based on
<filename>distutils</filename> require
@@ -746,18 +755,26 @@
class in their recipes.
</para></listitem>
</itemizedlist>
+ The <filename>distutils-common-base</filename> class is required by
+ some of the <filename>distutils*</filename> classes to provide common
+ Python2 support.
+ </para>
+
+ <para>
+ The <filename>distutils-tools</filename> class supports recipes for
+ additional "distutils" tools.
</para>
</section>
<section id='ref-classes-distutils3'>
- <title><filename>distutils3.bbclass</filename></title>
+ <title><filename>distutils3*.bbclass</filename></title>
<para>
- The <filename>distutils3</filename> class supports recipes for Python
+ The <filename>distutils3*</filename> classes support recipes for Python
version 3.x extensions, which are simple.
These recipes usually only need to point to the source's archive and
then inherit the proper class.
- Building is split into two methods depending on which method the
+ Building is split into three methods depending on which method the
module authors used.
<itemizedlist>
<listitem><para>Extensions that use an Autotools-based build system
@@ -774,6 +791,14 @@
class in their recipes.
</para></listitem>
</itemizedlist>
+ The <filename>distutils3*</filename> classes either inherit their
+ corresponding <filename>distutils*</filename> class or replicate them
+ using a Python3 version instead (e.g.
+ <filename>distutils3-base</filename> inherits
+ <filename>distutils-common-base</filename>, which is the same as
+ <filename>distutils-base</filename> but inherits
+ <filename>python3native</filename> instead of
+ <filename>pythonnative</filename>).
</para>
</section>
@@ -905,6 +930,19 @@
</para>
</section>
+<section id='ref-classes-fs-uuid'>
+ <title><filename>fs-uuid.bbclass</filename></title>
+
+ <para>
+ The <filename>fs-uuid</filename> class extracts UUID from
+ <filename>${</filename><link linkend='var-ROOTFS'><filename>ROOTFS</filename></link><filename>}</filename>,
+ which must have been built by the time that this function gets called.
+ The <filename>fs-uuid</filename> class only works on
+ <filename>ext</filename> file systems and depends on
+ <filename>tune2fs</filename>.
+ </para>
+</section>
+
<section id='ref-classes-gconf'>
<title><filename>gconf.bbclass</filename></title>
@@ -1255,6 +1293,15 @@
</para>
</section>
+<section id='ref-classes-image-buildinfo'>
+ <title><filename>image-buildinfo.bbclass</filename></title>
+
+ <para>
+ The <filename>image-buildinfo</filename> class writes information
+ to the target filesystem on <filename>/etc/build</filename>.
+ </para>
+</section>
+
<section id='ref-classes-image_types'>
<title><filename>image_types.bbclass</filename></title>
@@ -1364,10 +1411,21 @@
the OpenEmbedded build process.
<note>
This class is currently unmaintained.
+ The <filename>strace</filename> package needs to be installed
+ in the build host as a dependency for this tool.
</note>
</para>
</section>
+<section id='ref-classes-image-vm'>
+ <title><filename>image-vm.bbclass</filename></title>
+
+ <para>
+ The <filename>image-vm</filename> class supports building VM
+ images.
+ </para>
+</section>
+
<section id='ref-classes-image-vmdk'>
<title><filename>image-vmdk.bbclass</filename></title>
@@ -1868,6 +1926,25 @@
</para>
</section>
+<section id='ref-classes-kernel-fitimage'>
+ <title><filename>kernel-fitimage.bbclass</filename></title>
+
+ <para>
+ The <filename>kernel-fitimage</filename> class provides support to
+ pack zImages.
+ </para>
+</section>
+
+<section id='ref-classes-kernel-grub'>
+ <title><filename>kernel-grub.bbclass</filename></title>
+
+ <para>
+ The <filename>kernel-grub</filename> class updates the boot area and
+ the boot menu with the kernel as the priority boot mechanism while
+ installing a RPM to update the kernel on a deployed target.
+ </para>
+</section>
+
<section id='ref-classes-kernel-module-split'>
<title><filename>kernel-module-split.bbclass</filename></title>
@@ -1878,6 +1955,24 @@
</para>
</section>
+<section id='ref-classes-kernel-uboot'>
+ <title><filename>kernel-uboot.bbclass</filename></title>
+
+ <para>
+ The <filename>kernel-uboot</filename> class provides support for
+ building from vmlinux-style kernel sources.
+ </para>
+</section>
+
+<section id='ref-classes-kernel-uimage'>
+ <title><filename>kernel-uimage.bbclass</filename></title>
+
+ <para>
+ The <filename>kernel-uimage</filename> class provides support to
+ pack uImage.
+ </para>
+</section>
+
<section id='ref-classes-kernel-yocto'>
<title><filename>kernel-yocto.bbclass</filename></title>
@@ -1888,6 +1983,15 @@
</para>
</section>
+<section id='ref-classes-kernelsrc'>
+ <title><filename>kernelsrc.bbclass</filename></title>
+
+ <para>
+ The <filename>kernelsrc</filename> class sets the Linux kernel
+ source and version.
+ </para>
+</section>
+
<section id='ref-classes-lib_package'>
<title><filename>lib_package.bbclass</filename></title>
@@ -1902,6 +2006,25 @@
</para>
</section>
+<section id='ref-classes-libc*'>
+ <title><filename>libc*.bbclass</filename></title>
+
+ <para>
+ The <filename>libc*</filename> classes support recipes that build
+ packages with <filename>libc</filename>:
+ <itemizedlist>
+ <listitem><para>The <filename>libc-common</filename> class
+ provides common support for building with
+ <filename>libc</filename>.
+ </para></listitem>
+ <listitem><para>The <filename>libc-package</filename> class
+ supports packaging up <filename>glibc</filename> and
+ <filename>eglibc</filename>.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+</section>
+
<section id='ref-classes-license'>
<title><filename>license.bbclass</filename></title>
@@ -1926,6 +2049,16 @@
</para>
</section>
+<section id='ref-classes-linuxloader'>
+ <title><filename>linuxloader.bbclass</filename></title>
+
+ <para>
+ Provides the function <filename>linuxloader()</filename>, which gives
+ the value of the dynamic loader/linker provided on the platform.
+ This value is used by a number of other classes.
+ </para>
+</section>
+
<section id='ref-classes-logging'>
<title><filename>logging.bbclass</filename></title>
@@ -1971,6 +2104,15 @@
</para>
</section>
+<section id='ref-classes-migrate_localcount'>
+ <title><filename>migrate_localcount.bbclass</filename></title>
+
+ <para>
+ The <filename>migrate_localcount</filename> class verifies a recipe's
+ localcount data and increments it appropriately.
+ </para>
+</section>
+
<section id='ref-classes-mime'>
<title><filename>mime.bbclass</filename></title>
@@ -2487,17 +2629,18 @@
<title><filename>pkgconfig.bbclass</filename></title>
<para>
- The <filename>pkg-config</filename> class provides a standard way to get
- header and library information.
+ The <filename>pkgconfig</filename> class provides a standard way to get
+ header and library information by using <filename>pkg-config</filename>.
This class aims to smooth integration of
<filename>pkg-config</filename> into libraries that use it.
</para>
<para>
- During staging, BitBake installs <filename>pkg-config</filename> data into the
- <filename>sysroots/</filename> directory.
- By making use of sysroot functionality within <filename>pkg-config</filename>,
- this class no longer has to manipulate the files.
+ During staging, BitBake installs <filename>pkg-config</filename>
+ data into the <filename>sysroots/</filename> directory.
+ By making use of sysroot functionality within
+ <filename>pkg-config</filename>, the <filename>pkgconfig</filename>
+ class no longer has to manipulate the files.
</para>
</section>
@@ -2536,6 +2679,9 @@
Supports creation of the SDK given the opkg (IPK format)
package manager.
</para></listitem>
+ <listitem><para><emphasis><filename>populate_sdk_ext</filename>:</emphasis>
+ Supports extensible SDK creation under all package managers.
+ </para></listitem>
</itemizedlist>
</para>
@@ -2692,6 +2838,16 @@
</para>
</section>
+<section id='ref-classes-python3native'>
+ <title><filename>python3native.bbclass</filename></title>
+
+ <para>
+ The <filename>python3native</filename> class supports using the
+ native version of Python 3 built by the build system rather than
+ support of the version provided by the build host.
+ </para>
+</section>
+
<section id='ref-classes-pythonnative'>
<title><filename>pythonnative.bbclass</filename></title>
@@ -2773,6 +2929,16 @@
</para>
</section>
+<section id='ref-classes-recipe_sanity'>
+ <title><filename>recipe_sanity.bbclass</filename></title>
+
+ <para>
+ The <filename>recipe_sanity</filename> class checks for the presence
+ of any host system recipe prerequisites that might affect the
+ build (e.g. variables that are set or software that is present).
+ </para>
+</section>
+
<section id='ref-classes-relocatable'>
<title><filename>relocatable.bbclass</filename></title>
@@ -2871,6 +3037,11 @@
The <filename>rootfs_ipk</filename> class, which supports
creation of root filesystems for images built using
<filename>.ipk</filename> packages.</para></listitem>
+ <listitem><para>
+ The <filename>rootfsdebugfiles</filename> class, which installs
+ additional files found on the build host directly into the
+ root filesystem.
+ </para></listitem>
</itemizedlist>
</para>
@@ -2948,6 +3119,15 @@
</para>
</section>
+<section id='ref-classes-sign_rpm'>
+ <title><filename>sign_rpm.bbclass</filename></title>
+
+ <para>
+ The <filename>sign_rpm</filename> class supports generating signed
+ RPM packages.
+ </para>
+</section>
+
<section id='ref-classes-sip'>
<title><filename>sip.bbclass</filename></title>
@@ -3181,28 +3361,40 @@
</para>
</section>
-<section id='ref-classes-testimage'>
- <title><filename>testimage.bbclass</filename></title>
+<section id='ref-classes-testimage*'>
+ <title><filename>testimage*.bbclass</filename></title>
<para>
- The <filename>testimage</filename> class supports running automated
- tests against images using QEMU and on actual hardware.
- The class handles loading the tests and starting the image.
+ The <filename>testimage*</filename> classes support running
+ automated tests against images using QEMU and on actual hardware.
+ The classes handle loading the tests and starting the image.
+ To use the classes, you need to perform steps to set up the
+ environment.
</para>
<para>
- To use the class, you need to perform steps to set up the
- environment.
The tests are commands that run on the target system over
<filename>ssh</filename>.
- they are written in Python and make use of the
+ Each test is written in Python and makes use of the
<filename>unittest</filename> module.
</para>
<para>
+ The <filename>testimage.bbclass</filename> runs tests on an image
+ when called using the following:
+ <literallayout class='monospaced'>
+ $ bitbake -c testimage <replaceable>image</replaceable>
+ </literallayout>
+ The <filename>testimage-auto</filename> class runs tests on an image
+ after the image is constructed (i.e.
+ <link linkend='var-TEST_IMAGE'><filename>TEST_IMAGE</filename></link>
+ must be set to "1").
+ </para>
+
+ <para>
For information on how to enable, run, and create new tests, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#performing-automated-runtime-testing'>Performing Automated Runtime Testing</ulink>"
- section.
+ section in the Yocto Project Development Manual.
</para>
</section>
@@ -3385,24 +3577,29 @@
</section>
<section id='ref-classes-useradd'>
- <title><filename>useradd.bbclass</filename></title>
+ <title><filename>useradd*.bbclass</filename></title>
<para>
- The <filename>useradd</filename> class supports the addition of users
+ The <filename>useradd*</filename> classes support the addition of users
or groups for usage by the package on the target.
For example, if you have packages that contain system services that
- should be run under their own user or group, you can use this class to
- enable creation of the user or group.
+ should be run under their own user or group, you can use these classes
+ to enable creation of the user or group.
The <filename>meta-skeleton/recipes-skeleton/useradd/useradd-example.bb</filename>
recipe in the <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>
provides a simple example that shows how to add three
users and groups to two packages.
See the <filename>useradd-example.bb</filename> recipe for more
- information on how to use this class.
+ information on how to use these classes.
</para>
<para>
- The <filename>useradd</filename> class supports the
+ The <filename>useradd_base</filename> class provides basic
+ functionality for user or groups settings.
+ </para>
+
+ <para>
+ The <filename>useradd*</filename> classes support the
<link linkend='var-USERADD_PACKAGES'><filename>USERADD_PACKAGES</filename></link>,
<link linkend='var-USERADD_PARAM'><filename>USERADD_PARAM</filename></link>,
<link linkend='var-GROUPADD_PARAM'><filename>GROUPADD_PARAM</filename></link>,
@@ -3410,10 +3607,6 @@
<link linkend='var-GROUPMEMS_PARAM'><filename>GROUPMEMS_PARAM</filename></link>
variables.
</para>
-</section>
-
-<section id='ref-classes-useradd-staticids'>
- <title><filename>useradd-staticids.bbclass</filename></title>
<para>
The <filename>useradd-staticids</filename> class supports the addition
@@ -3457,7 +3650,8 @@
</para>
<note><title>Notes</title>
- You do not use this class directly.
+ You do not use the <filename>useradd-staticids</filename>
+ class directly.
You either enable or disable the class by setting the
<filename>USERADDEXTENSION</filename> variable.
If you enable or disable the class in a configured system,
diff --git a/documentation/ref-manual/ref-manual.xml b/documentation/ref-manual/ref-manual.xml
index 0b4eddf..a296b9b 100644
--- a/documentation/ref-manual/ref-manual.xml
+++ b/documentation/ref-manual/ref-manual.xml
@@ -93,9 +93,9 @@
<revremark>Released with the Yocto Project 1.8 Release.</revremark>
</revision>
<revision>
- <revnumber>1.9</revnumber>
+ <revnumber>2.0</revnumber>
<date>October 2015</date>
- <revremark>Released with the Yocto Project 1.9 Release.</revremark>
+ <revremark>Released with the Yocto Project 2.0 Release.</revremark>
</revision>
</revhistory>
diff --git a/documentation/ref-manual/ref-tasks.xml b/documentation/ref-manual/ref-tasks.xml
index 59b4d96..21403c0 100644
--- a/documentation/ref-manual/ref-tasks.xml
+++ b/documentation/ref-manual/ref-tasks.xml
@@ -619,6 +619,15 @@
</para>
</section>
+ <section id='ref-tasks-kernel_metadata'>
+ <title><filename>do_kernel_metadata</filename></title>
+
+ <para>
+ Collects kernel metadata for a
+ <filename>linux-yocto</filename> style kernel.
+ </para>
+ </section>
+
<section id='ref-tasks-menuconfig'>
<title><filename>do_menuconfig</filename></title>
@@ -638,6 +647,14 @@
</para>
</section>
+ <section id='ref-tasks-shared_workdir'>
+ <title><filename>do_shared_workdir</filename></title>
+
+ <para>
+ Creates the shared working directory for the kernel.
+ </para>
+ </section>
+
<section id='ref-tasks-sizecheck'>
<title><filename>do_sizecheck</filename></title>
diff --git a/documentation/ref-manual/ref-variables.xml b/documentation/ref-manual/ref-variables.xml
index 4c4fc22..0b2c426 100644
--- a/documentation/ref-manual/ref-variables.xml
+++ b/documentation/ref-manual/ref-variables.xml
@@ -3533,6 +3533,45 @@
</glossdef>
</glossentry>
+ <glossentry id='var-EXCLUDE_FROM_SHLIBS'><glossterm>EXCLUDE_FROM_SHLIBS</glossterm>
+ <info>
+ EXCLUDE_FROM_SHLIBS[doc] = "Causes the OpenEmbedded build system's shared libraries resolver to exclude an entire package when scanning for shared libraries."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Triggers the OpenEmbedded build system's shared libraries
+ resolver to exclude an entire package when scanning for
+ shared libraries.
+ <note>
+ The shared libraries resolver's functionality results
+ in part from the internal function
+ <filename>package_do_shlibs</filename>, which is part of
+ the
+ <link linkend='ref-tasks-package'><filename>do_package</filename></link>
+ task.
+ You should be aware that the shared libraries resolver
+ might implicitly define some dependencies between
+ packages.
+ </note>
+ The <filename>EXCLUDE_FROM_SHLIBS</filename> variable is
+ similar to the
+ <link linkend='var-PRIVATE_LIBS'><filename>PRIVATE_LIBS</filename></link>
+ variable, which excludes a package's particular libraries
+ only and not the whole package.
+ </para>
+
+ <para>
+ Use the
+ <filename>EXCLUDE_FROM_SHLIBS</filename> variable by
+ setting it to "1" for a particular package:
+ <literallayout class='monospaced'>
+ EXCLUDE_FROM_SHLIBS = "1"
+ </literallayout>
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-EXCLUDE_FROM_WORLD'><glossterm>EXCLUDE_FROM_WORLD</glossterm>
<info>
EXCLUDE_FROM_WORLD[doc] = "Directs BitBake to exclude a recipe from world builds (i.e. bitbake world)."
@@ -5532,6 +5571,9 @@
within the function, you can use
<filename>${IMAGE_ROOTFS}</filename>, which points to
the directory that becomes the root filesystem image.
+ See the
+ <link linkend='var-IMAGE_ROOTFS'><filename>IMAGE_ROOTFS</filename></link>
+ variable for more information.
</para>
</glossdef>
</glossentry>
@@ -5557,6 +5599,9 @@
within the function, you can use
<filename>${IMAGE_ROOTFS}</filename>, which points to
the directory that becomes the root filesystem image.
+ See the
+ <link linkend='var-IMAGE_ROOTFS'><filename>IMAGE_ROOTFS</filename></link>
+ variable for more information.
</para>
</glossdef>
</glossentry>
@@ -5723,32 +5768,45 @@
Specifies the complete list of supported image types
by default:
<literallayout class='monospaced'>
- jffs2
- jffs2.sum
+ btrfs
+ cpio
+ cpio.gz
+ cpio.lz4
+ cpio.lzma
+ cpio.xz
cramfs
+ elf
ext2
- ext2.gz
ext2.bz2
+ ext2.gz
+ ext2.lzma
ext3
ext3.gz
- ext2.lzma
- btrfs
- live
+ ext4
+ ext4.gz
+ hdddirect
+ hddimg
+ iso
+ jffs2
+ jffs2.sum
+ multiubi
+ qcow2
squashfs
+ squashfs-lzo
squashfs-xz
- ubi
- ubifs
tar
- tar.gz
tar.bz2
+ tar.gz
+ tar.lz4
tar.xz
- cpio
- cpio.gz
- cpio.xz
- cpio.lzma
+ ubi
+ ubifs
vdi
vmdk
- elf
+ wic
+ wic.bz2
+ wic.gz
+ wic.lzma
</literallayout>
</para>
@@ -6409,6 +6467,21 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
</glossdef>
</glossentry>
+ <glossentry id='var-KERNEL_ALT_IMAGETYPE'><glossterm>KERNEL_ALT_IMAGETYPE</glossterm>
+ <info>
+ KERNEL_ALT_IMAGETYPE[doc] = "Specifies an alternate kernel image type for creation."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Specifies an alternate kernel image type for creation in
+ addition to the kernel image type specified using the
+ <link linkend='var-KERNEL_IMAGETYPE'><filename>KERNEL_IMAGETYPE</filename></link>
+ variable.
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-KERNEL_CLASSES'><glossterm>KERNEL_CLASSES</glossterm>
<info>
KERNEL_CLASSES[doc] = "A list of classes defining kernel image types that kernel class should inherit."
@@ -6430,6 +6503,34 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
</glossdef>
</glossentry>
+ <glossentry id='var-KERNEL_DEVICETREE'><glossterm>KERNEL_DEVICETREE</glossterm>
+ <info>
+ KERNEL_DEVICETREE[doc] = "Specifies the name of the generated Linux kernel device tree (i.e. the <filename>.dtb</filename>) file."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Specifies the name of the generated Linux kernel device tree
+ (i.e. the <filename>.dtb</filename>) file.
+ <note>
+ Legacy support exists for specifying the full path
+ to the device tree.
+ However, providing just the <filename>.dtb</filename>
+ file is preferred.
+ </note>
+ In order to use this variable, you must have the include
+ files in your kernel recipe:
+ <literallayout class='monospaced'>
+ require recipes-kernel/linux/linux-dtb.inc
+ </literallayout>
+ or
+ <literallayout class='monospaced'>
+ require recipes-kernel/linux/linux-yocto.inc
+ </literallayout>
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-KERNEL_EXTRA_ARGS'><glossterm>KERNEL_EXTRA_ARGS</glossterm>
<info>
KERNEL_EXTRA_ARGS[doc] = "Specifies additional make command-line arguments the OpenEmbedded build system passes on when compiling the kernel."
@@ -6559,6 +6660,12 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
when building the kernel and is passed to <filename>make</filename> as the target to
build.
</para>
+
+ <para>
+ If you want to build an alternate kernel image type, use the
+ <link linkend='var-KERNEL_ALT_IMAGETYPE'><filename>KERNEL_ALT_IMAGETYPE</filename></link>
+ variable.
+ </para>
</glossdef>
</glossentry>
@@ -6697,6 +6804,46 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
</glossdef>
</glossentry>
+ <glossentry id='var-KERNEL_VERSION'><glossterm>KERNEL_VERSION</glossterm>
+ <info>
+ KERNEL_VERSION[doc] = "Specifies the version of the kernel as extracted from version.h or utsrelease.h within the kernel sources."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Specifies the version of the kernel as extracted from
+ <filename>version.h</filename> or
+ <filename>utsrelease.h</filename> within the kernel sources.
+ Effects of setting this variable do not take affect until
+ the kernel has been configured.
+ Consequently, attempting to refer to this variable in
+ contexts prior to configuration will not work.
+ </para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry id='var-KERNELDEPMODDEPEND'><glossterm>KERNELDEPMODDEPEND</glossterm>
+ <info>
+ KERNELDEPMODDEPEND[doc] = "Specifies whether or not to use the data referenced through the PKGDATA_DIR directory."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Specifies whether the data referenced through
+ <link linkend='var-PKGDATA_DIR'><filename>PKGDATA_DIR</filename></link>
+ is needed or not.
+ The <filename>KERNELDEPMODDEPEND</filename> does not
+ control whether or not that data exists,
+ but simply whether or not it is used.
+ If you do not need to use the data, set the
+ <filename>KERNELDEPMODDEPEND</filename> variable in your
+ <filename>initramfs</filename> recipe.
+ Setting the variable there when the data is not needed
+ avoids a potential dependency loop.
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-KFEATURE_DESCRIPTION'><glossterm>KFEATURE_DESCRIPTION</glossterm>
<info>
KFEATURE_DESCRIPTION[doc] = "Provides a short description of a configuration fragment. You use this variable in the .scc file that describes a configuration fragment file."
@@ -7376,6 +7523,16 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
<literallayout class='monospaced'>
MACHINE_ESSENTIAL_EXTRA_RRECOMMENDS += "kernel-module-ab123"
</literallayout>
+ <note>
+ In this example, the
+ <filename>kernel-module-ab123</filename> recipe
+ needs to explicitly set its
+ <link linkend='var-PACKAGES'><filename>PACKAGES</filename></link>
+ variable to ensure that BitBake does not use the
+ kernel recipe's
+ <link linkend='var-PACKAGES_DYNAMIC'><filename>PACKAGES_DYNAMIC</filename></link>
+ variable to satisfy the dependency.
+ </note>
</para>
<para>
@@ -8311,6 +8468,32 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
</glossdef>
</glossentry>
+ <glossentry id='var-PACKAGE_EXCLUDE_COMPLEMENTARY'><glossterm>PACKAGE_EXCLUDE_COMPLEMENTARY</glossterm>
+ <info>
+ PACKAGE_EXCLUDE_COMPLEMENTARY[doc] = "Prevents specific packages from being installed when you are installing complementary packages."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Prevents specific packages from being installed when
+ you are installing complementary packages.
+ </para>
+
+ <para>
+ You might find that you want to prevent installing certain
+ packages when you are installing complementary packages.
+ For example, if you are using
+ <link linkend='var-IMAGE_FEATURES'><filename>IMAGE_FEATURES</filename></link>
+ to install <filename>dev-pkgs</filename>, you might not want
+ to install all packages from a particular multilib.
+ If you find yourself in this situation, you can use the
+ <filename>PACKAGE_EXCLUDE_COMPLEMENTARY</filename> variable
+ to specify regular expressions to match the packages you
+ want to exclude.
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-PACKAGE_EXCLUDE'><glossterm>PACKAGE_EXCLUDE</glossterm>
<info>
PACKAGE_EXCLUDE[doc] = "Packages to exclude from the installation. If a listed package is required, an error is generated."
@@ -8377,6 +8560,144 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
</glossdef>
</glossentry>
+ <glossentry id='var-PACKAGE_FEED_ARCHS'><glossterm>PACKAGE_FEED_ARCHS</glossterm>
+ <info>
+ PACKAGE_FEED_ARCHS[doc] = "Specifies user-defined package architectures when constructing package feed URIs."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Specifies the package architectures used as part of the
+ package feed URIs during the build.
+ The <filename>PACKAGE_FEED_ARCHS</filename> variable is
+ appended to the final package feed URI, which is constructed
+ using the
+ <link linkend='var-PACKAGE_FEED_URIS'><filename>PACKAGE_FEED_URIS</filename></link>
+ and
+ <link linkend='var-PACKAGE_FEED_BASE_PATHS'><filename>PACKAGE_FEED_BASE_PATHS</filename></link>
+ variables.
+ </para>
+
+ <para>
+ Consider the following example where the
+ <filename>PACKAGE_FEED_URIS</filename>,
+ <filename>PACKAGE_FEED_BASE_PATHS</filename>, and
+ <filename>PACKAGE_FEED_ARCHS</filename> variables are
+ defined in your <filename>local.conf</filename> file:
+ <literallayout class='monospaced'>
+ PACKAGE_FEED_URIS = "https://example.com/packagerepos/release \
+ https://example.com/packagerepos/updates"
+ PACKAGE_FEED_BASE_PATHS = "rpm rpm-dev"
+ PACKAGE_FEED_ARCHS = "all core2-64"
+ </literallayout>
+ Given these settings, the resulting package feeds are
+ as follows:
+ <literallayout class='monospaced'>
+ https://example.com/packagerepos/release/rpm/all
+ https://example.com/packagerepos/release/rpm/core2-64
+ https://example.com/packagerepos/release/rpm-dev/all
+ https://example.com/packagerepos/release/rpm-dev/core2-64
+ https://example.com/packagerepos/updates/rpm/all
+ https://example.com/packagerepos/updates/rpm/core2-64
+ https://example.com/packagerepos/updates/rpm-dev/all
+ https://example.com/packagerepos/updates/rpm-dev/core2-64
+ </literallayout>
+ </para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry id='var-PACKAGE_FEED_BASE_PATHS'><glossterm>PACKAGE_FEED_BASE_PATHS</glossterm>
+ <info>
+ PACKAGE_FEED_BASE_PATHS[doc] = "Specifies base path used when constructing package feed URIs."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Specifies the base path used when constructing package feed
+ URIs.
+ The <filename>PACKAGE_FEED_BASE_PATHS</filename> variable
+ makes up the middle portion of a package feed URI used
+ by the OpenEmbedded build system.
+ The base path lies between the
+ <link linkend='var-PACKAGE_FEED_URIS'><filename>PACKAGE_FEED_URIS</filename></link>
+ and
+ <link linkend='var-PACKAGE_FEED_ARCHS'><filename>PACKAGE_FEED_ARCHS</filename></link>
+ variables.
+ </para>
+
+ <para>
+ Consider the following example where the
+ <filename>PACKAGE_FEED_URIS</filename>,
+ <filename>PACKAGE_FEED_BASE_PATHS</filename>, and
+ <filename>PACKAGE_FEED_ARCHS</filename> variables are
+ defined in your <filename>local.conf</filename> file:
+ <literallayout class='monospaced'>
+ PACKAGE_FEED_URIS = "https://example.com/packagerepos/release \
+ https://example.com/packagerepos/updates"
+ PACKAGE_FEED_BASE_PATHS = "rpm rpm-dev"
+ PACKAGE_FEED_ARCHS = "all core2-64"
+ </literallayout>
+ Given these settings, the resulting package feeds are
+ as follows:
+ <literallayout class='monospaced'>
+ https://example.com/packagerepos/release/rpm/all
+ https://example.com/packagerepos/release/rpm/core2-64
+ https://example.com/packagerepos/release/rpm-dev/all
+ https://example.com/packagerepos/release/rpm-dev/core2-64
+ https://example.com/packagerepos/updates/rpm/all
+ https://example.com/packagerepos/updates/rpm/core2-64
+ https://example.com/packagerepos/updates/rpm-dev/all
+ https://example.com/packagerepos/updates/rpm-dev/core2-64
+ </literallayout>
+ </para>
+ </glossdef>
+ </glossentry>
+
+ <glossentry id='var-PACKAGE_FEED_URIS'><glossterm>PACKAGE_FEED_URIS</glossterm>
+ <info>
+ PACKAGE_FEED_URIS[doc] = "Specifies the front portion of the package feed URI used by the OpenEmbedded build system."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Specifies the front portion of the package feed URI
+ used by the OpenEmbedded build system.
+ Each final package feed URI is comprised of
+ <filename>PACKAGE_FEED_URIS</filename>,
+ <link linkend='var-PACKAGE_FEED_BASE_PATHS'><filename>PACKAGE_FEED_BASE_PATHS</filename></link>,
+ and
+ <link linkend='var-PACKAGE_FEED_ARCHS'><filename>PACKAGE_FEED_ARCHS</filename></link>
+ variables.
+ </para>
+
+ <para>
+ Consider the following example where the
+ <filename>PACKAGE_FEED_URIS</filename>,
+ <filename>PACKAGE_FEED_BASE_PATHS</filename>, and
+ <filename>PACKAGE_FEED_ARCHS</filename> variables are
+ defined in your <filename>local.conf</filename> file:
+ <literallayout class='monospaced'>
+ PACKAGE_FEED_URIS = "https://example.com/packagerepos/release \
+ https://example.com/packagerepos/updates"
+ PACKAGE_FEED_BASE_PATHS = "rpm rpm-dev"
+ PACKAGE_FEED_ARCHS = "all core2-64"
+ </literallayout>
+ Given these settings, the resulting package feeds are
+ as follows:
+ <literallayout class='monospaced'>
+ https://example.com/packagerepos/release/rpm/all
+ https://example.com/packagerepos/release/rpm/core2-64
+ https://example.com/packagerepos/release/rpm-dev/all
+ https://example.com/packagerepos/release/rpm-dev/core2-64
+ https://example.com/packagerepos/updates/rpm/all
+ https://example.com/packagerepos/updates/rpm/core2-64
+ https://example.com/packagerepos/updates/rpm-dev/all
+ https://example.com/packagerepos/updates/rpm-dev/core2-64
+ </literallayout>
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-PACKAGE_GROUP'><glossterm>PACKAGE_GROUP</glossterm>
<info>
PACKAGE_GROUP[doc] = "Defines one or more packages to include in an image when a specific item is included in IMAGE_FEATURES."
@@ -10865,6 +11186,34 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
</glossdef>
</glossentry>
+ <glossentry id='var-SKIP_FILEDEPS'><glossterm>SKIP_FILEDEPS</glossterm>
+ <info>
+ SKIP_FILEDEPS[doc] = "Enables you to remove all files from
+ the "Provides" section of an RPM package."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Enables removal of all files from the "Provides" section of
+ an RPM package.
+ Removal of these files is required for packages containing
+ prebuilt binaries and libraries such as
+ <filename>libstdc++</filename> and
+ <filename>glibc</filename>.
+ </para>
+
+ <para>
+ To enable file removal, set the variable to "1" in your
+ <filename>conf/local.conf</filename> configuration file
+ in your:
+ <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build Directory</ulink>.
+ <literallayout class='monospaced'>
+ SKIP_FILEDEPS = "1"
+ </literallayout>
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-SOC_FAMILY'><glossterm>SOC_FAMILY</glossterm>
<info>
SOC_FAMILY[doc] = "Groups together machines based upon the same family of SOC (System On Chip). You typically set this variable in a common .inc file that you include in the configuration files of all the machines."
@@ -11052,7 +11401,14 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
</para>
<para>
- The following list explains the available URI protocols:
+ The following list explains the available URI protocols.
+ URI protocols are highly dependent on particular BitBake
+ Fetcher submodules.
+ Depending on the fetcher BitBake uses, various URL
+ parameters are employed.
+ For specifics on the supported Fetchers, see the
+ "<ulink url='&YOCTO_DOCS_BB_URL;#bb-fetchers'>Fetchers</ulink>"
+ section in the BitBake User Manual.
<itemizedlist>
<listitem><para><emphasis><filename>file://</filename> -</emphasis>
Fetches files, which are usually files shipped with
@@ -11180,11 +11536,25 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
<listitem><para><emphasis><filename>unpack</filename> -</emphasis> Controls
whether or not to unpack the file if it is an archive.
The default action is to unpack the file.</para></listitem>
+ <listitem><para><emphasis><filename>destsuffix</filename> -</emphasis> Places the file
+ (or extracts its contents) into the specified
+ subdirectory of <link linkend='var-WORKDIR'><filename>WORKDIR</filename></link>
+ when the Git fetcher is used.
+ </para></listitem>
<listitem><para><emphasis><filename>subdir</filename> -</emphasis> Places the file
(or extracts its contents) into the specified
- subdirectory of <link linkend='var-WORKDIR'><filename>WORKDIR</filename></link>.
- This option is useful for unusual tarballs or other archives that
- do not have their files already in a subdirectory within the archive.
+ subdirectory of <link linkend='var-WORKDIR'><filename>WORKDIR</filename></link>
+ when the local (<filename>file://</filename>)
+ fetcher is used.
+ </para></listitem>
+ <listitem><para><emphasis><filename>localdir</filename> -</emphasis> Places the file
+ (or extracts its contents) into the specified
+ subdirectory of <link linkend='var-WORKDIR'><filename>WORKDIR</filename></link>
+ when the CVS fetcher is used.
+ </para></listitem>
+ <listitem><para><emphasis><filename>subpath</filename> -</emphasis>
+ Limits the checkout to a specific subpath of the
+ tree when using the Git fetcher is used.
</para></listitem>
<listitem><para><emphasis><filename>name</filename> -</emphasis> Specifies a
name to be used for association with <filename>SRC_URI</filename> checksums
@@ -11636,6 +12006,25 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
</glossdef>
</glossentry>
+ <glossentry id='var-STAGING_KERNEL_BUILDDIR'><glossterm>STAGING_KERNEL_BUILDDIR</glossterm>
+ <info>
+ STAGING_KERNEL_BUILDDIR[doc] = "Points to the directory containing the kernel build artifacts."
+ </info>
+ <glossdef>
+ <para role="glossdeffirst">
+<!-- <para role="glossdeffirst"><imagedata fileref="figures/define-generic.png" /> -->
+ Points to the directory containing the kernel build
+ artifacts.
+ Recipes building software that needs to access kernel
+ build artifacts
+ (e.g. <filename>systemtap-uprobes</filename>) can look in
+ the directory specified with the
+ <filename>STAGING_KERNEL_BUILDDIR</filename> variable to
+ find these artifacts after the kernel has been built.
+ </para>
+ </glossdef>
+ </glossentry>
+
<glossentry id='var-STAGING_KERNEL_DIR'><glossterm>STAGING_KERNEL_DIR</glossterm>
<info>
STAGING_KERNEL_DIR[doc] = "The directory with kernel headers that are required to build out-of-tree modules."
@@ -12569,7 +12958,7 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
these tests, see the
"<ulink url='&YOCTO_DOCS_DEV_URL;#performing-automated-runtime-testing'>Performing Automated Runtime Testing</ulink>"
section in the Yocto Project Development Manual and the
- "<link linkend='ref-classes-testimage'><filename>testimage.bbclass</filename></link>"
+ "<link linkend='ref-classes-testimage*'><filename>testimage*.bbclass</filename></link>"
section.
</para>
</glossdef>
@@ -13948,7 +14337,7 @@ recipes-graphics/xorg-font/font-alias_1.0.3.bb:PR = "${INC_PR}.3"
<filename>uid</filename> and <filename>gid</filename>
values causes the OpenEmbedded build system to employ
the
- <link linkend='ref-classes-useradd-staticids'><filename>useradd-staticids</filename></link>
+ <link linkend='ref-classes-useradd'><filename>useradd-staticids</filename></link>
class.
</note>
</para>
diff --git a/documentation/toaster-manual/figures/add-variable.png b/documentation/toaster-manual/figures/add-variable.png
new file mode 100644
index 0000000000000000000000000000000000000000..6bdcca705afe530a2c2b72c4f0d8050354c23410
GIT binary patch
literal 110712
zcmd?Qhg(zG+CCh_G9tyX3<v_20R*H-ktU#`p!D9GBE3p)Avg{&h=9@}AOu8OXd+E&
zP=wF}1PDDq=mA22B#@Bgw{_lgzB%uE{)3NeU1VK5D|@f~to5{e-A}xsz7_`?FB=F1
z;&}Y%fiVbl0_d{t{Bjcb at F_x%f<RY5k00DK4Sl~kON%(an#p|5h^E_+<IEZ&KE$O-
zxHr2$nf7i7nwpK`Ylyfuxm`bKJNuO2vlaX@>-fxB_IyRTr1QwrvEQ%0J1+8-<<uWv
zd2AeC{&Mm)>Xg+f&u2Z1NC=Pn%^qI<NX- at pOpt@(xZ6sjtL8Q8&TE&{lztRy8Y0YW
zF{;=PU57C&{J~|3jCFOQ2ptXCCEWf-HRl6*iw4wU<`UNXPg2Egp!XfNZ@}z9^g*!%
zhhb8MP!e+&+3c<){z&j{cwtr5&~kvcZzJAeoAV=tTKwM{LXc{3JetdcIXO<bvX3Zz
zbFqA%({78ke&m!}L1Hokn8|->>M)XPHp{`4eP*5 at Q}6J$j?smO|8BFe^gFC?!goB-
zGc)hsdqhReF=P*2i;-w?@S!apMLM#@S^0#iw-y%oHr)9{S6 at T^w`c4L8u)iUy+uRm
zrnl%8X+xr at yN%<BnclkA`$&X2o!kHQd6p}y%$JkQqWk7wW?0I}EH?w`@yHLuB~e5y
z;w`?aexn+4n0%^|d5V63R;T~(28rrJKD`yw at q~kub7N&7dpEpwRC#nDTR~n?@djFs
zn_spVmkGSc9`h?+9nao=s<4P2)p*-C-7|m;dh_ANtN&>NquPH$G&D5WPQDC2FzgOV
zuc*D>fEdBqRWVjqS1+=kl$VqH=%@G|<JImZ3o2c#(koM1t{Wmrg!KC6<8;z|!<C&t
z2YEk4`QH`@H4BmB9h;bVckD$pf2c&m%8Ie8<Z{+z8soqpgP5zEVX(f4?&|8gkf<3T
zz<dDeK4dzQ5u(%Q*=Aq#1eGz9a?1|EgD0c5D$TJZKAG!pA96gn_Uk}@zuOc6Gn!`b
z)$q~VM<4U}c at j09vx;0?z5(yS7IPo?FRGrLlsL^YpUgNc2Cf7vRj6OSeUUvzPDx1!
zp<a^dXIWEIb0WtuCO5iI^~o94d}zSYf7vUDP-?Pf!K(+?nnDP3pT|ws6t^kXTMVb_
zciXeg#gmhhX=kO;!DljAx(^*9>At;V-;H at Aw@6OJyIXzAQHyD~J=U*zjQukXZ}9;(
zq#Ve>^Ij(~#&=_n%NGMv-8TcT>~Zzgg_Wt%I;%FS7*xE!dQFJYM20=LRLHs(lM18G
zbWD at D9jJWtNp3_DDr!MIDg76a9i&cvnetMjBVn9=fMV)Es+WHSlM@`$J@?Fi+!BvM
z>?=@b#=UtjU9#I{v|!;w=j$h4{U2?Bv?A*=0Lg97G}dh6@{I9=IVv)GCc|!Wc>f+*
z(3y%;^dqTQ2J|9GIbHqikOQ5hur$?TmK=$v$qYQ|T4wC@;)A2fQPY=z-5#T7BGqD9
ztezMbrBC{ff|T+p_)1t8yJv;(LJ=dbYEb&&p}9ZkV7(%Wz9VAr at eV`8y$`b8haK8(
zJvB~m?*bI2Q!r7}B+8!feE9$Fc_w`fvbfPS-QYVt-EF!)ttW`_hf3`q_Sr%5>jdc7
zHn7ctpCUfose1WDG+%2deRUgx*3J#>AuSC$Oy*CFdA25ut1BvcsWbYRhw8L21Hz;$
zGindoux??XS~l2c$IH)eV%PC2cq<#*AjrhPc!PWS6E!b##+gxlnNQRihj9(~LvH)g
z$z+tL<9x1*i;K+o+Qh^+p?2o3AX{7q(6TZ!t1<lSv8KBPkUA)hOwk#e*v}{`Djth!
z(=bq_y;q~fR87_Vf>j5*bUI9w*_ElP{U77TByDFiptsv5C#?V#Cs8QV&}`u-*n#Zf
zsu#YeJ~BUf6 at DM{LroJHG#c$<5=6qP-YNGNkP=g{pP^8((#u at 2F}I|wa)I^ohje?L
z3{>~t^B2vwj8(bG!QBxK5Na6Se+DtL+x_9ViV^cLfmscsl`$i_7<3g88}2CPXiZph
zK<}zf<LO65&Wv at UOho2+LT>LDU1^?C7?|kk?>z at sk680$i at lEz_Y?h>Il18>B&G at q
zgg^TIDKoP)1=>?Qf`Q@>8#5fXaWP3D5>y9m&?D8*I#JB&6x+rW@{%)P@$6N0i}<tZ
zqJ~`5)$ZK+FyJsJj9ICmHZTuj=<ksXlKR%Az}3MJMPY0d<gP>Lfp3LXlud*9*<U<@
zgUzQA6y}dD$ptJLuzY<HEse+SqUA`dL`On`1HI^e{u>;Xd<W8Qj}cGQyM#oH(sLL`
zUdaabV6ElY{M}vuW-;*)cT8n(8a5ruClib)ST|E-G<G4f=u*xtfP?zq4HgED&kmex
z2{T#nvn+CVDgW*iFOE-vGziqq5HC=VNNY^MAOrj0`5kh+lhq@@sQoYvVoRqR#lRpF
z6E$yo7xstFx6wKv=2y;|0v1w=NntKxVHD>do&{KSz`{*@orJbgE8cTt9PPkxed^`$
zJ)*Nmwb-brNhxMS9&3gGs7Q)3JQ+a7HRpy&;;CIC!kYxan}-l)3MrbC=CU7*c~{AC
z(tHUd!t^=vh|`CumhG*gY=Vd_N!w*_o@}DmzY_*wn8O;^pn6>F{W8C!fSjR)W<uW$
z-=XhpIrDvBR!cnN3_ofS32q8oe$~{}G&(j`C{Bb`0c*D#ut<#A?X|c-$3l?ma)Bmx
z&~wOzlqTx7*b#{Izx)A{*2vrk4T;WcbG5Toq}yXXFq&%+QI`3sT;`KmQsf5%$sp&W
zqwsZYnD93~8enrU%%Z~E*}g&c>-8NquDL3CfK<GbuveDOI7~{S<>XaV%GTWxtuqP;
zO2K=4#axK=y2?qK@%<)htO6S^ZfSJ%TL_4;XTYt>h=V%R2&!YBi>^}JxVc2s0R?oi
z+b&HFAw3$9S2Ygs?xaM>)gL6uHDt}oh-F>Wr`mb>=m%6!z;jvkmz$|s>;;d}_)p%=
ze`rvbW>0Qa-h at 8kF;BPf at ZHMZ*nn9go-doUNty|D*&3#o^+6-(1#^;iO-sWM6iJlx
zbOF2Feew6?0P0?iYKDQ{eneoYZ#R{&^XDCCliY<sYqjzy11MGG8y;eNSuC<a0!N$x
z&op1dqgF$g=aR*3M3MjFuA8dFe+7lN+9L at VlxaKxBiIyfPl)of*Kl7LdkryMRX at 19
zdgtYdiiV*r5eNpdh;mK`uFk0!t1!OR!|cUx<$k}_6XgE<8pswOAhM>KyBDxgX$wpE
zc78X|uJ<4l3D2XdP6{|QTW`BAjKR}DevOzWS2*A)9VQue_>q~aNR#GZbwNZwrEg=q
zt;z4&$z#FY<Zdke$|{-JJmM_{Ssk>q+pzwHmus}mbchGd+P=?l at D1;aYB at aUd5@>{
zk_nxzGEuU4|G4Q>KZFma7-Cb%ko-PMtC>*2qQv24j6#9qQ1RU>Zvwyzj)rP5gEmKL
z&*TL^!>^9gxOl;qx!*h7jEC|CJ^5IW+ynk7%xTo~^wse5a23yF- at 3ASoM4Msi2VzP
z^ej|J502O!P;C`!RJhH~;@C at e^>Oz-I+Us}KB;JtoYp5 at o|)aFUR)(L?R2;gAvtTr
z8o8=sLmmQFA-3{#+%j1CDUS?q__!C7+nP>LBltxImsRwo%IMS-Q<A<lCNa+?SrpN~
zWYKMqJIgJDFUqI6ux1^VcHtPjO&zh4OmtY^`e)cy6~uhoeILZb7PGk{N({JhLHkgN
zL^RsMZm0Au8 at q2kjF>dM at iB8axwdn8B%>I0;Zs{?TF}RGDeuF5>rzr2a<F^ZzjUME
zt8<0aWdRdh>NIJo&kk at oI=oopW9 at Y+%$MOIly9rBSFc`;zG5;Cxo9;o$m8>l9;oD-
z0tCaS-ySwrF5OyimZzasYj(n07zz at uC)QaXReg8jhf3lNaL`W1<2#RN?vsOQ&aN&l
z`%s7Q2bBXhq(%fov$rR^%^odRw?$wMH%)eNw+X|1t%3D{9k$dZ!Zr^wb<u&B4X6hq
z!Xh<;pq8l+yGq2XWLnQ|Io$!@>{Er0htXwl<jvfUqNeQwIexjCBq<DIAmkA5&NBaP
z7pDv<zb%nAQK+D9^}anW?vBTVO=gqVp-;{xukPe{VvVnxh4qk8BZY&c*DrSNOFrxJ
z8HALS6!ghv2GTXr{o8aUYr1>Q#|>+F#q$o3Jd21vu5La~{9tFQ@~1N6*lHWqwj+wg
zCno*jJ>9XkmvHq+zv1$x-q`*cH4Ey&g_g*jCQkEbp{xUjqOInaM at f!kg*Wj!9B2BP
zv5!wDR_v8nwJimR^&S3Z{ghecdpEbOnN90j at Wf<b(6=XtdHSZ8;2up)OY~-I0wjK!
zHs{YRXA(dm&b44*;VntUmy;jtsH>`E*9wYYJ~F at Gl7mJtQ2V95(t#hPzIaqsjj1vC
zz+wN01DLkXSuWZj9(L<g)pP11-%6IS5=T)Fq|`i4L`!0RlPBp(-BBY}3j{UpuMq|%
zthI`IYZ+eC230_gVivz at Ez6Bs+c3Q1%A7<hR8DP4dLPbqKI~hXhAh7Oef3Ia5(KaU
z(|gPe`_~Zj$$<UZJGn7ETmq<v@=X<w#a)}G$9B4e1{5pQL(L-2!NP(OWp}4S!?82`
zOx;>73oxEWMdTh`@?vdeC at 4w1FFhw>vS_`(gk6UFs#4$azXlSGu?PapzE*eHq<ITj
zMiKC{#SHEI1#Xy?NRG70{}Hu6NLC|Pk at u?h6;H9Orwf2wtXC2o4vSj*Cl0<iG1Wu8
z;#z04T-667*gcKFmpZbZ^CuS*wNPaD5y2FQ*In0SHQ%_iWFp0(#^sXP<<T(0o1^?U
z!bob+hF>~+$I!ZpxtmI8+hF)}g<Nyy(8nXjV~$W1-ZAECN2uBLx9+o~@UftcPwcon
z$?(?Q(3UKAExEaXeyYWbmjfGoS*ADSL<yb0iKmrCYFvN&*EJUL?<G^tcJ&dTsvmOG
zVlU(jggDF?ZGC9(lpq|ntgNgCd7u`hR}w3U&N<97ldH44A0Y?_f#t?R!*SBda!CGU
zfc9JhNrqj+JH%zvJ{48aziPS|8PHb}dJmaAHYF<&vIRC%y*?gx?#nRTZn-&dHx?D8
zKR at WcC8nM?clSZVTot;Kd%8U6R3%(Y6!iYmrt$2Y9T8_zYGGr5uloq{JL;MYmA;Jl
z*j#CLUAAu;+o#F^`)-Ne0Lj7UMnmoKgOM#VZQE$FllBRpl3<HM^7t5F4^s|yduNrS
zh)LJp{&k-+=tikjwrd;ChX!Ag3Fb$qxqEypHj79l2W?gFkq_VavtR$!bMpH#dAT`g
z^QhwEt%E>@WrY}ysc6{fS!EreS-$t3fsFOvQuZ@$>wX=s-v+lMI`@f(tS8nen3G8L
zM0=*E%|9cmB6l$!_KmJYzNCe$fVJBnI*1^@ggzk*ncl?BRqY~-S~r5~Ov7lu3wR~s
z=~H6f*ryVRidtiDh2o1m)CVdJ-X=kwh(EsO9eZ(Ae)HyV{byy46UTszuZi-!qTXB7
z1o<c&q*#vW)!7d<tBbNRKgV^gp{$(h&2gd}R8{k&SUY&UbZd(~wc=me1iqUe0j)!n
zkMh>^6{a8|Wy!t<$d`S6R8oQZxF=Mr+?zeb17cOm at 2|#~7H&p5O5gCc$q~TTcTSzM
z5ikqeqGi2XGdwJqt|0kNR&GthY~{#zBO_njz2YR4^f(;!t~7<Uy-t}Kk+d~PpG3}<
z57u)(Grin%Fe!5`{>HgSY at kH39Kpv?M at jrLys<VG;BkUhc&b_%&+=3q#f+3>lRT?z
zS8R7GX??S&DF*48j1&<#5x7!lr|h at eb)Wfy4=zz<dvLVTobPlhcp4T22p<0o_1Cqx
zo3K<&4I3M1FHGZ6<&v}7(ONnGYkD7o4{#p|`gxg|nK5}=0XAd1KKKu$A87)R8U)c~
z7ImOi6UibDCtH?%+bYU1RGFj*H#f`c1x{p$h{Lg?RzXHU*Xrn)!c<=*ei#`TGH<U9
zIBU!8S=3~o7ZB!7JB()%&Xl~NH>PnvD at xrNoMe@G&6dOemz!k$PR!ft#xRcesy92N
z1A~Xy&TC4x-RzjS?)%KX+U=TNlGts9((sNUPdg_dBUROcKf8RV>ag*hiz_ZZK&~hZ
z0u^J|K>Auji38uISaRbb?#|y^Dp+IlUr`fAT1YdGe*ZA(rkmALBGxf9hi<rddcV_k
z-E8g1 at WEcdt%tbyU^U-I*H`f}ZR;(eN9B^a>Y0b1r|gj2t)Ujw(2Ff?rG0$|ob5Mh
zZc8n_92%!k?BcwQE- at 9pff8!Ty0Xiw`$XYW_Ho$;>!y1P2N28#`i-aq)&@{;t;Hv4
z?peDe{<lv|OFhM^x37;k(FMf6?7kM43Ai5B=ozzNqc2i{dDGle at F)+%_8QI!U*31;
zS9Kd`DZ4YCy*Fc7K~eWaICFwzQB!iJ)dbdor2sV!SWPmfJaakp;WedW?J+vNWt;+I
z>*#?gizjpn(H<6=+mO;_mk&-9^ek5(+6nmZdn*-ofycejyHm1R)eYWsp>4$QIj-AW
z at Ww)`Q)P<_;ixZw(kt7;Ya77iz=YPV at xIldgLwfno>(~fvMD;wLjEj-!v^Oy+;-4p
z?Q>wU&r`KTbRbaviS#g+%@=n^+uGC)=~2kLVgZljy#_!>MDZqa4@;x1<d)l729{vq
z_C1T`3q9lqpcE9Id~rzCnxWDfI*%dlY(2NjT{CIy6SA0`-aYY>jkDp0!b at TbJoxIr
zeNHvAS at JjQ$^Px#iI*Kyuy-%MET3+jm?&Azo$)#GdfWWO%X at Y+uwMwa{@$Wy=yaWN
zvaO^lai692pjiZ$tX?@-9ew}2pl5Sm;YKn+lxNe-?9Ks=^n#nz{7S1Luj=!|Hb=t_
zZjayU=~O(qUdIzV{^FHLo$8!cCz{lB%Q<n9K$)f~VHn$ZybWNOoChJWxj-q~_~1F*
zTVyVMb$C(}FFVq9o_l|LFLtKbM|81P4WZ at JF_hcovL(yjn2h}-NFlXc?I<zaE7iQD
znSK$JWNTXZq`PFQI0IcgHu42UWhZJTUwiv#<f8ROk2^uu5~PU5)I6UX=ZNbSY#JA}
zDvP`jK%DShRua9BAN9dE#wF*Dtea at zV1=A(<GLHJpAz?}*rnR)bb<Mr2+H(=C2Gtb
zxvJ0_W(y$?VK$vZj#eS=gfn&F>*<<wgLE4kfx~+GL{)CMu=5=>I*PuCfYeB%cK~?G
zq`($6c4Uu27?wHEv9eR-9LT7v8uJs7|HGzP?5>>sB&Eklh+}9XW?K!mT`3zX%$@T&
zN)h&eH<w-b1g1Rwk+)A_qYToSlybm})~+6M??0H-r&S{kMy_vcH)aJuD##8z>vf9d
znIl9o;Pq%1vh7-qyu7Tn#M#YSC(8h}eJidvWrEG0e2C{PDg8F&X(93~tElp}S&tv0
zpn9M9 at V;_HC~R(z3S2FsmV^An7@>I-J#okPi4xmV=h7P{B?^u>4j1orenqps8d$+1
z%&z7{<zI6;o7y_Fk!3x1Ca^OZas?d%>Ov5taGQu20;pv%Kmb{XYsTFpl<NkV^OG*h
zyyo6_?|zLia^VD_k<edSc$<agxf4Wx%SJ!5C}8g}+{&B|22Ctky|Z(t4~BQ>D><Yd
zYqzP8>Xv5bCmqNuK%4ACQngmnNZcK58TJ4?HZXv~N7B{CAoCJywpQy3Yonk~_q7Zh
z(nR{$^$iRfex%pK&#fAY?<e6M6z$(WM0yV6)!fx3H?A_cJvtZmMvmS;tyUU{qm~DF
z5oo-Lf>KTf3Bp1HsF*<i2Kml5DY>e~#&;_#PED2$LLE0SjSEZONai2qC75?B7ZW<=
zsvh%K$UNIr7DXT;i1l>yHRe;=o0S#c9&a8Ga#mKt!)2wXbm!Sk4omziQdtyA4IGJa
zn5TW6;%8oj(7C at v{WCsYP7=AyDbB+_#o~DN;xFu_WFx5UG?$ydizYHRuxELy=zPO5
zwxk9mYkL40l`No$@H?N#hg|Y+++Ui;1g)%Z`8Vc{*4 at 2}i#HrtHV&eF`r}>|d=dYc
zYiJWRLi$ruU&yEBS3_K?WTS22#=Bo8SsXj at vjC`K<Y1C%D+$ewqGYIM<jb0e9){Yv
zYJ(>D9O{R04baxz#q<7+^=05t+p6>;--v!*gY`b%93s9Gh=C#bCbF`!qE4s=DwSGJ
zm@{aK at GH_j9_<;#i1UFB9=6hAjq*)qxofAT_ZM1k;(@aTkxF=Rqjs!OaYT_Qntgqr
zMI*NPAw^9U(C8GTs|TE-hYx6hs70}k=B4|}g+0qU14HSPwB)!G+<hcVRsaRov$z<4
zuy20ECff{KLK!nW!{?*}clO_`;9!pl^<U7!HP3Qy)Z|t%^*o6ux!Gd&#|{#2G5q_k
z10c2)6ydl2xov;Ux6oGRy)A?qQ`Jr1v_FA69THCOFcA0wAuA-ILI5ysz^1`{iqH_@
zr%r33t3rB64On_U{n{>#m0D^fX>mkjmmRZcfEXYRa;@tWmX}Sbk9kg8O68e^+~-8f
ze&8GMxzvn>V&&xda?nS%rm`$B&Fz_yM9<l#P)6;XqTwYj|8hsEP<+~^jx1KKVw<l)
zez_sZ%*$tvb1RYvlD?J8hn$spy}H~8HfT_%o5F<0wx%gdVZO<AE!YCFg8Td?H98Yq
zCgFXpigGGr3KtM*k=<-UGRLDWz at 9X2zrkIK^ATtJ`zJ1)_edw++oM8EZG2i!WB65y
zoRCTDod*oJFN&Yn?)0j$4oP$<mZ-RlWLvJqk^x_p6#CnVXdsR}%LP(ZTb=LS%dm;9
zHfTt}cmjz1^wL`;bXCXW8h*-n8=Sm-b)eH21+8NUw!{GHCt)YhN{S5IcDh(KmC(V7
zZ{3P)QI6$CY^S;!D<8##?@#T2qh7CRnz6iEu=v->MI_$M_ioMGzjOn%2|&u{wmIze
z`#PPGA&(|J!dQ;f<EolpiETv%LxZ=b3SD7|4s3?RENWG&dxeVgw9(@cTe+0|D(~@|
zxcM9|ZnD90P563ZNRZR0sa%Kpv+_}*EuP8Zu=U{|4pyp``JKIeZq8oMz+lyGon`*f
zQI}wHldZohIi(AnL#^&B^d1xR{OE)Lw4z>}>Xe?5R`T(qX<@Q8bijw^oh>Xi-V5Lc
zJ^0k(`UjOF_Cqg3Y^RK8^V{1`1O9o;F82+VU~oy}iu6a;=?cEYKkr`!JUQT36LZ3>
zC80WXP_4k{%mV*Lu|U}i##hc7YI(=oR<e;gp%faOEyf3aO>KNWw3#0i)q>5c`?5T2
z>^W0dNVEb=nn5D%XbsJ^%j-3w)Ak1fh$s9LZD(y)YShm|grl~%wgxVNG_RG)f-s9m
z1jRSV)tp!1K~W=DI!Z91^-NeY#Qr&AIbA8zI`+xhLE;--NCTW5h{HI<XAnDKGBSK7
zH|0L+6x-|@Z`pg^&U at 0$&z!n}-}7)9xqUt#CbGP`gwi>aD(WI%^~NWt0Y6bz7anY}
zSd(L8fmZMHdGqRle?Q2!lsYNJP>Jf<Hn+n!Kf!KK$>|}_%U$NgQy?W6b;i<ZdXEFx
z>IViwLeO4_F$tISsF6wyO1Ez1PpP-Swc1GZnE4&xyu}r9AlMqzB7_UjZ^6I`NApN3
zUaPG_3PM+*YJfGmh_gF$qY&mw1GV?I_~_9lHv%r0wr$w)R-q<Iv~kszUiF~R*LV0a
z&jw~sGe)_l|76YfC at rf?*JNe1INZtC!_CO7&PGZ>p!SdVZ3oXY6Gdgli!-RTd>*E1
z#U at a~B(C~c`*m{YZsX(oonK|y4pia2w-N at zAg*j6j!RvVq=RcRdNBQGkuwqoNn01g
z?_ at xZUg|J7+w(e<i<_{o5vN5?#K*%zU}@N!a-edIp+EC#RW9lrh!e8=xwR_i4{^`d
zxFChFi2Nvi-Q&?K<trE7QWo9i1?F6_X1x;;+Nos+;eBT0*WG&ptsz&KJE(~e?H6t<
z2)7!+s*Hz7@%K(A9nE&}69NsSqx?|CY1Owp2`Dy at LvzaK7A!3($hIm;#CzJcb$f<p
z>fqpOfg3LH at Vb*f*Eim{V?I@{5rsHn3 at v6R)Z7x4`<PIi7361-K1<Va^{HCKdlvvW
z#5no(ROs5j4`U(A4bXQi?*u^9NHrR236?6zbv)M8<|&wh^*h>~!TUn{0Ig`LH!mb+
zMqC#pG)Se>z0K0$aJZ=%$wrkjgNCb47UxxI8GNx7^K>(@E7eg~3pT?ft4Ufsu9(UW
z>0J&tZv8s{Vd&<sARp#zV;YvL!2;=emb1i(dAqUR5|^EuJH9-1uF=+ at Ox+zE{N|uJ
zKvWi_LWXuPPgRO+-LhE67^oLxRq3_*;c8<Hz(193KRPW;Pc7i(&oR9seF1WWd-&D4
zjn>f6VDaK^yBb*^sXoo#o~|x<YV^%>e?1Q~`CJoP-$lR-)k`r4EQz2`8;@W*Lr%zl
zaRK_f(|E<%(-myTw*u<MSJMn1<bVG&rSwx#W!=PdD5Fy|M=hc^yiJu=nqK3z0`hx8
z8y_<ocTI^1myg1Yz*iki(eX9P)Be&p*U2AIW?JMQOK at A(!P>6 at u)uDTl6W+25<)i^
zXHnu%<YD*l_wX3T9VSU#FxUa$!_R6EQF?N+!31V%b!tJJ9-5C7d45h`C|7o}K&-=X
zdMgj7?Ay|86HEK^Xu-X1^Y$~IQ$f`b-M8-+SL7AA&2-Z9F^e?;-xfag|3y;$V=v`C
z<5rmJs+l07v1 at qSD5fKU^)Biy+ogy>v9d$UJM1OKm{H?FRJ2;C8v3SE!yS_+F&!r1
z$g7~u-HTC-stqEn#fvGf`NXWUFEukMWGGA7`|{}Bn?VgB@?BE+%WNtqqt|gd$L&Sb
z?LxtSs(~$HpSYn^>`zd!I;WF57CsFkET0ITDFzMEa)VxGrDBS=yifS%)-vQ*|I%U@
z7<dxqEXI7h<P;R7M4wy1<@qCo9GEeenUxr^C7-sEr0Zdkr+r2cu^a=)3q1!^6fTsb
zxDD_#BN7|8h*BQD!6NjiyFsy6J6g|z?CW0o!ARDnZbPjfiL;9C{4g#WD{xw(;-k@(
zYm$|djkaysj at -|(R~xR_8A8IP%d<HrX(-<uZ1Y^(lVn<j8Xn@|6LkR3jUcsrAnLSS
z{OkfY=U?xo9h8&)Zw5ye<g|eeRM|BP!%)SgrJ{OzdXwrR$Kbll6shCUFCRa#_Ac#f
zd)@G{$?ogIZSN2uh8s3W-40jDYufd14QEsyMIrPveBbst53rTvPm3*;*7!<(F5Cbg
z(iv&q26}oDUJ#waN*X;YD{Ewbzjn&Ae7 at 5A_h+Y~HHfPr0-q&MN0mnOZ=)b|4)5oU
zrk at eloliO%%;JDRZf$A)wd!`JfdRb53qdW?s)aP`R7xPmBqFBIhc9Do{lV at Hu}2zH
zh=D?Hd2Zvb_l$t2kYXrm6<z0v`E3ByA9!@0W#0Nd6K#>aOv)@S#iiKGvCCuM4XQ<{
zfc9@(z8!=gZTtB6yen`DUX)UKqnTV3wERxt+5l=ml$TUi`pt062K)mh*?YT_c9F_Y
zoKUy8yk3J$eHS^rbO~eHFlOTfb=cbrc-8r#i9RQQukpHq0QsrfGqXQeI4b$_0AQzJ
zZB88mMexLio3c_)p7C&$pZg at Rv?Zndb>OtT8P8PEQBw!GIB13+u??QeGLHy%Gar8R
zz@@kT<o at R;C!!a2-q_2q^S7#bS4o|Vce~9yHWT at vm~1HuR=hlJiv9Ic*RK(G&O`Ce
zJW^}*8cYS7+;rlmsGiF4=)-MPen6aT3-R}3YWSG8H6q+a?;YRf0TK(!!Rn$BTz(5G
zAlWUIfc~b^M`ljRF6esLm+}Zob(!eu at S?&%jP;kLpep?k?9jlrtg at j`B7WEO*@6mt
z2qJ$wTOnwBi&YeP&3X3mSF>ku5w)7YDz(kF%IsOejmA*a_H}_6AFHbc#7(}9mT)_T
zCe(MS1l5uknWPB%39wVs(cGC6$Lk`Nh$tXwP8=RQAa2;#zD5&!e*<MjC4((0p!z{;
zD_dnArFGl2kvsjWG}<Lqa-)-nBEwn?LJqR~5^lCSr}ivycJ><6Yu6$2SB?<NK68O^
z8w=k#)77}DUTJo-mhnQrXT}4>dHNU{8bm|;v@*)&b#`ZVUVk&OgUhft;^)R2&tR6r
z&{+~K%(Y8)h%l3!V(cfMbN=6Jo?s!9YSXSXFW6QMxE at 6&P_{(cV1qcKo4^0atvA|t
zZYwFdLs20HaoPa>P;;#P0f>9kw^}M)qSVLYigXbamp at -=q4owDpbt4H3<}%&ns7Y}
za0>0~s^kGhNj>VtcN?QPV$i0iU at uRGo&lFN^h&cWbp!>es_%o6zTyq6 at S<QVjTh09
zqn0f5t)V-=@hDfE1JDtRcuvG at QGF^YyuWT|Hs(cjC}=|Mlb=S4L^6IrmU}E{MUQ@@
z1EfwWL1P39gAUxdb3fwfrSctU(9t~VM-nz6DA_|0G#<DOWNp3sz1f1 at Dj8u2<t;3r
z{$Y0n at JYSI#|HXHStXF|)*fL_M9PMVfDw!0h*OvkHef=xG<iLEqQ8w^x&)Fg?>3DC
zcP<R)KF)OU0KGey+lfWzG=<gJXi<<=-~18z)98e%H at aM)iuilYf$+Vi%8+_Xg{;?*
z3~gJ|Ql<Cs7_gV}mxXAu2Q*BV%*klJ1(L%MdwXPGK%D{hfUN#8Qem#H4KLot5C3F+
zdHfx9e^da7X at Zg@?W0QeI4;HJn>4&+Gq4KTp+Acx`m?&0&#zRdA-*k$0@@`8sk`36
zqZ>5NCu5H{1~ev3L>?puHt!CdA01#v)oq{MR2yDZWR=Fgde=}ZCE+z0aPViWuIKAn
zk&WfbN8pw=Cq;?<8PGBTy{D7Ka?o;z(TQ&cH;rdC2DuVn8_LR*cd=<`j`20^e%&L7
zjl%W=r~&1f;Sr_~#lsPw27QvA+c>+pSM1m{5c}WOOy9s$x}|e1VCvqp#7}#Fx#~U%
zFh|d!MHgJh+B&98eklAS-MN~?Gf)O^?CV#m%3CC*ICoFOqIER!b&U?U#aM25m~g>(
zl)oj`ILV?n$~I7~lXV%cDoXQl2!MVYesm;d5 at HPEG5=k;tj(nKMR;d!!3I~?vse>s
zz_nqkFl){ta at ePb8Vdlqr06Nyeylmwb=7=r?J(-$^(Qd{r*o8f5TgydUn1Wc<tV?W
zrn8vQk~T6R!E^`c-$c2G*6Tpl?|dp+$h<w{mmk)@$-aKOvKd#X at 98pc*#H;B*86GM
zLv_+QwzB>@6~`FfGoPn~7HAd~%d4t>=tA24Nd5~SGe7Lys-{n!gW4vm<s%y;%0qP4
zeaDo%>=tP~ZRZ;6$0mLTQGTwe+6`Y)x{To%Wgi<THtD at ld|#pJ7OS~*SpHQ39^viZ
zkG{;c$Xq}i57!kb6Es*a{rLGFOy9ERYBSa!2|?%)xNZtSDtANgkj;`Olb&3a1wn1v
z%Jcvzy3TfAapvP^9dPSxxKqPb+<fB<Y;4g%q;6HUiiCA}B)Bd6j3+Kg#p{HfxwI?T
zB{OGZ?CTPWwB6zH8d6l!e8&S^XPS;?ziYy<DK=>v at j`tC6K9;XU7l&K;#1X=P1ko8
zz8`;QvD~w(6sGEFvU at t^V6tsme}o{Tnrjb0<*K=!?h2hZhFiaW6#|Z;Pq&=I*{w4y
z0>FJ+2nEKINE!FTzmz^w*)(E_<!U?op2|Gt?Fw*l!Ir1scU6dzN8e2+F4rB4>9tsH
zRC&^RNYe~jZ-s8A&dvI17QFbhozrmag{uSe5o;=%t^c^(t#FIgxjCs0>Cw>1rsJX1
zjG)tN`RBPuAt8oseh*p)A{G(NABWfTTwIRvw$7G9#VU46km`Ie4)emwp2BVHUq!Sm
zlRsjq4Rh#et>lfh;R5Buxzqf*xhFz*%D)YFcd0NI{#vPVklqU9ue-L;iB~8HNcmWD
zY48*Muct(vPuGp`pQm>EU-y56p)sx!3IJdg)_D!cIIjZm)I_<vlnP(A#Z5*b{Ov^K
zQHq^sWc=2<g-_prbVG>NxZ-8H_eyk$B7WhOTU3<(UdoEoIP^S9bM^PmMKs}h%F4yW
zKQa5E685lC%iL35z>pdjG7gc3OILJ#`gUiLsBa at Hp6#1C-nK`(82@;$+6vF};3>KK
z at wUpjoYbek;w>!=41ZS>CfNAURDYmb=V~$%A6#RLd71 at F=+P~gx;#A7av>ga%l~)b
zPM7OMqLso~;}#Lw%SM4db5lMyK0f-r=<x6z*xvU~3O<p{_$PG;F+&vgaU4dY3*zJB
z{}B6?e29a#3p3T8YrMXD#nFMx%YJg1PjI}wJ-Vx?oX_cZRMeR+gqHLz at xdl^)x{+}
zU0uNG$avFO;gc&PWIFc`W~Q22<-)@Ai0pWxP<^UpTu`b1U0g>8uYf>?R9oVYFfKVV
z&s!2oe&3p1yO|an7YA at TpH)q>T>+2tfN|qEClhkpqyAXk&6f{ghuhOVJ&#HI``rYJ
ziU93<wJs;ff)**`>KaH~YfFRFhBWQ2FLp1YL=sRCd`*7~eR9S$&_1QS3}9WlJQIev
zoYs;P5&bPe^xUgQKrl4$@ZxTqoQkK|xojwabfqrhYoac~OwY!9*q?y~09Ul0zWoI7
zHD48h2kX=*UFy?CVEwrp017s#|E4evOTchx3u4ZzPnQ-o%nbu<o|IFTUUhSHO4s at A
zo-}NBRswtJvg6nX?!~Vek`Gs0aD6fIvVlf4u at Q%IpPX%q=jPLbpfIdaa{r_fsTkG%
z>Xdh)D@~r8>-o1LQG<Y|nudkSA}$x=A94 at e_&h=l59`v!$6Rj7R|Qc19^|!iXv4_<
zN%&KT1mV>W<m_+s$RkYMxAA at 4Yr4qXXvP<VfYu)GG;qs8GUQ0*o&%oOj>mNlWpLD4
zyQ4zTsw$b029EWH-L#qUqU)J7F780Jn{(Tm6&#TN;Ft!OUIT4zZ;u1~*e)azSWh43
zo!hrFelV+mzcfQh at ZnOXSNt+s>XyDe=HTE9|A^3d>MtEBnCv^b@$o8C6d`C^ZL#XI
z at zm0)P}e*6nfN!-L at Y&8U>E`J$m+3xgef{7F6q2MV{#alyHVP&MZ*v-Q?PZKua}qZ
z?CdPD`9j=hfsO~DFSl0_rIRf#cl$lZZL={?7plHqhAE7w`wB}m|LVXL2ae~<zW2C6
zL|sM*Bc6d?x&;N}*<U{(HIZ`4w<~*kN?)UL-n|>$*(nhg{!Kl^#YNKzhfC;^SN8A*
z9_2N>n`&axB<p9;(Q$njSv*$sTBy_<&KxV*|8u(XU^C0ITM)vUX?jC=pwq=9L$Cka
zu0a>pO_=_w)73n)ruty%vUp<h1E-X0<j<*$H&0WZ4nNXnzCE~Ew3PWU{?fzLc*NNw
zb8FZ;vu8rg1lMa9tyjEst9znyJnnqCQC>b3VCkx=kx9YuzGrq??jyd^U~TzS)l*|i
z=WO4Sz*FSUGZCElNamMs6b&X9mH1DpIjR7*1R5&U)Y95gmo?j!IW(nG{Z-Y`yXVh`
z>~~2CqNN<xKfRPICM{3R0Sk0es<jB&MtMhW2{$iDO~ubKHQ7N4TR%9o3KwOf_fN7_
z+~;L1S~Qf^Z<~2DX at VOEJtm?kX8)?dIKdN7A`y=6uBtb_`^<oD at R4Q(88w`j!yiK^
zYssXkw++7~I^oHLqH<q9H%kDMGNX-@!F?4|WRkXXJ*SSAechM at W*)pa7*BE<Acq$f
z7Y7|IV`@owNY$%eJ2-fK>>^$rcD`r`8IUCM{@`18e~s^^bH^FcP_mO+ja#q<gKmS8
z)eA5R{q%tzr}xlleEGxM1H$!N_;dYk-)$TAAa+U2li_qU6W|VA&&r0O%QZgPyD?Y1
z`rFbD+t!%()EWOg+E?mI{qnuOtW4+n_3KG27K_zy- at Z+Q<zzVc0K)3-{!6t?`WC+O
z4e^;Z6VL$FY$+vO+bTwLQ`2VOUp4&9`^WAMG8gd>ldA at nJ}+a+nE*Y+CMS{t1~avo
zMP1i at i|$Yi)R`As!HcT&yudg$#=#%-_h0j`f?f8^Ik=K<TwrteinPr}9C0KjCKs1S
z;Oh|vR at nLZH@4Xg8 at jZxpx~h5o3sN|2z+&;uH1=Era;O=uuQ*)G?XjTXP-3dOGov8
zFJ4m1`>!<r9C1~UZ5d#0>zTTY#y3H)lai)nnHeg%F;+3>gAW?!=px73zf(k&`I$?g
zpG15J+8EX{Mf$-a)&dB_Q_YCrVJFDv!#--<2>%ojhIn*HAF!bV+*&ap5eLX%KbX3Q
z7zfOjN{C5@&hhB at rVwAlA7~^FLd%5bhTmSU_QoD+CBA;`!tV(%dI(_6e-|<sl^Ml@
zc6!src`skCWi7oguG+56_2pHoc at y*N*L!x2{z9%lxo9B2R+NwjSWF0{`~D`tvRhuQ
z<JH~0jo7dA^?3U98jk#fFS$0?dXJ7i at 2pJvsznZc`8BVNIf2+n?-D+7jHPvECzi2{
z?K94uo{q5N@}>Fo63($W7BQ0B4(l1)!^X3%AqL#alK7mA at rO98QqZR%I${Lrd7b|s
zF!#T84y#B%_0k*^N~Z>ewc4vh^YZe3X4+~CRb58|if6w at 9S=Vo+s5Ka8&neh#Hr}_
zOfDeRK4&m!x-PDZo!7S5y$#e1w5p~`ft4uRt-O4E7RW+<{t|Fc+j0m%US3*C+i-}`
zKs+ZHb>NXeH9+R>j4P~cxOycc4V##pj9<rYp=A+e!*i^0#$7lHZHzo at MXy}R;{;%W
zxi-Fpu02|ZR9W-t)GIRLH(EqNV%+~>)x#JHF3cBq at 1oIYfRa2Ge_mvCa<Wt<WZTWn
z?a|AZFN3e7AB6e&NiPF+B>`g|Rq7b>NZHU<l{qtHd&bDswOIeXV*c>35dirYKf9hO
z1^|qI?h&I at m_P=4;^o&(7RPWQ{UU%Qxw{w6pI0X!^?%AknBkPi%zcDC-N3-0Z*|Yz
z&(CmmFbAzdXen4(aq-~a$O)MnZVXtJ1FA(}C|4AyKlrHT1R%^#EaV=GV<pE&3+l-L
z4!1%~!??=3|MG(C2um8*@p7wZ6B84%p7am*^}}<yQVF|ZcUsx(0D`Y}a)=V1Pf!r^
z{rjK7!oo{?hf5UNo-#MvX at I7l0C;+RKAS|A6?ppGlRk-m94-E1S2)~2V5`>G-Bo_s
zKaAWxj3lFg$Ay{g2FR$YV{qbjF+RSHIGcFJd08f~<0^rpJYYMxFs)ec{+p2g>O;x?
zE{#5VvgCeprU~fLMTj#8=)8!@ZoJvr>G~|Z&DPd`DK+?6e88>2j6wu}{#7Uxe+p{+
zbC3DM9M-5%6 at mXg=VIp5Er$`-S?0^gBL#_&6XK08$El!7GWow$m;4K@#xyhaRDsOs
z-(@*JI&ekLRQIgEOA3qtwrFEVw{=m~KT4GVRljH-e_84+KIZ;afH8jKGH0Kho;Oge
zqWx!d&pk(fo_DtK7mfep7j@)x(Hfnlu=shYUl|Xt{py{SlVkS#IisR0(yiyj|8oK!
zbTN})sK600Y+!KE!vx@|Z*G>4ylh|6zLWVMLrW4()|Kr2cN73tHc()oS8b^~>^55Y
z{bkRKEB{|<)eqCe*N`IHx>PRpTY~$K0;{Lh at 9cWcD4uxvACr7o;j6S9+GB+UMqC65
zTkIbD&#z}4(sL=^SumKzhY`V#{~@#uM%hxolo04Yufo50q^6Wp9RFkJE9)pBozox|
zpneYcyTE<y?vGCpDDSUdLC5~?K70*2`*-ig)8o;9_wN3B9d!Kf?kgUaD}VP4zyI<-
zH;TTd3Hs&lix+MkyZd+V|Hrqium|xZ_R0->6XUh3TLAT~_~{3X{}gX at qSx55_PJP@
z^t7~_`Py{_<;L<H0~`CC=PMmM{FICF;gNV%xxWRdRmKC_wtWhEXI`i>7Wu at nF81`&
z!20_(CTn|1OU{;ur>{kXe_dUlivDq~AHQg)``}JR6Q_)3KhRWNzS1i~S=;kAv}F<7
zoI!Jh)}L!0O%n#)6csgkY?Tvh;n{wdv-2|OcDi%az%27$1H^#=M)A$*gcIMJx+C?W
z at ItIDAzuQh-TUznP^TCFv36rKjC^USdp_W(0!z9oWa9eHo)-FK^f3<A`K#vnzju;h
z|M*qVOzGUs(#L*ZEcCYdCpFsnIU)tGe0r*j1bzA%fk65Ey{GVJK^dhY?`Vgrdg)dg
z?ZUoE=?}mg?!HEe5yinD2X5Y+tu`488rZnh{p)p2WKe#cnYXw1nXxH2dG2`xUrq%F
z{N{AE8(p45VmGNcM#KmvSv%^!nlw_o+_zNeK6HW*y3L>Z%@ktL%<C~Dreov!*uAt@
zY}Uig#{@!E%;+p0tT(Sy-b|hMtIEQ|xf5NrCiTbUY9;4HPE<Oi#70a9cDI at oKF;@F
z3Gi^H7zECg)z|Lj*VUP|Hs&JEtv=N(qN+ at rLaPz{Q&v_LMHy#!cbp&1qz-P8>wjzH
zcfn>fWslC~u95zTO>pYH{!@xvX&ihYZKFCfsB(G10~O97WwojXlA*C;TC27=ev}}W
z>sTE8Y${lzs(&FkeYu*UvBf$LZ>b2AaL8DlO^Q>=-m}Jj3(uDSbWSO+Lrv6k&D0=4
zrK;L=ysq#04NkmN1wLJ_QaGe2;Dc_CJJL^{Y+zuwl36+!(rfoM;FexK-Aus4OuJ?C
z6D;5&^f>E}N%=7++gb8HE|{<G{El;OSCe;T|I2?&KgcC3(v|GyTC}Xw$M%asa7k%h
zY2K&8+9uUL{djoIRoZ5^7r0(3gbj*T6Rj1qNedgXUm+2^+{`oz(bN=F>DaV-%<PHK
z7*yx)IZ7 at _WvESSJiYci?$O^iqn+;RbSiqc^y at -%&u<RoOQtnWchejI+5>*jTx`?&
zzPyU<;!MqEvpBTp`8R7db3fRoV&IdQafF|K#R{WG9b_95aO+mAP#gr<`mO`VpPjt&
zw}@YJ2!OO(Ih;B1k2yfJ8v7_~c<%-;zp`mTj at 7oDt@Uh1xCQ1;M+v`*|4i-gU=@|#
z- at x26i+)~2p}}EB#^r at UeKX8x$yCnu<I|Jx!^n1OyHg^C at IXvS(NvD?GmlGuNj{+`
zph^elHwdsu)^;-`ZlQ;#tOLjv0c&sI;yL!R=38DH>CfP;`PS*_K4z|s>w`%->Hf{L
zK!eX%m5$qDTTlO->+Sa(f*{TYjN(briuj!y8)k(X(MFSgS0(!6;SFP9Ia at tYhm~In
zdO7QQ+n5 at o#pI^TUq_O%()cuAQ{+ at mJ#*%8$K4)VR4gku)yrWmRT;c&9+2T!oF5W@
zPd^F#xuD1lS1Jlu&VJ8YJ(5NKW87E03NSozoa=^qb-@{CWeQ)YG?6NhU)|uthhrJb
zDT}dZO6d=g5kcMVWUux7Q39)}>3~WOnKgvvN9i?aKB{4XwcXM8rPG=bH^Lk}{r>QC
z_iO086&~!MFyY(%$!|A8 at E<N&k9_jD>>4D|W)$-~N3FTapD{q)gI_j|a&=tE9*s9i
z)%cVeb`;iKZy=V<@4G#0wJIlGVJv#dq!RS0);g!-Qt%S*CM at z;yO|1i&A!F#?Kfea
zZD%-H0;r8Vfi0uCI#EB3+85?5hQ-mu*Kly*VWx78o;_QzOIw1+?&b}ow1?KzX88$K
z&U+T_K{hKQiYHXuS at N6=zo3- at Q$O4NhR+BQJ)MVBdz|$)^ZAw5q_6hc-D&cmK!#6C
z-Gq80Yx|fA_bF?B7o+WxK7WiG`iYA}rsT)DbC!C?qkjkjbfF?q5JVnTDi<O0N9)&Y
z2bWNXuJZerH1QT+a(`S?aJi$Tzvl2W$<7>;dU(1>LptL(P_RJn9s7{7j!mg-G^6L&
z38m*Pvi?-(!u1axWrLBYJ$u<(Z?ZT7^f25M<|%Ut0Hp}FfmF%<UYDxRud)D&l#Cu4
z?r6C3LE8WN@#tH1xnGLZqbhBxC|cug**|A>hv#-A=$*G}&OM1kpQ6D!6V>?W at 3%JL
zZ%u+%<m^LqAb=#iuM2_pOMT)@?xuRWR_-k4=;H=%q4j%ZFWcQ;Yci*axPrdCT3w9E
z>c?747<MO!_NiH7LDEI%wWK`JCj7*vk5tB_{DkDs2Xe&%8(4W@)A}8YVx9))0?N2d
z>3L462~XYHN&ZG!aLc-;J&U917AGx#ay at He3B2ZKwX1zH+L@zO3APca6asvk0d51H
zN?~swQ|8vIGj+*Tova<rZv1G80-oxb+e~faX9&eb_aFc1H5`S!HbFx~;gdpQlapR2
z?uX6E*S}Ft`|^8JB$4M|TmbnhKS at Lz|I4(N`h`0>5)^jn)n;6!8)z*sJ|Kli*3jVs
z)okw7O{ps-Z^3gC23cn5s;qubR<H)VRd^9pVQe&H=1%pi>AyGq*Xn%M_A_xZ4rEJX
z;}1FU1U1<R8SLHsXT?+D;bYV2g53M?8Vg*bB#ZqXXvlOgMWaQ&>G+p&QJuT4~<
zpJSI#Mtjykc29#W at V0?X$0rUskr^fH=!1h$>q0^g=@*cb^7C48p&cDA76|dNV|qQu
z59zkQbnZAA&FU?0<)SHsjlry*o!>Mi7;pP$dvzR-9>mW+FOiMlx>sx{HXX7d at dTD;
z3Rl37)$50R)T8CL37z=yOn<>?U at Pa)n%|JZRD&{Kc8u!8VU$6(mw$+KI(K8pKz(t$
z<L6qIrv?22s)@TgJRfb%rKGB0pDtl-858iyG<CVMI%Ra)wxCzLVP^Y*8T at lm&{emo
zyDWKovv0(g2R^HxvYyR^Sy)4Hm93ngXA2u7`uIbT)216cEolTTAe8y?8?eCDcC7)!
z>$LMa+QBZT?Q;m)kyn=k`~BmIuOg9-pF0<@g2ge>wAM(9;LquZyZ;P0#xIZLYm}Oq
zm{jCA4?>TGEdn4OiwpQbPKYv6wphJwZsj%VaptZ17su{CY=s9-2o`RSzYdvC<g8VW
zid!5kno-!g;nqTQES11*y{(zKTu`goaagXd^>a=zr)H1Ur}YfDECqu$UH^pQDvZe<
zgx<3dmaKF5wXs9ph4ItUeA)$K8e9AHG3Ta_0k%O&Ar2B|K_=PMI568uFz+_O$RrUx
zG2)`>{SjoC(lB{-=x3;vI2GQ)OF1F0Hd9q!#EZNXawf#k{*U(xO*hQ+0-C7+Mt$c_
z`P`WSc)#Kq34z+eQ at T1FAdDk(Da6ZS-8OA>dg&-jY}TrPJjZhQ$2|@TrQ~bQGEFvn
zL_>A8nH`#z=BDLb$H@;ja$deF0lq)~jYItx=1<vK+EC0uYjWtvDSx!;_1QB&5E7;x
zS at PuaHZD#iZ)Y%ClAY#ocE-*JbM4N at qsv+$yQ=kN{*slJkg?vt{CYHp^$6ZDDLd&|
zz2cFM)Hn5?H#J9r&x6cw+ZtBVZiL!gZbL~_`Io7KS@|SEX&*YaI29_oWi8?E0qjP5
zpZ{QS)F=Xf1_;YR6oaeC;7(NM#q}yv33_HTAL7kckxJNm<Yd3 at T7I$eKK(o^+}HN<
z at pJzp>n8JCpnhLXqd~ENvVm;ome|RuoVJ$|I$I@!M|3a!kiYDZfRvZ;W{EiGqCvCS
znN-;a13k}M(&0V+lj|RLs?ZBXJXU0_xm&|xTd at 1dTd#5xMCqiGrg?_g*f at -ITP#UI
z+A0{tlQ~*ntXx|`%&0tZEqpIs=TFGrdXR5+21J7 at vchWv<ATkb%rG;;gq?F8EDi{3
z&c>QZq)nuavrnDvS_mij11o%RpC05Kb1M3hYxCp57Zw at b-(e+l^}=QuN|2CjvqE^e
zyD?$s^9p_W)|_zWD|pS}8(gBiwzjtEN~MWGeYIjac3o4z%Di at whFn)U_#FFGJV?@I
zv+7=Y;~(uKGGle*CHV+rHh4{;zDkH9p{A)YGVIwiV{G!NDD^PkyELX>{LarbAX>iG
zgJr(U(Ic|GZ14<_CU~29dX`z+Ob6!ISah^qWcz*_gjTreYfwBjJ+&z?Efv_SB7HMp
z(u6Uhkbz=XHR+(YHocL{J)>%$c*-JNI*c<chHPLHwBmRZVfDN$MDirKV`Hl^ufF~u
z+{Surd`^_mevslCsi|jj4`zVF;dm*BOM54rB}va-p+HNY9exUPT<h(rXv^n)M at elo
zJ-M}1sWlUbYYncyOUUjwTJ&jDf3L5FS8LqQK(w7T26Q$iEbmx*9`Ei!WvfdZpXbk;
zfV_?$kG|2*`Wuk5EVF^cm+fHU**_H%w0j@)*SE8vqS2(LL6X4lKZoBn2S&f1Eckrt
z2FR=X94N#5wtHx6+~1k%8&;MpY^m>9EUiDJq>O~7mwYTQy}{bP()&FJqGM)l4d-`O
zF$0&}+fx01?7d}FRo at yfy!NI$rMpAA8vy}HDM31<Te>@x5-BAWluqgHmX1w_NOw2f
zrT=rzJ@?}s<G$mL_Z{#0vTMbh^NIO9zb7`_u9)E8`vo>(|G&&hw(Ev#14CT at 1q^{`
zK(Y>N3~}H;3;O>%_5kp|jcBwX5 at JTIpL@G)kJG!ky1vAJZhz%{wJb4u`A{1*Q0ae_
z#yY1JpaGY&s&(xX`VX4IU+yGWJeb0<3${@CCnJpax!PnnI|xJ~1h!r$4%GVJ7qn<k
z6;X;!HM3AtL00^-uX_?HyuYgkoc*M?_bv>X1J30}^v9*k&I+!3CcU#LKoT;U8kT9p
z!NL705&#h`UXt%j at 8?Fr<{c<Nimp~OI1HEWM|NtU3F{6P0k=!xt~R^dDo&<zIPu4b
zdcHIMT at e)?`o7zAR}3HMQ{*L~2lQ?3Z#3?Y1hik>eZmGDoQ4E)r^ObsPgpIWAcSGe
z=j!Upg!``ek`thEgby4ne%#kRHj at JC+QrTkmK%`tH2u#<S^akX8o&p9K?c`{i6o}<
zUuT2zh`oI6 at i<8-=3?EfN(i2UPYsm>E=i%1P)U5NW@)y<@;^YyD-sA*;4KD(3KY_+
zr67Xme|*KjbMR%wUmB1HBB3Q7U!MQPtc?A at m%3$a02j!X+$FbCgAW96pkoBS90<S%
zf{z^aM$*NHPyqliP5AHIu9#LtvU~TqmO9cDFu1KdNG4SHYIAdxc_<Mg(OOGb@(T$T
z at H<K>-m>!M)?7AuFWTnbxw|^)URrF>zZiSRb-%M^f4(W^Z>flxlX<$;tt#tU5ugjZ
zVVt_ at x4-{gpM=r)aCPbDeLo(lD{)~n{{Ys&xGF9OSlmn3DUZ0?KFZaeCAbj{e(W|v
z(w0phna5xx7<)bvdax)b4O*LZl>eC&J3r6Y2r{@NhwAH%Q=Jzwji9lX+r#yuve3U!
zIxUrvETzTs*GGP_^{L;u;Ucq}Q at MHU1$<umJPC6bni2j}De_V at bB{_96yA=^dh*qY
z*fx5n<sBC!8y|y*KdF#4H%Xbm_`LQX7|)6>eLsG?x!=XPI^UlASv;3ort{eRSVPx;
z`|R=_4;WV3ihGps at wlDr`MepEDPjDWsI;`@r(T-9(<E5we9XRt>Nec3g0b1Xpz+nl
zLu2prBL3`8_=8)9u>E&Ibh^O^vF*cs6r^UPWSsmJv}o at bgTm-3;F0N`qP&nVNiJ{Q
zd at hl%XM=(g8lQBSw<GZ6+pEi|l+ at _^q4QCT-p1#d^8yFPl>3X7L^JZFtsJ%Wi$m}q
zA|oTW=(qs7>{<*sNyNZw8D>!t7hA%Pc8F;|ujvaM7k;drxjjLbqAF~ATQ<758^xU4
zY;sFk)Bp!-R{}TkqR6Dh8T>hsAJodDl_3Xu4t#B*hy94uTqCGEb7Y^QQ~Yo;en{s#
zthd1HS6aZ8FE5`A25pM#vT$=d5JP}WIri%Y#VxTCoIr9`Y~W{1->OBgXai-*+UX&g
zqbk7kNRiHVve4p;<Rds?(R(c={d%3>Hp_<wJh<Jd7%B)csqs;%$zr6Rnx}_EL#S|?
z?TG+x;Ab8@<q7hSV!yi<Wt0<4PScET#<=X%k>_LMT(og23TqpqqPm$f at sz;(I-wt-
z9_xV{w7bII5oGy|Oi1RYWX;m2C%2gCT#a1BoS34fnOc+8v(9W(_pQ~N{oLZ*9IFYe
zr(O`M^0;Jvk>S|QC2g+(j4z4&qC^8&t>Rv|2vlEcRWT9d;E?IoeZ&OYQZ4Z;*Ucn6
zx^U3KoF~51eJaC73q5)fL2l`YFo_c$>=~%T6u4|OD?>#r*C;wvx2}e4a{L6KN?7QH
zlOtLkWgi~c$G&i%vYo0H;w)z{9jp#+;1`+Oyud-*%Z3po2RDy-O}hDTlH*Q|MH8!a
z{mw_TbU^s=?4X^sOR7=OXADkNy={ovylRaMalsk+q{QMQl!3B->XIT<=IPKi7x}<N
zn5DzICRB30{(L6cxyBJefRe4q at 2uYnP&~j$Pm-SIS#%IhlFMcnb6&H{LW0Y2IDaiM
zzu8{p{>?`8{Q>J~_ at Skg$W^`%v8sUku~#j*TY%f at qbA%dq+!F^KCGYJ<@neGBl=GE
zc&&$-YV$rdBO&#IA5ivIa$<?kcKjvOxA;d^66D4Y<wh&tEgQMMfm^7rb8c*i!(G6`
z!NJMMgcXPt*I5|X&Y#*?^98CuXt2OZ(s<9OD*;>W^^d-RE{|DiVjcC5cL<vgg9Z;?
zkAut^YiMzIr&SM|!Ry`iBNQtO0YABcr|-yon?!#1z7h>9d5Np{RnQ@}?l&hB3RTPj
zrpVG%Z0vX#miiWBa~TF;WF~{zF^pNVGKV*WTz#O`<rE01#DC>0-VhWtW-dhbx+nRW
z#&;YG3V4 at g!5JPh6h1NTkcOz;Ueu=pXkRusGvKKXR&%6d#YD1|_>|3to1?yq2^FJV
z9Xq6vZ;B06jcDt<ML5zl)Zp5?SXpdwd&+E*&SW}V5gq67;+ef;ExBb<!H6ktLM$Mv
z5Y7|;TeL;8$tu_v2e at sEuAl7$MdIv=QgnT<DK6Rn6=bV=FhM8mztEMsKtP?@wXndl
z)Le%OX&cYS|A}cQ-)_jz5|>w6E`09e;7j3V at 8X%7Xe57NHeM0McfA?Ux*kU*`Xe21
za&UbmzKPyIY5(QB$b9nhvTko%-^V*L#S!fbPZ3>N0Zz_B_;d$POn|IwEZg7zN%O$w
zyuJ=@<!TM?(*5ZNq(_#BFw38cf{%3Rtroc#9!`$hBq%;(VM~l at Tg~+M51GU$a7b!*
zEkm<p4X@!2!}Y_wIRAcJhz<9?mF>YeiSTP5FNg+rtjsCg$IP+Np4U_YJ^<*q&8t
zp&c*$TeKIX3*6O`Y0&r36R(t5-wXxsl53;x0KKO~l#MPVLj_E`8I5&5n?2S7YufvK
zfgvGqzs1eMV%gT~)b~Sk%5|Q~qxGh<=f~eFCEY~RcZJ~HHcNa4oG>zjA3J<wTv@`j
zHlf4!u(z)_n?>0$_)nE at zGYcnLVzNP67rK-Em2iKUT&-%D2F$#lh@&+MbMR<@Wz0)
z at zg_%x#=RJL}o|m*LMx{pQF<>aLlQBjD_%B at 0a_KQ=XTQIIM74PeqgctVi0HX9~j~
z_-S at P#6vfT0c0_J4Sx|9mlmJL5VdtM9L@^6Ljnv}b&W0z863^!#;m0q8u+nHf!y`W
zkpWu1#>ONU#<5ZrB*Ttz2(N}LR$xfEIDikKW(4%pPW#$NQK3N1#=?%6?}3Um3fWW*
zlSbe=@RCG`$<OHXsET_ at e-s7tigLJ<EQWH<m5f)bBOdYkX&wn6?4&_q|Go~tJY%Yu
zwLmn^L|Jd%U^ajh(LnvNTJWO6LT?;?=VQ6v&f&7edzxI|vJE%oHu53F8icuG(aZ5o
zOFoUI3Bl#~=B#a;Z4VRO2ZIkSMf9GSm`+1>at0CnuBxkd&qa0`1j=n^*g+MZUHc4o
zFxGBVp!G+{@1QfwMpy3W_1Qh2O4e>z&;uW0U<y)%afNTu!yT$*R(Eik0HSJ{+LMny
zj%OR)q0#sq^w|*<dfSJ#!~0>~rq6OgZ`pyg#N#0OtT7ut(C|{fdoEjW8#vOs;TumK
zpUYrAY%-f4->mgdhPG8GZ!gy>Q0Wwl6)|%HPe0 at OqT8GHQ}&LBSK03O)rpcE{zC1L
zLkE(^q&HponLWJ+zm`I-T<JvK?nHZ`EULQW at ctA@EH6I;UZNUURMP&8{j!G>NP~(L
zNVqx1T@}g$iWm#@bBx>Kt>y1(jLn|Sb)3MHKDLk#Duh3_p_1Emb}#dzHwMD}Bai~E
zf!kS074clZg}Ch)ztDuT-%BqPAr>lnRT8YWJ8bKA$TSAD??yxtZ9y|?VEK3(F_7oR
zjb-YHw~@Lx-GWV#nN$Cx>}^3-ylgNiVP+1#1a9^Yd|SzMV>GRl6X$*xsj?$(UoUz3
z{gmeTkFGx`V(2A3jD+5)JBg$~KXh%{r!K=BM0SKNj^e!tEE_G4<6j?KVq(3Do_j7M
zBXdR|kB~eSII at Z<&yjnHgS!7>_pv#)<9jT8`t$rgN)HuN)T0;?50i?sXYZ#A<M563
zwE|vA{nSMUCO*TFIVoHgC|DSFnpUhxE=ZisELa}b5j5|DlIW?`QLUH+3L*(`&{_>K
zMl>_pY`UC6^q)<BluCc!7qozue(OuHDQ+|%6i2xEV5{QSyoN;iz~2;p*kagS-&(wK
z&~V1_#t+zv7eAflDbU??J{Um<1~r^8B+VyBpJp<|KqdF9=B1%+P4QkgPV{?NUp?Nu
zHqa|6wVyV=T&0B%#1z<>vsf|)1mUbL$`+>6FC|Fg1}|GRMFFx53Epo-uE3QhA+XWX
z8cGj#VQBXIS?|I5D>*Mbg$VGbSceZh;016tIW`tj+MBf$fls&5)^YLBw)BGClgW7=
zT9c<SBQyaw-tIe1_`vW=!G(lW5)RNa%|9uAb^iegW=Gm^tJYf7LLR!#`BGO=!@qex
zY@}q+raG?p%l)*lg%MFz6sQFAcba>KKT2Z&mdX6sOK5Fuamf0ZF9IT7k40naqY$b9
zsx&~=27KTPu8^?`u06Ywb#hX4IWB(w at V-HNx^8rb<@y*MSFG4suZ22iJTRMtsNRM2
zYl?_hma at 5_iRnqa_d-rT%A2l^fM+MI(Z+Az;-;_>=sZn1KI_-`IW#u~IQj0en;yd-
z#Ko96IbjPpEVO-Om1ttRYzV~Xj#U*8?%kJSI7Pke=>es+>|*S_BVMP6?Bs5#cgpE-
zJhqHzx^F0$K(x^03}<GR<8}Y*txx&yRJDN2%#7ZTwwPa!C>#biTfNp0bN5@@n7*)m
zC)d506^f2og!@9deL~WvnvmehD}-tO-j?MQRYNs%rv<hW>mT%Vo!B#JY@{2Xr_A|w
zn3IO17GwSxwN1J{pn73RD>^1dN@?pc_kOEi!(e{8wuVcXKb%y+;nzkCX`PEDQKOK(
zkBvv$nmaXf<dumNwzSYl<QciDsp}r(DFGTqbj+{S-<?f95LAh%_v$wTk+^`YAtIMw
z-{EMnEy`)-b-+lvGu!qJ!{ujgRA3F|*?n_8ID-w#JRDzQFI%{_h-KoY0CT;Ym>0cA
z=SHub4vP4GdV8$CUg#p6TYI>Jnw>(<&sEDxR_Z}Ov#b~&888A(l!xewYrvfrMaB#T
zp1<};;FL!N!mbz(IE at R_s*-93zu)7!aVl%WH#VR9=3uF1eWte9t<}}VG&jVKZUv3~
z@&hMKMB?mIlhzXc%J$gn$?E#06?|iBVMd^9dfH_vEkQbww}E3oBMd9MLCt-i-P)}h
zY5KDnLZJEzF)V%ldm8kqGINZrETKZX)>q)==Zl7KD97R+=B*yz*}}nXWV^{^QTOdh
zl^s`fW&P#(G-BY1cf^C8Q${>&_SQ<YFgB3v$o4^1g0AG!)7 at 1S1IVimVE9<}dH{c=
zzRA)c6Iy)ToSf?f8hhdqqCd2SOKaz2g-^pBVxGkfg^ct{M-o;4!|~rMgl(HPmd9_{
zze$jk?HGC-;!|LpF+e4`;JiqVF1>m&7wb@>x`ScF&oWx_OWND1&$AZU^KR;$L<?HP
zc?I)tmA;;j_=<3x4omQQ&N`8tV$>TDL?Q586qp$h_Nnkp8$JFg#R5s~VDs?0aafm%
zjCF>?5cE|SR$|g at 1kGHP_pe>#tdqxM^>Y$5Ky`&|SF&Xo$1o1QC88un1e&4`2<;vx
zf9K!SOKIpNZGU4$==g?C6=A(B-I!}w*6xun8s~AS0|7KHJ_j#vFDVAJxA1z)db8Cp
zR~&1uNR5~Z`I*b009d!=-t?C#WAZHvI8AewsC`&~%i(jM=2{*=Y3<-Ky}ka`_jJL_
z*^xS74vB;cG2fe%C+W8iq}G5ZJyNj3dXv9)=1GwfWEc&Q at MzbztC+@zYa6Fq|FW4)
z3bXUq_xbV8R+Zn`Up_O{r#mhh7q at EYSE>lherRFrQ&wD{FwJ-7_&UeH^Ui0hnI=MJ
zu?ShZ>l$;r3C_g?{I1R-sdT<M`O#=aG*16Ir#P?!veJjXBm8P<g at MZ502vQ0bkxU|
zI4jQ1SY_$AG>VEu#fyNpzOGA7&L6?H4%b*@Ck^l9z(CO^ft1NvY^j;>nZl((t>8Ca
z%c1HZf?bx4#N{z4<O?@97r{)o*Dg2WWX3zJBjYy|Zi`@ML)RU(zRzzp0Z9BDe@>}l
z?fUWBU7v97dJFPTw#{XjHA3Lq<#aI%KnJ$bp{$BeF at h<+U2b`3^kA4|={Hx+T-GcU
zg5<-A2_#T6OV*aI1+nV7;(f68V)1KagO8Jlb})xaI(SmdtW0n at IjZd?8 at M+YYZ*Sx
zwHdcopsd??w5UhD<_>xwI9g(BfKw0c{cA@@Gv-4v)%>IUAOR3%P{{v+CCyz%6`?E*
zoUL{bW+<Q6ePF=$%D{08%5azYq<7y`Z*^O`SXW?(H(F+9<-=Xjk~z at yF@#ug$$8yS
zo08kG$Iz3o&9>M9;kS4lB7L2(XOb8{!P1!DE0Ooy$=H0)ez8^`COOI83hiGTLF$+T
zC>6eFDu_fgwWrreK#cF+Dc`qL?;qL7ZtbI4pZh%dHGWzo3Ks@#Gc_5{sBo6oaKr<E
zV_ at ex0`Ycg&G4#b(n%Gi<7u+^3e~O8N_?Cev{yX~2Z-!K(0NKgw-z64uZ8bJfVIm?
zyZ(Sl9M)Lh+FBo!bzy1GX>(`S5(8PWm8p?FvS)enjP5JC{)@Gg-Eqw&7b8bA%08^E
zw}vAacV`klPJ?L!nYY6X;`cTfDFN at L?)BK at fMof}Ql1nZ^Qnd)wri1SdpipOXRFG!
z99DMamy8IZ3c#m(OTd(Db0~FDU&P{g?0I8 at kIhfYmmcI=I|;`Iof)z`K|^<Hnt>L6
z{QHmAinJKZ)dv(sJ_A_5e*Ugb#~Z3gENt5YH)TrU(f#p9?H(mxto=oW^3>tiikuR_
zB%-Qi^=^Ij?AXC5yli%0pu2qsrocv3kcwz*{V3}_NnnHR$V#peX&;5La&s$_xJ_E`
z8~F#7F6`lr(p8VKm~F9pkDB$R54RmmfPTEdlg~abkd+`_Q*KgVct<XcMAU4~ED^&}
zoHBK)%8~#smF=S`>BAoTjQzNLpRMiq?EnMC%@^gaK-^EH`xYhk8lq2;V&A$oj<E+^
zxC~k8T5Eh>aN{ys+rIi(N;#tcx;IrP-vG3~WTrTpxYHz{qpNK{qdT46tazWf<^gcC
zYRV&-O8I48zW$3$tn^Kz6gf@}nMEd2N|@5oveMRa_yo3D{G)y0?6XwLU&%4t(syk_
zGO9k at Pn6+Cw+wGR#y&}cOFXVHId70{#4o$zKXN+xdUGuWp~5`dln7+FVyPexI~$~J
zNwft^K+vcfnZwm)e$S(94+o?JqmOS at J)%!4>GQC at ZJu%`S`Q8`B{gkVr=8^UI~oEy
zcf?~ge6(cZ`iz&apXQZCC*Fu?7631;%hb{mznt%*0a0EUut>bk2mP<W(Fp5N|D*TC
zf)T7b&rIFlUl4jkM at B_Jh=Vt{94tahAt|4GD#z6i&lRH+e at SnBW|%0;KrZ_M25Tf1
zUUFZRLj~5oFMpBw2biN|={s9b3;e`Dvvj&>^h$5u5}dBCnmVx}bSZVS#se!iDi?-c
z47-l3<s6Jl*LZLYujU+XOrEy*I3rpPSk<0gd!;i^5<bbF;1&?hiPirZX&t)uJoEew
z^T^HE8%#rKc@~ph+b-Ar4|#S*$D~HLE5IN0=ESp==P#jF+<bXBey17C!Z`(=H;n}i
zGF>c-ENcSDOb~?&x51SU2bT0rFQLy$#Jm&=U}BbnLtM4*_k(qrfS=^u$vzyt^`&ny
z_T?+o-CwqNnaN`)D59uG!?iu~i at us$Jiq-ouh#co)cd9Naw*vbiv%HBa3Ynu^{F#d
z(wwAxeEOJi#JJ*&hFx`j$%i at 2*DrbR%;-69X5f%`N!qk6K0t91Z8fhupwd+TcklT&
zx%^cDA#mV4dhYhZ0s1y at Hmk<@e1reN-I7%M&~9y7)rh6 at -?;#9kc$S|sK{1UYcmJn
z1DEXw;kwl8&b3s0P&2Y1#`ck3ubi%WD3IzbYH~`;BuCZ46Hp6P!0u?{0o6EAlLg<Z
zch=V_FH_(8-0X|=3$wYLxSn>v4XMJCeekj_U(iB*1nP1)Ks|deyytCkrV*Gj?UokA
zR87L(Vs({<4v?Q9f0J<~%oe at BoK0{(_oG+hO#PJ~%{zbr^!D_)@(BsO8>>+3j3KPr
z=RpOq(4=Es403F(@>CVlysbur-h*KrrTMJ<-CtrpCmQWO+zkRbqiSF(r<$n<YJV(4
zVsOvxNkia3q=>n9#n_Es*}5$y0gz0>U at o@?v4}!gGpmKvQ(ElB#V3y7%^h#w$X^>$
zM#q?r at x_7NaflHEzr$Pfq5y;2thC=BFtu0!%}iz39>?=CZEHtgLgVZEO)hK6caG!Q
zbii2(4uJR#^h)uU?}awKjjqeloKT(ih1(*h!cI$RP>e;RRU1-Rez<H~Bk9T&5xa_9
zU=yrMD3N{R+SD0~MlN0yW}}$r7XNWTq+(EpsJO;HSv|CJDmO)<hWiI93+3fcu|Ute
zW2tU(xiTVIdIRJa_w(~z1A}j0el3O}zUf4R6|)_tv!)u;u_K{5z+9J{w|}zA<ltBd
z1asOft3lh=^lL}?z7=$)U`P<YlZ_`paFfYUYn`zmbiKC{g>s54YO#vYR93m;^H7&v
z6UND|-~Nm(M;o;LHH)76o#l}E{^KINjD(*%pJk#6^#JcIJ&cB3?~nZi{cvM$b%bi?
zo`<h8&}p4$-7$W)v)9b{J4PxN53tGFmwKDk{q|-+zMxfl_DCpTabO|7p&R7xO2V9r
zgU}pDd%&s=?TC>5rz|gI#p7f-UIWKZ61JPb4`H^(XtRemgtS5Yx81BuH at oYX+!nov
zfboiS_b=VvB2dXcpmCvL{}E=g!KqW<*Q`#i5c(0s?1H<t-ae4SDi7Bke*#+qoPyYu
zAvD~5vE#VEOok#W2ODra%6NOf_W3dwU^MT5SuG;H^$uTc1q~d){ZepWV%Jcc|Ldm;
ziB|%O{riMmr^1e#^HR2ejX)_7h#+L8ky{1Ykfw>Fip=}D)U)K?Y%_5!nnn_m?l66G
znam%rzPa~q!U5X9-4L<R5~^T7bbi=!+hnordwhY9^*GdrWysCG?AkPdcd7zjqEJTl
z`w{$$%^<1Or17oSFA5-EYMSSiRWW&CKDW>|-X7tAp8ChpX*gej3Iy|(*;A2S!OL^Z
zZ)`ERb?56G<FW0J*F63xeRAJH0nk2*YO2x`{@qFVXp%5;Dxb06hZCrY^9VN1t-jV_
z)O#FV72NL)1HI5lo6#5Wf%R!LR{J*YwCA^?4VQ0WGq>ygBcDEJXa`J}w(@fz34kVc
z90Mchd*&kI$dXc7VGQgxVPIhXI{vLQ=EQhu80&3d-lcVLHU#%3Zy6KAu>1FKTJ&XN
zwX&~DIT=4j^2@~hxWg<jtj{g?t;(bzU*0}EhtW9LO6jOACDl*5<D139(c4oMj9$!#
zRNOXP*oLfVA~vj5Ee8~sjDKi|UB2A0y-f`qKlJ(9QW|Ys38D<5*VvVnE)Bq#X?^q?
zQT1t_Y$ZP}aU(lA<AX{a6(eHiO%E&0%tHGL{hsW>?>_9`T0}&FpZ14q{Sn~ASZ_sG
zVg2xdyE;iO_uAWV->Sb~YtI(FgwGo2mC$aP(`L3S3B!J2oq79F7ARerproA*(8x`g
znM0?}Hh2+83l!iE>pN$8mv^(2{CRV+CiQ2h;M<~uwyjni2SdJqiIoox3Z50)dcDhT
zCZPzeqF$j3FZ*}rC&|q!bT}o_B*X+#9?fOM{C(}}tm at 2MIpn}yB8FM$_t-!a)M0($
zaC8L=8^O=%_gkNn(#8#gX>zk>7wzV_y`CqqicHvsINh3$oQ)hc$L}G9=-e!5+uXE@
z;cZL{Y+)@Nv8-*^AVKao8~Gfjc|*B-t;J$&U)kBnVssP#cm6xnX5RveLwBJ8Z&^dQ
zhRsX2_;V%~P(*K8w1rxwkpTanvuAJm`8XutZh)6Q%k>g)ZSRHOa^Ct54LmbuUVdG#
z!UDK<zdt)Hf`c~<bv0SYlL*J2y0<;xgR<VvD8tF`D?+}glJwUK*Ha?|3Q1($4x$Pl
z$h{qglc`N;IOPPsnbn`uyxnOhD5`1z-&_$Y{8>HC+yrDG>V>)CW*GVV=WYgV_dkZO
z=T@?oLK7Mtj!%=k`Eo{g+-5DAGPtvqKD+y*S7!Ejq|OUCURZNqFwDK|w at tkCC0_)|
zDp$his=w6cp)D{P-<aU|nLfi3kKCv%!!C^&co4q7?b;}a&@29Reu$TrcmD|+RIq9>
z-Wm|&4M~!v?BWuODn;wB<i^`p?_+d}z9}(;G<&L3lvp;cajMa4X#-aT1aNIeWqKSm
zf-c=de2}92hp(MMJlYFn*K&X6!MLN05IAwdfLFi!!Fs4(+qgpKLo)1p&YBm3bx8Qv
z_CZE(jQvSfE*z0F9+}>5-~$-p`g<g;f){e+IE#9n at GKnA<EPSm!j|!DrdZLk79pBg
z<*&K(yykYwhFx_#L at Yj_O9j&kY!4X&eZZfHA9xHL<-!0u8ew+CKy=^_&JKc1=-|68
z`_BJ*NYH-*YIJ{;Crvgt=YK+le})ed0ueD#=B&o#zwX=yK4Xa=9Uun&Y)9aF5fcHp
zWAot<DllU6_h1R>Tn(f`&RayM$^OU%h|1p2Mm^qgxIB4O0Z;vVkrr26Z^-`s{)7V}
zj#@tvK#}vXEA+6Ll=MD;@!tb3{6vNP>GS9I;bF`?DBhS}5M%{s2MueuTKM>}O1#UW
z{3NI4--FN+dWOAn?78A32!@beKP4#I*?qhUh;TYs?$x26emtKQe7IZY(OF)Sh<~Is
z0p$Og9XP+ve~$<p))Xf=*?%8=f1-{5I at B=C{y%hyNIU at MWWYlqU=?n;j-vrsuNRr^
ziQ7u@@2NZLcf(1l;aAkxzmud2TwFA0^1c4p?QLu0;XxQA38bZ^p+o-RsmOc=5J^Rc
zhaw|}M9R=a%H~9Nn?9Y^1OF`sKVBZb-55Ja^2>ND#ed(qEhYvdw9}+(&6y4tg<!X&
z$Wt`dNf1QyViX>|{|MlpquH4e#N%?tG_ag?ir2uu!!Z930r*yBplv!&-FG0EQEusA
zZpOd)1sn_~@TLO&{eK8Ig^C#XH2E1A|Ne(Dvvu2n58d2M{~@y`D-rNR2N4v!zaj!|
zfe3Jt1cP7x!xU;Ipir3-<NuqrX$qg91FxTknEq!t)xi*|DD#*9a}cloPYt4w1^D at f
z3R$W at ssD|FnDfJ?;(b2kzCPADTVY_gk;PhDxp41PQ|WoDhB)ot1wLa1WwV<*-v$*R
z{29afS!rF%PmCl at cT~bo`kQ1Xjz{XLIBaxXRGqYWdZWqZbH=gRf}1(fxk2mg*}PU1
z%eCkejaf^!*oU5l<t*8mtH{69P>TVj-;`L>4Ixl at 9VxKErXydqPsGueTB6+gCyE{X
zA!lk@>e%==jg||KaKs{_{ZFj9hV*#6-2`>wa|6DrB7&q7Q7tL+EWS0M9QB9oUs7bh
zH~o84dxSuSPfBb at 8`1Dj>C3r<d#p6Is}b#|=1O(XHlS?^{(1je*ew{StiW}yCInJP
zP0x3RNj==xk at z<d?z!m0g{MfWv}_w~)R;#!=s^|sj~1f*OUgoVz|N|BGME$%4b4W#
zo<CZ5$f{5P6F8MSK#7D8LAGJ>4^;~eo72H~rdM54#83Vpss;TQxwB8W{xDSG4qTfo
z&x!VVg870K7cvmXO|HR-4&K3yoL~U?n9A3XW5Ge7sbvMnJz|K8Vl1;0DS$IlzR8#)
zak6x+4;kmG+0fI^|H{wsDi}v|^Pxg+x3P1W`1p3^90BJYnHbw3vNQa>xM#CN-J;>u
zoj*KneD;W(c~*4}LSWL>!CE}koj6C6gTR8}_7d$v(5Jt=s)GEV>2c=h$eNseZaTkT
zkhaQqlr%G=1#4W#UK+)1JRkti(5rc~zkbERz&P*8K>@#?c^MbJLEVL>U$#sx*Jb_O
zC1*@%XUvqM+eA%&!7`-28s)q at R{$oE-5daY7P9xP3K+$5aiIl^ZvDn)W&*u6;KCQK
zsXveKM^ER5L-(zjW|BMM?eD=Sf4Hep+qvzzP+K!*K9B($sCe6%nZfOl>VCC9IKCN<
zD9uHzRwW_X8M8~yq`b^0j%l#0K*PcJ$vh#!nlC3-M#yA4_p*2B?ULd=oJjJU9zX-)
z?iYLSiS`}kq=VEN7!pv<F^0CXoV2Y!Dg9-6N7la*uH^^J=sX4RIVTe-pYkR(v=}Yq
zVtKw#B9kGBNDK?cwFjm!L!vQ&l|4u15)7MaW9mE&Oe`RTlk^M}E-Bk3hhA`*5}i~T
z at RV{bW=<-LvT17W_|Cu&Pl?V{oeFs#XOd0$c!k}UyECpwB+VGZ8&c84;pmkK;{-9}
z@(7BOsqbC%W-Uu5fupNszaEMA;cpL`3m!)U)BjQ{U-PfpC<Lu23b!OyT6iuKeq?K<
zbD|;QR82vE7dZemoJCzEwp#5)j?kf at Z_d7)i1ul@!*5Nnk81D(bk*oKUm)-KvrnhN
z*_|O&IY*^mqG6n5gOnAY+O2FK<ZFiujMr~eoU&hBiV;3OD4+s7;#Gtqs_{R(E6HDj
z<4Od|q04?jhZp5GR#_}-kbe{+3%JRFLZw9sq$+WK-cfTbjOf?I((n`8i3(-Sz-wtb
zB|x`>=lEH|W at YavXIt5xpBHXXRa=`=UH!!1gsJ}5S0y;zIgzoYah*CpjX7!!|0)u4
z*eLpLBA#IuA(}>~6(73!*=me4K!k+d`?B&FfAV7Nu0?lCpr!Su$HLX!?Q3&=TXQvf
z3SW{-Ax~@Tu8Z`SXwo4sn9WDHJk)aoA;=dpDCnu*$mwB7EH7AxP3(ukngdNLkGbYf
zH7{O+mV9xShvTFGgNB%J1jEY3&5FUN;QFa8QRVfpzJInIgeC;Yig*pbQO7Y2a&MG@
zXYjEA3H)<uH9LeH<Zcy-MAPPa(0^>}RKTp;xy8ssOW`)>Svwe!=+U2JpaOX=H`o7)
z59QMeDIbNw%qRk1@;fDBr6jvhwo3-|JeJ)!9(@jn_PBTMYuo7=cn^260~npZcLq?j
zXwjq*_Z`|~h&6%`LLT@(>waziIClAJnWpTCPC*M#!{&{h@!aSF%I+3CgKP;==E)Pg
zlnbvP#Gz@|A{ubRrFT at tAdbK^GG_uY4r}qr*<O^r6rcMTP~tC8OULksg4t_DJ7AT^
z8G`@3iJU=N%Tj$+<Z99uN`#~ux<Q&++4WL}y`X<8_!BvyzE2*-%O`~;`<$Zla~IFY
z{Q6 at X6gjZ-gD;xdv`8Ue_~Gq_^eD?fM)~Hph*~q|iCTQD>ybK2-x4^SOi)!*GcXmL
zJUn)15Eq6J;<Ryu6Bt%#J3w^@w?Z+HrM at _s)hKSfYL*re9mlu9L)M<R7~RDrzgzVj
zthzu5=1Ay=cM0mo!18%TP at G|9ZLKvwJ-!gE=J)_-%KPi!2snxynWKgne{b<Ao3c{w
z at pjd<Z^#Hh$imCX$(c=cB3Rsu_?IAQfzf2M$yAJGFr0n79p~UXEs=)?ZOqEjM<()o
zkZOsAqjViwZCq!v^T^1ztz6?cWh57;sJ=LA71_(T)$2*V(Zwexcb}|o9&PFoF1BF=
zp7Ne-|AuSpVb=>1;m*vpsah+2B^ybLd)B#Y*cLh!&CqFG0HzAepB}z25u_=Zcwg`i
z#XyILiwnWFvAsUZVdmqAg{xTQxOi*3u=fyxfV$Az<tNBMjBEglg5RsRy5XLp(AJSC
zgn9U%`#sAr6UfR~R`svHlWhl~p&AmBw6UeBIFvj>9F=SOzjVcWnFLum&5N?Rx~QfN
zej|*bhEM&TX8hLqZhxcrt_AIsk(W<k$KV-ASjq)7+6;nt+>eo=rcRz6I#KEVl3MvK
z+dpy+I#4 at 6Z+Ye@Z1rfL`W3>ykKUiHEc`BphmIJ&S;LB>-1=Fb#o6==q(Fmfy at En}
z-nlLs$I2)r?3yuZ*BbtuiY3qHmiJ&MWs8suBM6m$C<c|neQ7kx($_neNe>!is<rBk
zX6<ERo6+vxJ&{hJ9Fo%$LiatB<@hy<w>=TJM|OPy&N=<X>OXTfg&5Pf`bY?qDm?1@
znel|@z7@!({;P?E8+OnDv&O3s(T>BxdO>w5?#)kh>c1$&lj61w)TZGVI*;z at eLef%
zc?jno4|_3+KbR2XrOold(Qe(FU<TB!hjdoQVu|Fc!MI{BheeJn+ at 56WK;Ow at 8|iEu
zf8{>E>L3$8a5J$Ii>(&oc&LYk+0JeE#&aS%u>Gpt{Jz`bVNKB-3&<XF{OYvbMW(}@
z at osq^$1!BK73Tlj*vg!o(kQi)FfK%%4);^QUQfhwozq&kV)T+xhoi{e)sYJDP6iru
z&gN_Kxz~|H=vXBJ?=T~)J%T_0Opcuz at m~;$yPOA^&*hidpy-2>J$aA}nSf*ckwh_R
z19O`mhwoK_IVO0;tNHs at 3J2P6LKgPJQCJ-HoM)nu)Vrcf)|HB|7T!3B_U}pQ1|uIp
z$5r!lxpBE#sQ+R`0v3SQYbZORQ{78iR^a{-@};0HoLm;7c1``#YeFza_Ik>U7wU<T
z+v`4icCR1b!h;UDc=Qf!7f5F%A&2Wm!wf}>!M!l<ruYdKz<RTYX80+Fe~MZCyrlDb
zqV^v<KlaNGv~AR-OmrU>Q{8mLK?;2z95~YwsmUEAvq#?|n3X|tmxdYPQ0P>K+Z5)0
z6eqNc(h~5 at We-bS#*E{*x8}|bNkmjlQ0{wt1bLK?jm|YkDj#Zq%d>#R26m1bT$DRs
z)=ihU2n*xQEdf4A;A+-1R(iqihhpqyV1Ax?FVp4;jzyE(I%u_*EO&(sjahNJyV2Yy
z4UY0P0>ws>d3%M9NcV-Knu}~+=2waMh%@@<Jc!1SrrqXIOmYEF>0;S)aO6_A^BKv3
zR2M?>NzS=YX%utr_IKHkSANp8sd{r<yrP<8e1LN90=X%K3R=0^SK`e(3CnpH<!+yR
z(}bePrQ-51Iq_;2|EF^OzE!whg6^y0!)Rz*cxg5*ag+oraVL3f_5JM3Wb{QTHM(1J
zE8>dUA2DC)_q}v(CB=KiqnnC)s99V>z$yp*>jjS;YZ(Cfp{8!jrPjF>1RV2z=Jstu
z3-byz87j1FT~77OpE2<8Q0QnNcL}(~=Vd0!^0eSD<vR(%C71%D at 91QxW7tyUQlY*s
zNEKE1ymJS`{m(M-ndT0D7HoQiKL0jhP1nhBTp;W{8f8oqWGR$2*bKvRP|UeYTm!Ry
zJzJNfjC{F5*Ip>S&UmYL7x{hS#LfM<kzWK%nK|Z6l;ozTVe2~jPIgg(LSuRh{rE0l
zlugG*kp{Od;)L(PdM2*iw}tI8mE_>QAE)0s4liYqtH5Z&+4r&pU-Dsh;-~=04IMyx
zM;bx+&&u<k6Y6rXN2-MIZQZP6Teef(aepQ;&UB(JCC#?veO?J}JrL;{<|>lX5LjaE
z=dMJxKutQQLin75mhd3M-OvM<C%Ym!z|n_l^eA!G;0Y(Wr5ggCg=hD#W2Og1o&usf
zmF_bnfs7A}mhkX?Xhh^YQW`<b9T at v~5n2E29$VO2q(Do6S!378-V54=xxK4_jKB|?
zhN?95vcEt4jLjr;23I>h0j}h at 8UN#n(8qqkmV<$CYmgz^)16dEBVRl-yl6=A>)&%r
zfJ!;U2}3!Zz)=rIm46EUkSHtZ&^ptRBG7zAPnVyCu at 8UbNUok1fXTcWy{czFlOj*`
z6$OBM2M;YJ+~IRqpFO1y!%wE*=v&=okxIR23gG$j`F%#$656#$L$%A!v&Axgz;2I2
zn2+<<o`AlQa^vd`HMlm!5DdcTkeXLl=yMEpw-~WnQYq1^ktG`@A>Etk(%(Db+AiLG
zS&)+z=}JAxg_4HZ%qk0=cvEz4u)Df3PrZA1mlM6hjahoq!L&FDL%qmYMQ+OhtFj)g
z9{Rd&REXG^t!9=Z4xqk?mKcIhf#RPYSwSVO2<I3WR(5tWX40TFKfgMd=9n2&DG|VE
zqTzQOpYo5H^*w(MC_f06tF<t22;=wQT1Pcy{TAw7>G`o%NDep7K_O?e#aXTrvVwqB
z<JQ~#?Sm3t?s~Y37sU9D90nd^rw}aWK!Fw`jtKC-QIgOSWJZoWXz5DA5fFc{kQE@;
zp#*k1#dBa}IqH3v?M{*yl2f~(HQ)K*Ipj4`k}iC!v03L1bc+kI0A*#Onpxwt)Q&`5
zJR<U%?4s(UDp;<6t at lz6Vqor#oo9UioA*^?q2U*5elLlQB%{>kcjniDUeC2KSzCY2
z-xM}NbPGauossC_deH)Xqbdl)R}mN;liuh;E_rBZpLPaX4Q(qjc;4%9>Kv*Xu^mwe
z7am6XX|DpD2fUuK(Yg3&4xO88piRRxk~(SG4Q(6ny at VDIUGH;}7V8lSAb%&F%X at z&
z{1 at m@vo2%@(7m*$wwr2#8}|>)R`i&`YJ4-W#E~-mB+ieatmraE8xL@|mg}>Y`tcUp
z_EOSNb at X$9!H^rcF at J?ZR*V*J9$fBt%k&}+J?<TR at 7riqXW2La*I16eT}+Zt4<Cpx
z6;j{>ckrNY at eZiy)nh)5zrh6SUS->3^v};3+!UP0`1yG|Mc+IR(6((iFw$fEL7h}N
zXiQ at 3hgZxm5F9T^^Nd4wNEY%6j6~$((P)HgXej4e3~8>Q%c8-DVGQjPkx+zJx8f;>
z(_YMB$mJ%{tdX+c_)U{4VU*}BYY74}3!bP>8hK9~0<e!g;SD#LbWxQ;*ysV#fl7BB
zK&Rkv$)0FqI%h%{Axk3Ccob>gDP{F0W=J3IA6$mz&-Nqp7AvdY1SYY}fz26qw_`ye
zVJCBxf;MhJpgrv(@I7*6<iy)Iz#w`9!KD`!z*F;O&bqx#syk?ac->3VyWU>c{6LXc
zDQApuu7`YasKg#B?K2vBv3v9`J5p1jZQao&WCRqR^I3B*3>nI7q5Fn)&r%gEcFX+^
z-C|vIpwaF|P4PQ?V6aF2mDjr4YV1_cjf$1t1}QuK%Ov%f at +7dY$B}MKnf5YwY6dEq
zz}%C|qk(13Z)DHbV)TD=&s}Ak`e|<ioNIg(G1{g{WI*zDF*ya0&Aoh&Gh)Kc_hixQ
z^S><IDMEnZqmJfuHfX)7#)Sy2F0;4PB`%tKh<xr+l^96#)7R}e)w!4{xE&a-i_%$8
z1wF_~{mXg6qx^j|3lGF(>Dnag+NRRgR~M=6_IH)O`u;#Z%7WCq&CInKRU_+<-il%s
zh(Ez#GZrCPeObT#3&gu|-erD~7S9WH7zMr6-QwEI)eBC*cP(1Lory!Hd_(#5Q at 4;f
z!JAX}%&Ex=xHiy7wvduV&-;<AI~NH04A{uom6D^=1t`iq?aaI>W3joVYpRQ`Sj5FB
zmfX|<H;!SqrQ=|6k$n8vw}@nm)6 at ZR+aAalwoO^q<3+Tk)oc-7Qmxi at UX#DpV0KP^
z2f!Khh9zilS%i1O(DH}_ws4g|->B$dkcL<50Z)gAf=unTQ+RhnS<1G$rZ}-vktIH#
zFx?2|J3UnI0i2f&6Ic86dAWYGyI@}2By8!{0>=pKVpy`K%?l{W9BW0?P$nNmIG(}0
zS}()Md=FO32oufnjtvh{q4hb?1Skd8h|SzuN0$F+RUR01en$t_#)1l<#k^#Fb&e5Z
zWqsIjl-Ou&Wmfe}Dr(HNGn%r~fUQS^g%lMb at O-P5&A6`eWuUo~nXQCxm^*hryvhDk
z+_Oo6uge?V!R@;4L(;Qum@!b^oN5^S;fLe<^#k8D6w}ECL*71XtAnn at TB&yBQR7qe
z1Qd*n=N;V&XNx%Q5cYL1RN)eY+`)nN*SpwF{(0?I?R$xP;7ZCujDwu2ahLrTkZdi3
zmgx;7K2>1zDtZ3Pc>Bfz*Cs;~l*nX!7o=ynsbX{(a2RB!J-OeMwt%rx=}0crJN#=v
zfI{!zxd66u at Yz2??Bjv*L%lWNC{7~c2V^B5Kk~kuK)Wn0wxug&S>zn%yO$LFY+bk?
z-~Y4Dcx{Op4)|YZiNRHk>L2)NRZ$L3ZSwFLkH>4N?OC!50&bk2Xh$STYQB!(eAmsG
zDt_z!gqj|hT&Vnjdps!PzwAGH*gf8o?|_+I`r=cg``0FwoN-W{gHUGC3t4RJI63Th
zT{v;Q)QKO}-uyc9SuCGTKe}0P5?(~^QA88qmV!5|#pBN-^go2Aqd8pBPH{4FheR$%
zA>?83r(tMl at Cy<)(J#Z&UY`3|R<`e7nzV0+&Tq;+Z#W<t(IqA<X!GEp`gPgfyb?OZ
zkkMPe5<Wutbl>CsKLV))8VxMZw1nA=Z7s1BTac4|aqPknzIAKz-)XQgOX5$+%i_(<
z#h9_C%W!AND#+W!;!)*J$meMw2APp;yOIQ-q<;7~J+DabGM6B$(Bf|FM+%1}P+pfJ
zE6hey!y$j at Sh_0<6lN`|D%j5}Q++0g|2UGOf&w}l@*C+AK90<h);K2DOC7f~GF)Mr
z3NoGou_fhSYV?HUgfnDy6AyUIokqr+Ba!!drd)En6CEs#&;8x}n5yOG4|JdY7uH=U
z3}~`^R<hYCUsDu2xZ*QUk|Vol2{aR7j|kSgl8*3a6U*@tn&ZO|_xb4~X6R#6`(HS?
zCo8nghK(A(FD<ob8Ubq>7kzqZ`hS7JSDeAcScqF)GUI5ub4Cfc^M|zV8g;B&a^NWL
z=1u%qD*aziuV6)?P6}pvZ}UBL&Vcj~rvCo`hW=j at _`e6_|6d-&b1kGmpH+jsgK!*<
z6Mw4msOGC}B-!FQmj7lA9ss?LYr#=gRW(lEukLbE<M%y<4&!D8Xtc&7o1GNiHFyz`
z?sy4s+9ewuQp)N0r0ZJf^d_Csl{X6Jim1-;WV$q|-#Z~K)Oq*S-<BlI%qUV-<cYls
zILz!X3WwG4S7(c;%qO>s at K3_-V@=M_ojvND(#piTJX^<_&%Olw1iLB+byxVGot?Ga
zdC2jHYR#20yDV!(kCblu#x)Y{!fH68`*ZZ;{uA68tI#w8h>Rk%P?8ZH*YdI)I-fp@
zitdj1Jg#=$5`7405#D}AgVWO`$*)gx85%E7S6<8g86)F{0ehNE!0A@}AZ|f2>q7XQ
zm}qmR*vKazLLbrzA~K?`^IbR_P9e{GVMHXk@|wn{)ty at lmvWp;5pnlx6m%C=y<l~W
z2pG)X2zsX9>Tgik4vC(5bq at LBLE|HFpK#)J!TBA9g7WF1MH~;-n-LE`?2uajo{9Kf
zq9%WGI6tvjTTD#Tu9|QeUj!H*WYbg!1z4|Py%Zm{B$DZY<?-H&#V*PaO~}<#z)1=h
z!mRh?I+4Sqki#xN;A5#Y{wde^bL3@%7SVYg?3>e84O}o2O%iVWkyucD9+IDjMTO0g
zzi<^*ga at qR2VoDbGBD#|X-Hwf{{iD0;<pbf!VcKtYN1T;v0qUtWYyP(b{!OxAYYuF
zedz`NcJK|VsctA!v1xf8k{DcE1xEmXeeKg$3*UqMOGakwbRAhKk78%wYLrnjQG)fo
zb!5StRiHc%tFjS=t|Q8Zhy at H<Ppu(R-0*JVQNL&Y_B-H0j3TkLzJa4TMS+GhKvkmS
zWHy`x*f|i(kagN_A>)pvrmA&(P{}$tRTcOp*GK{87rgV#_>}si-C`mc&oDqgz?cEL
zIf<W}Yj-5eoto18iKwPyVG6<J5nDDd{pAwBc&)ldxlnUo-zJ}M&wdnW`nPh1QCAXY
zWEgN>>Y1D(D%MT#LW>+`_Ai=JoxQMCn#E1A{s}_kG-rUu_nDIXvqja+=Dpp1{PAtx
z at ocb>sgu^NKe{U7ck3F=M at 0i*X2Psnb|Fs0V#v1PLn)R<6h*No0hdFPR8f1ct<L8L
zb_2^<#w;Hy5f-+lr^+GZpV~^t!<+YPXI(Da><*-jvbYUqqr=KSxPWUnW5(b4R9kg~
zug*obYa33InG@~j@>p{&2H at jewaHUNOZ#2CwJ?@QX-gIt)70AbHOXg~0K?+0;X^ZH
zSW4Y8<N27nU_AMdz!A3ip&7F#xt{3UIT7$Gy0QqukkDVglh&~E<Tu<JKW|@|$J{q#
zb}JsjD?2<poVMB5Mn?<kZZz3KWomp?aZ=V$ZvRhds8!YG$UV-~K%`FA2-d?HUq}X>
z^uGf6H()mq!09#S6+?1oD(rG)S*KT)D&23nDBy9kNWJfT&_a^j at A8O|x$E|}xwUg)
zB7_u+a<Dy7{M*D-o1YzH&3aoo)&%MNr$!Eg)0>I&rg9E-UVwM)qO;fY<cjNH`NObD
zjd*9~v&dvZ0CS<OuMgQ_xg~~FfWp{*L=Yfrdc<@1<TJ{1<grjc7eaB0A)0)s2X+Em
zsqt- at 7jQ81rcL)4LK@`w4ue*XSM9do6e9 at yb}B<sg<ZN{UaQ-WD2jf7Yuj9fhgPa%
z&kAsd?3WOGX=Xp!J*EW}iE;PSPid3bB^3q4Lqp0|`LIx13<G3n;EGJboo)&b^v#0R
ztB%^9SLhg6X8A==&IdMAi*?8x<jgeiQq$7L at -r(bl!u0_9BiaCik>(Rc`3)RZSC#J
zSXzpt^4f2C^g at u!`E7&SH(q at jvZ&%Wm+rZ_K<V^BFB`T9X_++-y?DMI6N2ylN<S6b
ziTKvBaP40qb(Pms2!VPN0^g3dlBNBW4OB}Vad#098Qqf#%0hJBv8>L!i7tPFDZL|a
z%YF=d2FxHua6}qAA+?WEj9cTVjlA*aWQtQj`yJ*7dY;dU^VH?Pt7AXUYC2ek+bir9
zm#UHkt~?bb3<N&Aq~q=x_}xLHB+T;!utZ(W);I3}r<LPm2UI7P&jHHxA6Tn!UMx31
zAM&%9Z`n;2AmMrp{j!S4q`s(!o){p882BUs14t|XGQ2lrT*yj_?mkCz4KZGLCwsj)
zt=8%-URM3&9OK-|iXzw at x1!NV+{i4zU54_DNZBmgmZ9UMzUmQX!M^o@(dc5Qre)4e
z=2V`D$OlZbR~T3Nkx&2=8zT%mCGQ?_fyV}U3zIHxD(fHRC*v4Zhz2AaySed1itmak
zDKAO4-ksimHwd}xb($&;HKIVaxpIH9bWfCtF%UGq!qasD`*u{QN;;0Q@|^eG8}&jN
z8q8ic>w$xNge-h?M8B&S6l{V?JgB9ffK~YU5>XFW=+w+o_D<jk8E1VaQ(V7N*Q8q4
zq}d(gGP5LqRcCq1c6|30YcZ_!*HUG=L12=xqbUa0BOV{G&#yR>H8p-?4LRV#U?_9M
z8v_=eRbUT8dP`bIkCa>4LJsc{jO at TBzx!~m->aZAf6?0MU2W8SvHx1)qkjZ%s^bdd
zRq(St_>d#;9Lfv*fcMRB%Lpw29p+h}9EacDG>>={jN$W=LGoi4cs?83SV`s0qNdHq
zDOK$9emd81a~WYp6TY2t at eo?m*&3;t_*^MUO{1~H`>QlvV8W+p7RR5*0si7*<?`oX
zS;-0 at X*C-!X3>wO0{=IlM3Ze40<JCIJG#(OZU?MSd^znuiM(o1)#M30Tag4P*s0 at j
zKa9fr3?9RGoYHP>Z at 2f|vEw?&341GxC^)`uY+1_mjrM|nMoo%-z%IW at OymJ(!(MD1
zn5^`u>MTx>rD?!nC0A+$x-6&Zuww(>ALI{AyPj5i34CrV^o>Pvq;o8hycdqV0h~;)
zzc=XpxW0gfetY`}-H`hRxGby>*f!QXVq+23P@%pk?#sD$7(twDQAC9l_<?=NA_ki>
zMSP<z-$A}4^8=HXmd<Aa0~#S<i6HPyFTj1EtdzvWAd<)^uf3R*IA5&HgijAgE*{|8
zB#W`gJ1F@*{9`pWAolu+%miR4x0*TDBv6T3K_jO457TKb7IFegRPp$KO#7~j^4i*n
z&=29Ca25O|l2kxgR$89!1HKFhxeAFUil?aL@%FyMc7<uj;<!yXB%OZKkXrIO%TnB)
z`@+hFKwTilpQjEDP5kuO;BBBR5|+4e{;hQA#Wfl8GZ%eB^Lh6CUPd?4QmZn?Nb75&
zoSLX{OFkF@!hUJ at i*p{SS=btKn*uW#AZsj62PAf_rk7_oe`jVyx9bQtcFK4Q*OqL8
z45S+j at GcX0x<nA6qU{LHG2S)Qb{#4B16xP()XNXC7T%oyPHMSvD;Ne|;*q_WcpG;k
z9_3b5cnyA>F>iXs7iwGKeF~LamLUYYvWzZ_bJ*iTfk?B$*4K-BW-}@Mttz0CIGCIM
zBG4uOx!6d)1l*%c<6I_nt$#*qWQn4HfzB>fgNY#2$-)8=GY6(E^<?MuUl*Syd*{_U
z7<_gU)|!VH!-W(659Z!Fs;a;H8r^g^NViBxN_U4M-QAti-QA!9N{Z6b-6^1ScZ*0I
zLYhOo8}<1<&+qr%aqoNYc<&w8vHx%|;GDhpr{-L9uC at G*psmh|7&bCn+?|ia!3wdS
zmXZycdm+sSIi8Igw at d21YXYEC7&6eEsUUVri;%&w9#0jD9&(^EyodM^F1fdwHt@|V
zOwi9=KSQ7qN0cwv at Xw5<DG~Xjy$=KIEurNq+*nQdaIT>OUGa~WtImolW*t%Uj7lq(
z6vW~TFN)XmUb!nEm^^N4$mT at wLJ4kT=izF(Ux0WFF&}EyI{n?FONf7)FKju0Q(Zmu
zp4y1MN7 at eU`@!$U$^*qIdI)vItXw5mtVs2Sj&`kfEJ1DYE`%1CK7k!`kjR^#>*1YF
z?7Pl92ZL_AT$uOxP(g~G;?CUyDtS_UXyR|u85N-M+nS^i3u<QO&tPf5X!#x0hQtaP
zSTG?Ge*FT96W5C+s(mg%@Fl_ug%dN9?1rCxPd7reH86zbw}=S3p%wo>Gb{aX<v1}9
zVxVuji+xvpyXP+TSjOkFw+?Y4SUEm|+N%HI=2G#8F}5Z>ternjaEDGw=JM)@8r6I(
zhw#^z<g)w+^A#*%1LEM1#2>^`%uFBT(<e_UV%Dkz<FpBC!@mGWpDrCV(<AM%6<etP
zo-iFWzl8$9ASs#{m_f3;(@6nV?aT)`IV*wxbOeFJuRk0t(Xk7vk?VD5`vXnN*o4fk
zUWLP~<beU0ZRJrucR$a0+J9yxi!Abl-k(jP-fc~w`xr^N=cKLV^!3l2!G8Re_Y;yO
zS at 9H<_{eq_ey|g~FdnXpNgP!gbjaulw`yq~MPJqF^(9wbTxkKtzb1#1*Q3XYTC+Id
zP7?)x%$AmUdAX3{Q|>u3`eE@{)wP at t)GsYY&xUcI at LX((EJ<I0{Zd|TwmCiGXr>T7
zQ-(NzjE}x&UIXiOF<SDZBl7P6G|qU1+%!_qs at roIErT@DG<u;+G0gJ^1!y`9%P4>i
zA at u&5IZlcuA=v3b!CaeM=hoLq^fVDk6{C67OS$mrLezJy$CH=vyX*XTRb!;o2HoAK
z)<7o$BaD$3>x*?5QegFj4#UdQoWT1<i<|03np-~;93#=Ajl^Hj`$4)gD?T3u+db$l
z#SP?`DS$rGQ*sYlx$K at -z8Ovi9IR2kJvsMvKC99au7@_^t1B+0NDN^i3SS;%lXlpE
zgY7_(AV=1=%5YH`F}Uk1f21y6d0r1DNWQKzb_^<BiMzDn4g0gAerkOJ)$b0Ed6n6%
zE=^r2rnlV_y|7>zo6E)2)0%X@=s??=&0D=iIVspnP*)H1YenLCo01U79^1 at APZ5E8
zBxE23{@kbqZvvVZWppt76~-8Ulv4g9YQ?qG)h*W#O6J`1;pk%J0DvL<bxmUfEe*>P
zj-xVicXG$iUmXZQWz4+`^jwr8OV=MKI(XbzI-}XB*k%x&Z{G3<-a%}LMh^s3X4l`s
zi4|kH^~-qXv)AzYmSY`2z8%KOIXQqIo**i;oE-8MZO|(@Wd*HK^H^!s_gKi|x@%z(
zjGidTXdncA1yhAN`6e4;>Ov<S(f<zd*Wx?iD1`iQbx~S1K(uvV8VsW<oxd6F%{OyI
zN|Hmyo_s#UV!syRjzekqUQ-tBj_k$Sww~ft9gFEJ(PBfk_WE+fAko#gGB>wBCdfou
zxk6V1I3q8<Cwtv5zHND0HC4ZQLll(s(!A#zCcVgwC1OV#S149Tav`oKbI;jQD7aMG
zeahd(WZ)+$7E+@=?*WuO?Ik)d6_9p8F;_=q7HZ%k$Tqy*BagXL2l557Yz^5b?HBQA
zg!Bzn?_L)B510blFP|KQPVT?~$l|;*kwXtqTT4q+CTpd8 at 4|w{SrNTwX*zmjg!NR9
zel6bIEfOCC2&c-dXM8E_AAw+${JcAaQgIR1MbRMpJB5hNV8U8iOCvhgzo<@$ijyo*
zG>`pw4J;m!GmYcDVAg%P(JJJA4yAJwn(JJpU at n1Kt7)kLEhOEp!)FqurM3V=+hH$d
zpxb5*<?`izGilE9=~`*VU}H<FuTqnPn#@yHxt!Oc_gj at nMl1SVY_5i2m7!xTPj%01
z>&FSo=AvwXU&nAlLZ;bUGtEbBE|rZz9Sjb)uZWE>*fs at ai6offgV=%&BbG07B~kb-
z*_+z}cOM42;|C}-*++hzLfBR(d<i<%&f*{3S at LRar>>HMt^AC+Yvj@&zrw%%8rJti
zv$lcfqv2hX|6Cb`7CR8fH%>!&KQEeL{H%^vJJ)~Z18Bd*(B|7!q}dQDUv{zR5zQA!
zUB^lEQv7>NGiicu_)fa`IH(J2a4myEj{#W@*wtPRmh<C8RO`yy{Q-eRIS<rIJN@^D
ze!Pz*@WDnd-5qDX>j~TS+ at iou!C*qO(`*uUO^(rxH*ropgzCp?uM=2vinnBbnQx=t
z7hDME0b|baYoZDEcIAY9fwd0{RGO+f6!c77Zoamz&)N{VE at xdwn&oM~w4`W@<*>1J
z7Kkt7FE+XpN)wDpKD)2+^z3lR^jtZ*LYnq{R)}TFEG8sdjJ6_cqr4H2B&eP37P at 8H
zqGP(aXxw1KQ2VXND}&udqHzVBg$s-jnK+~LxmvRYOa)iw=#-Z_Z|nu~UNX at z##=_P
ztppr~5 at T8oe0VJA@ltIS>j=(%WQcoK9~1R7b}t;pSd@`)CPYMBj9sNtUoG~z7d%Xe
z-~`6;V->XfC2 at S_ui0Vd190Nl*e~ojulHfaim at Z*v8j+nqPWF|WvP&1yZKwZLkQrr
zU^C5%3!!{wKUTQ{pkH9`%IV?#0*lYwAb%qj7**?N0B`Nl-WV&)+S_d4s8gMo6aj*r
zkdv(~?&D1!Esu76UqyHvcrf$9-kNidELi8I<t#RDxgAVy9+FeSu}<c at Qe%(uD5C_c
zYfFst_J)(i7n*j5Z%0w(*eYnfSt?i<MQRXr=DU%ugP(M?Xm&4eao?;L)!Td8Djc8z
zMzhefy{Dz={>pt-qqUNvE6pmQ%ubsfA~TE4s@(>YXCK2!`ugjL1N$AzOgx(6zD`bF
z at Apt19afLVz~lm23=Y0+cw^GPbj9c+ma*XvgNVJEObuZ|<OQ!9KymZYWvZ&r+)tE`
z=FB@~)Zg)`E^&VvY%Q`%Q6t0VwW(oWNEC18^bK>~6&x?J{VKqACehjp^!?@W7mh_N
z9f6dY)XQ!ba7JvfouN878{A7GAXdv!%CJ0*@`8S9$1<Wy)Q}FZ)_tb9?G9h<1>Fz9
z0lrno{8Alvo2aZG at +e_g+|RM{skqC?<8g-Uc at M_rg(ed)KW8%65&w8Cj2T&7u&2}N
zS&FKW%yFSG0_sd$Nx_=~aRDI}nofpZVZ#yifhLkA>%zD2-xbN*>k}NLyDp?pcx}&S
zW)qdQjQlFkt3ew%J#K!mC)Gag8hSMFI4l!(DS4^$d`bd8WKBwU7cs~IXeu(&dq(#1
z9P(8A#U(W|>nERj*q2CI*qP${m6Ew_D at UXF*S9?Nfb1IP$lE5Azc~u=1>pR!Kp56U
zD~l*WFenfmtVY*y$ep&8;1-^=t{a;Q<*1tvsV>Xa*T}8awdToCuGg at 4;8pgoj1l##
z3b`77q{~uvP)Jy7(P8lg`B=B?Nl6B3Nk+^$>zDS59~T}k9Jt0+!M`Xia^xAeeUG`S
ztj?v!V(-Ajpk-lS%)+I9+ZO*sw=BXVryXex>FENr^tw&qgl_<qq_5#z|FG3c4~m#S
z4P}mnSu at rJey+SqY||e=uu_JfA`=P;N`kl;WW5j7!^Xz78wdyI2PKVoV%5-`QyN$O
z$q_QF(0J<>Zv|B+>C at BIj@Ru+Y>RlXtj6Nr)ldFT0K+GeM1V+!s=Y+Z at N}L?sner=
zM-i#hJP|!M_0EN$q{FK-C1O7VqmmowNVdP=a*Lkc=faX(av*{V*^Gz}2D<=I#@dqD
zzy!0kl$1YH6Yd}eelRED$iV~0rFAawQw5QWIQET<sBJM7d{_7>X2oue-DUr~z&~)2
z>sp2fsAb6y{`HLs^WIz6NH^n4hE;51$8x341{AimKB0$lbW_zE`MO%kE)Xfm1UUo^
zOhh#uD at F=JU|EtstYpx7(L;wE^+UrSF&C|>H6T#1BIj;T)(BDixwZHQ1{iDFA2?KA
zoBmK(Omni!uA{#s;k at CN0QmL{Us}3m-T-#V9#iL%elQ7~2S3*G`#*0Rp#z=*)*q2O
zs5;3<V3cv(?T|dsRbO1k(|u{GL<@OpKYyac(hF`wnRhFaqUyq@^0{RN>q`y=ALcuS
z?}_gIqKCVhLs+p#c5Gh&<)F3rbMT{pt8}aoDyk2Zi+ax!Yzkpxd1`=Zvepows{$b`
zOH$0otTkk%KvbpnTpC>*JM##-oVwN7(&T at DNfyj3@*>a*5B}K=?H{f8HvGYZtcDKM
z`Cn(YBmbg9aR5rxC7yjoa4$Fhb}EH|ljsr1&YD+HA6y?}%32;C7=n~#uZ#vr@)TZ{
zM0q3li;B7KYfFq3*FomjKdl>bM(gmw5?{8 at cc!X;Vf*JPMEbzwi0Wd0av+8pxttyK
z3cl6n(vmgsu|o}(5yo+D!=YgzeN-kRWKdQJ+pkUD- at T-rGPhsggq`wC0y|Sq^ZX8j
zGup<iZ*?v{(gzs$XAI~cEa(c5J%F7sgeok~qFJ>p1T3GaS`6#nfXAnf@>Uh+izy0$
z%@{?9QeJ$cQqWqxQG(FGM0``WMaLxi{U3B{z50+5F%KeF<y8 at XHmT==D17NYAv=LU
zP=|@U&CYbM=1J3O!e1zx|B&hN=V7`CDS#PNnvHSnr4T at zXz^s7 at -K;*0>u*W%|iJB
zDLRx2-d_ at Mou+>1A!}j%q*BeN%&E8!rT4&p5OAL8FlQ{x{-dqL<Nto9e^V`$hs2p`
z#(xweE~W=|%Jc8U8JRC*h(Q-=@==CNYgkp%WKE4B-(4Umi*r%}dcEJ at A`NKP8+qlP
zew at -IFWx6PaKaEbGW_*#J at BI`GF+#_<Bs%T+9dGm3O<fI-sWX}d$FW=Jt)}cdN^cn
z{7Vg|qgCB|y=%g?ES?)2;v36?yA9~C6vBT6GH6H$Bnbh>fD0f&3^7t9Fsgb%qI6oq
zt|bBME;E>xibiK%UU2c!l>x3lCstXPg-ZiPHqqSK*!B=+LtaNu at 6w|n?&>fymyON)
zKOUXK4aV5}j)E*0eI+Y3m#E`uktoB)ShBa at nVivxUh&#MA?IbZ$l&3$nfIredg?)L
zztdt7sFQy0(=OthK*}h-u`4LlH7c+rDyLO6 at -$-QZh>jV>z*gT- at zbom1m=hxb at c#
z>bL4RsHfIZUu2%h$0Hs?;Z#{&ESegvAIG~^gK{gaky_yMnv`RDOYZ4y-|?DaRoX(^
zGWa~~5&M5IMfF*(ArDd2QE%QYp at JV>56)CR7rW(OFK-6DTk}Ta{I+^@UXJVxeze=W
z9FDBv(|bcT%XFEBCEfbUw##~t{%~~d<NifK{o}{1tZs_}Sa0n9sSD5?^xbn&Mvu~e
zhIn<+YwM>FF4iYPilKkr4~@?=@ST6FljWPz`Q^JyvB7D<tnql at 1zedXUI~rlif(_$
z&x=;?`XHr^6Q4PrSo<yCo1HL<_HfH1k9~?2evZV at V05xzn^ymGkpouNJ^9eOHG4)^
zt(N;u0{a17=>5~AuC5b{0lQK!I`F`i!_3ity79V(9~^(O8&iyGW?KLD7X5h+k<ih@
zip|-F&tk?j((dx5FRVL)Oi9`=zy}2iOc-qV9c at bc309m9zcQzw^fTzxyFL>gvKjQj
zE3BpZWo(WT*i;|Fdv?TnZA|I{!NEj)=4I86*>sL93aKU4>5jHT*j!0GaFj^3c-%1-
zG9gKycJwv8^-&6<WpdebK9AZHjEiHVzB&YE3~|2xfAYz!4<p!sHyUrWG><(P7BOaE
ziTPG?zHs=TFD%=+E--iPKYBlmND}|#n=8V at gsza^v*seb{4R%x#P<2)ynUX{&8;t2
z1_r|m3 at 4;#e9k@^Xw!<GmKR$|%PCb&t+29Gq4&)l at h$-<37uT5S{c?{B-UIOt-RS?
z;{N={EW&^vRF?o8h*-ulC;Au#E>aAx_bfvJS)t%ss2hitW$=+qfOInPy)`$%%Ye*a
zGoeH%3&ejoHS8k6eC^U1fwYeMh6`MduS>1DNf*v+QIOz>Z}x_nzUvZ$|BD-Sk|=-s
zs_0^6*qudRc*bFGEZqIp2d`{8(i#5Q<<_vQF1xom&IL)<u|d~fAnV$J2)}XIzjv7!
zYIMMYAtuJMG`y at NY+oNGCo^l-D%av at Pfz0$-lQ}9BWERz=FuYeR`P+hwJBOR%NcU6
z^P9cfmJp{A%XQ at MRZO$Tid3Nu?S@?+#1Q)_>^BdliTPmBv{lRpY~j9Hk{jix9`B7>
z*3Ab6qhk`o<j$l)G0NCxN9{Q8F#Y&KXGK~=wGu~&MsHq~UpQly86k<V*>RF?DcmrA
zV$leI{3LI^UMFw$P|q>pYmaJbkp~~k>#*F0u{<wt+V(>+Q$0-XmZ8p<tr{J^zC#lg
zr#)l2!|g~;FNh?Io3NK9hSuh!%;ojBasHd_X>Pwlu9t(=vMv9_%EpU`Kz(gzhQ{!=
zHW%`)kU?34Al?$M><kxkN8ai1altw=^G5L2JPXUq45mYB;7wIP1t2TdJKq$^M>MeJ
zXMvX!XLa;r8uv+}h4Y#{aSZcEKhJsO?iHb`C_LT+yIXcxF`R^BSSFtqT`Go+ve6U1
z8*hq8rR`Uj`?xEDEm0>IzWrYcaz3DweaJk|yt`>Rrfc=}AYL7 at t|7aBvsznQqw~5_
zWf3F*ScuPv4x1V#SGTT0D42g7K^2Weje32LrTtRMBphm$SyPXn3nfbSJs<K+(q0T$
zUnl!#Q_gE6Z3fu=6*Ig&_6<ja at g@XTrb2l+J`BeQ*4sC4w;=Ih53G${eOm*L{PKP8
z&o8_<lfan>Crg!>m$xS4N0Jc4gLVLSd#fAhGT_)SX3sNjZEq(ZbXG4AtgGYXdEkPX
zAoggR_x<&+%_r~eN-t;SV7!Yje4$Wpt~bG(o6w|;<?ZbXwv8jL#7d28OeAoj37H5C
zH)?i24MsO?)2_;bxtw&hE4a`&&JaUPP=>Ma at 91oBwD*9{FZCVcp<UWLVsr=!#G0Mx
zEljLwqLp&WU$;lM)ey<n{MVsWUiSJ#IroaRqg`F<+7Myq9nIaAq{E|y^+j$5pT;fZ
zrLHPHJ2?xjBV8&ua2Ug51lR#LvUfe-hj9<~pmSNG#o_))imAB+&t at K_p1yNDNnf2g
zXcEasNIBGhYU1IIAuBSiw2iUcv#c8kSf4uhJ+k`2l%Dl;BW-g5hQt%v?m5Y2rvi1L
zYsqD4x&0h;`b!{X_LnZ@=x1 at w`Xg~U(#TbVr|Sp5Nba1~p%KO0O<)9~t;YWP8<QpF
zn^*gskg>!D$0 at 48#mkDsv-<Kk&a+ at akPi{Z#|M`qtZ5wHKDs&nmp!ST9nAmb;716m
z&dY1Aw#^J!WWhOHF0t`l{>oJH6zll9@#-2~k@@+xp%1PIw8s7G;Z2$J$E>H<CS-Q}
zEJuQwWjpIx9<ay3qw;-*p1XYlE6+OUYlA##7d}vTyeqbo4 at h)_6VuUDF=Qg4C-zL8
zS0u2=xIL)_jzE6b=M=NhSy!>mvKjzZBBOgA&ivF`y`$e`5Qg!Ar<M3OP>6Vdu^hx_
z&SdX6&XwH2rF+s%YrhL6;Q2(d0<E$3o?W-wo72SiGh#lwC2c)Bqn(;2q#XJ8(YDY6
zvZ^!e%6VH8JGH)DT9hpXgcqgZ5j$g8IyOHq7>XR3lywyb&tz)CH6^(b>=smKG)obt
z@#~3^tbeW>fY76~`20*-C1Y+uecaY&(4tfWp}IuOp?1ucoB4Kj!6C2YqHNlBx63?`
z8$=_dF<ZQK<5Kb(Rdr=~&GS;FHUfS<M5G8?C2=g%Lae&?qy=!|BHH6CM$?B5 at B5@u
z3BcW)VR5-WZZGS?-m|aaVtyP<`2UOkxR at e10WJjfm^}3DuQhP6ZIm_m(!_rLl4wBS
z>U at n;p|7VMSOn*vWeQ>^3ZOc>*>;cb=2(dJ?E?%l`R85afe6sqTwc6}-)o1%Zu>uw
z+wc5m5WfGVV%F*p`Oo(MPQs4=orJCMUq0#o0!#i*!Y=rawe{fL0-^C=TLK94egoG3
zCpYmaZDCb+ZsoHnn3zgBE%4^YCgJiQB0}R644&0XCA8c%F;X5FrFtG0a_L!%JJ&0A
zHP!8|f_m<ss_h!@;Z}Qmu53Y=t}6~kkY$+Y@@5dn%Ee#igOSbT7x^l0K3~XxAyX~p
zn%KdgFokg#oaTu!B`J18wW*qOEt4<%o*X5Ojf#MSDw`xnn7eSwm~~JAdipGsdt`W<
zSI6%C6rqa1TR)OxYxob!$jRDd#rif%{-Bxg(#IB6OKpMZt at _@cpxK)j(M59S{y44(
zZjtqzj^~Hf2{mE*Ou^QCamsul+CtHO`Gs))x(pTHLAU$$?#L2uNqh(7m(U-?AD{OS
zPMUFM{|&Y)9H*}<0)K;Ma3j^?3D6!;%QgxFVL0XXE*x|N+59Nu9n7o_t=>l>kUSB>
ziw99PCZz&$HjVJ&_X<Juy6nqkG`k0ec$w5wL-9J<?vnc`STJI7*Uh6Dg9K9I5XftP
zgfF^*J#f%*J;hIS1koG~5cfhhM3f*Rw}Uw(@yncLQ7G<mP`N?SXk&lu&9$QcF_n%g
zj2tq*r;nC0sTHG@?V_$(^hQvZ^+uO{;E`3Cpw}mM_&=H63r^s`eSUk~OaTap7<S2w
zo}D%k3j>*5XOtws53~m;qGnj#VP%K5I`W3&{x%ltleVa1JlHxC&G&O~7E`ww%8%~l
zB&8QU4(&fMdoqs+HfNki2^%6*^S`Gv3Y}6BVbcD*a0@)?%hkPp+zC1E-h-s}L&TY#
zUNgUc*WR^ro}PWt2_f!*yp!WyBSWL5NTmJ=iAd;jLkPblTB3mHG~kTzuOIuYpLwkv
z_d7d&hQ8!0JbRAr9{NSO*^*qT0qcV?c0f*{l^>myKv&76!_~@2%VVH8ckr?SRmL=`
zzx#;D-&L~q9kRB;y8}f3$=JC$M_WP)-Xm-85qwxyQ|Q<GlRt at cd1-UXV5t5OJ_rWq
znET}H at c8NGLM;xk($NyaD}sNv>a_X5Q=Tqwr&^{S_dy%h!O?wvEO?m~TRNB20<$)%
zw0%5?b+&gnx<2%)U?t7{=0}fCCd-St#)c5B)f`zNC{VHEU%B*juu-(Zw6z}u-n0!f
z at ph#bF_#vFiJLSle0AOVUnKRR&j9>Pxi_^}4yk|=Rz<UlJ_fbc=nz)}qY&3<oNKr;
z$Jqz$GhIt+59oLCI~$R2rx@#g_dX_!ggh&0TmpGCyRJQ3F5RSGbq+>lPwyIOQ}e$m
zyDnF`ASSatZmzjKWuII~JD99fA0xV`ox%W?lVSJW`)7AzJ)tVkJ2zdrwoa*3_OE6%
z2_|Jac_S5oPBVK)d$EbM+td@!IBa$!O%F=FKS6F1Vo9(X42X00tk6L4(WS(u8E3cE
zB+Un_<Cml#MoR^D3|e3^L@{6EOX;DXjk)}84?+$^qz>)L>?U6&tmWFhL+M)VgF1Nv
zS^zv}F0Zzq at +Ip}rBYHhMOHIQmJ4 at xi6I^i&3d+ZZmv{&+ztqdTs8+aBv at bEnUp*F
zz1|#XU5T^-89?hVi>q)X15msCK{bl^6%LI1Ov5o0*02Hggk~~=Rp#ng-I-CI5{#4k
zUB=CxC{CoRWfAWme{k4&t(LR%NRk=6NTh|h8K^ip{6j_GONgXNvZhHY;wQ7cP>u(K
zT+6KiQl`)GUz~HI#owh{N$$Qt=@?GYSF5zf1YDN^b}Q!abDF~UmO%4O)R)bLi`~^s
z?7B7-H8a*hK|eF<UN!zHM0=RIk_tDg%Vp4yS at E%!tMtA;t{>oeRI}{+=*60Z@!z<P
z8Q3pKG8jGJPJ?(=AA22n=}QW;WNHJ>Ef<`uH9~B-1uek5owkPja?_<QTIOT0j9Q=X
zCNWtilVmF00~w)BlJsbCHRz(JcJO{Bj&)|(QJG*_6D;#FI{Z7x@`yj#=^BAFjVNc8
z3swy3dv+1G{i-9st#Cf&XeAk)jI!L=OcGka+fn}0-`ZsNgbXvV<}Ngp39Q)DMnVSo
z;9y=gccs0b4fLeNMeCZ!0}2G?jh0nvsflZ*m#A?7s%Yv-Ts>hKHP<5nghqW<@Zv+D
zr{Vuv4ezxU;3Zgv!Vxcg7h(f2rBFjX`Gl#>*t**}Ty)Ze>}-)+${ehNZ32x129uXr
zC+|YC8Prd3jayI)>gqp{-L%y(3l5gi?zBs4y^)Qr_r0^QN~@ZOJ!(++ewbdqtRwC^
zdvE$TEToR^09;O<>?O^_fE!tQV*^H00XgQcnKFTTP1I%Lp#PcXD7>W}%($FPM#s!#
zk>qasIBxr4+TQH~(BD6R(KeV`Xs<S*1Qu3XqD8}N^V=%O+d{QOTSI3Pc6|vF*f#EF
z5Lb9oSy%f=bGBabXvx-mXg$h}1w((>t#X7Z*Pn$6L$cV%$i+D*>kv(UY_+u$q2>$G
ztSItr$>J=ai(8EbczZ;;hxNX<K+I($l3<uBrV2^M_YgdpApx4#&U_xK^t at _WPxR<%
z^2iU8;)1Uz+#bU*TEZ=WkO8m|)1^zEE&{2qey<|gRl%>+S_onU+?xFh4l$_l(P>il
z=jA!lBp(0dg(%FC3)Wb=H;Dp6tTxoE=d_c*jQ<6GpyOaP3aRj05&_C#f|WBBC}-%M
zIKxZ%)f5|Zu3`X#o at w#<O-|X`z0sr>Eu(udYhA at LXXJXgJhqE6MZ6-b!dngYwu`Jl
zZHE>XAjwZAlGVQsvL`=*M9)omuZ#U>F5C#isWJBTQJzXaoOAIIDfGruNopd>&$WP`
z;)-uS7v7=5wpP(hN%Z1IO;3D)fk~sdjK<B4>BC(c`7D+jud5(YhRquyW(WSdV`MuP
zm+^d=jKt7kc>kt2`+WTFf+~!OlBZ1#|BFQyfD6g%z*#9#!T(hx?!dNGR9=++2XoYC
z!@dCK+?n#Q+0bTi|E6^J8+J{XS7!PKeT}vhP9n8gFkagu<mQk7qZJ~qyuXp^kO)EG
z4Z+Z3SDDW3%M(dCVQPcxrP}u1hH%T8Xc;p-Jy^eXQ~02SW1$1m!@0ii91fO-UC3w6
zNZ$Jtz`}A%^hb~^Qm#fW+2<9{-keF3-R<Hq4PqVjRSEs5Ck2HC>$>-iM@`7GVp6}5
zvdxFUriNOfaALf at Jj&IX`+HJ(h+ul|&!+CAToPY6R7GCD07^d*@T$Ps<@ZOa{Xla7
zi3sVEqOc{kmY0^gT_*OL0mj0;%A>%Ds>BClb!mv`Tu(QC^VvuY+=AR?rc7r#vj<HZ
ziD}lV!G}UDz*nL%t7qVDJFA@`hHmfT(F<<*pxslM+?>G>4?2vBs?$bZR*lMZNY2&;
z5!lVl-Uzr<_Gvw7{G+pt%MrH&&OKznH)Wm|3nrvs$ZznuKlSn%BSb9Tv-~Z4OKSve
z&TipR#KF3wLf;KHi<sY5jfFYoXWD>Qii?A6SHj;;LM7YU={j4MT2c(gR at KBnb?&R3
z_d~dfuO?#nEkT)*EMao1p7?_pNB*@FCtWt19tO)I-V*r91Ka851Ter9<u?zyodGYo
zk%9{L+QTf4?JiE26c^vV!7;^PVgcL^y_D{$X at ot{0T at QYs`?!_-MfQ$U8{A78*<dj
zMmDTiOS at b4;j-+Q?m~w&leIy~KGz`~1D^stiD%s|mQO0cmaAW}@nPq56|86`7`rE!
z$oLl*W`ek|VdmJ9Ds+}@56PTik?(jL+-nhroa}smIN+zQgS+*01iHH!xl_DVa}B&C
znwOU7&IK>0I|Bv+;YNW at 7#L^qH|+JS4vB|iA%^*IHs({py2y33FSh-qYlr+qI$bHB
zBs56|R<!q7Z!yf*h;q83^Bou at u|2BJWdZFdcgxEw73-dAc<ncUn6!FM({`*4{n3jo
zV2r#^qSY0(To&!><wE|!idWa0RK>cdG$F#i2mHd~QXz)^P0qtpg)s6luIDF5=mlde
z&(>B{1yB=f8XV~R@@^w-h+uLBtM|}5+jYErf1*)QZ_G0S`!{-WauK)7w}|n^GqGNd
z&J4}B)?YmsD_=1TbW0xG{;uUFRf~mT1TZ|cuGdY4dqx5(W at VPV%xWaob-D{(6c0fx
z1Zf9TJ2mOje3p(fO at e`vnTQ4Jy!;Z7B^EjIj@$Co)}MNil<cr$)&*;p7E_Ysc~l(w
zI9&+qEi#p46kNEK*S*)JJPpuYFvZXS(dlJgZ9WN8J}y(8LATIiq}@RNq}-w=W}Sg1
zaz=4V*o%DdnjyTwsNngei;%C1P`6Mnn+E`QGjqK?`3Os2Ezj22Vt1OP-;^wlHdXvx
z|DPkkv_6^q)=TW at vtQs*Nd4gl$B$Qb^w9G+i+EB2PVb2R%!KiFo at P)zID`BDE0OyH
z{b?R}>Hi{|yh~pwdK)vaeKJ58Q#3UtELxnZiY%+fE=o->i5!0g9!%IT at nO`Hkdf9;
zeAdWg%?`^ljMT-cb0k at FWIt$!Oa;7`$!2S*@~Q_#B at U`T(9yRC6db0Lzm?NKvrfAu
zsb=n25Q9cj!Y<P(k3*&c>2iW(v8hf|2NTs_T`<VwhGK_N*)CJAJ%UH35ba)PPYK7}
z5P=C<lVB&4Vb<{LZf{6VxQ0UMk&k32=j0I!9+ at 5?;QhS6wkmaE&VENJg7{|`Pffw8
z*jN>j17gkRpa1iFE7gLqU+M)o5N_%weMh0z8sDh$(356N3mRn<!(Ng*OtCC(!iJ}|
z4zo)k3ZZID=2T at wp)L%nI-UIDbX5cjSe<w;az80~+sV^CmY{%KSO?7Ve9}h_S?g8v
zFd41A2+Q^!yJYSQ`h!jkKZE;)odp at HxwCc2&A%T%CQ2{p=^M`58JVT0V$O&vRsN5W
z5<wC2>%2kTN{PpIZm|#YOqO5~%|1T%kgzoK3~MJnvNM8OeVUp$A$(Wt4XfJPlpj&Z
zTFB+n%n#dadEhdx&)A7#bI%p+vgJPWOEGlVYW%PEy%WI$2=TE4Z<1OYgS7gcdT<6h
zIaoK+jLJ<V%hx}e(HKHa2{H<xlW9MWUt<xn>%FFSQg{A7NepS~bZEu#4br%6-+$}f
zdOiOvh4*m%tr%ipda2o&Ax_7QGS|vUUopYbs?YH{{@xWRGy%2<rq3dr8KR8Y!>onE
zQ}_*3<*_H5g5?#TdgEw~1cuviU=~t!?j%YKMPs{4*J|LfiU*0>klw=p6K0Bhp&JPX
z_VUtYpq2beAG5fKGGtBiSz0JV%)l0|Ga9Vl_+uCFaIc!wBM5iHt&$@GdEp0V_-MD4
z>cH&xiDIA(iE-2U7`}_!%hIS&sfq(R1TXmwG6zeZHYY-AzR<=vdq@`*c+pgS+5)rv
zP`%CK?DAnJit&HFz3WwY7M=sq#VPhuhc=*v<0x$zJJiRUDoW|%Q=hA|f_Gtialghf
zSJTf&*z)n-$rTZd2E4w|6RlPGGuJ2D++fz0pSprLln)=2L`W}QU2Zaiy4W3iL-YxK
zwKKeBQn~v<#Re~^!XzK&4y<m at g02)HKNEz*tjq{7o}i>C+*<%DHUS0DK#_i{qpP+D
zc>%Oh2#GXl_WI&L?zGy!5B1(ELxq7isIMAN{a1uUMEh<G%~l(tio!iqSwT5 at jZFSr
zG$&RJ8~#T0e)Ar(DmX$O5r!(^$h(m*uGarJ%%Hm*CiiiIICh9On+LQ-tx1w*jFsl+
z?mqX=;L*d-e#q24g;bS;qp$r at wom?L!n&5PSdK*Aj4A8xWT0yoFOMbhrnOaH9#c1C
zV-nL3Y`2RB6Y^MWcrD~&ud#{p(Y=ZL1L<$bm>RwQBkk?{Sy`fj$teMsMEk>L%tOMx
zY;i}UWUwwz{!GvDnxhGXpq*YY#7<z(P5PkF%uue2QH35~3D{yCfRlBNcb>#tr?2l9
zD)=fz8tK;$xLNpwRP6KSt#iliP0sho$Y5}aF^C&Zfg^~WMy;*_SBb9Z%1v`fM8N&j
zHb2>&<!yMR8YuTe1%Njb*Wx55+9T`MY1qfMU8+_x+KQ``j?6mGgxPG7d>d(foIlZQ
z;I5&bg?U57*K=arwC#9x=e(Eg539B6oQOZy-y19M-=!q_P$9EE_Q9l6K|^VThdGF<
zFEnV;6k{?V@)`&y@{q*tQzmg<w&tDffNwO2*@Nz$WiBkTQh&##YV2O%ExP{j1T+Ke
z$Tsuw+3dkrgI<Aj2JP}Xc^fYTlZ!je6kY3`*gZ~^oM9sLnXIb|ta0g^o<Lp6&JL*Q
zX0hJiRD|+0RzRIp;q#-x^w!2GBZ at s%V$z(|u+R1zZO7<j{Rfh%7N6QdV##bQ{r1&u
zD^KWQ=Y#apBj|PZ6Wwq;=XO({ykSJC2S>Z}HX^Uh&JNCr^j`LqXXTPPv8GAjeb(OR
z<nmiG!1hA|7Q*6`>>}QX%{~e}bwOmvf~_G6P9h+Fl$+6HQ*(6<D;7(FyUuaxXJ|H~
z&rs+4d5RRUjSSL;>r7G;8{;x7e{&>x)Vtpy%pm40Teaxn|F-r~z4ynKLlp*hSTQvZ
zE%`)oY`^-hcOLJZis*q;Nb{&6J>V7z>2ETKvN3V6?X2GOfC&(OyfmouRp}YxImM>F
z{Q~agSwv9#w!aJN??ZW9<QSYv#cWof#~`v$^C*o}ei=~Ktn>msu$^2Jq#CVwppX*o
z&QSds$&Y5`S}3t62b6l;C?ZE$*V}4h`2qvc8b)HB;|P^GR`PS_Rg;Gw9Upup!*sh-
z+N~mZ6G at e8D!jVT0h9YE-Fq{XHrI3rP8``iEgUrApuoak5am%j{4nfw`PoMSD^?d&
zxr)`XYBl6_67jkP at s&SJ?l5}i3Q$ROV(a at WAG+C~ON~@jc{1K}b(zjHIYPKt7pR+a
z4JRh&-Mg6w84}>wk65c60Z!@8aU&wAkrmNbG*zUhXglX!NnE#emkN=Z;L<ESg?ETf
z_pt7VsMkh8*=CaWtkCvPnS`io3<tpLr{9+!*H7+F<PZ}^<*n;Z^IJ(v7jV~F&lRNu
z at 3wPBx^V_fZ56_q2h&?JLur$~T*W_muh2H5d0deU`zysBJ}ArC$?OVdg)g;#$pdZ}
z)ZR4l2t^3jk)z}sTQ7rR&iw3F5reLGT0-cfthqwuJ{9Jvz_&@P+SEYuJjNn<Xqi_h
ze;Qf>x&$fIWo6nX{m|?uK$tE&q;NZgjYx)uE>C;jqW+z(l+-HkDEZ6%t6GCa06WM7
zTb3j`-9tNal?yuF3O`4OjC{C`Zw6WP7aUm`4A-xRGW|HqU+NOCffLMjLH~T+1D3`^
zff3c+Sov!?8l3<wZ=@Ej6yRAW68Y5*i{0Boy29e+ivE}TK&h5T9W4p_LvXDH_mq8s
zt*r$)ccsR=pFG&3Ha7`AKh<r?G9Kd)iRE-97#bls9t2lYFv8MXC|u_-fy2F6|G4zy
zL(L>mSJIMwX8Ia||6g?hoZ){YZ$Iy(HG=X0Zv^BOmye+SM_2aW4*Ru>=x>TY#T|W{
z<@K!;1>VH)Pe!+%yO{98TUqxf?G%GKIJ%dq5?ow}4X=*Efvzptg&$$dF+|fHqtVW`
zY-r}g{`*+Kw5ckZE&@!*AO=_lMEP-y)C(!5T}VI!Q+HjzBu}jqWsf3GHkgjdU-^Z+
zI)ixbOtLT6?&2ts^RI^{yX^sv?0HRE>ZF4{lFb2J7tZhlmnAVoQPHMc1m9q0-0Pv%
zvzCSGwVwIrVh4h){Ja3C?b=ncf*2Ri=%Zvu5Z_~%J2C67Z2iMYl&i9xAd7(Va1Sjw
zN{#E8sM9V at VYzBSYp2vdJteW>dzm9WPmzMIqR>LHS2&i`PS)GsMYMtQK;4d8PB>>)
z({7+JPxo>MRZp>vK(O%4M`GYGQwQ^>nG>KbIlw69jFen)mRPez^_m_P=xNCw$T+>o
z{A^D)hfCo%!3Lfy*3C!(?0 at Z2*RTFXLagUC;bIoV<U!7%_hqKO{!K$Z6N6KU@)?gM
z+csziSvxN{>%^3PFahQ at 7w3W(=mwm&LN385^FO(@{b<u{G_8oF>5V)PP~=YvNJ#W@
zTj%g8d~*_Jpe1k<$A-7YyJylRVz^X at jG7w)hQg_kSIDvIi$2}Vv>`%#puI4;VYyVD
zIrUB&1d^%PEQH6_H6*m>&@+g%5irMU`m!?nrTvo#ePQ{aoX5b at RT38H;KSQt9xtcf
zKM=0WU#%g6YdNZD_?JOTSoFceXTVq;H(ZB%=WL59iee6m+VjZpI-lvwZb<>y at FEX6
zneGGjsQ2|#4K+gzDX6=H0SdlnZ*dm_g4!D?h at M9^BJhDx5zQ3mgW7%dX)JJi^Bd@$
zgby;AT_bi%p#WlVb03|lxo!#`N;Z;mQ;sj}`$e^nnvSuCP4!DVOV=J!5CJ7oiQepw
z_6{26P=K;^yR=8&-R})1sU7MqxkSCfa;AyI<~vuBo?U)vI%Fq?V8Igq^~nhv(c*!Y
z(zy710y1QCX9m^Il)Uz%2c9((fC&h4PQiD at TQ>v6%ZLk1F+1t)qPa>LO<K=weY=Up
zjkFj)WZ~{jVjYA2M_pe=obWszNd<H}&cP)!mGAQ0wTli8jE({Yhl$(Wj#jFt2tlTm
zYyi4onTejlROmA&BL3U95_NG_;_>#;kHe1mJ&vHo at K~RMUnR_1%LYd}!=m-k_4D?F
zDh8J;Sf-LkQK%t=(SD%Q&Ot+hnjAs_OXG#DL`a1Jy6_HNbS*V(SGRC$x8}b3p*#d)
z2p-ce;2L^rw{)bS?wDaq7OP5pQ2tr^{u;eMSLe&a#?0Itf>0b?b5B3`*B19vmP-{T
z_cK>*e)llq#g5r+?t{GyC_)JHFF#l(@@eujF<WhJbUL!<%#9CQMG!xtDuhk?h3r#1
zX at +3sspBMq^DNwO*~KRm+W~X)=QJr$A6u0jD)~4}Ur`EeM#nM#4aND{n?*`-l at 4zH
z9|tXtTE6 at rcqy?+3Lhg)a at RhkxjDG2zfr*{c at sKXjF7u?)&*nS%hE|OLflc*#18L?
zpQ0;P#5q$y66=w6^l0PGpkom4t7r>{wdOIJ at DVh!*YonHSL!<DpOZJyx)!uR?h#M7
zV*&0C#SyAiU_dJD#o<@t(F2wwTY@(+(r;c6$nCDIPIi31_`0H3s;*oNUQ<+%+L=rK
zWF|U%!PVQiNG<O89X#}%lMkc7_iCd*fpWsozXnJn%)0LfNa177%5NXl$NAjkwMhP^
zd$kpRCDpYgJ1wdwc?*WY?Y&rhS*d?R#HSBcib2J7&H1$pj>D*k6L!-wX6|2ty0HD<
zoqGQ-s;mF^N%>!Y`*_j+K8g4L>?TAUp1Xfen^h^3hdW4CHembMY8ZZ+38k4XWdMJg
z7GbQ9sNU8ra_Z0Z-%N#?X{=_Zrg<HT2GYB4&bQUH(rTfz+pkPbVe#;A^jo~T at 0tcI
zKF`+?izHkQ(+#%FZg)&nd^vVDrlkAs)Q7`UM<DVFMt*OZsxq at 98qeeeO4BHyH&H%&
zB9mh^Sbf$oV4=RnRGvL|B}kKYa^3Q+k+>n?qPU`3JI!K1Mvy+K!sFWU)?vr?K0Q1!
zr*k;pee$Awvoy*BQZXN?ONx_mr|^>Mm&S_qiA#Hlu+a!D1&ZE5tU;Fa@<a}bAGcmT
zg!UixJde`y61G!96>I&;tLsynHpPwagf>%lXz7{hoxQ!UUZ%|^$J=yGywfZ7@`92*
zQOfT7`gOBlTWRCFI*DBt553~XMt*Fg*8zIMp2^hoR`cC~fMfPSgu2nztONAoNb_aK
zHeUg&LHE>G#YO_z=c&}ftv0o<Ty|;7^@YrCZhxr~xcIBwN1(jSl(P}n*0_gw;c7I+
zeE;O(|LfBZRAH6l>Ws#`DM7DFG2I)NutL9kXLDgS(I`EfS?hTCJN%O;PpYg at f#D8<
z6kTmX5&rO4Lbi>icdvbnl#H9og=vN5+<RI!)2djtUO|^^GKKs}USC7IU(>(3{{B2u
zewBCO#^)7z^(j!LSn1`0s#UJf)qdMMO*c^Bl$Fkx-%)dt(X{%Hn;|ND22>JWYsG+(
z?E+gdO?CBxQ5~!7tk&S+2-y5_snYo{-PQup4pSkkT5kwg#7ft<bhfr~ZzF`_v`mTg
z!&+}I{1elL>$HOxgM8c^!O_v|)rsm4KD>-)j#>N((b1a&sU?lYqpF$TL?mkFr9RI0
z${d*T9+k3feA*E{-f<sL6-VoPQU at rb?I`BWo!n}u0osS~uIr4SOBBl3$}}=Fgc81T
zuD)NG7Y16-4K9RdpVT>ng*7eD2RBoX+pm-*Bs&_464&3pb%0z&n4$t5{h=9!wMR}&
zXm#M%jZ4|l7ABt9FwY9!j)x9jGMhI!PCETdN0E|Jva^Qk1n;`rr0mI)?uC7Rort`W
zMvI{-!RRl;5ocF)C(QhI8S9fq)EUDYGsC5P1Tzu^^RkOc7Q}<ale+13+P(3w7wWE7
zfN$x=o(S&wP~VU9peZ+`#LcRL<$262gJiARF}52ziW$N)x=y_7XB$MRg9w?R<%}Mi
z-yOA3F{?XzfN at E`To<-;HxDd=FRyG)JaG*-q_~}Aq~F_pBm5>m3$C-J0603;Vl=PO
zS!yj|a}Wu at DNT9gWqaEkVk(ZNnHb3J<Tsn*U7vH8!4K%aP~3$vX%me2mMYS2VlKbx
z2`A?N^>i4C?vv89fAtEW at zIRn12TK3nq1T0zwe%U$G8+wbjV0A+MCvQ=VRhmqh9B~
z!V2t{ZqA-kReWmjCTpN9H~EqGNI$Fns&k=ZWWVj}<C22a{4-n%A+M;CDHK2{Pnma=
zthEBc2G1y0dm7A9<W<&h{1k3WuV`Jf;RE(%di^>*Gqd;j=y5sQ8OTjU>FW+Zvl_Dd
zFTP?{_e2GhbS;7Nnd7HV!B?=g!&cXk(-K-YEqMKFnTSH})+EOOXe>es`WkYzT9mLy
zUmMus)bVuhmOuW>bS6c4c4zeFf6VK*A20y=iZb0)fcKQxvxYEX4?5zWTF_U?JTC+`
z6r|{AjM6L(*R+G1RkZWHFfb_p*zV>oCU!~i?Z+Ll_{uAD`DL-E?s+x+M#Qs9wt;sv
zde5>sF$v$bMhuUjcWyqnFR8ZS0U<75bjZ>KbWuXGE<o at 0&fOnurMnPJXN$+;O`wLC
zb!1QebyL^q%ZLf>FSxe*!dD$D7<;U&Gj+sqXVRP3s{WlOkMZyt*^O4zfJPs^#rva6
z!ubOtFa{&O at toP|eY?Bfmye`{3Wxvh>2b;oDyDp|Zs1L;(hUopnF7%4u10Ly)rx9$
z2NZ0m4KFKn%sSe$U^@?-P*W?cp|f;^9kS<WWm&OJG)!-0i_~KpKaF<F3$wEry(RFo
z3RB0?Z}cG`G{q5)YKd~!h&WxwpzVz at XpAd0x}E0ZxO^cl2>(6I=8?(A`mtr-BQM-N
z;XyZtp79Do>Zhu_LP8WhTT>c0XHs+c*^KEebNtv__^gGhQ8^R$0Rr(3Er3$-o-d$i
zdK{p+ck!JL|0#h`iMsNT!9-3+^fkz{rFY>I at c1ZNf~KY`;wF>nE11P0SDN|9!mQ+n
zh(T?uqyKn~e}2Vq0_OByZ#&D}pVYloV5mlS_x*yL&bn84e$E<Ce!AGVTv2DyzWS+7
zjMWd5KqENMx-NSXlk{C{X2YqHO%cNqpH-O8f_<+m!&C-1#i}PdW!7abJ{kG<t-TGG
zwJv(`pnouF)~GG`(^r_)SiLKE0Ez--KQ;xEs=ZFtaaG$^B&pd}ubXi7hh2Y7s4{h-
zupj3B^~?L?1YhvHWXp!4<Kf|@zh@;i%PX?ToV-vR(i$GUKnl{$K%I)0eyI?_;?L)5
z0plVmeVAgdqe)e<GSPot>rTx5 at 58I`nHz{JdEzW8W^D6pbTLbpE8YjFeIDhVy5mvk
zV7zu3mMO##?&K`zg)WZEKcp>LOzpW(HJF2Ov!a-#$@-WwAM&&7N9wNkaUz~rY$_zz
zE$<hcFxo_SbE`P6KY<}P at wW}i6|>Z(EL<77dL>uan&hOUq`F2K%ZKV`7asj;5es8|
zHIs^J8ZZ5o<Bm01MxV}9aWoWLuRe8}Zt>@ew^?mq!q{AGIfVYJJq-?y at IwNhQJyOP
z7hIC_w|QbJ0j=%m?dAI`v)hK>SpCWVqc+;d|8++l32vaBiEm8|*iyw_eNXv)qLJI*
z%pgO7-xfKNFF>UxHt0)B2K{1nFtv8rYK&lwichLG_;h=>svME(O!004;kDXgi!OEX
zdFe7tSrWR;=lXl9PrV<T;)F?vhjrsTo<Jz#@qbYWefkzxg?OrR90NiM8r)Fp>URzq
zA%|_Z3i&EUMFst6a(!mVkrK$Vd2()jmTB!e{pN*LKU;Ybs+4PP!`cJWZgWo#->mFp
z=>1n)+HJb<pNOAN at oyvxy6eO^zK2jDW5W|p-~x;oX;eQuP>!U~3R*OzmY3~9IN{~}
zEWBqhs_2E_0gl~05hqqHY=pW7rE>y&h$LrA0Q at AkU5CDjS`J-U=EC7fE;3N`sRwRl
zPrMm1N_;!PA1^F-<}Sg^B*4kX>7ErDe6>1!zS<a#RCC*vQ+KeI+>QOG at TfK0Z}7|=
z17pm(UlpNVf}BW~&WT{DO5%9J?Md{*zJ#bD!nfUP{8zcE%Md<=4>o!v&Z%#6hqswB
zi$Ct#x!3xc$Kd8URq84o4yV7Q+~+g@*K8{&+;mc>Vw2>!!5$Qbw-kkoiPl01)&p2p
z+d4|<C&wI(!W3R at hK*TSJXuFxZAU&rN0(+v9^|pv7YAFb7NXYMW%rK4B~K at pbDex}
zNEa0#-C)fvmeF?-oznLA0|xZJd4&)0pO<Nb7!-mRol;LRiMzJ5Zp at oeLj8UB9mY0K
zcq9bYug{fQ{iQ#HR9ou2<Fbf%QsDc<1v&s9o_At_OE_#;Jo7OLOrfaC?m63!$jPm+
zLDD+-?5n61CC}dKFz?x_OB~ovT~^GFevGt9l)_1rw82nip-3K}4m)xd670krHkMAP
zScs=sh}Nzw0d4odp{_upsGwYT#&&GOXy8R2Z at trH0xK_)96I}k%I)2k5gj7SU}Idx
z`3jkFOa|f+^u}GZtY7%XAA=<!^fX?Q!mN_<zyOI=O;s?@jn4H(Ryia({dBy4iT^Qi
zE?9wD(NAP^?ayiL=iqMD`PV~b)z6;=7K>;h;#`QP`*^LYNWUR1%>Hbc0=>Z3%CnAo
z+P3I9?n0^vKUh@*JMjy4EO^P_C=pba8o-Icgz#dDK{8;hvu=Nivy({*7*#Kij{PjO
z&^e~)+u%nEf~a<%VmLM`n3(g?i+{t={lVNx at KPsa?C#gcF~l*}PEq6HS_YGTPcJhB
zfN7(>OTO3_u2a)LU$Ey;kz&h-JU?IOw!uOOv9c;1vQncAO9=ZXGYj(2o`XC0TnYFo
z&G&r|QQwxH%oTJi*$kR0z!(dBpRsC|9*-~|3fhC$Pa%5NO->7_{~x)PD0~IMCS5+s
zFJ<HD+Dxj9!`^2FXig*_q^xG^gjQvq4gUbfGRGl2k48arhzpLtjG@$_7EXYbr_j*4
zKD!S5m<-cYmixO>_x{nH$yBacm*rPz(cJi^*Y?7*>Fu6oU~_aq;qlfTaz&|L)G=0S
z^LGyO%ZH<c!!W?FSNENOvUja@%eIk+2XO`q5V$CHm$0*tMZlF~Klg{ho|A*=W-~zx
zN-)OFNmEuKP1yTk!3W4OS4G^H&)5#nz9=(n;T(Hd#Swr>1DqiZnc3E7WPB4S0YjXC
ze;2mI2So&&xKBQ*iwi_VKy$Jk+z!WW5JuskR|j|0YpN$^L?_-p-C|fS1!;?jLB2$>
zlx8TE>i9UZVQYt1h~Rudo!>wFDe=ohhLY{%vowK9;>vdA90q?DYvZ!6`^x$$z4Bgb
z4>4D&uV?DZ7D<}NRe0FfwZ!2-(81gpV$kreOCXSLFd at +nkuBKj`WMDJ2bJ@`gZJMI
zL4MN{)Purp1dr&%AgoUz5rz&^wz#(8jX1qJaNu1kou~-H2QBdaxK4!!zb)n~wh#qY
zYkQPUq6A8 at oRyP+E0rZBaA3nc1Y<mRhsJWx+VUh@^R0R%6kKK^9jnjUWdLiD-Y;BF
zlHcuJ=NQPj^X^M_SFqfAgujFVBX*m|osjd+y_2r(lkUAlli?raSx(i6L0QW9zzZVI
zVRbIw)~hiO#I-Cz&!jr2zxU=>#Q5LiWKH>yqKHv+iw87Q*9WI;ap}?Ha_2e>QK3nO
z*fM`4$aK8C5xG32D#8=^mzf9A<Uh<j^Jf3e%u~0RJZjzmV2d%XNAjmnN)$VKZ6|KU
z`QM}VO{jy9NeCRcGdIKJP7+F2ncub3*gEX<A%6Kbq6RB1oauUvcg;p;)*-ToyXKfX
zkAbm_J=?Om9sSd!Z0dG6huIyv9Z$Te{-Ph742|ZA=F1v%2wbNJ^~^1=lHIG)H?i7x
zf|aWOvlS at tPctp4UeH%SqW+N(XpUc_UnT`!0Jg;k&kTfzREF0RcA7`sTv&|-=o%(H
z=<0gbalsYTwkdoY8Fe}*2_R3!;RVI(MBBEv_-SDcWGYUs`eH(V3c{O at no;YlEbEmg
zHJ%XhNzO6C;>T|_Ifl`w#Cd0?9 at kNft%uE8Ex3-82T!?L$1LuJE)pRL!?Vye%g2JP
zq1u-3B3$dh9Vs`Wa&QUBX;pR0u<SZCo30a$VYbxETHu!V_1CqLjq8zn|G%BofQOaU
zNm2(?V($$dO)7bEv%t)BKO<1_*UVrm$m+B+lxQ{{N;t8m&UxN~&nxjisQb>arkZcx
zjUZS+EU$D#rKo^_bO^;tFVdx>^xg?QC<;mmg3_BvGlZg4DIpZ;O-evo0 at 4XxAV46w
z8(#nSKKJAOa?d$=;DH48%vx*Ktn!;RGwBv8sdJd(w`crK67F{`oxOQ^C}A|LB?X~L
znb1G)Gx|^8KNe3s;(8>Oj`)0t3m5PrlMYf;sN#BPP0;hBuaN>^0jy)V^FIU`2EMnx
z)UZql*P0CV+6J8By2H)D`Kf`W(m-1Yz^l>m9L;G0lSjhEUuQFMj{a5WW4&6oQ<Cm5
z4XtrR&K;0gm$t=91asHm6=%>(uV3VkTT*>_o(fz9Dmm_s3Y-?daN5wf9rYLZ-?am`
zkGf9pt?Eez6QdEujhnUjya1QRO%8+Uy~!&1PtmCD8CFSb(B=bO7`k|MS}rIGt4v?N
z03Dgyi at C-8;Ycr=0jR$XB6})`*D9-bG``!7yjRVStt?`5s4cvR9poG1b%;Nwl6x*^
zGJ%c!Yj^MHxbSue{nA1rE%N^9Ps0wwFq%Jd at 4>yxU|Ej%#>Q2I{`lsBOODapI}&8i
z*zyW}B7 at tlR7@zEKW~9StH4Fxn*Oi#%LhY4a#Eur<72ke&ZK4II(a{4^d821dhh72
z<f*ES at uasga<#egP)fLY`pX&U(k(kn!K3!6%vPE=QG#Dc$B)*x$W!^OkGNXilshPC
zq?i)am}s?H5htxZfepStuJieHT<6m~v$-7)*7=a^KYU4Sp+5|^EO}&mrt;4UmsaMx
zh2_+azZWBBTY?DD)92x%+`>HaH5U{u7|sJvgFnfN$VHy6eu=cr%ls5QN$jWoy0No;
zp8hlcPX9T;VrigTfPe+<pUiFAx`pgHGWFM&=5>p%ECb+14Z&KUCy&9>Wd0jtWY-t9
zuOEv>*zv#Xe6Jq-FI at N8))wrNlkoNQ{h+U}&>ZN{%plR@??^(KHxP0#1 at 6BUB`tOH
z%SG6LLuxG<9RKQ^#rz+1({yclo4BwW6*$`HzUIxo{HeV*&FQ at bbi-yUG9kFz<R at hV
zw4`~{)plwRgw{%@ddo5$`s#zO!J$qz3?ve3(IhU#cEvP&#sGX2Hv(OIbe*mZeWYic
zM_h-!nc*OxYvU-}TST%22W(gR^ubKRW(;8c8Aok8ZinNiC4);&hg7kKq-4HqhAN;*
zjFQ1YEsJf$$h%YS%<}kc{3PCOk2L0t$9<TTBd at 6tWXXq&lBA=p^Yn}Vdxy)VRTmIu
zDLRy4Lz5ZcP?x67UT?4+N^4-*g96^bo at V^PUA{I1Engc^)Z4{DmZ+?Uz0O=kMANc`
zUy&5Ag%`Dvi{x=l%S~kK_27(g$tyBFe+0L<*IB2}r0xE0 at NW9fpuzf_P2A@v3Zmmi
zP&<3cw06TcK<6!D!om5I=%tO~eqM>zqOgfKl`PzhMmHbd!SH{jdUtwklt=CI=Q#Zc
zsxF+Y)y-JoGM7>ZLwcaxCD+HXO7ryX-hRJ>{;V#pqU{{#(1(pN5fU7GjcfUtjzR0W
z3gLZvha1KEq!Dtlx$L0=_8U1LOOiO4Glxl&dmGGU`VHC?YY2o`$!9BeN8|EKd_?+N
zxaN4`LEyS^kQvb=Q|?GVE+2_D8JTf4o!oOJly7Cqk7yRKj*)z1ycab6>j at Qdd-7x{
z+K at 4_0zPyTxfQdG;kdSxE>D)>0kHj@#7sPP>WOdhYChhd&_`D0lXqO2G?yJPn8CBf
zluzP*YLY(hv~sdjTm+6^Q&x=P06fhbWl)Gmp-BNK!U(!QAGTrsw1PCgBjgh85BoWe
z5v-^tYLkd~^To!{e1AuT=Y(GUOn&o1ZQu6jvV{N2!KJmvo?b2>c+0rxaDQP;CLu?D
zsZ8^l-JC7C(3~`#ORgI4+itNm2xjrrJ48Z6`i3xhT&wb!@ds>y3#|rmIf8OQZd<ZZ
zoMsK41iix&Qcw}jWU!OGN_J)UKllxviuP-Zao-OmZ#UN&6twBQ5#B~xp!Yd4T9Q37
zC^~fF0Z7~DWfRCzF&yj5jk~d2_CsU?)XsyEn8I)z^}?q7A8~Q4Zw at DL>V)gGm50;~
zs5iFq0~kK?#jtzwUXz&4zTq8{0n`CXByFZxZt<FmAhkbH{xB3>M>v8joJ%- at Cjv0i
z{TOqV0oBPbSWvcTGE%;IgWyP-=Oq6rso3hGQywrtr^6(0G%+z;s38n_3sPjV{}3JM
z&t-4Ep6)~c{0C$}am1k6_Rp(6+`gCQKy2_1>?m8Gw6b2lB_C8s(^f{Y at kVaXEl?17
z;G`H=kD(ze2Jiy&<QDqaOuc22$dMpge=`dYGanJ(HW}D$#_g+yl2`Iv0_T=CL)%<s
z1}*^<CoF3C+ at PHDRK|{w^IkYVYSFxg+*{I_T%;~rF$*q&!o;rtoLWx%o)ef(@~-32
ztZQ(7-->gPm<(;^b2cFV=5Gtxz!>n%duQc1LQy`-m44^YSTg{3AVR1keW<qe$JcNw
z`yXmTE4DJ%>~-P at dkFHrGC?R~Y0uhqnRqsHN06lDih`-451ch)&?NCdaKFxV02=@v
zF(gjmw at _xPJirJWPd*o7AaRHY%ia``B{cn!{l4=fv*ot(!H3H967QLH7yCKfEuw4)
z)%_Ee-cy0PDu-L_4f3fVXb)rs+Y6ivq3?BrR~D1xo^b{QerZdsJ=o6RXuCEMcroLV
zpqZWQv#pxoKb}R0E5%s*z$=I8`QB|9OYqCqoZcUD at Oh`?Uf<4B!Ub+R@$KG<TX8v>
zNTgA<N2hFeuUFdHkagSm*Dn951vos2nI_buP$hl(G{Jj;!e>LUmI2ZLiBNL%N8*~s
z=>~f73*78W$PGUe*)>oL=ZobIVC!~sIC8e!_p+iLXU%DwtN_jJ-W3S_711*xCp=w0
zE8qeg9;N69j}3Lg4x{BsE3P}p;IAKdn at 54~H#7%OteK8;N4Sh7wz1`d+Le0Tkjmyu
z^x^KvYP&!Kq1+>vk6aW~EVnl*Z$G!pF{ga6Tm>tMC;J-nkrBD^^0m2r>83&YndYbJ
zJm!kG2p2%ToN0{ps>_F#Owe&oHU&s>1HoT62hjQGnxc60p>5GDo^*K%CqLBL_lmor
z4Y!Cov^CoA!a2<4OL%)9<>tf&`*|O*hpfx{-&oQ-SS%s+q7%`3w~9=HKJ_$?9Q47)
zM|QCz{$%;XM;oKgLFL~6WGtwMOP{)a!f?Y2MnNDY<|r8|2;CWV9oZR0J1v&MMt at S?
z`bB3+a72l*wie69-&*p6>2Qc$TP(`$-E7E=haReN=)tmo<BGyngVD<qgT@?cf_%aG
z(=cg|YfDAwl|@gO{G}ptm+2hYQ8klhf%N+WakFnHQa-HqDy%{rD>L&k;7o#aOvYnu
z1>@NegG_3XE3g2Ab#l+T*LteOt!Y=ZHfe#-q<&uk=d`?xJ5)d)7ReJe*CZMX(fw9e
z-Xj~2*lTOFh$ibJ*Ori$%F;hI9UG(Cj!L$>mKS)3ui5{}<qAR`_Td7*{Kw4j`)r<?
z3XiEkO-%&!O8BoY1WOWsznOKWUhl8ndYVZCnOJr+Sm*bK*ZQyTVy&c*IjGgp>jOv1
z=$hT3Op0H=OeU6k98x4PIr411zTCvmP}?@0h2X;}1lDNJiLkS at mdVAwWPnaOB>f2Z
zzD(1E0#A3{dp=tqyeazD>m?(N5q*7l8+spA?|WnEP5x>J^0b%-L66pE6-93N04E#*
zzH`OcBQHqQ$G99zO$i55R4ctcA%9J$E&O0*Fnob1L5ijQJ8(*`A{hbL;^rSc)X{Vh
z>gf5`uC+dn#YyCOo6VM}D!IT<P}t^ES9GV^cLP*-X36sE#-1MPPb7`!jjdJsb$ohm
zZ*>8*SnempU?xF0M&6i&4ekyF&YWmPTnNx^!O!%+Cpy)AYRks&g%lfhzXn(5ot;<M
z(tUFLS0Q7+HiO?2|25(Zj{qwnhNvzU0M(P%Iak^_mpUf3uOwDf+F9klP}AGLD?9n!
z8s9VbNYhaQZ#2$haq?VT^hsBV;(*KK*;5vVBd*SAUO6u2e0U?zKWQWO1tyh40hUKS
zgR2H-l1_*_e0C9FjygTFMcpvYn~1FOB!+?Axwzit^(tWiV$#45OYHxY$G75AIVY>l
zhAZYB523-|N<Mp=yP5|S^vn#>(;PQ66 at LF;irIk at a2xg@%E54MtIgwu<?wI7_iGuV
z0#fCTAHFN*it9g^uWZs`<7gip8)!wP at +RJ$1g}}Man*s)<X<i0bS4aYulG8Oh5i|n
zRs43eVP~F-CwSHRsaCm&Va&#V3Ju&tu`3#<I+k`?8}3w!SBY0tS7aMF_y}e!p%!6}
zI9wL*T{`jqZWMun6dU`077ljDU74deR((l_``q*)jomUO`FK#K-Vh#m%jpKrQHc_w
z>f0iG0j>_gI&zo1;3zT2rrZW`tYP542ZztkH~vnQ#`YIEHhvo^sL?`aIrw6Y$KFk(
zRmn=hb`(q{@EqYI-^;4kah6A86FXfau9 at VZ*Wok=iysvK+}K}W^$+yLemEJR4gX_t
zCp`e_ at _Ign(T%tkm<Zs9TS+Uio)m8QN)EEi==h-GS|QR%02#Pi*_ym==eW<^pix`k
zv7fS%Ob3BiI-Bw(dLO~BnA|>-fEiC2`?2Ty1;UZ2CtyCP at QXRdYvF2wP<T@^%+a6x
z!5bxZg+ku<uyt6H at _3Z4zXSE-$Awc<T!2cOQLUDKwMq1$M#}jRY+i9<R{`8|A}V{e
zQhu-m`gKY=l5Vx86BF<)(;3T)3`7-iDyLSJAWiDCR)6JIjn`-ibe)qB_p5+1scg;Q
z`m#kx!`q}=lS))3gA0B25c2+sulA)o6GE%deI4k1U7dY5$V32nxQS|q5b`Kfsz!CI
zO)$evXI&K?47y5RnL_(61JJdg6|~@2i8SJhMSyDRI8B at ksPuAX<5JTydhuO777V}n
zs2fK27~ci2j|^9M%+<?93&tMv1{{9+Pgmj9p=LUB9){ilY`^j-$A(w&yylR7S$|`Y
zey9DmG;Uzo&bX>L222msC0r&GP~Q;gN9`OO&ih?a$f_Y1Tz@)5BztnWD5i at yF||>)
z{vnVS2}6opax=vX_68fBbXQLgPGnA-i@;3t#DRJjECyRI%KFo1EvRs-0&<JGVKqQ6
z{w|Cfn|$gM*U~eHF{^`w>vGN2(YhHUQ`FIn+gXq5K+~NAy2<aCM3%iLoyNfVrWp<E
zK0FyI6aK%gGrq32B+L5G;h|olW$#*dQ8CTmtJ;t6T+$;41=*erQKX^SvPl`+?0=aS
zUCD7&JUQGLo9$3tINqzgxvHc%-L`NhWIBxFhx{?s4KXwn?;GDTQ#G_aUu&<<_NXpo
zC5R6dYn&R}BRDocp>X=*UtNf=s!FKQn1y>GP4rQWnG7-F;502kEcn%UI&Z-nC0Tbm
z!fx1J2sw}2SNuz^(_eBmFL<Kncihgd?TpWah!6F67|t!H|1u0QUX9TcNVKMT`IA0u
zq`cZ~@cjndi)dsxhp)2i!=I*b8~ji?P6D?No4l6!^|QjmP-2*8U8v3z#qZbw_^uBU
zjjBrvkgI~053g_1A9Ld7e(B$tB;#y at eOgsG3f%THCh<3TR3LiNDcSMQ6lox(slkUx
z1vn;_+*^;A7$5Vftbjc{BlD|nHIpziKE`rwac}RLBDTJAczsVbB-FY^8oSA9wO=!a
za`tO$8`zBX at h7|@P-35Yz1aYji1dv$bqqTyzZu~7)Avg}A2c3~LN2UjV7W;rx*p8+
zR{_oBz3taFds7ONf!oS7y(w~VmjNvSq)DZhqce%<HSE%H4qjbh at oxQ>8|T{~ks1FZ
zxX<U!4NxatO;RCiW6|Rt7i=D;FD&X~wqm5_j^5C-I8H~Qf2S8+2QHJ3xd#|IPR21&
z3aA&rHrD(2_=vJyTO87>SA`5WlInK}gbFn5`ugiD904>eYb$oPwqK4$*&p{#Z>B4X
zbOn#Rg&nsN!g2c4_0UTqXF`$)=^1FrbFEn!9Q8}Y6Lu`5{*LL%yZhRIEf>}CgMjh_
z(A>YE{+nrWwGb`?1Ofr)+wfe-%z9;g{mQ?g`u&@AyTEr8swh1 at UE-P>Q<MQS1Ogeu
zVuL5igp-DVy++h7;Op!AMG$?c4gS%?ln@=xMm at vd>}|Tbva;AEh#s20F<y6KKSMas
zBi8_K`BN^gu8xk5k&S!((W|S at zd26YQi@vV{+k5>-<keKp}>9cY{(N9fDo$xL@&Tu
z1>j#sfXh*T{WQSE^p_n#N$7820KB*O>$idHjsJ}sY+w$|PoyD^jZb3M)-rbK&6aB=
zf>e)%5_07d at KW`~FZ>sb19B1$hu0iUPkhU;M1pTI%XX4RZcY79(``%>>^nu(_3(Fh
zCX at S&?^YN&?|i<s$yNdWI)1l8I_QZeY#5)Qrh`#Xg-dvc9Hdtot&Z9{BPU%DlS}sf
zh=uy_2L{nbPx1`o?DdB1pjS~tdl1>p;KX2Y10Q5ofpteYZviHC`9hrt`xUb5N{l`-
z`@w8YsEhHA!;?Jw0&OJH8j>H(A?Q=J?Y2|AhD~Qi(pOXjxGm#O>>(Bm)!dZ5y31*s
z-?AeD^+Gq4G%+i)We+{&X#G$%!smOfD?&x8opVER at na9H*mm?(G~qoXHT`AvP2M^M
zV>9oUI at MZmsq!i*ni=<S24Wm!0^*eubQhwIT+Q&R)XC_nh&Ojbw<y4tEHw@!#KGG)
zd!NSTE8HuaLWia>$c7Q;4g&X5nepapf}1 at j${1`%b$=@EYmpPz_CI>OSL3^Kns9Rt
zvgC&6e6-N8=k4wKdD-vB;g7$6+<Ky8bEiaiueLmeQrS##bPAfcs_bEvXW2CT%do^)
z*gE-5JI-njs$dY`Ejeucv1^WpGgYthtE5M?RL={pJ!`#E{;QtJ)d8u2`OMxL(o1*x
zhIw<F|9s>X!#F0CKL64EW#%qaZ5t=~p+{XdK>UMV5xx_z-(*?(M0LksJ$HhOEnzIQ
zdR*QI9re1NcrYVT3_sGG4gRAz8S}WI=x9c#-t<^m8t9{eGbWcmNPdiG7dXA6+jaVq
zkimyr2;-ifZrby&%s%O*b^9X;oT|F%3QQDbm^EFXd~A1!_Pe$x4+)irXBdC<gwi5!
z077IGTUNIj%T<5k`K&~|zU`w?^Bm<=N1r%tvmLK_CjY%_q94`s<29@?i?FgE_p%YN
znY9&lDwFYuY8p*Upu&=uN_B+nAI7$Wt$wZz*-_azF7}#$v2oZ9W$CdX;j^#l(f^!1
ziSh&(juqpvC58)-77l%uAW+Fgr+dyOehwMEQRc+-CakpSA||Oe48M(8Cx~q;=uikr
zZ|&^w5ei0jObnW{_*}WvdjK^?UF3)!5_70kRM0OqX9|r?4x1jB>xiG-CN4uLqsyHD
znbpzH?t}E6`=1g1UBf~HQi)PF9`Xo_gsItT{9XAl|K|YhP5a_cDn*ElvMCBUVOuC|
zx~d at GeBHs77-K{iOz4TtX<lvTZxCB$Pd~hRqSnFBj#Vhh_*zPj#$DB(5#m-2Mo6ea
z79o*Qoxt1KXA?W>J-nj!jrsg33toeC<5vOo_?m+G0hQcAm3;6k%3{}u3uukjCjJ=r
zf!J6{t#r7aH{k&?NKSDk#&5j96TbPJVS{np at OLEEzL?EgdReiay%}vo9n@%$V%{kW
zufnA+RAOAtYIFqx_pi~OdT|3dmH0#1{kG{B`!9?9WobsJdg+P|1*Z67zK(dY3+^_y
zYb>E=29?glvJM-NFqT4xK~>K_=;VHn++iONg;0D)7p>17adjOVM2<@L*31_zGy at iC
z-IuGfQ&Z_Qo-hMXI2V#HKmOXXO83sykI8-lWg;faNsF`%fp at khY?O0V935z8`ak6>
zU~~l_W$sG#awyfU{*2-I-?)M_N at agUKK(-Tl)%6CTHv1(6`-_0^v6yveHr|AOI2Rh
zxcW_58*Ofcy1MJvOUaEq${tP7h1`f$1hClG9a(4Gr-Yb}GTX0NbGzM_y23BR3W&r%
zaczRU966f^^eOaeSy9q;`Q%eht#nsgXZGL=l6rVkdk~lQAJXhvwasjYOK8Zqu7K5%
z_jadEFz2MK%M9ahLN3KjWE47W2(*`rfdoT~hb?V at Vl29Zh;$dB9GMG-?v}70PqdAr
z6B+BWMZD7sZSSobH8I<-ljnh)Ua$%n_ at tMTBDLttX)l^)r0?JpHkcYhC9*W3F?;0M
zNX=T}W$IUo|A6c30lEz^(1Yb2{}0n?b%h37x_#<5O%eU^w>nsV at rJ2JdM?91<Lr&R
z$6 at 5@J?W#DwG(A at w;J!oBkd-hD2Dnl(U+kQ$r|!`FEV}QQD&NyeL9 at -^*;JNBwy;^
zPb)Up2lH&uS+<%Z^EUgd?5ffkne5+pt=8Gd-Y3?tUh`k;rzUA!BwJ;INnaUAEz%IA
z at LqoYgI7F#$#O;^?>9}35)dWu+?jz#RijKFzhf$K87TUIrSR>9qvCQN at X@-sTh_hy
z+e&YZ(p4t+#err`U9ed_S0^@8$KgWx(7jvOm}&Ij&k8;fLUPK1ltFZ|*nT>4t^4v6
zII-+qiS|~1=xxC5n4s-?@&up~cxSe^R{hF9JDGm6gTMTRr%&R<%kItjE7e9D*Q&Ev
zY=Q-Ztj}ZIe2hc^{m<(Ie`;cL8_1!gHiLQ>1^piFR-upIUNMK<3Ts+fqIf!B_fyM$
z_sCblDEENt{f@&Q+yhC{B=G>MDxZqX(@XN#{4CEZm|r6c&(G)Z{C&jqAvp<5)tnr5
z|9p(VRN9aS&!8qS*}r=3x6Z`Y`zaqC&-swZx4 at aHLxl`#N=3NHdsf1Qx^-er=*!;V
z(bxkY<5i!-#qB)C2KYo4H9Wh~;=3dqCC*vh{F2S~)3jUvhr6EL9x@{s3%3MY$k1A%
z=8oNJ{aSIcgZECcJ_z1)B;pp|@1CUOj0_YP8 at Oi*%-VTB^zcF;!iIWdp%Ou%$NC4<
z>Hk;8HEx?xY#24wyKMo3&=X~9h`9z5+cM+xQJ6Mfx>+LV)(Mq|i(u$xB4eg#-~3+r
z-+*l@{^TR7hDdx%eZ+7ODrglU9)sKNIe8%A0YD{WJ-drp+U8cqenKi>v=O>-_WDDM
z+vSTzff<8(vXYg$ya;W_0(rKUYmgPFZpq``@zOa3dRcDZf`6q^5u7@^%q$?Mep0(d
zSdTZ}N)NwGz0SNc?&DkE;VoSdy*^k_U=2B+5quVVf6{D22K!XDwn)F0Z(R*XPztK$
zGZ?V at rIW26D-{fX$#`whal|^AJ6<KPAi9#_P$X?K($;^y)3hk6Eu7U~jp{fC4LKhJ
zoUw=)ztbtC=53Tm+x$MZ^UG6y-c0p<`TWS`9^L!3DFk_uflkIqUIvfGzOaHyR at qvX
z7PXDhy}G5Tg~F8H?~8XYgrsj)Y>CnJc{wZU50is<Kj>t=H{h8gn|u+|Rbl3>Y#Z^^
z6Qm}@cNTzcC+^0Gd0eII-9(Mqs35d;d{9i-%-G6pSKIx1RHe3p3Z_O(s`9;ow4`~_
zxPk0CdEHB(<e?m^3Gx#bsnF0&8MNJzt$fHDlj*v+In9^BdMy17)J@=2((f^SrY|bd
z*dbdpG@=lUf^<bSz^Y_{W}%N_#)D-T1$cKkM|EqPPobI{cCGtKEpILzvw{}9{5qiV
z*`$6<YNkTb;U8_`sE-c2Ub-t{D${?Az&agVK4w{y9kQr<81l^F?xwm%S&^D=`ojwL
zUSF9(!s=)zRT~4ofBk1{^1Y__ER(W+v!e0$XswYVxP8OdBIILi0`Kq0b1HaaZ}D(}
z`k3CpbugmOiwe~pb7~7-^FBJGzjW};>6bvK&{l*o8{S7nn07G6z{S|U`Dx{gHgn&f
zXL|8HG!6Y$yBU}i6Z<7c`V<xBu!x?$>Hzk^7*8A9+tuvWw2!Kd1b2T0%L+CtA-!Ae
zLn`O`TDwN_9!(_IyY`{0biYZ#Ox!ZGyQ4>Kj1-=eTobl_Cu50zUahzkEIEhuU5Mks
z;V5(gB5_RO6wR?hx6o_f5o4%d>y3{W|0oP;j4{RF*;|T)R-Z95-+?h?IHn3m6|OuH
zyz~*NUy)ag6atJUV`s-Y^AEY3qe<Nyf_|&d^SPSaksO|BIYJjx(z7Puep}y`@7OZ&
zR`gXqcqdQ!RS1d|3Bt_?NmrCh`Dc_%-@}zS=UV5erTeMI|6g#+<UDuCF==l7;6zm0
ze55`9`sqU7ZPj?`SX|Ul)wsh at L1}l~xqXv8vzkre2^VfoPHP7_)0Q(fHFI}Wt2h0$
zTYe=6cbSY=4hTmL{08PnJE<vt7VnAdsKgiW#&=G9(Fe)S6<K at gWNgp8)H(4dbBTE2
zl!f;$cT at ybLz3Vx`jBA{+|e(SL*w*!A$TL0d%~3yBZ39vfRH;RHPn-DJ&bfA(*eu0
zj})Y{1GBiwwDqzvTF8|1+2(C(T|(!&oIg!_^DJ~5Etey~A=G};I^=}5E<vdQ-BFYl
zUv(uu2;R=@YlA<``l6ur8lr3~kaEzw9TdQx%h<gYP(-mYwAa>s0;ufW108vihqe+6
z{-gGTZkA3pW?^A&@9;n8-DSsVam^BT3>wK4lG?aRF}6Et6iEU at O?D&5{n{gj<(Vht
zUFHG51X={pbWaihDAJI5NoA$<_r}E9=<iG~Z9t}(z)scR)BUaFE)d2VeDNgnzkcUL
zX~8Sfjcu0kNDHRUXO*JMNINFpyI&00Mc4(J*<EeES#VsiAJS_T(siQ0wGN~iG2#&k
zB34XyFvM&T(|}n~2AB6YlvlN-e^LFQ6CYGURM^!_eO+?x+#It3GNy^7ddjILDCyEk
zk5g at 6hHTL(sl;4e at H<XdBI(_To5FPMpBEB8&e&i;n%%A`J^_tZNn6GUj9_-L$_7et
zjnz9|f)*x at OD<kTWPm-}V^)@CYIi=9>%wky`Q&ODRG)^ds?0p|9pJgKsc}A}D+q^k
z1?mV(K}9Bp7|d?sy&LcMPTZLMv8U2$x^B&+GRL<pU91o%Gom%PWvN>;#KKXe()#}S
z?9ie#i!zH}vH$9_73T#`q<<~rN~`1Pg$gUkqiE4Mi4~;F!TMyEUTvfO5x`W{9|n%V
z!tFz&kzO}vKiPQU8Nz8Bz1y?RGZ8xph269MM+%Lw-WTeq2OEdY84fK`u*?c<GI~UZ
za!MFSP^S25nQ<A=#GT%IFq5TUJfTP0EzYP7 at K5}g-gozpXY6W{@IZq9WSGYt&M2K3
ztuN*I*cb^GFWvSZYzC|Cp3ZYRtyVUfIS=y1N56Bj-AUeAo6RvZFl^pPJZNP?({G at I
zHfu#p$6<XIs+b7wK~X(~*bsXZmsDpTRh!vh#OoiMN?i^<GcHTIe;~IqXNbE_){ImQ
zu{xQ4!|fGC<xzn%KL{);1EH-(k~1Z~wtQzo{sjQ{zJU-((r*RvzV}>E$){*s;tcI<
z`qTFlFRxr%$k0#WqHAlT5BsKS-sjbqZ#s_W%~U~-nYwXT<qr9t-T2r)E0^BLhqGPD
z?b{E6aa_asiI%NEqyOdn>@nxo;!511Xv>Wz!a*`Kvw{Xngi4~sI6bwf$}R2d;qD7?
zoR{_^vn|+`_oq|qPjH(C{J$dmDDd>Xe^6_xea`u--ZepVVUMIxaNalD+eDf~v2yEp
zwd8sGY%ZjWpp3dU+V$85HMAU?N9Uiq0tU(!?^zJzLh;E#eP+CzNcVce0gB<>QT++>
z!+08uF6Km7Iy_DN<hNCKkDmp6DgPS-IwutV7eh|2V^BruU%0`wwPGJa#!}1lW@<g>
zF=6*#T?8?umiS4BFAj#nMG+1=c{P--Tbp)YG?2MIwX$L>8Jw=mGMqaQ=L(~{-u}%9
z96_3dD>rhctDE``#<<m%+<qFqC=dghw%fHdF48}=)geq2b_uH|=OG+Wx%H4ge#l&X
zWD#~qxwY at 7zUx$r%-|l@*a1o-lDM+pcjYkn1kmaWa-CUV;je+R+Y{{#pzGLlRsx6Y
zFt%%*0Zg!tU#g(GC%$pyb7c~Kq42Gr9&XQvnqq2h|6&tEnZYMAN0!rb2v4*#9_`p<
zRt;@;2Vol}<A_SBe66=>@<l$|kNgU3Zo!Q0q&;J1ca}T(znddvlLGRzAuQLk`+mOj
z%UeX{54rJN?ORPEt?T54#Yx-vH$oXqszk2HaVv)(%rx(BNXV|?@r;k}AJfx-JWl)`
zBR^hvWCq4vD4RQ}DL+u~TOIh at tdEhpJV+CPd?)Fv?+j-y&KJaO!V>R6;&L>&8LuUF
zj=cIQA?30~n1O8RcB#{}YKQ_Cj0f)t8z)DEdyL2KC2H5(b at I=}M^LrQTO1^VtNcJ(
za9E2x at qwpD&`4!d`;tm2=d{R&o;!)DQBFKaBj|E3w{n2y2v3&l;V1It|I`9FKdPk(
zC(*PC?(BR}j6L%`E7V{={KOQS_=72*HdCis%#2A;X&UtBQ}J|t>3F?t`IHFj1X;sv
zNICMu*92ro<d1Jox!EqLi&w}w`+(hT<5g-7ZyTF+b(#hjF^L`M^PlI-BbGJ at JHb{j
zO9#)aiy5y91oGH>RRW+NquLRs4OtomlJua-FnG3X(VLg+vAf*LZDY8}cvgPm<QkTq
z(*jCt5w<;jEYj;>p7WiHr?ET6<}Wrg_Jg4};RDMXT_#l6J@;<1lTCuzgu6X#bmfy_
zn(+&nvmuo6uSVbPJ3O*sVqKm3lT|2WCqAEn at jh545Lx^OwM5eSzUcB7JmW9W<-h$w
z+87XxDwNI;HDUsE8do|~94b;AFa^s+*oh-{*#PO}X($@GYTGv}6U=nD_72Xy>Qbly
zH-!FpXmLzmgCB^%b~RP#DYc=q1<dUoxzd?{=Jxo?S+K-IL0_k2G?Fc`ckUH8>W&yq
zF^ix4?Rk|v55y9%=#Bh9IOVVHD#I$I_ff<X8)c1u9BXSN3i?aKvVs>IXq}dXFx2uZ
zfJs6nC5Un=vP9wqZolea<K1oyS5Q^S+EKeLA#-^njl6P92v~0UQnmG)aluEPGF+71
zhOsapkVYZ-r?}4UahD!T0oD3p7lUdek!H}rYrM0k8%XQc??zzoNS&_m1rT;nE-p-l
zUR0p-Hyy1k%9zoR)yaDrXKg5~u9~1ni at WD*1a#}xZ28B#C75S at G?%0lGT(x7?kXOm
zIW{!bOK$5Ofq+TSiei0e31?U6*^pzBLJSnatevt1`9d7&B+fYc`Vq^o52jv&Hn#IY
ze*G<Vl<}=)G$JA*fCwoLyLfqKVow&Pvwp4|<I0d{`Ml=l2%dU`_S7d^ng>F`IT1aG
zKN>ct;ZoBsZHO1diaJU+Hs-c6hFb)A@`VPSc}|r$IHBr=EqHz|%pB>ChLr|X!cH6s
zaPv$^gY}fU_=M6NuZIGu<QN|rFTEPTn{XA+E~Q~^T6<SS;;i|;zxg*+H^oVzI%Wlx
z9a6VTqrSn`m=1(EUl641<K`L+MAfqjrFQXU5)=hQ>ci8VG+D}3rrnnws>3DX6dsB7
zba+gBuoV+PpLdh&a{HBm{ca at y<mpu%5$JdQQEs$#{oV5I=ba0C`?eqn<>c*Y6JWw4
z23<uKJ(d>GaV)KO`gdy1zRl8=mQKApxBfL?jJPG7a2V}7lQ>nw?&#rEz-7B8sTsdA
zn-Yz1v>9?Y)oaVNMW%GxXvoSyzbz?6u+>`J*?KCi1C(nVj*dj~D`rqNbe~-ZM0LSZ
z%F|D!{de1vxf}3f!Ik+%?Q3Yzu40a&UCsJnCp3hpMuH$QOL2<+1H|b4_+Eqy%}a*|
zfLg9FuYO8w5C4SFtaafcWKY3?;nqEV<JH$~a}K0Zi+ruLU;_)^o<eD|crs#9vHlAP
z%m~k#-1RNNKBW_phoVOxilxml1?6=PmCi4&{LttYsrDpX!zzA19HkG@(Gs#z6U@($
z+&gez(VlYCdB1ZPdvs!!e62yVG{D@!eqmOUk}kY#T<1_JT854q&Sra^pt!4qLrshf
z&v;Loo6<Gm3Wl#aw~s=62dhqUK&3OMuAgxAU%b+ at 5g|iI1NWaSu0hpPKO%gbQDoT;
zSoU%Du9c;m=y$CB5DR%)G9K>?#o+0^5=3HT)+;7Ym<Jfog0W4tH=a9}_EGDK(%jHu
zPk2L?sSeNlo)e;Yns2h>>COxBdAZU8sHS|`;O$PK0f)?Cfs?ps?-H1?OC~-*&bC3y
zZnW(jj{0QBh8 at 8pm>-43>N^TaVe$G$w-d{T*s01^>$1i$ugJuQGioBcJSG^A;0=*f
z)98gwI->K{fiPOm+%V6kWSXMuFY+*;k2 at CX<zu9a%|uT)EXqWdG^3^I*ZeeVi3-is
zslqBOtPi56W_Q=aYrx}rKaGF0VhStN=uTENouhlCkX1cZ5-vO#7Ug9W7VFnTvGFW3
zsHPY!#Q72<PH(>O?u2^DD`38NwofbHS<nOyS at aoN+ZK)E6S4mC%gAf?>67NC1w*?q
zuVrD{M-|vt4HC<|j!Xq!eMVCX4zqO3)niSgp(qD^g}j3A5{IMu3SqGZ(4SiK6#^7;
z!}%59db5WF6Y>Bv-;b9DkIVsIwhsZSiyqD}ank}xdCT4kK9X&20vEUnr3~KCca>8F
zsKpf0X8#k`61(6a$=2!3Y3SkwKi%*^lE0!^q{};;<$|f-^pe6icegsO(UtE5U$VCy
z&xf=b!OC-?&3lZ|A>Ai%5OBD0oZ<b#q|r7%y=PL-*Rgurkx5uMUg-CZL!-O5aes86
zqKi4^p;6fL*XvkEMje%8_UMUXmC>Pzup1Q`vqrY}obFiXVB8hIvBu4+h_%#{1fP9Q
z<E=c*M2%bpZi$eCwI_dS%B8_WT!Tu91&k-$O?894+C)iUl#o&zuwp9^lkr(&_hT2a
zp_#JKb&`<D1hI$Cxg+)v5$=i_xXDQTpkr6}{)4Yi*VB(QAbGT$MS)m)c#Dy0 at 6ULM
z*AOE0!9{*M|G7=29#CmWdxR2h;2M5#Y)p3}H9EwvlKEu%)lpF02mZ9C+FC^vq*Nz=
zT441mP@(x&Vxh0=Dyoar*X^`D1oymllCK!Vm%~g7p2qkw;*@$`fLfs+(9d_8kx9@{
zJnG{zDoF%FmrM7^zD%}y-GcDjLBivZkEUV&Sgh+N)kuPiJY>D&L~DGx!7jfk9Ql9G
z5jR-XfGv)a;-*ZVxU&-cHTd at Giu--rEI5%G6B=yVdje>aRi`qbjY7zA^nA=FPCiKo
z%GKe_X9;HA>B+3Y at qi=;8JqGh#DL?^n*6aG8&VÐ^ZiobBEm{s<A%s_LqF&Zb#k
zD=b#4Z6^_6O;%aasI%+|v>KV>u4d=+@%g>&Df%ja{osbM-hjp0W9Qu7tAJ+Af9gQ$
z>_KYpvBhhLMd_O5zC!0zF&MtUd-Dlv55IfhIy)4)!BFS9{t-N)C$E<cP}FFq51G8u
z%jWdY0I6zsg6Br0!u)IIH&;H;$^TvPk33H1HITEe1=E^`tb6x_N|VFnDTVNYNYjS0
z9t-MELnRB=Ox4LflAjMcS;K_m*FIBf9M*nFxB%Iyqvhlq_r$F445hLL?Kr`z!4*IR
z4sY+<<hegTgIl@&Zykidxnmq=MqPNT-_$QXOg=!sd_*ZOjI=f7lv}pQFDw#k2y5J2
z(&pP;)Zpf8RytjKAyd8fW5RQ*p$MXJ)eJiF>o1vou0{yJSfA}S9BGOQIxgkgRy`_^
z<~a54#0!N)z6SYt at pBtTl(-OdNh5nPywRdE-L&JN%Q{leJ3XteUx~9%59d;Fapi#3
zRD1$CXU!Bg at Ft?B_i1*&(%Pqdqki)jX+`{HE8<~{E6<#A^z6Oo{5hi)KolWGIP6Aq
zJHm6U_Nce!Z2NQuw%WsBT{qKVQg$dBkNjIo^9EdRxLB}|pLn3biqKM`>9Rk<d9mt$
z*J>YX|7U2WXQbR^GD=GBZkhXVE?OkaG`V_vA}Gf*ucqs<Y)Q7)R};TG;Q{^<XM*MJ
z0};p({lAQz2fgdm)#%v^G#&>*Qt<4ofU)!23M?1cc8Ebzq0<v;%?34BpttjJ1~3HC
z_jDue{e+_vYa2`p&R~IynwSX>$PP<bmUh72{MvR)Y)1IZUi4pQkq=tt at Anl-@mJ&3
zbms45>y}z&)|(2RSb#(jf<O7?e_r{+3EBU}+42bu|1TvZFS{Iu40=j+5zh+5YZm09
z7s{=Z6IgaFM$u1e^<(wy9fYI_*63S}C_^#tNzcRTah)DvJ;b=tT7T;Z^2 at 64!uRVZ
zedZshxI>=|KR#z_Z10q_g?T{oVDOKKxs+r+zE$&)71};%|9Ui^$oDF3;tGM`NFafT
z?|`~z;7{z~*W=2HJJkhNQA%I{Xt&)5<r&}Vi~W{xA!NqUybf4Iqy)VIBuN4T%6kGQ
z9fGw#R05p&Ss(AQ1JO|xvxOD*3-8Q^pTNyHHP?Q|L*a8BpwR+f4No3}|9NA)le)j;
zb8r=lLW2?c_41sQ!w8c1D!7=TTFUF~O%pd##2;k_R)Xjub6$M=qTQj5!eDL-ce%K4
zvmi!X5Ti~7laY{CovKOQveDt|rCy`nPGSyMlex*))CaXI`ZN4Srj$@VI?*<Y#X0?7
zk^U{ZSr!Eg(Iw;Bu98Ql{GMwaPVEt4+0SQ*yq)C*_xe0M055jqoe0E>jdTNWEur9F
zVhxWAW%5fNUOe=`WN_U&lrnW_BfS|fx+4p*6k-~6;^hHq3K$2zwXr5U`4+cO{7mK7
zf~TrW*u7pTb0X{1ro^B#p0^8aEr(5a$0rM0F)?FOG3{#Y<zs7mWlP)*T^SJCkXun|
z2<Fl2R$2fX!qm{Kr`%y-EbF8a$?c?nn_uG1?}yH%=(KfGp}P<e$l0H(x38RiTCM#g
zTESHR282EDW|oVG90+XZtDv&{F}mVn>}488yV7=7n~6 at nPC}rid(|Tz;lUMsP|@M1
zV`x}W!?KeSQLX&C8{<DilM+DAdd{R`8?o&F=fN8PLdN+JL>g~J*mA{^ZA at +AA{0F8
zqRCPx`BlMASb_eH%Y0?aKmRSCQUznh#E5(&fwxMd1+5=`gD#XQEkdN?u8DvXQ$aTs
zB;Q)&#fT(O!*1P%?$Wox at -4P^^D_c-qtkvojcO6~kAy5o<8sWz7<*gs>giTFM!lI?
zN%tVrI7Lc}%AucD73+cTAzjt^r!0mCwk1Xl?#L#K{bFq~*UT>Vn7M7}bbHKFQ9~r^
z+o%e36M7Q--lqanf3>h8xBb;^fvQ;Us#u}h)upfO;yXvc<9Xj%%m9l%ty)64{@sw%
z*&@pt<9nYCX>CTIK$)(IhT1A2*7g=S=xPfLkPcpHhyYe;=c})XF?1oxo!wi%lbAzn
zB?(-BfbTALHYifREgFTLC8{E&n3S_)6&l~?_}mjCryr|1;C2d}LhrnqN1eccRe#?^
zquNAcKX8_yph9QMR>Jd=*C0C6eYnUfpVES<@kPQFRUHu`n8Qy~b1JArTS%Lt6U;9*
z$as&_8Rot!P2QdmXmh9d`YXlIxNajouq!=aYvqka7|y=$+7%$tH|7&LD0N}1g88K9
z{o|azS?gZK<7dLO)`k1eDsK-<MZX9H)Z#@`M*@#F<iL*l19m0&le=}hM~Kr}*}<O6
zvTtVWk~-#^o-r~4J=Kg$EhtL2eNRmv3Ns;yU}+s8p7K+ye(If&<1RwDkGp6p<9jZ{
z`^;O6l}_wt_GlrJsh+jux_n6w+SOIRt-G6_;u=k%THvP$CteSKAgWuaTUXR;ym1S+
zSe?DTt%@8d7jr{xO#02BW9UQ5Mlz39oE9>E)T$lwuzU7htD^E14js7Wzg5 at aCaalo
z5<l<!&SN_9YeL}isL44_v2%^JGqkXU3CU)+1=B}10bda6kF;lQGhqyFn8Yp9+!x%+
zsC_6qFL)C&A#eo{v!fDO73O6K&F!rAxAKfq&fyoeSzx=MtCB8Cxv>rSCU`2^u3u&O
zgDV|Ok_jkUXu)=UF{ig>(06iOW1CS|)_$`@_wZN%z%ww^Frki3wjDh!vd^WC%I<B)
zhz at uSsm$^3Ojyj&Rh4x5QodIL(lW#n<1ovovmA1Qk-|Hqy4+J!-NhgTRr|7oYarL-
zYP7kzqzAEpVPG1U)3ZCV58gYSC`H)bn*7LH6wI`grs2J{au0`@HT&F`sx_JM`f<Jv
zorJsLwuZt99X7`X>iUGFr9)_pZ;xA^g;CE-F2C5(&<C`t>SP)AiagtI(It>t_tq^6
zH~;yx=d-rrjGMZB%=x&?=eLc&U5)m4r*JzcD@%uvj)LywY7fd2%gDcrp-lt{Z+PJg
z9-0$*UjzdXu8jOK-#oL*%V?=5uUY*JEbdHjkLVz^lOlZ)YFZUWU!8nyX3m%3v~P&8
zc4_nKI`CQ_WfpN$T6o#Ks2Pgbue&9Zm=WXAk|M1xBCJ!w*`a4Wy`$(rB|>cK>vdb}
z;JKccLdTa at B(Yz=<*+;Pp+q8>D?j&zkDR#8R>BHJB<#dBb%CDk8Mb}UVyfMpjV`Q9
z{lTA!muzjZB20@!Y}Jd|>c%6wSp}Cq)&s&+ebY`KbS*Y4v at yB9q*~<rBQnvGjm~`T
zq#+;?#0XDh`2R1qY2e<(7?|H<qNNUPv=BP^v3DtI1T3)omyrLLP~l%D{s)(@UcU#Y
zH(wmZ7W+V<6;<oY8(?{=;)xvU{6O&LGSjZKL&ex~ZT3F>WW7;OB^!Zlp*)=%&W0GV
zM+}+=zI<Mit)HKtRBPM`70g`f$R^eV5Y{H1!D@<{Ju^-+*buJkpnnQ+GzRm1&_k?=
zjCZyR(PI3u$-Sd at ScIcKhvl1_<~?t}UBQ^yrPd*&qMGK2g$h=B%kvznM_1(g`@ubr
z>vMqjRL3Z{n=ZJLJ20<i#rox=uvJcxNLy9^*Zf`WvRxBH`$zU&;3e_L>*M_C?w3F3
zFpfP-e_bE0Sw9?U37cH+kCb&TRF^XjC=Hk|`#){QZP*^<f{O(mE<+_<LbPD1sB*?w
z{AXdr$K#q06+YLBS!EU}I%|<96}5M-iiAZ)<%U;$7JlQ;v`X!xUadApHs;J#E9MHg
z9Sz#&y9FQns50~8C0M6%z0?g4^7Bmm133&0d(2iuP!rfQlsE_IIC-xBr4KZ7f1ONp
zF^_3V4sjfl^`FG?o`@c-AqRo;re6l>{FIe^hRg~^MOi~7$9a;lpH79pUP~dzR5zTj
z%JTGdZ%jb7_9H at JdDO=x#o7m|U_DN3FG3rM(C+LIqRs7ra~Z^|ZB*SMdy1 at wH+doE
zaEe at j|6~EoNm>y3;!dXcD`HZ5_Fj6unK>Qh)X~n}RoQWUiKI*4zXjZ0QqsIBLY29q
z^>3JwNDopaN-aFtKUWX>4=25hS4>HW+kqfPq|JNAbq0EdWi*1iv8~^30hXb~=j2t~
zJ>&#*cU;hv)4uE4E>v2ITCA4Al!6Jf)`!(6uZX?6Vn+#0oU*2oum#)!2fF`TPBSWB
z2fZE~v~hseKM{q1<cSAIO2L>n?jMjx1JKv1dSq~A=Ka<Ed`t}lnrbe$z%nYh>-UC^
zR}!sTCbJuPk1QBW*zUWmbPk at KTgs9}R*FPSPDG2ni-QY)bBOQ>htFN$>-l(9vE%l=
z51;QQ*b{3R1NSsP=kV6 at 3K-+)?_aNM5ATyNP30g5_k|MeA5R%`#Osd3BfA)Tr&m(*
z|GY()0x}B>$nBo|Ri1#_z3pZ0x})J#dr^z*mxB+13|RI{9naK|l}Vv~J5jgkH8Vt^
zY?^#}9!I8>CriF&W^1yD?c?oF$z5$9{V9A0$!CF!*xIs<R5B-llIQishi7iQzF6w_
z6u4Zfe7JE*LySc-z?%k=*!QVlGP--IdZBODaSau;cB<G+R^k?bYlzlna1lGT0iN2A
z3+(zahfH*<`FJXj6up8zzdP~y at HB<*fqLE1?)d)m3<%9&UC4fP1nl5o_yyI}uDA<!
zqBxrNaNaf#xN_3*!!x5Yw}G>xw;xNdvD&)L>rzIS8MFx0zsQDH$@6Liz3*)D#F_~J
zsuUqtDUw`-v^6%b-f37s{mzIlH*1iENykS7d^yu_K7X)$c5AH(VxV3ZG~L<+Z|>V|
zJs-C|JaQxC)}GA`>5UR!ug55*V_uK at ty4MX_xXxh5K?Kq=h4AyK*pPa!w>R3V1~E%
zt!J;9$EHOz;MJFVr+FU3`fJqPomBX%k+3bb(i@?EUn3m_Ky7Ixic?;wH>y6o&R{)B
zzFmZ4bu|q!kcP^=k(`k~OvU^&1;OcxQ+B}7M?bdBAD+7z6&B>>%$hLya*(wlvsJKG
zyG`|S6YGV0Y&B<^_F)=dAVIWH$=CR3M$+aDPFe+~3*j5DHtg^!W>HRsru1Fm(h5`6
zOczX}vUmPWODZ*8Pq!>K4xkN3E^8jM<so at 2N6}rEDKGHWwHbaN6%Gc1yljllz6P2u
z%@2Rq9ec+F?Oq=zKnp+;as0zT;MDIG#P6}zr7DYv^k7{5J&n^-OA?#&tSwUcy-D9|
z4RjbTPkeW)EXTW1x~8E*Cabq`uiBV!)rP5CsqC=ymAkb`?|V2|8sBp%i7A%J2ai at j
z<Zd#03~NA9Un6DsRvAZ|O3P$bUveqGH(rYqX;;1Bk at fbQi=TJ4!~@kkJw(dx at R{pd
zMiqU}-P_$_yw?kuLK7}L(dyr+R%QS>+Nya3-W7RA>2kM?NViQBEl+^&*Q%j9j7f$?
zLT0ALdL#DXY`2qmGxkBJn$7Qt&^Pij2llVfSkkHShX>BCxF77~Yr*hLw(q3ZPN$j^
zZqB}n&~JOt_bsbKn*_z;S<WOyO?x^0@?j)VG!=Y~P2YVt)>taQJj%kQ{K~;k(b!<?
z1(%%Yjs8Mu3dyCpS4E?%9Jg<7ODeSnEf!Flj%0Pd+0zkYuPJ_jNnv8g|6$6`&Lfn^
z5EPD8Oo{?jFi_K2ADvNsEZ3n>a?yBDPV~vkn~sYyI?R_(QzoUHGfcSAB`lhK8X9MI
z>Ad at MQD-mbD-qyjdRLRuZv<AIS2xMF<C##tVbG+-k(c*Y_$re=TD(T!8X?P(MYQOw
zxvuaoyIldby5o(vFWrVh5s2Sd;eVclVpwlbT%?h;D>yf}*1T%?l<REDkyMTPl`xl2
zw?3!q$H$((-xA_{)mgMquJjq=2?bNLx6#x1&vm`mZ;!1L_y{_BlyC`CVf}j(F6UE>
zwi64InW&Z~L(Q%f6f|!txTV<3N at t&Wd&)}<^*tP05cOd0LdB7&k&eQtKKloH5&rgJ
z(H_8PfqOBM02}Fjs3Yd3IBID5tA<(~Gqu-07W_o`&EQbWk#166MpwBX#Ucbezc20l
zeLabv<NN0liXRLbGt~qo70 at c<uQx3(07;)L?S5|aq?ysA+<X*g{iP;aYpQYJs+Rdx
zefb97%V^H!oaeeM#TbI3w7xof#3HMq)+dQtrbwNH-fF8?@T}P*E+p@^4Sj#grm?i`
z$vpX;1#p2wB>wif&YfH)UZE5Q|K>|gaXLz^vP1b?1xy+*+sj6B1QIS>dcYVhy at O7C
zVx{mb$Ia$cTiMWdAS!$`$K0gk%Tv{*wB6ghv!+Y$`;N{JX(xAhevD<0h|fFhJ>PJ%
zrqsVYY*0lvrO at H03IUHfBaJpz;(s#uY4*|!p4PKMrI<IwXH{zrg+*o5B|Ob#;1Q-J
zc)qTr3z6k|dV^c;asRMRQ?ynWW64MA?yjBy at HW(CE`yJF^`3w0*1m)w&?f7-nKq4{
z^W>DbIxk=Bcj2O6<j7sw*)exBw)0||L{kFWsX>!P)i_#pz60fNbr{bzd}^e(f%D;4
zn?r{Mwa80fK^e3ofz#KI&A;+v&LkC7j*zs#<sWY4YRftOK5s3qd;`lluLH`DALuFw
zy$R7aa(Qy9ocan^mO&xkm(e7yvxmi6N@<dvI&_%fr;nGUUZ~44qc-c9-c2w54(_=T
za`A5Ud%6BEoHqxhZ?d?ijr46b734fMX7cBZLZc0p&&#SY7m=8j{OuhO>UtDOY6pG+
zrAp!@*$W;kL=%UOuajp(&Y%(~Ohta4pTBAsm67#O|DPmN4&dSiVfXlRpI5MPTo0=J
znf58xBu9@@mcGXi*9<<E!XUo>(##}p!V3908NbDylc2g-W4A2r)!Zs+DBtV7gJl<O
z!7(#YZj^aO>FyRUk9;l1X7;Od_8-R0B2_7RN1)wS#w&B4kK%N_s09>ABj0Q0rEZ(&
ziw3;Cm}P6#|K^<kgV&OabB>zBd7Oe#Z+NX%4;C)Q(wHV>-Ik`l`Cc?J*MUa9INkGx
zQ-w*@&Wr)k$vywr6wJnloO%zMhSB>x**B!`mX+>4<2|*up#4dTe?aF5o}ijYOs0CD
zngrY~;m(WjYLL{l*PSLkgMZZiRN!!jPUj)g=1Q17&zo6>SMEG7%LAjE>{c3=o(a+2
zW#o_CDt?>C+m)jBgY64#^_x1zrmXksdS~;E%<k}NgJ=6LX~n6m^~r5VxTz0H5wTVs
zXSmNy$gSvKsnLh0sGimm81TAf?uhA`O)I>wH^><?AWS^(SUS8jSR-7|(d%q-11V%|
zy7zpn4S%eZbN`F7w}8qj=-x+PO1e`zUQs%vQ;<&S?rxCo4rx%jl$7r77Lb<i?(V(^
z^!xtz|GTm7UCVVmzMeB at X3or>{XBa=bHupb;%(XIbEcLYObrLk9KG^uY9qxRtA at 1I
zu8G?Wni=k)P`@J#$l2SMoAq at K$TmkTCma;7al?UGhB!n8oj`YL<0_9!DMVMc$XN>Y
zHE^oH at ed%PvUpVwKO25QZFpcUBMXR at Cc7N{!(y5o>D9+AE!uqFsZ$<Q at A59Jo>Wp?
zsYnnM4;G~d33FKro8EuIMoi8Xm|(#Rg3uc8=CZM0m;d=~*7Q93dvXwU9|F>NQ8tn&
z;zg$)h{yJ|M1DBWY!UT};y|I0NPhAwX{8@#Tu7Zhx$I1#pe}=RuHu59G2leRMuxX|
ziQSwP1)VI_nfwD+^u?|51Ki>gcd8TL30@(647TP<JlbgR;u3rPgFj&5k0d#LTxAx?
zRFu6|GYxu1a{R!eTzK`v?k41j&}bMYi{xl3qJl*rXn%7waddWzwCHO;;+e5b1)W|T
zNYm}9jIjQl!29sbr^>t1RD0nCONL}gvl5clS(C75ucZ_k%jbF0=6(u2j=4aoc+(e~
zpCXE2M#P=~S%GH#0ZwD!u_VeiaQ!E?j~tm{Kf1E#oM5Gqf#RMp0 at XJnHLzlQ5Os>D
z-62?~);hl_<tr;J{m0mqkdcb-Dj7kA>e{TUOpRt7ehcOuyA2@~5en+$7z~$Z?^ts-
z=!x=*2K!P;3+8<5=o_q8xlCC#s#7BVJP#0$Jb3AGUF0#laF4uitGBh)YfYA0>pZLP
zxx3~yrb;W@`bx{^^G#LCBNtYnzbntea06ol+)E3Z;tO`AwwJSEmsC)(ysvW_!oD&^
zp?nuMZuC59(Era<hIEr%F`6bufce$9c|cmx>ye4oR2fbLF*PasB3z#j%UCJuKN}!;
zb%M)M8`N^B1II!bzgLlk6m{%6jQ$C|B~k{J(0vs82t-|-(z3brKZaHOrk+&z3Wf<X
zTi2JeMv)}Y5c`CTNHq7`o88SG-A6p8gW5vcp;4KNSyF=<6jPe;RzTh{(G7jjWJ+~%
z)(cqg%D)67jUTo#hp|F5yF73(VEUX9m}8lh7T#gQ=_Rmrj39fGrMa6m;!c7TX;N~E
z+)>QO`z1Z8A2&H+mdVmTiu)~AjGAG4GEh00A-5UX)6-g!lMApB-a8In%f0vxrSyN_
zw+Oo4Ck%){#*tAPaq`xwWNuMkUMb-TeSBRcQQ3_E^I^mfbW4A9O$iXM_F-vQ1jWmK
ziI^cbj`+)IH-1t+Z78UzWrL~P6NP2?82kMjyR at 9fabU=A!+6Ts at L$0>N-%}ySTXSe
zOX}Os#S^92R9}B+ajNu9ttwEbn3<- at Z8VJ7Z%#UX8+8z2b^a*}p{>({C8JPS^@E3f
zGUBYl4NBY$3Yj;d8Foh{K-<WGK#k7nZH+~?#=eREZ=a0s_z)aG{5;)1kW=YUp|}wZ
zBC!}#Ra7p|oJe_*1pRjK^fsEg%CcFE6+3!wbKd3CtyVdD$!q?<_~4}nEYT`wkXnum
z+}#N at G&FczjyW=)&w*dqQkwUB at 6o^^9aNNGsXA=EaA#Lj8B_J~MGy(Zc%G~b0#>l}
zu2*kK5k3ZtRy2?py*AU4MpfMcN21B(!L2oDOQH#rbubDZ3{Uu>1(9V|zoo|rB+DH~
zV;JM684%MSb(Y-hL65YTTQBhH{?W4??aX%ze1zpFLkPVi&QXJZD;6vw|9F7c6ZJej
z8E_Fk2(kqL<ZlYQ&FW&ayUX!1gxBMZ39wT*;poY7JJfumGb+2yqDMFQdC>)KF~s~1
z0vmoj_9R(5!HXj1?Rb3Tiv_Q=`}d*~-QC@}oNuG|tTA~kdCx>~|GgtX@#T)`#l at b*
zMdEZG*VBqZ!Cw}AU*F1>)z$_d92_KQVFM*U7oYzDLhM&iS#@>b!^1;@7P6qW1)v8n
zudcqRC=~d62^sb?Xh5r}sfh+NnB068WD5j~zu4aA>b*sIZV at zah$I0HFSq;>4}gr0
zM)m~`Yr!w;8St#n7=TY at _z|eu`t at J$3b-~^=%sAn!0GkBibQ|uBqPY<*FHLzUhSR1
zs1}i;F0oC?+^|m-R|CF7?x{S&JnjxY73o9*#lQAYUK|wQ+3R4zm*z-;9+ at RatZP*W
zixWQ0;jU5nI5kG}qIzq)AL<->HCIFgQ-z`ZkJ_$~QnkrKG|gGB9a>#Y<^N&&Jo2-d
z!P&`fXSGq%+dHUAHg;xlR4KBl=C9Wd^qvekF!?OuV9|Y&_Gjzwa6xSkJ5Wu|8yRvq
zW_Nw>r-9ECs8vJ_*Jyg!?NRbQ?AxQ$nYOpOH_98c%=MC#HU$H<lEi(2cjtdnbw6s4
zM?9J=J9Tz;YH82lZ$SaMRAnqbSa|nSVDjHwe+0>bKvVpW&`~B)wtJUw2bbI+AMg50
zzT<T!A4N;A)0x(dsTSuAX5wLTP!i}K%E{@GP33aDNwz2!l*+I-bf6)5clLM=!S}R}
zIe+IAn{j0Anf}yLpk296Rib(0jdsA>#l3pP?|onDlFSom-~3#=FkGwq`*GCZLyONI
z|FhY_=sr4#5Or_I{7Lv}C&wifj1~HvHj*g}$4QPK4E^{K(G!KyhGI<wEgj1m8^a=_
z6&yz$=4y{J7rbzjT%dfG!YVMbF%Fw)yt}Tx!nf3U!XC);GK7AfJ79C0N`o=Gdb~g#
zwXQvxSm3_CoI5(UZj5lcy8`(zIJfkbKFmd;^5gnGMPG^67oFYIbJvw`WG+~*T^18m
zKiq5#S!-W9FL{L>Xy|+getkStvDmw?eG(UE_KK;kU$E}1zht=fI)!@NS<Pu0Mj4-4
zzXk^8%Y6IKm`oQ1LFOOhdtJ(H3 at 05ocnqR5mxZA1d$aw9S-G3y at 5%|orM{|j*x==u
zdaScOdU(5|?mjxK01D(0s$ejjZu~|52x at C^p(-^|k8<|S6JLy!n&pK$mT8RGSx>p2
zZ9Vh~cAA4cX2JETY|c1c@}5ok0n{`hqowqlqc{F at ThuVNw!EtEth6V2)Mkcb)gGOX
zLfuLWRVYENPi()uTU|DIH5;afo>EJeOo<vw`%VM^DEu<3Ilnwp7i2u8pnLPHmS~&d
zV at 3h`4If3Zh2~~0DhiKlRk2b}&3a%{&hD@}uLrIYEkN`<RT>u3&bC`duicSH;te7V
zgX7W3pF<s|3etE&kre7U_(l%0S-NfdT*8X`fWw=*5;mu^S`ecCn|y2RUGoydc_()!
zNx#toI=bgjbzvR#?AM7L`Z0RC#)kG^-84r^x6W$K%n;XxPkI}(43eWkJDm9-9!s6C
zYk-}2wj}>G5iZ&giKKHdSGXS4cUr=xg9EhRr<FL8c)Q{(P*N?9)+UQJZtSiOwdPwM
zV0PKIr_=5eMNw;JtvqV?pnm3dKHg0tO96ss-mN_*2GEmQcIV^G8sFi;D>$dtG)$i@
zCfPKQ)Nu82g1mc6lP5u~%~H>MGU0(gR*do`dj)PrR`g-rH%<UT>pW-WB>taPX$#xu
zL$da+raQ?|)!g;tT<eCn_f2wTw3C~tSjGMoYN<}~y_febXl)^F_KshGnxM7LktTu#
zi>f)_r7#y?1D8S1c}o&h2(!#k*^5ZkqT_w%Nj#C5vy=I4k|0d1_pVV#sb8YhA}ckt
z=?M$Z<5JwpT^YX3 at q(-9|Dm_gA+FClA3PG4D()L-$CPb6F5%ND;af8JJ~S>23I93Y
z3ceYtm6d26&O=V9r)KN1Ezuf!I%IHm1`Onh?k#WZIu+l|eh|kNFHkGpn)vUH7d9 at j
z;ORl<_3G$-erhYoQ<O`SsAJQbD1ObRZ?)B$lM18!3G|P8hx6V)tp=ze>PobeNO=-L
z9=DpF(vigf)3APrJWg{WXykUr at w)SDOe-Buuv5!Udn~U)JZjZ;{<Mf at U~)BgUkjL<
zVg5VlLV5X0WR8xVhx?;+kYJTj<FeC9{<PioNhhyn)2a3wW+u#}Bp!mrQwhg1VBMm7
zYz%DmyyKlcaAw5fzBS%E=1mu_HsYO??XqsRGUO(m%6Wp!2lRXW-Tg~(Zx##O4iE+E
zv_UxBZ%JxO`$p}@V01BF*#^^V)*j+ at oaHezh8m8G3A%hl9iMnQg9gDtp?+j&8&mj-
zwm8xa)^_R`jShea`iQy$v3t)G;2XSR`k5#2DO3uI<m<bGY(r+D%9-|SG*74b2ai8e
zp18cd?IRiF`0fBpXQV>4fi{c>K$a<jmj%uruFYtlzgw_ at IvOFL7Wqn-usGb!Y5NrA
z^Wy-Taj%_hXlp{dIId63lpk1}CK4xd<16dytek at F+flo3UKJcYH9Z2T1(v$!T#g3o
zg0Wzhg^TyYmFpAsET73FG1Ot-?S1+kVYaRo4Tg`u^0-oCkJMK11G7eLsd<o*a|A(V
z?U5`iqM93New?m=?!JuIvG01gx4?j1xaTc!6g at 6V;0QW9`u>r}0I-YNHZKcxx(evg
zamxaIr8aT%_OM$Lai=4|lKHI`i2Mt>FnZ=Y5gsDJIPkk-vemIAl3`C#fLWT{PW)IY
z1KB%0*;Pv>j?gqk6)P%q00RqmhChP<p6MA&k5JfgSnn{kmdc7j7LV2C- at +>;=mjG!
zmxMZan00Nx!!Wd{IuFmE3SMCT0ry&&I81T7509Q8o#Jpy=c|X*`z<!&;z(uQ$^PHX
z{wOEm04Q*6e(^P2h#{_#%ytjlRUSj~`c|JHNGz=kxaysSSi$QPTV054%!2Vhm8r<z
zp6e0d8=jn$?9#d9G?nlC at -3kz9}^BLsAcTu+gt+?y>C<w%1pwGH0Wx9Vhv;bX7p18
z7ab(D(_B$;t}H7wAhf-U-;f at qE$I(7yAgFvGTi-<Q+RWctd|AX5Vqo!{K-gdUd2}r
z6&=dV6ARN{4>kE`LJ{6J>`u2pDf~p)=n-3(Q!<g1MCow8$}X&$uNf+uk<nCjwYt5_
z0*)eQV=Y3VPUuhdF$RIsq^L03!tKeRC^{Qw{N|h=8$jKK7gC1c+OUYUe2tN5I`sdr
zk`+or+g%XzDg at 5%s|cl<?0q_~Y981UADn*N&dT52j#`trJFB6_Z_rLo=BrQ=tMHAq
znj9XTmh2X#Op704qD?DB<W+y4%MZtt!>Ylk=&FZOj34YDZm`VqBbird)kCRvgl15*
zleo>f at rF=d5wm0)YKiH`E}cWd#c2PDc(18$%BRx`M~+3T5K%^@H*^Zh-``!Jhx?8P
z<i2JUYE?1X$IAr^9MB?kZS9$y&{C`MTa>}J>*qihF1;Seu+Y75Z+HI9b1NIK#32wa
z-U=ffP6i4OCNj-TuQ2b}nHlN2(_=Q>7>@i&6%_v}i<`RV&wj_j+|9i<TTu1UcbCK0
z9|QFAlA_9scDGS_Z)^sZFrUY;<I5P<2E!zxeP+}ahWKd+$q26-iYnS{lx6UGbxl5)
z1S%0_{3o%nXs_Lf*-k!b84rl5LH(9&wyJS^Hfh~d-<ijUDj+iRbr~Tle2=Nb%ngyM
z at vR&^JFFO5yK-oip|C~H6~k9(#?w6_j+$$b3au1Gcv{tAfnNKL<LDnlGKx%|f_K=6
zL>vq8rU?;ng3MnkG_+vTjH#KcWT<yC<wWmGp7H2dw`lW>sN&ot^;ZFEG^|d)HHYtE
zHBJwBs-q0to&*h)ySd5RuwfPEN{zm7L`waoN0$wZ-5Ks*U%$#l5+C~ntsy<ufcFr1
zS4RgEo82)O9*Bop&#L)e*1YF(OL4Zk3GD-t=x>Vg-Hsh~L1R2P3|&Kuo9f&JVRi!N
zKA~t`8Bj^G!NAtueZRZiU}BKP=174Z913HkS#}mHI|=sm0=*Pj$Jkbtzx8EmL0bJ;
z!a4BTA%djeWMuH>L1~F)E>3ZmNq-c&%xBbC2*uJNeLW#!;1&-lzC#;wvbD1{jcZmL
z3ejlL`3WZrCG57y%cRJy1hdGCAsm(siSB at 1nw=@J>sZnN&(%qL*m_t%0dv^LG}r`t
zD_5w at 2)+XE>uFPhA#!tye~y9bRFt@;SC5Y#O>tpS(ze6FJ&7PKd)Mw2^b<cAh~n(N
zxI)0;^L<l4r0u+<u%N}KchMu#{F)af3|&d;5=&vaeKQw&)K1 at UdTy$TOdIHM9<F{!
z2vh4gF}!`ZDDEXHnk<;$=~IA5djlkC)Jj;W=XmFJg!#yc`e!?Z!d08XsfGATfy{HN
zfBBWf50vg3H16S!GI#g7P)7F4eSv=^4HFACVAQhQ<4Ff3SKNph5*{qoEL<jzt%hbn
z)FP7F8-=sTLS+*U;iu^7D5p!6tiO{xS!U_)Dzz{-<HFO<HJMcO`QzR$kZM1_!W!Cx
zRdfe&zm at PacNik<*zC55&~h{6utD?OP6sW?O8$~>)eQ_&gHx^r1`SRq#e~67;aOsi
z^a1JN+REjO*e>Qfi=DtYDM#1$Bq=5&IgyDTj6FwIm@&M33&L=~f)DldF)h0>{oQ1>
zn`%mLpXh~Cp-L|~M at 1{_m+gc*)}_+=ev*Hxa0yWu!Imwz8_(E?;P~t${rj7Qr_mpH
zM@^PFF6<^(Y-#%>WXik-VGpXW5zE=KEYCyvLLU?(3y8Wb7GEZ$)yssesjX#78Ps-S
zg>x-V8Z-uQtJll~2cA8o?H at TZamt>!uau0ETi{VVfDx2d7 at oTBmk-e@4B?SyfvR~=
z>y(!I6(T((H%19Lxj=BDYAjjrN{<F(J-4xHcjv-w$KNf+Z26f3J<rrOf>6cLIQc~{
zPKh1+NAQPiKgpV0!z=Yd^;#((HS0P>kM*rrGU$U at rl#sz;axS=g?DcX8|70lnoAah
zxg}0>D~uPh;%NoO(yHizvCNE1zAE3*UvDO)`~IkM;|#1$I2ZUBy4<+K^;w<xfU>Kk
zcyrVzr`?|t8<K{`LQAJ4wG`1`xp=LCv&xOI%!#lN(pCm#!vH64NM$QvC6rH{iBGMu
zC<n8MI#;=3o%2_AiiUI8$BRldr3y%Cg&zgfEYd>#eH&ZsMi<-$5B9(w&1D?9-F06$
z`KL^1dR+uS1&G6|1<ogeO9_vu7d!VNoZU at oSLvicn2Z_-ll=->zT<1TJ8b-m^MNz&
z>qiKuUp(-?;Xky#fAU5Aetv=<5voP+SP7FiRh)|k1qX#oRG3sMO({+tG;X-!&+;&>
zsLPUKYAib7H({=ac3-B<oIN$1XF(aV24 at H9qSl{U^ux??WDmRX3r=iS6{o<?n&(CD
zHNM<(F|LnUi~&-E at a%W6xanoD#qAq)nn>m9M&-rd6Rgr&N=%`Yrs5cXuw%4+vp&YM
zT+h_&Yt>Gi8EO$xntoxC5oXtOblY~6h)Hu?OTQkmfL?BBfmZ%K<r*K7Z)9(J!O>I)
zO3ly-L-!xJGo83L%r7{T%Md4|i2QncqS3<)G0jes=`g`sc&7&UL5ZQKc1CERV#M5$
zF+;8SHm&@zUi<A%q&mon8nW#6Zr1q(0$SJJ`fdC<i4RNo>ctT}08suiO>h9y1Q0Y`
zhRk}@jAWuxvEW20$~xDx%|cAGMp95UPsDqZF at IX25iy|=tbBL!gWtpu<x%muSsJ$=
zQc;S@$AmmS7*m-EsK_ep^)G$>3L*6zbzpd1 at vZK&+m>Qc at l;00`OxO~I#Mhu%dG8g
znD5EJZc4&_OB2GLtARB`nCI#v8aWNZEg=;SQ|FR$!?%A%O^q5+$wBD#pWeVH$4qAF
zkUYNaml;>T$fX*Rrm6m%UX=fl^1J#Q&X`<}g5&<3nH)P=p at ItFdvZp_`vazf9%&}l
zQd6P%acgDPggT0#lEbXHwf8$8<H4pI(p>uN(wv9azj}{g<b9e0?-;c0N4ySyVt|V^
z)J)!QSC8!1AzIj!xSJHYm*@zAa?Oq=6gNI2*y3Bw(LSt6HfXOfL)6{A*4XduR}FDk
z{H)H3mYY8=K}Jgj(D&;XFHDg>TT1(tr=^XJ0kBUWEGn_6190AX^`Ij92oaXz19w9q
zPTc^7x;TO!)=7gW6;{2c&WkIs+|DNCmTRs at 820UxofTU6GK-|eg0LVt3pXB;CwQjW
zkjQgbbooN>*NzCx8t at e+>@LwFFach;pM$8PxF1*p?mc?^lk)zhg#&NE;^+M35^SHg
z><nvSQVX1*Ec91I<w-u%0eU}*?UjbvFd6sx?n!;-D#u{%=t}YYXT2cE8R8TNtw|mQ
zvuAgm-ooCN$&Rph*O`YAu>O`NEw53_KTu_VHr9&4w5t-Vjd(B+K{t_w2&r<avq%D>
zrDOaO4aDk3#g$5)^~Nnj at 7Z$;w?-Q5RM{g%DL{Z5)vz^<L%>(%M&IKLD`}}4i=aKq
z*6lOyoRBBQkZ;1pzscU at vgq}S(*Jx$;Wvti0H`*h#F2xf4_0^Z**HAhLzcbMV6v=B
z*Vwf$Hw#zI7}-Y=&QMWs+d67?L&Cjd$`2Plna6h`$%;YLuyo1fZWnA+j(7vW6BX1K
z1ZRl(h1XQx at xAY_BY}Z&vT@;)w3rY{cwRD$P$F^-k>rk9hmS(-q)UPCxx<G((Xx<a
z(hLncfsjQb(IRIK<GF4H(DQR0Rr2Iz7i3y4mDEeV{7{v&VXo>fDcSjvlv|e&-cDrl
zMe!FKgxuLL!jrvuSUbp43*}iV3!M9VzwR1kG0N>^^9?s)h7z4c22gINhstDwShdmt
zv4|tdB}KW~hy3cKRQw`@r-1?rwuJ3C<w#9V*+Yg%D<jWxya(fY8>~cQ$}07`8R_xJ
zl(<KQ(TiMGqvFGXi8IIa-NZ+{qV$i2y?PHEuOhXjca#bsZM}GFPB~{N2_)}K2kpac
z1B}h`^u%NJF2YU_Zi_uE&Bt9-{=A=4Q at 2J*&~&KtdWBI(l*JqrIx7A~6}fQn^<Mg(
z<58fc0g6rEjaRACZ+Kx@=cger*`BgL^37G0v>!`KAXHnf8kkbOVF#mxd4h^*;%ad0
zpLG9P7s?kVA1)tF6aZ4{A=*%54qF`5e92j5ZrX$ltu?tULaW-tqJHm?&?mJrz#(VV
z10XPZhv}EsE+rbhAsuLP_o<T9V5ZD>)VnGVCpUK+Fmpt3eKlbJ8?*^kURh;r0#P{0
zt+yMOw45fwW;A!Fwr3Y;gje?(9lw-Gso3<34zsF<?Xbv at KJpx$mr#Tq at 6*jJ+|`Tg
zciDx%;}WZ<S$v&YgzHvffrr{y*052vju%Nk2ro<;sr;v~q=4Z#9Af64W0ncX7y4ZB
zkKvuMjm<|aH2a_(FDR}JFGAjZx&FqY$Cd>?c9Gj{#;xO|F<DHhW|Ra)H*C9!Wg{No
zfo?ATF>y1t`mHI}*W_%3WTlh<PAZ<!iS56~fak?4 at NM8#*7nwS;YCa)moGHJR<^0K
zBmV}3y$1eEH$M|f(NlQ;;UZpmF>M3D-*_R&UJkAi|K*{d`KNW(p#Kn2|8F<Tlfn1m
zofC5SqsLZny~0D`4cL?6nNCA@`RKB?-Ccs(QU6r(7KsO`S=Wl7k5D|oZn+b+2QI7X
zDz*=8&=_`&A{91E+yg7{;TBBR^ds185f@#glaDYD_Q{m^8|L7EM~U*n9mk&I=OzEW
zxwJ{ofURbN=Sd0sw<+Hezf*|=h(6X*PaxxsL6su57XO20I1gehxcxLfti~U+Jr*oR
zcg0zXItrX at 9)B=$jYkqUr>lvfeS_lmsq%&lC2J1?PHzAMYmVEmv1yy<Ixfkb60II6
zRGK|ajY4Dau3)2O+A_?aSaGIp8+tA|;YPE#;VNcwFU}RU#0H>+NX0ScF?sTUP9;SC
zJ8G%WKYW}dr~OYZKmwR0c>FfwD>|0AAFD)GW#$XAkBTH$r|~Nm`?No5pTPLKp8Qn!
zn-LwZd`q!ltd&R$VPbi7C)cZXtkFNg#REWf7D#b0gnEtxiGGC*`|HHjn~($fR_Fon
zKG0f9e%aij7_RZxY+!L;XFn)-olX1d-9-uwU+^49Y~7g3Ca-Fh`;5!FeJFz<KnNWC
zebsE?`CA`Uu+ca2+NxkfKte50!a~$kp^y{X%6#|+OH`SyhOY}oyHQs=RV-?Bf94~_
zVnaQU7A(rfbUWhj3zTIW?*x}-vyL)X{G@^jn!vpX8MP^3Z1Ad=XEYKPS{2$(!k6mp
z%>*HhRwDh%d{nRWkEHr2AMb(J3&E93Ih63jlrm^-b<N8)h1|grS!-CdG)Exzk>K&_
zN!a%wKENE~drrSAH;Q)rD+Y;WM~zQL;^)->_TP<Sr6q6&9TQ;|%mmKWD%3NP41N=?
zi9^=m at JY?!4x$qO#Lc=&j^D0`rCP5VxtvJ-ZHy4H83k*m?H$J12b*^0iKY_iJVopE
zPBs=MQN!(GZQ>Ome-L|%VUm at XJ%y$s^T%G!g$$*qsX1l|zmP&4=|d^kV=d6*p`I*C
zL=PvP4&j-Pq2%OO%HL2yn6)XxuxiSBPC+3M(9Onn5k;BYp_4=7%q<3j6B^sI#@dku
zwaZ^LH*Qa&824Fz7 at kQ_j1omk=9GAqQ2OIwHQy79Ggh(SEm+c0AX&a=(2;ZG$Z1jK
zwGMXA6|F%KXB)}4diqCaWIFw&GjixX7q6Dvx0V~OmK(h2T48ZvmR&}C;|Ccg0<3nT
z!Ew)XmksoH<?;^^AvzJre at 4<6=$aKXy_UO~abMtt{WlbaWq63&uv%%7AqGy+LQ$9Y
zq2_mL<iEV*>o90dc`U&z<7Pt=R*#{^{gGu%GRegi2{j;Q6gMU@?q;Rtry02$)*M<?
z7Po&@0g at VFA9pIqh3PH-0lz|;?^r=9q9VyZmg0n~#f`}zEj3vq?$KmIuJrzgBnEh}
zk0PqV^vBRUE<-gsk42l at Co5IkR1}93_bD9`*DCXU;5#H514nQA at ZH)qllrhaAIqw0
zh!}TLGF!|TUV!tTb2Dn#Hx$jd<SJrVtg^g>EJmZfIj-LmxBo$ZXkl<>c<w^qn;-Lp
zv}V0iG{YGr?xNw%W{xWkbaJv#0+2%5OiORXdo(tmBAyHmlf=4GEv?+kq~&mx{AYIc
zV~eQx-P1QWTPH8j&#ktT(F6;=cpabhyK>2LV$VDiAi39-Ur6&wp7dy%Tc4q}mFcSU
zfb`Ui=9Q)^fQM=%&VJk?p{7XiWw^`0Hq^DSYqJjpd*&7%Xjppt`BDK+J(hrnJ|}dR
zP8!+p39%--Nnw#YYRTTzse2hU=;KuX68pyIXSdMs{ogf!ElA4JEGMcN+CLXkJeDaD
z(g#&3R+j-=V)d&24|{RdrN+oaS8!D{(PuR=DLpC-aJ9zQ&;-xx-JGan=t#0Jr{-gB
z7SP|B89;%Sv4dm59_u;GS#0X>q`Fha1abDT8UU~#VOLQitwx}TM7fjaNv$1<YFV2D
zCvJaT!9#-$>r?}$xtf)~v(513mfG>pZ22&>I1Xo3<d- at 0ifKWd%D9?pS~-L<CjvaE
z5Xla3TyVZ+U$2bx9sf~+8M+zA;cLK($$a{W*_uTmX^?8u+i+I6z~V<Q&X`KxPq+Ou
z8VqBth~c0PE1ar+k at Rz@4?68L*H-`OdrsB#Cw&xCvnrM3l6?Jdpu(*k{U?)$G3uNv
z+2Ea98)NS#j>nh;K6a5(7i9yIAh3WucL?gSCS7hueEPt&MiU?52Ov4+p>NmjZl!Ga
z{Pwa}fO at TR1GR#Gt{Rb^c$3%V7iZliZ(Xj=R%S++eWmk<>UqU%c_63Y7bOr91}wWJ
z5;|8Xw5zq<&GZqL951%3T<82z_pD0ylmWFfR$UAl=l=qwE5GPyOPJr0t8DJ#*6)bA
z^**iCL+j#H8x2~uE!V8)SQykRqtoS>zOsB9=Akh~IT~aPe7$l^vb#eUK^Ib?pKXA{
zL(Og(OHMsBD0hN)*}8tOmoLuQ*y>z0&@fb6VUXgy-wTXQWPT6?SswCXUpiLNZHLWL
z%g-{x$M#dG;qRUjEMIEFn2o?=A#e(iPp61okh_t;7hgLa>9{p at 5qET{S1V;op7tIS
zJmXQ at Ut{=~q{j7jDo%(0iH4OxY05%_PZn4F?o9*>EiwWNnfBHloyFdL&l@#PXX_I0
z66G%ivn{mc=JV=Lr$aw7b{r32bIT0jV-K^hYQJp^cm7!P4^H#nTl62bM`(Mq5n1;N
z2;N&F{7ud1DHDNo9cBOxY~hl86SU3eN**-!s-i_KR)#%$ojbsG_|9p%NrwU?T92nr
z18R1SDR;BGXS5wHPrh+;kImNSK%T0~FF_`kAK0eA=gz_Eb$qBar1)wYE-)4JgR1`C
z?6OyN at U~oMio{Hzi3L(BR at W&AaVzr9n4T9$3=;ieGqX^9#0{c{mne4DcZ&UNyKUC>
zQ?hgZFFD<Bw?#7*y4C7<&|#kq7jBdQpj~DD4`_#TLj3%`nuhWQq!On?!3RP51-&=F
zy5KA8#hJq>WbOlF0&(i~h&_brLGAvG_0YjC^KQ0W`r+m6R)LJ7<7WE64O}BwX0FkE
z{_(=?p`@{J^SI#>s%=`lS077yBo_R0fNhoIkNa_%z3qZ~*`XTUtz$7Lm4-bRh{Hxl
z{EZ3D;0c*0%@=q;-)U)O=XJy4_?+e23_$C~x2R5{3zP;L_iD9V#%Vr?UG38fGvE2p
z@%0yewh_mY;s_uY|3pL5qVHMS;LtuTDmgw%S8c{sCB*XQfz_(u$z_;)Em@?&Nk!HA
zh^!yMjc&VGAb;SVC38fbm{s{;Zo{Be8x&;bR*`MMk&pUbvR9&18sZh{q}qTJ$}7?_
zS|f44dBROctv4Y55){BPy^|g71Lel#whYx8EZoFtW1QtH#cG>T=OHj?W6-f)NflxE
z6b|58 at F`~+U~)8kE4_+e at cyPd$fM=qRf#oiO$AMl{!r?8-+h8>HnmYT>4EZ&Efb1I
z#SBZU@=rQQgmRwpq3ZrLm#I7 at e&$3aYVJIG_#9#ul~jlR!}~G!tAxN#;$2>sI?lSs
z=Q*tc*Tz!qQleSdAO!L320v$=0GTBIzu2szSrI!&;rt_2;dHPG*o!cIVy-{fI5Fbg
z!dYbQWy<f)8AivKCK84Ffvg#%4GLxLX>nQ;B2b#fZg%iZyOUia_c{U2-#V2BMi=P%
z0AuG6QoJ8u>AXs3S-I_k%&5O-XL28-K~r!H>K`;uSQSK72yAaUvZm_eu6M at AS*`0%
zdtL)r)g&hcU6nW*nsH+zg|vv^&JmI^4Ch+}il(!VS8E1wGoQ$~Wkko#ApB;dfTbYm
z&N1dXx+>t}4k33XR})tv3;i!}Z;Z0m;8eufS`tw()BO&Pai2}t6PqKeOdB-Bi`j<&
zL?`dtM!P+>J4j&h9LB2GSjr6?a9}3)FIQyqXts8Ex+(Fv+~T}GF(U2tw7OU$HAap8
z3Z!F;98Ckkx|UQ_AN at W=TWj-wGbG!c7LpqWu5v56=A~=p7oQBD)63YoIFO}c!;PtG
z7_{8&^#HyD&uDM^;BKqcN{{K&&HaI?>#nD7ljJ!=#S-$bK at f>)+cR#|k*G&It&D0N
zQ at 6MX*fu7am4M|BW!=Hy_o$2@#i$e1U$=;RP4wqTjf~GjiFav%tyqVqRA-(0W>!s}
zIR7hr)cLIx2<Hiz6y<Y$bV+%hpn}AzeG4T3$Ya=_0l8&RS%LIUuQR13g8q59L-~Wb
z$OhSf#51P8 at X!j^F~bbF9o68yq|ng9=Y{#k*7lQgETobJvM^-5P{7iUY-gtAmmU5J
z<?DPjq0z$z#Um-pK#I4x1 at e^2LexfD+{$VEDgx&z8;?r5#@sg&bn_%LtQFa}QbKVi
z at 2qr2<0m$PLzv3WC6)@L^His7xPCkLTh*^5yQ;sL`<|ng#82I@=wQ}LM%+0Wx3N*`
zUJ}bhTdl}n3_lPZ_6R3xT9C8%=CyKb;t@^nLG-W#{y{_2!|QrOq9S$Vv$CW1&fo19
zN9_|2>Yi6Hk=huIVMhc?8<YUkSwZzTPbEbRg972B&`B&2ROE`69U(<1idXCTJy+bx
zy`$_Zo*mXiHVH%F#{koro8i%1Y;0~#HSzFwp{La=%zo)D@~azD#GTV7qgKstcG^W{
z{oYCRZv7mVU4_$A4R^1hUyv)W at nC9!CCZ9BQ)H~b77LB2+kAvAv<WeqP`lFXmJ6{J
zZtWc{I0dFEFh<UkHx5t(-f717Jn9oV4VAc|mK;rOOoXUJzI~pan17*N^pqc3d}dpI
z1T~knK1VXN_z{srSF}!4jFPr@?C-BqTB_0%T7Xbe<~I<``c;VVFYC#bNf0&2{JZfH
z{AWQpH)+#BFDo}j2>n(>wb<{I*1w;#xSDSNcFNxb7qnCSXEylNv2Jg7UdCeEq4prZ
z+0nu3c$D?><6<aeEUYbmv+rG{K_U5n!Ez)#P)9Z&-Xk9Th*v|Jb&ba<&W|j>IsH*l
znY%l?ZNaFI>smY0Wb8APetAwW1W-YOcF!iy0^c5jtxrlW{B1lFAJ!tyRP!&5>1EjQ
zIkui1j(?Yz;sdk863#4piOR#aRSZhTsWfxcba`-q8)RH(w_=sb=ZFv?0u`ZPv%G&J
z%LL_<6vqA;f}<1GCZlIYGRL%IMyttj7g at 7`<}~E$aP at xXy%}eOg3EYQgF54XAF at 6T
zIF^PVe;MhB&%5FdeIIp!%HRVzF=Pm5jkfJnZrR=d!YNNmY~QW<W=@E@;Ilk at 4#y!n
zgwp$#u-d?D_q%(TRCgL_CccYH(dAsXfBh-=s}%LQt(~YGS0bDXD%nrz^#QK~ka#>H
zZX|r%GgcKTFE(M836Pu0g+Pbeyfl+ov<^!Ph&GwP^A8ImL;&&u?<LWI<Cy;gcm>Zt
z9cr#ZSB=f>BgqN+#GCYRMh8^wge(eyW#ko at 6$lyR735&J4x?%wA+=yK_!VScDV;id
z?Iy3_wD&JnDt)#zmT1ll%}KcsPoQNleDv!{(W|p1?`b=`n-0!Y&$BAACEg~GLw7ED
zo=ir2(s-WT?eEu3a`a(n6+eV*kzhooo|KMu)tJHgf&SayZT|o{f2+}9Ps(&s-Wv^s
zbY$wW(0zm@{H!mj28R{uB4uEB`2nrdJ9~_0CSfq=iq}?vL9;c1UFPp-fCYLer3;m0
zMKQ~_QpLH<{ssv at V%$|R-CetA#(5WMk<S at Ir8J#80CavTEjU*FYN>6ecByA>MlZdS
zbG%EG8wmnzX#ZtY4*Y9!Tcx?srZC!&V0899#dIjNINP#JMPe&nx&e>|u`P4l;rRMF
zw}7uAq at xqy8DPUg!+77tLc3QL#hdX{#XDzT0DC<yV8;Z*ZglTCA9H?u9)qX5&$*By
z<-v$~1g1 at PuS{fEM>yP-vN>|(OHVFEyYo at y)m(-O)u4_eUdg1<@ReN7pViaOqss-6
z#Q8rQdI!`FrT5aG<pa8&E?YpdQW0YN6&vpojmgJwEI5~K<@O_s5`3&Vg<!Z|9=xzj
z)(TcJymJK)@1MPz at 1gca!hsW4zAn%TN~B?TRH43d&>*=SOSNa*EUbp!&=6Fzl{Ga+
zDvsX-m*|G#0K}zUxqrg3Cv%IBSrm=^&dR-=$PC^9F~5b^l>p#olH>znR!+X at MK4JI
zJjI+fl<88hAECj^E%+rj!4>O=@iZF0o*~eQm<uxROS8<KK24>q2_RPJx6vr^oHl+k
z#BL^iMNU%lV`Br at 5u+rbhl)NjE3h#4)p*}-vj+<4<#!1TtSoq~xU&lG9J?f3%Yk0Q
zKH!^wm!pb~=e<n&OTGn(cu4Ler<bp{VTDbk=B>SCpE(1e2bv2Fer?#K_XBh6!o8n<
z;G-CkJzESJp65Y}*Ql~YJ?3s>7%v0YreJasQ|sTzUa}g_v9<pOw=WgcWZM8J*I4M6
z>cSe?=~o;$yPc0jZnqR{R-vxwo#s((F9CUAkH)lT67t&s5U3|ICiHEm-}qi;evW?U
zDY;O(mbmYPhUa{lB3S{g!@iW}&ank#7p1>3H9Rt6<hXB1wvl7&J&onK4>>@yVH+2Q
zi9;f3NKo6dV5XI%4G<3?$B3?rC%IUz3@`|Xmgu(~PBV5L#p6PXjj(Stl|&kR{91{%
z=r3gd#`auFD0%xb7>;tB^EF<3{F`4J+sx=pCaz?F+at8ZY6Tl<6?&UX)dc|myP65d
z5wl$HNv<$?+RO2pWPkBT=jRYDGm{9CsN?`sF at 0(Yj8ZJA_$xnX*0t-W6+ihu?h}L`
z_BYm|BeRgT&J9ek^t3_77exeLbIyKPpN4o at x{_te$$1yg_>NoU*o%tQ-#e=Tc at 4U+
zcX-Ac9yK2(!>1rNe-~UD?Tp1*GHE3~8}7Hy$y;m at QX{NGnN_l|hu&_)c>%vHSnxT{
zCN)- at 6t2(t=XttuL6?WxLsJ*ezuR9*v*07AUX5Wb!7grSBCs*P{skx*WuUVnUx^=J
znf)9^t3boAR~_ZrNp>d3m#UV8G at ADZi!<J?1y=BqAs)nxSbd4gjTdo*fCunqHx5;s
zoO%rqDsJfVq8|B!qA#@lGoO)A3WM~k_GipMjFb*}u$Vcn-Fogu(nF?TOtc#87Z9|M
zOSrWHP2YQXAQrxl6tJ8x&OisBV>kQ`{&!I$l2|MP12wcRS(`buQoa?P8o(W9diOAb
z?T%cawPJNSy78d at M$yYSBJD4<Sz#-fGLA%*`gi3c$~0Ih=V-P%J(h4E5+`(M1{=Sp
zi1<dXN_p+RtN7NfIoc2cSoYA9j#<u1;~_Eujx=5Tmhf!r=T$Ab^En~&f7d3mYkWRM
zaz`cBwW;C3wzaWAb$7?|4oGFm^@YtdX#b_4RJhuW;hHy-fvx19Tkr{pX^SB$nX{>d
zK;@yCJcHwIQ~6k}H?P0O at wU!%{ZbYNYq+({JA~~`uxKfbEB-7%kjAW#vDQ-&YF4w~
zsHeL*-m8Cu-qRASJw;94 at tZG}Rj{vef`#jIp9PbZ29TluYxiRJz9hcC6Hn|O1rRm9
zmpQfYtVL}!+BAs$(sN^1Bt56a49g5*>N-J8P-BR`!}fMsIlQkH=o3O#NJiXX&}s}F
zbY3E^B>N3V9VmQqC~4w=J2XP?Wm)&4dtuz8kvj&)J{ciP7y4 at tCu8~`Fq6dQ#rAWl
z4^k#S|G}Xx3>?yBf at Ey|-%u?jD5aAVVp>i(d#b4kompf;n0GA8NX at jGtFF=t7o$)!
zecHtUNam#ch*uC_QmSHw*3eLuEd$gD&G-kJ$A&2rNDQqPeKos;-h!<t5hVbe)=?Wb
zHdKXKB}842nNr5Zd(PF93Zm_?d*mzJ{6POpWP+GxR~v}Gg^QyZbbBObiGbpJnJvEJ
z8eL_~Nl^k27=9A5O~2_gM4iJB;djr!t1TR0xB!o=hjenn0wuH+0oLqx>m9Xt{JsNj
zD7bw)E>1b5#H`~rU5OjcOYpXWf&|EZDxbe!bVWF3X|~}U#Dp6^moU<1$#EPW;~9W(
zdcn5B7$`r)F#d!}rF?g7!&){R(-7kx6q};{vw{ery4Y7o8&iR$^Y)!N2ln3b#oN9W
z7~Mr<%!brrJC*rLrPw?HDs@{uLW}I_3eHa{muVMS4evlI5q(4bH;lbxFuJUevPDbp
zG^(lE26_-Jwtgpbs_>h>wC63xU$|)SYyFFF`#YZ_oW>%2Ez}i1j?mGGu_cYjuoIVn
zlBC>lCv&#XVie0 at JSP$_w6+7a=p4?IY&_dr`do3j8oetf{Q9yBmN+G6NUYP`==Wa*
z8uEkmofr`y>zb7t%tQx@|5VQqk;92>hYXT|CqzOlk@>K-i;=@eMk~@>t&l|dJeEGz
zzRBDOCypI!2zUXW`e(>w-va*7-m2Wwvwh)c0zp%HzF+!nKpL(>JLaoY877COJ8iYO
zhs~9BtP5$|M<^zd;=__g<~No|(A+IHq-0Rx#`jw;Az1 at h|KZ>WwdN}ky$N+knBuJ=
zD?T@&Fq$Y2)q{PgNF2Vtewo4vh%a7tg at 9C0&2*p2eua6mVCb*wu4-HuHNv*Bu=7Dh
zB-e{k**<WB at XcX!1B}i$+;ffkpPwl}CwP~dGa at GM*z&}LWpFMitwAck(wjW8{5 at p9
zaQNi(bstqANQ<*$e<_mz<zDRkp5R~jGTE-k!f{Geo>G22I6|{GA-y28;VjO?gtfOA
zVd+SZZ`Ta^&7L#Tkh2G@>Kks<jDwbEu{eiOo4rifdi7NrOt3-xxmOAf&7UK!ao6PO
zEjAL1l29jFu1^2VThjFbDQ{mQ`1O%!o8?QAqvWc+_IfN9Qq^W!EbYJDYrZu2>%Rt@
zf#Fv<G~OeBz#t1(W-yKKLhoP{@`!Hg1&d$_3*T7C@(aym-g88v3t!-Z?ZP=i)A at zp
zM>3|#Fs9KLDue?;O1fg(=UAmkZ(-n=7tL(aw_b;XZrDU9@!28&$eS at H&UFtC#>{zO
z0V}tD?)k~zoPTTZUpdF$*~RoSyZ)hsfTo`RJ17I>4*|I?Kq3*KT<P|QjiTTJ&R6dE
zj4Njbyng?S`58hyFK+)I#5dW{|B(W`=;hHomU>-yda^{L%352az~X>r$4;mhkl_&X
zx&@rLAT3?#T&~IdtKdJe3{Vq5YV%e$y=lJy?Nt4Ay$^H$;6Tsa{mw`w at E=5?23k@<
zW@%-m=k5Juq~aevmHhDF3H-Zx-~8VtVlXdNE-t16ivubifnOHVvEcvoM>OWMPfY*`
z9D1Me$4htplfXQ?vM0~d_?KV*=>dS}eZK#1_x)3^0HqP~|F_7maL+|{0D1aIZ4B<M
z%PXD1ti2RG;@X30{@ycp8y~iKWzxyhdAUBQ4M%=ghTSrn|Juaye{=f)tw7^~wq2FB
zpp{N|9%%M}jhO%5^`PFn{_dimjX1X`YZbWlKjA}QvHbUB0ePPcNSE4$o`t!?QiXhj
z_3!8oI*0qKW8KaPkB>-Z8Q{w1tipMG?H=B~(Z5VJ&{zK&NGJp{UNze~)B%C6@=%W#
z<Ge-GvJc)4>*_RxnDp`S&3!)UE>5{VuN)Sx`VRAScp#B9YDwbVbV>}=k6!Ek?f%2P
z!9g>u27Qx8XaCZ|%*`wB$7?Ro@~D>|@Og8pD5?APHB<;52$1H}H6~9wZ%6SQMb+F9
z2=uryd)M~07bIVP(`WJ&uXDE;H{ik(1~P;^MxCCynbVw+J>x5vV76{4;;yxssM&(|
z0g~xM9)c$n*S+gEbx#kLKp^f$13)tr+EO2)yJdaA8(iCTpS*vC_$(vBASsafzv`w?
zC_t?^khZefu>ADmMJz^aah572oPyd95KFR@*Oh3#YS1gRu9N{9u#Jt4+i>WrxHC1L
zcl1E6e9RYi&~@`W8UgCA#l}-n5B{X(usP=u`iZm5ceM-FS<VY;Xr at OxPiO~D1Ud`N
z{x+=-C`UDOrnTOvpzF_D&jOZ%>tlQLYgE^aZv$Kz8IAq~8bHBp)=Ld?a~V$~)@z-6
zM_b-rbx+Vh5we#gt0{e0z*&a(rHNFY!hI`%FV6=V5P`&WK!Q`up#JuA)BhZr!xSK2
zMS5iZyPv09QuJCan{cmHh2Spv2{!$XANELqF at YH8uGw%(oND2%S$FmL)nTD=dyC3P
zkeGZ1cXeOO5ZxQ38<(y6Uja_^|1SZ~R*W;~c;c|uRqf29zEUG5Ie(o86?E);)LHMu
z$<MBF#ZYLkcC6KOx+o9fGR+mU7Wkk1fqz;zK*(}Eap*}_p1z{zr`ZpYpV;6IsJ}$6
zkIT{I at 9I7ewgVy}yN6px%|<8WsZt$WbpM0dJ3u0`G9JYb`V?oRw&0a0!!&>EtV+IW
zm4^l4ayPjZXFmXm49X0C?_qZ*sfjHYmXs*@X5k3;c7<pZb)({Ne;?2e0X4){5q7U=
z_#@0pDf>SEh6FSg(zcMseRCA`HSgN^iujhqJ64p8SQ$iIBeU-E1H{AS1y6B(b%}P5
zXK-owa05#=;|~3_I1K0I;lTn!Of!6ZaOHk{bhI*e%%t4f+(&6wH7w#sa(JX~VuFi$
ziNZ8sj9OM{kIUT{+;j-z!pIJ6RQPva05RhE-l2uY>1J={$66paM_cge*}Cn$Ffo6%
zJ~5XsS|6j{c~>SFtVV>lmBB#o_}U+M&Nn#H at E<NVht1Wtepq-#)cBR;Y`a~#G2+O{
z6C}KA*|^ZtYO~Phz*YRmK8_U1#~X*L!~3x=%DoZ7Z^32 at dfD~2!duX|J>7lIpL7O5
z>T at txdm<$^>PoNeirP8MCqzz8cmn1<iVWdtayZF2o>)N79nS!Q9!s9Sz#Cmt!t!Z_
z_U^RtYK$X!+Hv;oZVeuue5{Fm$T-%Kn0nYeYHj0R^aOi(gfBe|7faN)-W=dOmZTJ;
zHbh;~FBLp`aXuUjz13M}_kLnG48yp0U at u-ex(~j7xS_k>yk~z`+HjMA+S+F0bqDiU
zfqHLSI~)IW+8*Vq^>k)ad#uAx<+Skl<{H2C=B`vutKB|^J7d12W at VxDB;hv<&n>+7
z)m*pJW5y$&@l{LG-JR8al&n|(8y$?tkf+P5iM_?kj4fBM at TI2`^&#(rMNyoi`=+%N
z?b-<bhs3lyyr=6%y8DF;FUZS}_a>u5tM^s>M`3$zdUDFA4-ZW`$`d9|Pm6*&kDK1P
z_Ig_0^lL-GI<)ag7gr0O_Zzb8Cm9XG4lZmek0*<m_Zyva_Kx)t{0jqJr~0i=o3-pG
zHc|b~04wt3h1kmJUCJ`NSvuD<gWAgQ&~iWHLL7US0c<Vv3O{0>Bapz|y$-<j!2eP|
zTrCHE0RaB|>#{pvwT4_ at k<KoEsCk=VZk^`CKW3WO4!EFYEtksMIRcwi|HeSoyA_d(
z+4o!HQUP})O at Sg=zKH1@?Db)l5w8|GoS`ZkaYsy9biHmr$_?dh0jIXE&NUS!i}mcb
z{j^pgZ1#2yqis2jm2npk at mIqOh$fqlEgZiIV0Q$7A-dlEpD_xTo!>N6eRTq;_l_h}
z<TP70X|t~v(FLjR9y<3_Xj+#t_}W~Y^DZA{qa`XBtQRDVlEikT->9%oOgFf|H*)Jh
zs?veHlX$hoP9AROj?RAe(8A#5V9lxuaV;)A6v!*PX%TEFu0Q0pEmz8#&wZ_77ixT<
zf0m4DHkbkmvy*=J>xwEFoyp6*JJbZYHhqJrBI#j`x1T+l8X#>6juxU$#;^ES4wiD{
z^=me3<My8dTJH|n9v%35Wc30TVe at HkM9IXApZMLc#>YkCOHt=b-=(<0#56 at URbiDz
zCnJZ6=o=&<lOg*1ts|*?h&nb*9=RDkXOs#W_)r^+B2F*f!+|F at x~!Rk2W4%$>ix}t
zAarin#;%}$<0&Yb5_wp(;*a!<Ql1P^*5=L;=UeaaZ<*h1NPP&#Va3*?V*10FG^er2
zM*M$X%M|qXP7j9+7vCvMwrie(*ykbUPjf)2x`yCS=n@;YCZwP+cjQtO6uVBMHWl at E
zRi%Nxo<9r}RO^kQSwu&zRObhw+8megX`%E2;tckC73z+V+g4G?JP<&6Vn&fMTs&RU
z&LC&y3Nb2S!nECo2J`db$}Jn==-1d+H<oU~sq9Y#K1;UQo`?HF({2X0X!-X{9Y3_@
z83Vs;dA5jrGHFuL6ovL7zb--mEx3VHiECPtH45QC1QEi`!=Yk^p<<?MnQGpX3cuFT
zBDc!C6Wh~#LDo_|=+c{Lku+k2PeD_TkZpG>YZWFL9KV;_v#?d?Q$mt&JDI6^YE1X+
z)LIKpcq#BajMp`9&$vEN>vS2L;<7J5%%@_K>0}-CBw-s?Nn&IV*>z!I`-BRC{Q?jI
zDCd9=a79PFDok{gh at Q=p`$Vz*4O|rk+x_qpCL41no?1~DWE#j2`+<wtcX%%#JJ7sh
z3ZidU0GuX5PH8Z276|4<hw|wnFNzHq5-+E;)kItpGL3I5llB8&kU{9?51X62Lwrrc
z0Ow<pVf)|<=7HO1YgJogl6BKSwj7Dp^Xac16vRR#23({>GL-zPO>oLxkYdE3zd#m3
ze+k(>GXRM>NP9?t5+7VF_fIWQl5?wfsvZ-DPrM64J5kMeJg!IJ9{3FTR{?Jl?$x8e
z!uUzQS*LO3Y!K1r#mVGHbl?iK9n|1Y6HlFI30?=hQ4lOBpo?l~e_s_2C8e%Q)NpsX
zsIy$@509a1g2Xo+OvIl2X7hzNnooHb!|PX3)Qfis4OjLBo}0iEu5HoYdp$nz6C0e~
ziE?n#lV6qlw3;7rPDd%j_}t<L2S#zO^Wj9CrPWHG-`v|lwXqgixDHnCfM}O`ez0*)
zj at TivFBG~M8GdM8IjMzEr9_psVGb18ybP!n{w0^SYPC>{FtCh*kcZIX1gq;>Wdi-l
zZR5|u+t=fsFuHcF?SEu#fWNw1>~fcmfn6HnW3;fOCPLZsP^GO*-+(mf3dMvTJ=NNB
zuL9vBBm^ReRhuW5oXk-My*lS9(81PTpV3Pfd)@l9aB2%6+ba2W>~qrVN-JS};(Zx~
zq?J*0%(h;`XH+rbsFZ6{z*)^_6mxX@;~Sh@%u`$cPU^>&eV+>|yPqKmT<lm~9O=+0
z=J$C0r}9w4zq=VSjN7O5f%715V(H7n1sd%kYZIUK{Q?J#T*Raq!i~hAYfIM+O at W|~
zu_J3?1Olpe$74x(IbooYpzn5rXoRuQvW&<x7XF48g2RH?-Xy?qL07V|AX&}93H>m}
z^aT>c%KR+gv%tl6@(jyy-qlMpm=5mN6BRB~)3Kd?wO3}ji!}pGrJB5)M=ITU%62xw
zqB|6F^2}jh2+~p3QS<+Ux3`X}s{O)67mc8lbeBpuNOwzjr*un7ZfR*yLJ&5gbhmU!
zNr}X!Q*x8ieHMP- at BYp?<K8>Q{o~v<)?nb4z1Q0BobNlI=b7`J3%GzqdG2^%Q;PCT
zZH_BDX!_qf&xW0E290*NTuRf|yO2L^UKEup+in*OK#CiR_!VRTMKmZpRl~fquKcpc
z at Bc@=^Zee&NavGn7A+<)=ulns#1b7 at r#6VPr}<V2bTeHRhvv;4I8qk=8{W}mF`ZaI
zWeMTijMiLF>Rqw2(l5ofQd1p7gteB!Mr-w3F-zn22yCj=$wA#-=dMksrva2f^8g2g
zDp#Pzmom7gHJEC(KslcG3mPP!F+SJAp6sh_o)-|QDN{0!xm at xMiC%?yv<ji%B`~;L
z&-ink2|$x^O#v!7zU78#Ia~ym(-v|!$YE}M=B9D0h=4TtjQ}_ at C*P1<%QKu?tf|jb
zN^Y*6 at UyNq%OU8^`!b-C%baePm-tj3F~T$L2&_K1Nq-=T at h5{=am3tex(kim`Nwz7
zRX%oJi}<9iH*fxB2*H3EAzKJ?fb}kz(DprW*cevT7>q{7SQ??}L!d}goK{c_I~diu
zE_%aKK3dkfy3pIzOG7w?U9}t(L1u-p%!dbH44gOaVJ)ZNUf2;pmfE`Ewx|`|3N4Gg
zqxY<<aSskfGNf!T;gRWuU+d?WEZ2R|tA8n?BVVtvtiy&7uO0jw|DIb_>Ap?^`gP}A
z at cV?e998fU;V+(8bbunE?jBzOtp|VMC?OXG(w!@|_R2Pup1*|_Qt}wBXOujlw7Yl0
zvR%$WbMrOWgv2r3cWx~@hu}{olEyU$VJcx&V`F5GK6|MFFkLD#d at c7b6@eNT*BB8M
zA`O#fMlciUo3$p~u&ad>T8tO0)aQrQb&q(|*JM>BpPM?8vHwb)<N9@*h}7{5{v>Ns
zAL*xmX-+zVnU$W-3s6%Y7Y<CD;gGDP%I%vKP;{u at p7ibghKjg#e6W%t1W7zan)j+$
z?HuG_+1JJenub^MibM>|PR(Aj7vs13O)mv_j{t|r*r-U2oR$WuWzK- at KI};gn;{hz
zzo0*MK^x_~Jn<&;RdE&JLPN7B3~)TXjN-lZa{W@~zGbAaBIE+ROh<vNIO(BEHLg8b
z-cTYJ6E^59`{XoVUV~~jT*Y4*OoqfPJ84#OJ5vg^M}@TU>dlul@>b`!>cnpU*r;N-
z@*Kq%PQJSB?Z9w;jO at BL_sbw?CnxQ$IRPzBaz&#<H;+QrGcQogvyIFquk0Aycl#9B
z$<Y^*1PGNUy_yn6F*68 at J>#xNIZ*T at mo9i(0xX8b9OCsH)XsED<6#0$MyhAC)C%2J
z at W(pgu2uS+nbT964!$mrMZo0Xij!TLq+1{w{Qzo2cTTHg!VrSlhcljiD$q949s<Mw
zp7GPoC%}?yeH}*o4&&FQKrww@<FqZo>ort}0pRwzJH$nXU?K2><&#NF0L}0*z#I0Z
zjU;@!-|}Gr?#D7Ii{xEw3oIhuY!buikmq5~KeLCA%XoX6xmBz-fBNB&stYW7fVpg6
z4BO5j*asIg5 at 9*OC%tEnR1*T%2H5DM_0miT?u~5fZGDVOk}`z(`&2sC13pJlt)?`e
z9Ds1ZH(M7%ne<+?oi~+>PmFWPrLz#254UnfgTu|~It(ITFe7&KS{`}Ew!m3#XB5S@
zNx|MXAw3kbS_6^WTZ@^+J5$x8>5;>7d{tQj5*9Dx$YdvNKVXP|_yJCm$zls`O-l>X
z!^%-KFyaar=Dkr-HftKqDGP$NENWl_WpOGeCr>P=s5pCT(dUIDzgqD>dj#@E+)9)P
zC+*27D+0*uY at n|XKS at z(ljir2h7~b7yy=MZwIaPXJEz!4;<U6)<d1>(<?oM?A?*@M
ztpPXj?Q8c+8LziYkaZ4M%+7-i<WKs}<-k~LCbK}G$!fYzM&%%n3A{2_#!~TKPq%%+
z3o|as4STb+mqq%{5aBChn}sDVF0dG%wQ4IB8e)2RthPoA+#J}DRW>e}ji+%HDUbQ%
zN7y5Kyug7U*l9*EBX%1wA$4?>r!^VYUxv0ZJJ*hoLJIV&uonAO7T`|y<H{K)T2Ch5
z{VLfeSTh30+$!S>xlN4cjq~MqwvGnoDdCv5d5D!6S=Cm(jwj>QcdqK_F1so8$q_EX
z!8!N(JIAk3K+6Tu0^{YdB`3jbImQ=w1%lr9TheB;XpF8Oykzfmxl1Y=rDiv136z#%
zYoe6AC6h|iVqw<@!N|gVB3d=(Mb6uwgUw5jOZrR?o_zJzQ9|GwM;btc)SB*2z&{g`
zh4<tO$?)bL3E*ZcjOZ5v!QEI at V-a{nnyDpBWTTXg+D?eM$mZjS9oBnAjd0T2ZXh8t
zk_`<>JlA1W6YNr??r_(LU<QcoZd6eP#S6^}`i?#CBmL!taL4ws#~SPwU{WPjVUnDz
zxREGtz3dT9p?c2!c9)s<ySy}Z70z%@wp0G$&H(C(GR_aA2H`7I8I%cl3p#M!^#V{y
zlqXb&6#4Gl`c-A at 4AEc!xdtdJw}%RzVOjOfl~!Mp0oNyl-slyp7$#-AwmB)3!kHFg
zpZf0h-=#f=k5VTN(Rmt(lyO(lFs*)O764xOY>0JOZy+-PycNrLk#92_YZ&&Jnk(?D
z+SsNlo42`jfvnq0o&BViOaDAAgu;lDMQ at 9;&b7}zD)FoG8KS!V_=!LAO7An`dkFlA
zewcBmclz>#oG$p!pwiS`*PI60lLC~wXpq&y`l1*R=YRZl$+EO>#+^mr6l>k1GBSXq
z>B<^v>Kw(H1q<0WcI at T$*`32TuP0>TyK??)EDi4cI+IX|HioRxkUScv=FVSFN2-&2
z9Nk8Z7j<#)UfPyWM?rE)ql5s$cj54nVh16+pQKKimp($zo1+yugT8Y^Um8Jt2v(rn
zryZj#`niUdMT!0GkCz;{x_2i)r5eUR=)@e5mzGWqc|awdK*HAXH60q{3f|lQoDfSj
zgX)#_kpZ^FP{o3<*7!(MZn`s4e4a0XTde2y{8!K8DQHWPpjRJzQn%-l!CR{=+WdHf
z79nEt(llQO(4&}|+pCPdM&?AFGDXWQhK=gZK~~Z{!kF94yU&>}!S8NRhc#a&cYrfh
zvRP|i^~3KQm8h(_w;ZPb33JwJgq+1*)9{+XZOuEIf#Xs{->8E&W5)J_frVma at nWdU
z+BKmAke)B^(9E^;E4W9?M=rFm*WoGrEh~R%Y3T&hnQZP08`5YC5pnf_=|Zt}B}(`T
z={epAaYp3C67m;8fF%Rbu`RWQkC2KY`;3 at q+^2i=rCJ*uFR<QP|E<3-YP4*1<oFBj
z&4W22NKJ#s?G3zDt5d?<?Ui=R4f$?$=hmlMOrXO8ag7*-isWz9!dY}%g1Id0v at wA>
z+~UO7gC=s9wFW)$UJ4*G0No at te6W0GpMb!#jq*{_q~&a)Zl{mm>1Z)h1ENI^sZ+9*
zG#*MnFQRw=hHKs#&khvte~KT>%*+h<BPL>!(q+u}7<&5p-*&BU*oyfiewwmsjqv7e
z#8(BSN%3b%?I6Ca)j56}x`vTE at L|IR74n06ocxS8qv=K=uscyhnx~xFUr)GiHVC>!
zyMKLxd>xTG5%?j!GsjTtOMPwLDbdDiI~mijBVyVr{$F8)(2oY<w3Kr6coOqkT!j@!
zy0_I9P4>oZ?zLLDu$Ue(D;q~;8V1B(Qg*rMPNRjhiESzn<qr0Ou9S`*(S30WGi7fk
zk=C89Xupec<@cW%rlx&3n81}|E1d!SD#pe=ot+2;h)<0<w6)z_T_KZ`+B&m%xZp8H
z6!GAf8VvY2SP at m#)xqM_9Ym)7#y=gbtWZ{5(^jY+{t7oB5e%_^e*=FQn}cy6^53JJ
z<6#K at J#>j5;>15kE_2KSeER1YBLHvrKX2K>06E@&-r^C)3DAS at 0GRN=0ZAnO6*YU+
zhhZm8OCxPzb2I-!zK<3?j8+~$Fm;gk^lM$j78kkI8}tLF$mh`vpLNKEMP>Q3WG*-&
zwC);S*?~7Z=GpgfrLA<$wO6hN&*YQts=Mx;AL%Fr_dz+ at pNbYB7r7GxILB|5po!E9
zlwUGTlsg-xn65vUErgg!hDQAHvAGm*$~+9i->X5nxN@}G`#crb6CeVXA+1%PneZZm
z(Uotv&jJc=`i{#EB)t_a?Uv8xlsQXj=-cVI&?vR@!^k;`YOBh1;X)_CXyGebO}ne^
zte9|l<@Cab0}s+u)~>Vc|0a at dZ>!1WNlK at 8Z+nCN@n!h-XN371FEY6A+#kky540a~
zhM<^%O$D=61sW*#s0~QaGvSMfjoVMwJoAOcefJ(XSd>kEn_-Z~V&LF1>V}u<4^iF7
zgU(f~j_uK8Q+EzXhI>&utNjEt?7~?aN_-%qvXU|;XVVzu0uUak%$$O2%e$UiRCsUE
zpDi-<j at 1QLzom`imz9q{&Zc9ug2<yo{-V*%aCDbAz5w=PlsA(nPFA;z0ER(_Vs<=`
zvBPIu(UuVC&b!YFEfu(9*$145=*3nRNdr<<IJoozS~Iv6_CE1YxqzlljeYQiF;AU@
zF*bz+!9H9~EzsbJ=y>*|-8zqw+zE at fTd@=*M=i+zBS)wMKpn(`Hg<y-LJQQKT_))K
ziVV9stc^b8KoCC at q}CUS{4y^8{dJ5`SpxkF3xIY!Gl8DjTFMT<AQa(~*AV)R2+(sl
zexOzekO%aBNs4^~sP`hIlBiEFq%niLL31ve9oH%&Lv$`^AAMQFy=YO9PYNAS%Q5%+
zzUjE?{+>AH`So{RE0k?eozQ#C`Ie9mygv_|BRx>8Ah%(s#qazcyN&eakBnoum)kf+
z$FKlv+F at Brn0T4Nd08hHj;x+QZ=i74^&-HskJD8ExJGGh5EpezfwpzEc^3Uq<NKIh
zkx0q__z`{R5o-^$D4*SZLx{P(!BX1$!`5*WP=r6f;btQq%4V7oEbM;$G=fCfrxr2V
z at 2UFujEpNo*H_6NUN{=$^!k|L3XAZZX=7F93zrQ2!)bu-!6G?cg9 at Reqm4{|wUc9`
z(!9jm@*^5rXpo>!5PYR$PBKmCq)fRSE(9 at b(>kutQa9H{j>gWF8OvI;+=XunY9A&G
zLFQC7a^qEdrqvPfxdcMj1a_&cK~)Vx_P`dwe`DbFwevPMXi9@?VZ__g>!q$$lb$tO
zl^YiKt4HTk7tLDzRCHe%w#aY}6dt5IsC~eKf6K!f!uNOCfa%$`P$W$hh1u4{)sgl6
z3REppEW-%}H3QL>3CS&+=ZNBSu0Jo{lafZz>sNh5eO>V+X%h3+C7@>sO<_k`dNNo_
zb=zG{hI*!fewCV+t4tfeUMh+Hgta%eK{j8;^<`UasAv)GwBv*UYd<FG?bBeXq~%BZ
zypF1qn-kQINuev*MY0;0S`q8qskfiB&~&chG<x$6J^?q32xdK-e-1$5P#h}I!Bspv
zw4!L`7ufAhm&*m;Ek00QSa{ddY7r{oEAEj;+h5{%ufD~~vj2p&136|{4Rc&^<yQe3
z1YTE6F-ijL5ZE<9Un{}DNfsCad)un)P}!(!ADUfK`FKCuwRqXV8%UA!lfCD0gp*K&
zHOK&Z at WoorH-7s8AqR7I3&n%J=lRUG=SQ<1+s8|WYX=&w=aF7~WPfK?{NI_yyK$~Z
zGo$z};}a<qtgbw?MaURslz5{=N)x;U$I;ZK2te;OEHfTQ6t8f+kyaYplOXp681gp=
zSO4M2Zx~s)(QMT?OmMp{MGP_oUoaPM;~f%fx=<XxgqE<BQ~S{<VD%gLCSpYuwXVVM
z!uQ6II=<Fo6h2ZCe5D;1E*YzKI8==ENCf|Fa(l;rgon*nF2yAFcG_Cp2MEAQazkY!
z(gjUm7QJ-yOU={et`iJ!YMc%4k<ZBR*Rt;Gb2bDS#^n9>oA*L<9rU0)b;SmqnsAlT
ze;sQXp6q|gJ4ykRFL%mfz*q21!Zae84AvJ5v;eHAok3(s*Z=`5U<Bf3+I{dUv(V1@
z*FXxcJ9-o9U<c}Fa2AHl$wGOZ;QE<NvIHBt?r8E_!aKUYU)TE$TU4e<(N3>g?pl+V
z`igPG17}-#@7Q?l9cqqbrKL}vnLUIn4<|eLkwC8lDnuNSvIKeH8#;9;2s_4!nEmAX
zH^Y<-yUX3 at m;T_J6)l8pZ at Zn?!V$38-`k7K%$c;YnQYcx<e83jbA8=0+OY4ME-gH%
zIc3o?{)Ur|zxVkuuhUmI6sIR0ZAW%K*Wa%~rzoi=p6?YI2&wHzPsXf`;sfbYiP4xq
z&#aGCvOg#Z|M0xN;#1ll`eZx)zSaEZ at C};EUdwsx at q4vDXM^Mr7H3fQv6onEs;~(7
z=5qd{iw-xgRSKbFzF}jhQ}qdeRQb4cxwj*#esS at I3IZj1_Go*A;XWWch3z`m8imH*
z-Fr+RVGUruU1q>%!z>vJaCN_`Jgv{_v!fIn+JY~atwz{h1~`|ua8K=B?<iESo=fkE
zx_G#(pQ|$i!lVCpqZg~K@~uozbRR-5uyXviHmaV~MdNAO{?lad^^EX|+zvQShMk9C
z<`!9&G>1-8)2^p@(tk<nw4QWq2cyE4J`dEiRMYm at 9w8ePmKi-VVzh1^1;#Np_$JtR
zdgK<k5ZByAqO+&h%2fbHF)u2oZJyp6&F}_&!RQ!gafYQK&KDxOim?QzRhVXZN7d*c
zysQkbpmbUtnP)ShN(m-E<zVZ|RKp5u3BC?N&}*Uf!PS)Oj$|U?yq#<g(ZD8%^_<t}
zd*O5YJJwFQRTYYO)1=e;Ak5r}19W4;lwugfZ~|Fx?-(^j$1hdyPlq1iHM`AoXxl~Y
z^i#C_D&`m-%`rC=lc4$Z9fo8P^~ZPpn`-oh#2m{Pb}g3XQG<ZRt;OQ~Jf?>s3{XTd
z%lqqoR{ywPED4$ZcL&&hQPs8vfuUckq6DDE;h1c8dXZsN<%?1IiBdkQRp`4l#mF`~
z1o1fq9(_T@$;Jt7X+BfSawSsI#QOw1qU7l0<k(I0d8Ps&LuIN`#L5BK>HLjSTaZpE
z|1qDeEnPpXhe8q`d^#7QSI<Z>ox0|;NjKS21md!G)aCi#QEB#m<ueJBnvh{WW^WT-
z<=DwNQy>AuDHX-cUL#Z?8QNNtC0BOmIKghsiUJv{(V78u!oU-JIWpSs*FT^Uq%fq8
zTyzoUgLOj at WY*JnqMjE*PBycn1mJUfYk#yJcsZz^w~DEKd;Ypit?a0ETT~U$yKer{
zUNGew7TZe(LWtDhzw2Ecp+r2rMD>5^+ggRA6KN%=d^n`v8Ah6q5lKtp4(QSHfDHqr
z;;xDd_R_ZzvLnB14GF$-I0NyV#cit at qPT&fZpBkv0&&Suml04*rf&VsXxOe+d)b1J
zU4NtyCcDRpD8A?Zs7yp;gK>h07yvu*Sa4@`S}x_IN7WumXgv=*w0{{rY>NsXd(8J?
zSc+lI-3_He$IEq)0%G-A4zo?A3OZyNbPj+?8U9-m`lPpCl$rrDgaJ2<h7zw?k-65%
z@?N3dTQKW$r9>9`8Y`BGQzQXbE at +%-YwA#OjCpX;VyVBN)^2c71pmhsceH2O=-D9O
zeBlE0YSw)zjH|cmbfKk?c#^OC;%eP5)VpTAk97VX{Jg9G at _8nw`)rm8B*@|5a50XS
za1BWMUu8r*#F}Th5qgmuYCp5?OJ0zDjpdGW*V9v=NhESO+)noQ=1bQCo|7$Ql#h`@
zY}y-om%eIo#Y=M`6&Py8 at 7w&D);%$Xz~f(nWP}~%0r%%RsKl~&+VNKC+OT4_d~fn6
z(A29lh77~!XFjh*mO${ZX&43*m`!u|weUF>78wAKk1mS27h`PO$zK0LZLIg+SHAS}
zI at pTWcTB`C6&IhTtdE-lit!@IOUI_NWAp}#S#$qW3t%uA+~O5#pRap5r->dbl|-KJ
zd5 at 7cg($gZWZ>5VZNzlFO!q5kJQlVKb)w~AtjNWi)GdhIw~m1f-eB0MluYq7pKeif
z`SvHNlEA-xGPUq^D9hAZN{@r~Fa{n at Jpu@-n2)@zGNNq*ju_a2n<S3edKGY`MQ1DY
zI|)u*?8kLf4?7GG7D-PF-bR>=JD3 at UO8VmLum$N<{OM5ViiYuKbzkk{hNCj)8<WBG
zyLVT^(YYK>25%4DJgFEI=wbqv3d?M2?|v&!e%rsOV-jS&;Gt^1wC%%hi`vu?u<jZq
zTQamVoiIYG>}{PqfD2EAFMZvqV;vrCyYms^mx~7(Spel<E`|<?@(>P}XNmL3=@F!^
zgGdX<$<qh>6uqwWrNh2mFKnM$*8j4``Q3t3GkNt=+hxie<CqDCb3-wE++0K=Z)a|r
zd3vyQTsSK(85H|DVCT$A{kU&hY>0+ at lt#PmY>5$XK)A~d<@(d{E^2^Vxuoe+T-;2e
z|2ML?MJga5&<WB`FE1~gSlP>_ at 34^(EbwrB^CpFY=3o9e68FG9-QK(j&dj7Br=+CK
zR5?CHX~DwAuBxf&#`%{riZX*>5%wMYu<myDLr)){$PlD`yniVq6x1ej9l*ko&0pPY
zZT9Wp_1OG;aQ^bnzqE5JJyJF=mD1x#`<ftDmi>SGKQrKBz3o5bc5L(e184sK_}Z`3
zWrhz at KDrV-`qC at 4r<TZHum~LYndHf#M<IQE=zTTlR2vCD?$7jRK{O#Pjm!biH}Mez
zf#29sAs*l2j(mJUQ7!u<U4>7;D>$)J{BkrF#$>YIQ-FCSqBjq&8v<+g8LEpDmqq}X
zyvAQ`p6o+iS}9x+`Mmt at B@pdhup0nZU3`F+r%D(v9gGeFFZBGqzT9j+ at J8QasAXO*
zD_Po{$XK~+)VFQz at gstpYzpSxeJvvw6z{BpY<p--c_?#SM518dxWfe0J4+4}z0GJe
zecOGBU+&*BT$SH&BRTj~(qv6;9RIm)yWHcOBG{w9JU)N%Fv`YQf2~u13h~R~Z3(<Z
zy&lk6gi2owlXhJXxKp+_!U8XznA}&7-?R<{w7k7-Qphk}Q}%%(P#ZIb8RH^~L=qwZ
zJ4c*n+%J^lza|NUV!KDmt~G9BbzE|V-FB0A9SLL1elxwUJ^b11a8sHv06L}lJx7QT
z62g313|%_tq`C?GcgmPwbvTLGX_Fag6TwqJ!tw<%2`<f?kw(Rr!Icqlfbg8uWL-7!
z2RWUmPh`eEuwVK*Q6q|9a8gu=7-IDYc*xza at H;mnHEusGnt9;n?>M at CaN_-!bpb1>
zpfs&}=%b5lipgC<>nbeU6Y%?R_tFqFQ;f7KL=(mI8&cyf{j;lety<MGPlw?w(~!IQ
zJJX|^Hs37X#d~|_GFre0*GY*f?bxYn6>GV9VZ8c!F}}cci3|cp-V1zSWC{A<CI2Qh
zpm>0FlKD-~dhp<S*S#Ns!`<Bw&E4F3u!HZKQ6KxCx}%pwM&<1^Spz)I$19}!O-5-Z
z*LBVrHb!iX`LG1LH*Bbo6S+6|i-a_$jlOsGd6wa8k3n?UNLBWD`wuN-T(Z$daUD(d
z$m~HbSod`Cb*&G~kE+s`oOwt>zeNP4_+?KM7YD^!UVn|VnZ#<ZoA3i!#70iKVrp0b
zNMJrP;lxY2n7g at 9`!k7pTlP+Xy^)B#`J#FQTBe%!wX}v8u&K!Q8b!|UjB-q!CU5Od
zI>m_}0peipS^F*B%7-03+Gr4aUUl_ppU2+#&Hs!e85#TEhTx9$2F=I-*do1oiIstD
zHsgqgd2ZDB^7_?qW$DaOw67Hx$rtSUqm5LjFV!>Q2O^5j%UOeAR8mEP=N^$%VwxEw
zz^|`@+O>+`fVOlY at zvTM%O*?BN~>JT{Z5duN(zTn%p>@>CRJRRS*g))Y1?7*Y3N}W
z95Q{B)UvA=&C)^OXDFV)0|=k%)&j0&EI_Gq3FYrrG$2%0`s*ULn_CSn`kXAHIL#$x
z16Y0W$4ar&rso at _ZB902xrk;Ul1lW&eq!22#?Qq|#fms`@X0v?(P>nM3(yV5wj~Ng
z6xN>v2-zkGjn<)MMU`pwH)iLccq)w>un&BO=WqJN-90E|xq}btaXP;XkT%fLxB8N;
z@$TmF%A{SR5gUulpj7p1$0tG8gV5T9LrTi~(N{OeS(xY6FB6BY$tYh&*nLt$9b31X
zZ+(e+S$T5Y-5|EMxFBZEctiQAyCIE?tkak^p~dfj?1trl=EDFriC<Wv*zFSsmynA&
zsFCZf9i`#ueR${lRQcC6@&!wl!{;w=w)c(4Qku^>_=vt=E1 at c05j}1KZ6X at hezRTf
zwU2vK`$q*6czQA5p}Ors>i38HW<4vg9CwISZiE1f3;6QNJG~E^`zqa~<buX`ewH)a
z8RVl0ZGTzH`Zy#^7EE%ayd#(=*5fRmBo*rH7Y73FMCRY1aa0FF=JvIPeMkrioRvW?
z#0$UTQ>1}`WGA-O<@|fV?^E~5^1u=U)6rIS`v`0I^~|c2MP1b-sNNGjI^eNOHy3di
z1(*=ES-n^p!*CvUT=VK7g?MM}n!h#>UL*T}rlxLusfY1WIoW at 6OZ7p`{7>c!6*6-R
zfOCxaezc;W*^rk0`T#7TXS>wNp!6pSy1zupx;<%CXXWQ_e(%^c;HGJ1^8ACupCD+*
z`Wy4rQ#P(okHJ&t-iwG0hMX&>Abc<T+2PGTiHUGVclIDkDx8M4h-J}bD3yu8*!yVt
zh%4|CY;59flh|*K8^HIxT<DIy<zkfk=9Ub1@%CI6QLf1J&}OgZy!Sqgh&`|?q<M8I
zAS2={aA<1SZ(Vb7cxL04>9=;Vy$R(ARBiFL&O5`mcvue9<ewj%ig)Psm4CJ5mCB~Q
zLIvk at 0A%9mk%`#bys{n}QOi8wr!Z?B!HdSf+0gjDc*NeOkg<i#6h!e>3nwua#HtF@
zlnv&J>nSt02wZKhi&<7aQU!#LqTmV;>B6EnMmqk2T15f~<^U~WzHW~g%mDSEHj=6~
zR_98xht$Qk6}y-jXfP+4 at 4WJzMt3Dz9ViA4d;3v8kI(s#YsBDGgFI+>)hm{<!)EV)
zu>vv#bmp9(Af!|{S<CQ7HUmbmruWL5Sh}Piv>yh{t}ms)DKT`LB+Zs81)i(JG3c{*
zb(0r9GC-P2ftv?@pV&duvhSgo4|IS!Bi3U6S#U$17CN>OTTJ^j_XxrDTO2l+Na>5}
z3!E$U&^JMW!AN`HG}!O-Jb%$5CWv>=b-`UtB}SV%NCOQFX=Wp`4iX4Wx<k2Nf3vdx
z+hJ|~vKC#~IOuKM?=e43pb#a|y8s6^a(c8zbLTmV0$ZkCgjQiBAW#RWW1YvuQX2^B
z&>?GlaGNizV=jApwPk}29LTA<)zajD4qP9Viq%Dh)J-w7xb)5cR at B!kKr=@HihhCx
zAc8&KbO?Hs6dzT-lCOsA5a at YPfvM0lFcq4)5F>Lf=9JkYh_KutL~eKPL^30@!sDQ1
zT>cr+QHKO1ciyiu(zgEBb$0U+P&32ud_T&*sfa4*d%W0P<UyTcLlE*gxP}}J#)r6m
zqoht6rpXwl1y67MPH5dvXLvzxUkOqNouk+_DjSTNFG>H){rQsXH=_%v9-*9^oZ3h1
z$o|2Lqa)-tl8OAKCe)+BYdSjM^BmshfOQR66f!o38yM at ndf9Gs^fN7Kw`<qB3mv$x
zOP1tg?i$X^qiea`G;Z9#!;HuW4!5>M0!ckOJ-vY?f9^=J+ilg0jSQFCqK^2grPr+z
zpld%<_&3S9w|uoT5U%&~pz(-PDi&}(9w5`3cd2qgel=UGc93O9>bk}Yv}0OTk_?-P
zq<3C9w+)==;bxzPsREyA6IpVB?Cdbtia!O at svA}9e$-wpXEq7)8;M+d1`f4r{9$wX
znbD`zO60f7B^*ZG%qY{QkL)tO;3JTOjb5Cn{p~Th>JB-pXo?TPH0UyaL|8ID-rK5r
za|>PMd~ZHcDU at tKGC2U_6RpPEk0KRxc|paa&zY#Cd<b+8?XBc6aZZ8bn_Gnk81PTp
z&@Bu2nWj-v at yX_H(}gf`$olB4K%&v;LnI|dvSiCpy?Whwdu$x65E!zq>A!74OdSmC
zb6G{d_rYd^iMjcBggWwt2iYQk5$ov%tc&?(bHLm6+ua~OfF-W-J7M58SQ{4mR^-by
zs%8!5#c0sR55x|HRLq(j>|VjZjnNnG3Uq+hN3bdAO-1|aLD0QWet!PpdHX#Dx4Zkr
zrdW_H{Q!_~$N!M4ET1^GNvGtt73xf3>Q=Ge-zPhD(NUsuu13wi<gJXwSHWGFMC^>x
z<=6b)Z`O07wPxg?H~J-}?rex1*FdMiGU&F<&3~Z*bujzwOC!!O9j&`e3uoU+j}d~K
zO6IGa%4W?rghwhzA%r;2Ou3^&PTwBrQd*W=D`UsOj}ojp`|pW`CSNa5GkA+xnPH+W
z4+QV3_4nxi0;+7D0NkJGO+-C9*Gc7Abj3xXa^RVx1`*~4QsHbS2UIkFP7sXPh_Y^6
zs!uMRs^XTG=Lzefy!_y9K74J+!O?LxX1PmSA2|8_k9mR}`JzJ!<?oJ%BYxp8+XN93
zKo~`UmI%{Ds!4QUX|2x>#A3l0g{pG_RQQ^ZrRTBA;;2D4J@`N`$NHO2-ixQA3{>Ed
zL(zJA8RTZaz4=D&Wpeve6Z6eDMFfakQe}s!EbloYT!kYh+~9qIy1vi!V_{`cI7jCx
ziW at j0Lo{wFcLE|Zw4dbo%gw~PDc(G=tF2>;hf2!Nyui?1Q at 9@+5vp~d1Y2r%B460q
z))xBAp3TE7-RQ%4^N8deM2kk)mGtd0dL~^+0UzRnoM_Gi^X`rW5zP29dhV**^!trV
zZ<zA2U({`Pge-}5Po41vtKQ|e+5n?c5whU(Cl2CwbPm7m$E|tVlDWW4m&wW~)}k}|
z^Iv5^ZuazXR`yH}UrQ=Ir3|WjQG6G}*dZ5*CUd>7d_!iKh`!k3&*Fs at c(XAiguwkb
z8wjGE(f5C;VG6(j;*l#0$<kJ$VXeK15(dAtZ}4FFB1 at n)zCU{VPp`Gff=!jxQEwTb
zkVn9T9nccBeK!w<uH23#);~AJsJIuko!vgCeE#CT^!C_txAk^R4_i%4^(2VW7Qqbb
z=oIP-n}~C1yQjSW8W!V#mT^%t81}CHu5MQZJJ2_zHkVlYy)RJ6pnvn{xUq<pZJx}u
zLuDuOKe^2Sb&xz7KeZ_XH$4b)G2JsEl{xY`DESRr*Qnv6P>E5}+^!&L6qRxs>#2Xt
z?}LX~fvaNw=JCbFQ64Vd4oth+&i^8zSDh^)o=Qw|z&cSS8ouQ;)vb6Ozz`MOGL`Rm
zhE63GC~cy!7QjX4bvrqGdc+VtaedxT8Njoz-j3aK(PBH;M|U(@G?92@@}Fev$uqF(
z0JMG`qME5xg-%%3W!jy|F}`^K+M-SzEHk*2;w75>m8U~y!PNEeX3^=40r=zC;Jg&t
z{HN9C$^CyB@!vc%|0r9B>CP)`0<raDqNA*6-+z*}|20!GVn at jt=x`5fmb5hV=>sPZ
zMp#b0{@-4sC5@#`Ry6jV?$NzuPFDQy$3*?LHkg|Z2?=?H-EzScv^^U3PsVu5{h#mh
z`Lmgm(~~h<{DIeheuY%P?-ZYZ0I9v6p<(yHz<?Dt_5)M{!CKdYMd%&|jR9YhgZTT8
z9~h>o7Z|7^=wXuJu&-HRWB&V>tN;0$4>b1wL{|I1Hw0dQ&fXcjbDcU^V%$L>^3bH$
zNA)?ArGA{`?T`~ArK7okPa<r<+~JaOW0MGHgh!wx{ap+BcL`iTOM2a^e at tm@^m8)!
z63bfm=6?Sx*D*`!Vd<)tmazG6qA&7h*2<6V#@+9gEVJJ$Y4!e@>OAlrF3CO(9M6KA
z+$Ns--L}zzL*w{YEh<m^EQ|_ns5_qIt$$1a5uQSA4!|d(2*c0A+_H!FrJOZf$e7wV
z<PJ8bj+uR^*$B4fUQF#yTfn-uJq$L`XbN9&?o+F&H{$Wc&NDVndj#cG0edBjHGdYy
zXkLh0Cdnv`-{ia$X5|z+ALT(!Pl(v9oQq()X+FCiG;eE1y5(M3TDLDdH$2|F`WCnZ
zj(vdLUqcwveJgu3z31hVwJ*U+n8-|+D1dI6+m7VbOu;=yTmM|p%q4^0omYq3-Urdk
z5AAi?glxOYk;O>dCpMwo*5fkmKloN2B%SJ5Pbs`SVg`tQC24$+PBuUBU$=w0F0gt`
z?-9>6rDc^p6CU%-vHVU<1_pw<BVo64Ki+ at tRE=95xkCC>A6JvYt2Wl at mQB~8b*Xk!
zP`%w43O}cKke|c<Nw--bKPOO#Ce7kvDjEvHp=u$PkvoXlj<+Njv|QMN;s&YNbg7Ol
zJ?oP4Geq-^*l<vJ8_V`MN4aFg!2#Yiq@$v>TlbcOTU&5y{ZrSw?PIFnZ%@2x?KTg3
zzen4~HeW%C?%494P*4~on?H|vf4BeZo1YvFJeK(fEqw_Iuu&<@8yd$~)@t0EroV^;
zkh8?+l;vslL}Cwa?b&w!3|?d-V3%zk8xxB+;*7~DHxXW7&Lz&0(~Ur5Pa*nQb}l6+
zmL;n!axKwoTVc{O9ai;;#AiqQ4?$kqpRMz$@Hl7elvDVYcBYfl)($MoxV(jZR<Mba
zE{G#bS@#|}Yvi#V%(=t|i-aZSlnlB at ncnrW;K>=52oEDIKW}JxJ>MG1i7Jajr!y9J
z>q1&$w;u6c_`>270kqxLG|7fDqq!#GG-7zz!lL#IK#OKHCihhkC517u9~0B?$<e$B
zPt;v`efq6I(BsT!082{j`?!4?<T@<->7Y;4S95|KxHo1^nGCYcvp>b2%6bH%8)u>X
z20}MQw*CxJUwGv5 at R7x=SX(NJ-FduS<X;>ULKR at LEN$+-V2cys4JfE}%UzN?*b3Gm
zN$vIzdMUdJCB3idSe$y7bIF?Bh at z?+VVie(ZBu=2f$v0dYc=|kC`&@lkccq1Cwxs)
z#3yRMoCdjjka(xMdy)5 at vSvFkSrF)M)6Eea#rJWQ-q}IBMMpwqTtKOq$xgh~t+$%)
zy>JM)GwjOZ?_$>^yQ8h-G<-7k7+9~unx5-b3Yys97_*j}OM8spAU!=X7GHGvHpVW<
z3|3tKUNlqOrQr<CClyUKPsUOCV{rJ`r?*N^-Ul6I;RR_Cb#t%!$ca7AfBtjHyh3E5
zhPWqGPDoexrEnfMKZEqjSXb!c*dwLbQwP|NOk-p?!t$R&!Z;5<4qk5a&=;1SkE0CK
z1dCAw(b#K$7Wl~`W7*@kdI<?Wf4xSU_ojEtTSPnqN+J`nV1h9=!EsgBMx37BH(^_G
zbhoozCNt#WaFChSITT8njYU&`j!4NWzrD5JH{J4>KxW9{;5=s7EYMmB^U*b~_ONDw
zg9sXds)&;Tzfkz)<s%OVgvi!cwE-?BCr-Ne#2ZA`91{!qbwV~LWr6Gz3we5{@g$?#
zF&S8NC#3|yPQd(_82C2E6Z_4KM?@KC4r`nfz5p>foa at T$$Ce9c3hDV$7IDPFvFz89
z#f_q}&u7L at mnwdpOCYOaCN@0jbFJ}vNp(Px$wa1kR!%cSJgRYUF7kNW($xaPlG4r8
zNs2w2Hlm2_wuW+uWvC<X_F9r9_>pRRV}0u@|9hsp7mz!0VRl9M87p>Or}Md4#lXeT
zz}IV>oZp(I8CPX97u>T8Q-*wtg0iUyAJHJOy|41z3fURWT*%h6EdD3MpQvT$H4|ms
z1)lf`Z%r~4?0R9JP5cpyEGg*w6rA)qO?FO58$&q@>(s)w?M%?jBHf0l9z;qDU&XRd
z-Qg>_lo+*7a_~v~JM<zb&dNWLj)!Y2eagSuV~tcZo51IP9lW~eXVZ0xB)*q5dqt!O
zW3XQ_g5gIQWRLUFcZICeh_vj;=%Gv$qT^WS_Eb9%C)+>$+7>ku8P!-u>v}jr7p$*2
z{lei^lLD}oE}Y_w5?Nc!|G6OaPJ{sH+Tx06>0v#Y-P?jLagX3+?gTF^zB4NyaPLQv
z3G&HGVS|2<VJJpXHq=}&Sla4K9kbps#O?4{>3J8W;WHDhfm#+3Q->t3kGb^xq?(I2
zCdXM_f2PqiBQ}Q+N!+Q)Cv}^2+7PnfEO$TN`g~0f8~xQeA^9F;fo)dn4lM0HvR#5&
zTQ<(5{fa*yaZH|_G>>R?!uJ)))ss?JYMrWhNyYlrd!@)^&j;(NvBeNc+2vu^$>+iL
zph;1)T4kj%qSo4oz~-qX<=z6^*Iue5du;HAlwQ+IpNxYBvRf at d-L<3YUuNWpOk7l0
zhcw5R`3qozBY^3j8kNYqJ`Y1Vw5Fz}7~O-P_$Qz8S<xW&ML$NIU8E{(@Kr<n>ewBP
znrlZg&}9|PrL|>rQqx9Y3#_x#3uW5!b)UpE;WZsoTB$n5uf2eHT)_#jMEb61URt_V
zTZ<k=?o=6xi at 0uXOpG^-4GeUCOlKR-<_&(*5H*k|a}39_*x%v~*(ImUUV7Slw5b4k
z#qu={$$?Lg2fr4<tj=|Ipst6E&t*ln_z+ET6?uKJd`~C!WP*_8=6)0?%UTVo#^$s)
zOt85x)jvTQ99ht*Vw75+=3utJrDm#W;^g5ADGSNnc0awUn<2Jm1$ZQn%bh*EJ#$J*
z=C-=y!1(X>xDbt&h1~ZDp_lmc&u)oh at 3Imeub=*pUy^A~_SFGum=(;|##2lrb0^ok
z`%}eNyTl*XW<@?BwsDu|kz{QXT9)e>yfF(@rK&ycD+r{r%<oj^b!wQoC?R)|sM;RV
z;<x!b{!3=$U_$E_7fg?UNJZ9Qh9^fK;MYEj2*fpH-{9QY=AAmIKA$o{D-i at 7aoBc(
zV!XkbV%zT%8y9Qt;ejz$ypf8Avr_a!E&n8|o)EDkXFUpVEiTEeE=E#aFW9P_J6i2V
zQ>vR86QcU=U%}{Dhzpig2)GArt;7rLGTKjuo_aM7ONXS9l5tJZ*UU9n-bj?;0+eR8
zQl>~FAyq{vEJ~*th#gm>o#?>&5Ag{eWg}?Q>{M({6(b8vj5Z3##wkIpjaeHE6(Rd#
zn$l!QDZ9P78{IrSYoB);W^Gy61E at iRXQ!go*M#$k$;f&pqCsCL=3wHxhSD~?ko<ze
zdSQQJ?7$bE5nHsgHhHcmf-3aWWv3)(j58)SZdHayeL?IAY^-#p8*^)Xv->Fp!(Pjr
zkN=JnkIm0bs-P=w*46?h!0|+=V1yqW!z;RfD+eYpo-k>bA=pxJh2f}M?wD{kK^7O)
zH7C=fh@>cFQ8e}(ywmc5msmhS)Aw25jrH%jn0dtM7*o@?HC(_hn{v-21xxm at vmETZ
z&h4RO#*}TA&ZF1gdBn$k1HgE(>*ST^@||b0{!dg1H!`GdwprT+!<92;Y~N%kE%46#
zZK>9`LStR*x2J%^1irnj@}%AqsFXDcg_ls%55$j1RXRoygy|mB=2X7sJ8Vw&TRK>E
zh~k{j#)XG94%%lmA$gd2TNJ#RVnkEL%fZS>;3kQ}9>$Ju)PlQSC+um4pF3mvLN3dc
zFcGpvTkA2UZYiwb-+8eBviOx~EFh1&wQ_FmuuFIz%cNsm?43xR?ES<Q7VorE!%5~@
zcEfPoK8X`u>hrZ49Zy?*TiELxWlwDt_+$yiDdXW+cV1HVMAWs1g3@@%KgjRR6rg5G
zG{jvK(^?o)<*a`Ci}yJhd|{@!4`&{Ojzui2K#FCtUDxu3S?i9q?FM5P)kJ>hKqqDu
zn at NNXhT#}PFs8+<$+}0I0dx{p4!Rk~v1GX8Zs_bgBC4O+z6z#!BXM`{3#Ml=EOK>`
z{aTOnGXv{lIcJ4war$k~b@*ao<iJ$nm%&f at 4zy1v@(s@{0`+?_E#+or9e}vH<b77s
zg|3?fy8tfM${o`5uIP1+H?tmtY@?6sbJbbMHur65I+#xTehzWvj<G6jXLxxiQ(KlY
z!{Uhy)k8zRQrKPFyrz52t$VW#r|>#)7zJ}bs(XOi((AmSRmQG|ySKFX at IjCuY9r7|
zINV?X`O5 at a-m%2)o|C!k9JM8rks~7@{oHnUWM0g4*0aI9&glc^{O)2&Jm_Ar at Ve90
zB63-+z^FSuC#RnV=UQt*uMf8RZpO`qGdqSy7oA<6E=hGv>lG|sfS=>Yad)CDK6_O_
zozV+v^~*0_B8yFxUBj`*&*E#Y;%t0JlMDdZc?!}JT38R*{4XgV<IP2b98bF2J{h}Q
z)WFHvH&<Gc8F!9o^+UJ3b^2O&MkxDAGpNqa=h)D*s|Q5PlldiasNAdAJ8`m|@1vHr
zg0|-kY- at FEwq=ISbwbHj!hXfoc~x!Q-=t&-eylL%o3y%ebi;nyN?`@tgBq~S`OrU|
z=u!#@K at F&R?EWlio3w`%e)%5k_UWjSz2C~=MNv05w at h+6@x;Mh{n(FrF0C_$@|UL)
zO$2QgmglF%IfVE&hw1?Qch;jh#65c68QUb at In7dzQAtRymBQ+Ls7)f2tc~{FZ&W_N
zsyHh?H)?L$aX~~p?LeQ8ar-G0?ux~F;*iJrI&h!BGFyW)sw#?;lZRaj#eldEQ2Q>~
z-Y9px`vzRIuY_YCfKY`fD3P$7`dK?HqBEV^jjHC=F$tLOB9`m6$U@^t*GhCyDjT!w
z-^CENZ3m3o`u8%=>dm+e_bz?pD{FwA1lYkTd8dR~uLEGVEj+{#R~r&n-ofDXcm-z8
zLAsvKw87Q?d*{}!<Ut-!y;j0pEs?>Gmihh0^G8%V!^WHb^*6lvPhK`VVu2!l&$02D
zQk35yF<FMh#6(Z7L9rI2_OW}<)PeH6>UOJrRpcs(vkEJrdZ{<7w#=BnC~t&P%~3Yt
z=v2Es?l+ at -B`3b1GtFMLZJzd}G!CHyVo|Ew>ziv?eJGEpA$gF+<Jv>N;xV7gk8TeI
zeDD8Z`^H=W1$usl?ABRr9bF&$c!pCRWQMKrzj2553h{N9D(A%9S7jSVse>(HEKyDM
zXCOtzHD>=mQ1$*l>jMuL`Ts$N_<z0(OpgXPSd93c at 63~LZ}9u0#}9p5(>|Zke6+ at f
zeaXi?LF?TA_S&AbdI`H7JWb1eDYqj_DURtrG8n0lfs*6ahkrtMZ*aGcd=lEWVBe%P
z&WE*{NZ4ar4D=C|E-D*pHI>fS1;`3X%Ug~S+DRO2%s~3-ChwOE8U?(Rk5?`V{h~_j
zGWL{~K_&^oF<uHW`U=%urf0(VF%9rOdOeZ5LHh?|1U&4?l$M62?bb<D`>L}CG4^-U
z;uL;5VkAzXKS3e;@)D*-!vprxUXF(GPgROl<VfQ14S>J=HfN@{Yuq5V3NqoieLHcZ
z$b2|UKOG*@?p^ZW1Bm~Afrm0<Ct`_vdUAu)cpE-sK>o#QLO?(QJ(=}7 at oE*Zg_}CF
zp8N}(_`$6j#jQ`txbb~B(LD)lKv+KuITm&>uGkehI0T_y at fFVfwuI@s5~H;-X+h+C
z;FF?emW`v{hlJtyI_{-m{YX2ljgF!(d0I_)hi~y}Ypnc*0#?j*&!&YacIlMYkZkQs
zCN5t`zLQG}wciTUjw&Cm((E5oMj(CoGZQlGAsqK}m4jZP>&ujlo70cid3TOJOHUZn
zyu2(l;yPZ=GcwhZ2cSRKDjUpSv84(pH;{~%(sG^oJl<P_ei>c|SE#J_qb|?}P=?O<
z&EO}Jqa16mOr}d!F2<P%MfO}zF3m>fF>>st9YxSHc_W#T%|DRqMIo=)5si+Fala4c
zkCYY;pAluIA9!yj95;<}Y9pByHcrfpSDG&>;9~lc3|e>HG<M<dT at _IFo>e(_+&qk4
z-`t)5=b~lPIVKj6am!}QFFMJee?1#(Ga=AY7*O7MA&j2WXWf0Mky}b3;qqcuB$~A$
z1GEg&UmejSc3|-r)pU1FblPr>L=t%d=4yO^Lb1O9jutQjFLYDta^-j;b4Gf<xc at 2K
zr3DS_ at xARpX`4La5C&^NcPT)3N%;kQ%qG-OOdzLZVU3mg)s4}E4Q}MxA(vyI>;~g4
zkBL4)!rx{F0=OD@#NP4=rIff_1d>}He at MliXh7YdHhGcmx+m}Xy-RNO*V;0S#`!DC
z(As+JJQVT1oGIW#s%=(It}1!9Ltj(Kl8XCRVJFe&*v!WJu%O3Fov2HrOr&9hn^Edq
za1||Z!R=+&jVxC$3Q<1$nxPQXWP-gKW@;*)=`)CE$}Q2SSVz>keE}4Iq7SjvixK#g
zJ+yL=UUid}3{)Du8WUD^n1{vo+T^u4^N6z7R)ERwZtmFZU839EShU->Mz4YCU2loo
zBmEAKW at H8X2-P^6Rp><TTGCcn)0$?FMLe>?4tJLX{%d~vM*-3A)14l0H`_l-oFy$o
zl?B(A+aA-yZhH*i<FYH`>ylivX{OGnEUHB(Vmm^8r`g#+MOj^4_sN+O{9VLZU+arB
zwlJAJ6I{JQ8V>^@TrJ2?A0cpG|JUSI4C01Q!FbOYx=0m5F#<I|(0$0v?@+~sjt7Sy
z<D9#ckWf#-N5jt-F6<8l>E-$2aeYF2DP)0MG0e@{!W}KCwaPkG$+2#h;{c{Wz0<=d
z;uZs%IyAZ%{l8Xg_QrEv#$Q=vcK;N}4|W)x;4F=gMQqV|lv(q&vT=;(^!T)ZxFM+w
zEjs6dB)GOWz&OaC?*M+ac8qv!@K9A;`Brfc{Vm0M!1X7 at 4&QdnojBD!(FkSJ+{OyD
zqzPv&ttkrVBPhBdQIBTSupo_sO09<KD=?fS|D)&h7I!5_0om$lll(v}jUGd*3)qWb
zR??Lkd+tXFUYW1WG?-?C*~X;(5H=yi8!(a6_tboCq!l*9)GfmMP(j{J#?=)vqdKjf
zYYymb>UCc``}2aP7S4Yvn=cf*Q at vwjer05pmgj`L!qe5DA+y$K6c}6^G`&^O{{<<Q
zFUhXZ{)xB at W~AbtJu#3~BbGdk_gNMthah0QbBYNdJMp|dno$HF=l~^}f*Hts?fV#b
zFN$DxyM%JuYeU2J2wWt&3HAsi7o#d07B93`;EA<?c<_&cy;7_VpTL<{{O`=GBLoDg
zVM=nvNQu8}K+(#<TyE22FVko^xVyeOo1^vjyDDZo31s3rNlx{nNzL>#G;JlCi2|GF
zDbk)P+8M>W>`*KQCUhs)`d10$A6P>rPI<9`lIxn4fR}CQgk33%TkeXo#0KrGt24=A
z)x|7`v}Hk-H5N_z4~=Rw37k}-nVP&_kh7{Blov6%7Gr&qZiJUzDv8#KB{#+>IJLGJ
zbiV0nCOdohx-AuC at uSf@4o*y^V~;p}9P#K4PtV&0Ii~j4G?6- at 9=>`3DReUbFk?q0
zRoF`Nm<+V}@!rS?VZkqu_!|fOBa?ID0(^Q%N`{6NqePMt+BlC;abId5KQ??OpZOt@
z2t&T_HOs)Gy?9 at 6+Yz{hsJebp-{w^YVShKD{D?k1J_ at JP0(()PjnY~f5wP=4VzZGd
zs+hL^H?J~MOt)n+wLq^rBuc+P54+q^p)%M}sgwLH$iU!drG2$Z5MRqduWks8sZ)R~
zIF~-A4*S&4b|U5H>*loQ%rCMD at zN%zf=-wrq~llaf~bYGwTZKX%q-)90T|XVBsW>p
zN}mGh-CScMUMxNM_#gRiUgc;I`()j*gf3HLNi$^0B8W>g!*ohm;isN?M>B;Lh9pp;
zaoDQBtZzOpcUvkRy_^+b+vCU(=fe{2(dp0W#8l%>dL&K$=xf;6%<qRar6?>b&RqHz
z3O=3$|1(a4CWuaN0fuRO{lKgEgU=LToufzH{}oG-k}O*~@jDPx!e5bv$tUHN3Nql5
z!<bxa!|wXltHW-4!XK%y^n8!ddWI#yAeF*wB0*ABYf#Vlej3+{R2C~Y>WR>fw*7Vv
zw926nhD{*uI*p)U&mQ*J9ytKqJLW{Z at z`}tzv^v=z_zwsU50+M7}-JtSZk~|V_N-K
z06)T@?kJLg($ucWl7?q7n-#<QdMM-DGzVh=!uOwa3JITUWPj%Oe=u0K02 at Q+sV13`
zIk(kY8uKD{xMd(m=<>C`2o^mKr`kC3jk^mam5i_RKgMw=AmTh7ziK+VD22hw;zlvI
z8~{#J=oqTuD9=rei1s~F_QC}FVs&OEfs$AH)zDL9HE|ZLJn(s7iPAYM2Z-567g|px
z_=iUaRwSem3 at D(h^LWokn~k|Z7DMoN!*^u5MluiHw#Qx+&%-vjCo(03ze;>l at K6fF
z{-|o9Am(#e32H!u9Yg9|9x-X*k7#axVUjNxmv2zZ)VdSEU99C&zNFPUv&p+Ie_W&Z
zE>hQV!#w%trYZnxf<oPdA9;RlpM1JD+*NbvIjH+qoTNfmHi6|n@(bE)gMsnuz4VMg
zg_LQDBI))CN|*(~J9GUlL2}27=IoxSsLd?V>--nd0aJgrhaW%~`QI|&CbcL+9Ujy6
za)Y0A5<AzmOa(QO*99x5SkXA$JDmp~t+WO11EQ6&u0-8t- at q~S(oedC<}J1S1K*2|
z@>`ffCkt-a_~RwNN8B$hQZVs8mNq92nBV%*uV`eXWvs2NJxTibIckW687<QlB5q`~
zS(=0-BEkLVW7OuFn$?Wvnr@%MoO}N}zfa2d2pvQSIKYMGK|`t_h2etE;~S%bSD6K6
z at vcGpWwDc<&A$A#vxi3q)^J$s#POxp_^C;bWf9-W<ldR5zrXSSm?>*H|Nr8?H(&E}
zcXD5gcotTBJ#@eP>rAuX><srg8yJ8<z=r{NA{|3R0+RxW%OcFc2&5EdFmQml2U#3I
q6o(pcQv(Bog8|SnK+rUTwaQ=85{x^2^X6VqKzO?PxvX<aXaWGiXHJs<
literal 0
HcmV?d00001
diff --git a/documentation/toaster-manual/figures/bash-oecore.png b/documentation/toaster-manual/figures/bash-oecore.png
new file mode 100644
index 0000000000000000000000000000000000000000..801a5d911f6ae43cd90e5f33eb7e1d98f5ae8aa0
GIT binary patch
literal 138198
zcmeFZWmMGB`ZhcW0xAM32nZ5NN`rKXlt_bggLIel4BaJ-bVx{dGjxYY3 at I_f&^^>J
zGtc;sbIx<l^Zotut~G1zVdl5@?7a7VU-xwpsj4jZ_~DC(007{z{0C`u0N_66EjAxM
zE~elNHkbhbXaVxllApY?4*U_ul#pzGkQ#7d*TQq(=xLMkui{XLW&x4a!)3umqs at -p
zrc=MV$L?!7t1rxk1iw&`JmmjE+hiZiO&3PKY+~>BfCryAJ at W}JeaKJ$qUjGoFyzK~
zjI1ZlrrDjpcrGkBUC3?Hd(zXg-}^cz<DPX*TiXxREbw>PuqQ}fVt2~QKlAY~mD`lu
zqTCC+=EIO%eoD+cRtd~^5Xa>Qa0mVm61&>KMBuOL)h4ZLzpjq?=9Ii^rw;Ia$}-wo
z>`285PRQBf(y}#@^5r{BOPGpGNK6w+z<>P%#Uu$f1Bh4N^3Gko-QgVm9^^-~V~NMM
zhP7maeEpx#|4(IO1!M*fAQu;@;(PaK{!Qu!`lpf7ufG0Ias6366YGQDtxio{U68wh
zp`j+oR-$A%cewv-ac}C2UlYncStH)^=e6#>MmgFh{y%#L+K00u3a3kNH4s9pC_i3(
z-$=x>j7m@|HCXc&LWy22K+DI2I3O)%fTN;)v<(>T at EsLo@Mgstk6$F9b-wx_TKbh2
zf)oAdh|>3T)Cqkuy9-)^{^u;L`5>pQNeY;IZ5z#ed|qg1X!NuHxwv>+p~Wh#rf5U|
zJ(^~~!AdpKn3?2bly2L;S|(P at Dg-?PL at yH}DR=?7&wc#GoqaEZmXj6%|1t at igJtO-
z_%j~|(UvAH802`TIQ>}yb|Kp5Znd?w>G1E_^Xuz9OV~_BU!I4;`#CjmX<e at BO?Wko
z+$x<4S-`EAD)~eEN;Uv-_S at Xc>;HSr{;ol at 7Kr|7VBbc-+Oc+QQmm^5gE%&$ewgAW
zDs~>cYETUXuMvg!1v(36 at u5hXv!4lAfS-at&?mxgwF$ZpyHL58h_x at foWt(#s<2D9
zVz#)IffrX5_fUGkd(dY|`10zB0Qp2>0^AMw&H5K#TAX_c^eiP<G19N_L*L`$%HRhD
zyrTt35^sug3Z-gdpFqIg&jR1QvuL}O;l`mO4j9`Cn_{A6j=~S`6UtU?%?Y3sGj$Wo
z7kCQ#*Uk4on at PpP4>J~ec^w^{1yzvi+<B2({e at hi8XFs1>G`7jq1wt9trhhF6}x-I
zwgPDc at 7mCZ;>i1p(iL*+0}9#}Qitu<t-o_Fy}-2V<!eB!6 at jbG5;V$orRy}(#&7?|
z%n!LpcADZOM&vkU<aa2-xk-sW!%n6VN%`Ew at JrCTw;FV1e7$`>a9slHimwL2e6N?9
zjXx+10RD8<3OKgUHKl*L>XASSpvq1d{?-p#t|v3TnLocC!aVPE#2&QT)o^s`_bYw>
zLHqKD|2Sw<hTz1a)9X{H14R0>-`zF$`+Q=|Q5kf_tjkE_ph_lII_oa#>d*dK0#<sQ
zIGASbI*sP<Z*U^7EkfR_kGeL((>`Gz&S$qr$QBYy(fRppi*~)q1nyoB=AvRob~B2E
zrSgdhkvE2ZTbUX0#;lFF>xC4Lfbb<s7X+Fv|4smmkfM_KzINFyTc`%#jF*1plH1&F
z{GZ04L>praCMPF<_$v+cqnP%Vt#1tC*Q}APuB`B>$w^DT1ZGDOPREani;KDu1?jcF
zt=-LW*OjfBT8_U|$$%uqRYci|I?t<YqhjO46o0JQ8h*M$-+)lX)SeBS4Q>8Yp3x^q
zU$3~itb2bYV#7EMdai&Mb!})*r?Wk!H%}wqk;qV8BWY%lYd&4%G(bPxt2SS532=Z3
zS9+oXp`87L6DKr4jf5`hRZvf!UNbFD%`pV5F^2rJh0XQWAb5Fy0Qnn8<&CEAx;!MC
zW9!w=_B;ogI`Ip%gZ^W%z+W_k;h2`#o=3OYb3ctN&F$N8UV*v8typvSQTF4FD8DOD
zUbsG6Dm^xfrY}kJVKrw8kO7#n6f6De2Uhy-?YO%iM-gIea>lqOBL##W8m~YMS%Jgf
z(ULbG57#FB$lw<<m&ELB2&_*VJdg at Sxos%eIK4x|FVUq#U5IA$z00X($H68VZ_otN
z-B;9w6H8umTY{+Tdul66#&?t_h<1H{?S{HV%=Z*-1;(QzUYKA1r=8tYHZS;^9G6I6
zCZVCGZ^@1^_{*n at qfYLiD&(pn(vJJT7waL!9Pl(({P|}Q$%ap(#Uk8|7O%eIa~RpE
zE7fN<AD1G?$PO3IS6^X_*ya_;OJ8g|Weu73O%gJ*oI9Iywg@|iE>EFZ$Ih1Z3Bbnh
z1gT_CIZ;G^`*d&x4EfG5^bL_Y0U!u{e=WDTfS8Pycu!0GLEm^F+^4b1M at niGRqfgF
zEPkqCjqg_IqZc&;1H&648V)Jl#f=sR1_se<Xl`HogVU*b^u#PU2Zg!M{>?}W7=r}I
zV~TcnZ6XRHRGE_#N5w5dQ@<>KaV|uTz^^N3tNUMRh^C~utFL at fUTHXegd1#At;vwu
zN*>^jUiQCz<SIl<`Ah_3#cHm?C9s>VIDx40weDjw;z;Qe82U=!=Ei$%V78DVq|X#5
zSaMF#_h^8|inQfe8~k-lf~aIHc318>{JI%+hjx9aQ-GDOQ?+jt-v&Nd7>R+ii)8Pe
z<6R+h*DMKk3Ya3M6bWN=k=_q#zAT?vO9&sYN;x at k7S@u*mMHX`mrR%0?;pw>clx$K
zBqF;R`z4kiuurbuGj_$A6wO|z?8LHfL>VBGI at W@B^XbwR88I({k=*dGuuXARgn3qw
zmG%zkY?G!&sqf-lWFL0=AdFUA=HKrJ?&%L7t&-_qu(a~5VZ4N94X_!l#aKmQ%V9+e
z!yxA}{0ASP`SO;G+v-Sa4O?UMW<NOJMR1 at 5ifYcjLI=U43|aBQ!Zgnh7UacxH at Gf`
zIq`2U9}WDq`{8{jKK{0?G{{Ye?!K5y+sE^mo>Rf3s-xbmtlJ&ecJnE~-9)B5!cL;K
z^yv5yl+f5^JiPq}(uFh|bd_7$KKUhQ?zLN3+Y#?e|LsopTgJBQ$@d9jzU2Z|R-Lc8
zeYJBJF-AC30^RM89m+}UcMzNR;%GRqrp{v+!d-q8KVXb at L)<n#_fh=G;y)S5z~x;B
z0l&5A4aTz+9JoGIj;0_Qe;)B5_wR0VVt3aY_u_Ii2S+QX)1;d``;|gw%AINA617Z|
z_Lc;8R1`CGnp)N|3r_X2pc%U3;RyR5|AmM2wT-Rqn?tuH4K)&(>k7*i)F!_y>`tCB
zVs0h4UCK>pF2fF?<woRq71zrdwbx{@SM$x+dF(m at c~oBj(;}m8{granvodqPevS;H
zCH%}<45?PyZ^n+h?z8!v0N0fAaDc4Y*Hq!4c`EAna`Uu#lcU~B1GMR at OH|=hRF1xw
z*TGmN(r=JG?K-s2bPlkxXJ?ddJ0h&YKE}`aG at C1vx+v?M>tRhg at 8O!TqdP~3ZVWF#
zplx1^G`JvwEDAK4y4`j1I{779)o2 at GNI(=ns4NXO=36wnZ8o-aKy!wV&7H;5Ol<_R
zSiaq}o7|cmlE&szLw^sm+e2-qHdVkoRqq}NC7sGqjAeH^4JgpWZouZC`!CQ2WAVl_
zft;PVDoeLP#5hEEK+ycHv}C{#G*FJ1$Cg9}D~Ps8^fWXQ_rwo7<gJemC8~jJLUu~K
zr1d_-qT_qmaT#*iewzwpO0s3gbLVb-#Mfib-)C=+JGIZ1)eDHRlMoEnI6JjE8ln^|
z)c)9g&gO>k|7yDw5%UG0i)YlLpq!V-6z?BQL4!sziaYSMy{PX(zp_)J4Qy^U``(@k
z#fdPw8KiCx_YD!(4}e~te&mbGEXy4 at N#e`KrdTF}Ip<dp7%O`7SAsKNqWzlxX=x-z
zZW&lC>F?jen(J2;$GaEUGNo78H;up&jKkKx#-g?x#l44hLCuac)QPwMVqak;clguc
z6;KsFPUK-Gb5%Kt`Xyf6j48(R*=dP>AJ;eC-juv0GaX1INVqcn+XF6;hGM}@Ow3D~
zYN?%4C}rF3cA+AiC5Iw9XG7n|No`EGXFeBTKi35Bv^<J~=Iz%xmWr#ncRQDohl_Jd
z8o<08sj;2+t3X)BRPhs_j|vJ<7AJH~U*Zj_L_VNww~^@zQcQ1<Y-0WR0cU0zh}~`D
zumw$KUli0&NUy#KL7Na8r=$&_g6)esZ{|f at EP{JzQ8%q=-G__OPN*>=sPgZAAB+zX
z1-zs=u%KK+QHxS at ic%AGow3gk+Et^U<f}3}fSw|b-CKDq0da9E0f?}bV<`p-czmo%
zsYmDOkVJ{S${bsmiO)fxHonDyanq at x-AyD8HkTHVqEp-MsbVD0TR4NrNx?+SqY}cQ
zG<Kml{v^Jt$`Ri*wNw*#Dsc}A=p+|Cn*M^J_7HPNtlvPne06fOG_LX`vJx0PP>dCl
ztw6L?)|+Ybk0hrH3%LG^rYCnUF<$fHMnPLziBAee3`5)MHRW|Z!a0j3Z^u3TTsb%u
z^M1S?c>MN0v>{c?^!>0Owu^WRF{?4kJIiK#ve4420rn~EoV`XFNjD`r4s|1DkmnPj
zl+CsoebiC~&9@^ryt;OrN2;($04qgH6epnUL=XdzUx(i2W<ELkx3dm!TowCtbw5|b
z^tpr};maxLXiJR^1Y$V^DoOiiwAHK*VkS{nivH^|o5*92S`EzpbbN*rND&|_#tRT4
z#Isd&*@{USSbqqwVWP^M^pdZT&_ at K(c9&W?2tFIFNC7T0A6>@vk`cUGKNtkY_2G%l
z7x8C|KzlRH2nT2`idJ%efb_NtK<v2c%p_5~0En=oefvwROE=ephtpg~v4?3xrl1$u
zHxc?A(8So$S~j;+4p|3O#VzlZ69wM@)k6s`#uVLhAOoWw4gDOvlsrJ+7df>aBdT3y
zeGsxpr2yp0jO9wMFG^|eyK>n$!^WAJ<BTbIpK(rwzK04yiP{TuOhvxo+FSgMSPS_=
z*c5z(zQ6mhq`;Mj#csNBx$blbVXPL*jd8$NTIMo7ZJ&IF?xCKQT-fZ_u`kUvA3pE8
zc!qNi>qBA)vieS03}{W?`6OW&W0y2Djyq0XH^!KI3ss_wyUyD5Ft_j3H$)97m5R+g
zTcOMsDCKc%-`1mUSo%=sAd%*?_pxB77z>INt$fc>Tw_{5T3^s*z3_=>{N&KVqrN5I
z9K)3`WgUBtYd?;06?nmqWV|WR!}dP|E3+huhgLo3nq10CJ at z?43duF1t|>_EydM-$
zezJR5WW_O+<H;g^6kp_n{#Y at FRmHF`SMoIU3OY*Bcg)v%#eAdh`%a}%Uaq5SDB~+r
zN8z^E(2;)*awG4K5jwpA+U0rU2FAc|7eUr<mbfh{u&2&j&IL<t=W^uArdYQ8Sn-T+
zx%H~%OEXd}O2h{uva^{`Bbm&sEK<uwa$<w%mS+|WKB5;2>8&2r7FI_!ZOFo(HU!;y
zb0Oy?qkpcc21^7)T-3|~94fz)Vokl}uWmAH at C5jOQ^umN8>6xa-Wfqcw)p0<g^gIM
z5g{%yg`lT=7U3>?civfvY5i$b;&IQR=9mTO?lq+16p8N{0cNp6d(sR;MM#4D|1c`s
z47P3CR{Mze52z;U=vuV;kGL2dW=~)A1phAQ6J$fXtvfHWtWed~pGzaHq#lf3IGlWt
zjA`(X;%T)X+2Aqg5@;=hEKjzhnp6Mbi-W}Bthnoc{(RO;V$60aBoC<W(!-Bq?YEjS
z@>s+6 at 4ymV_J4vG{ctO$2m89zBP4 at CKqaqchuyE0x%>F4Phuu6SSIu*U;4%s;t9Uj
z^yP0Xl1>k`N(DX&IHHG?`n{6HgNGKcUC}*PKgIS#*N(&8PF`J-9`)S>%D at F-Uf7qU
zU7<iLfMqZtLg9re5e{veuiCiFbshv)l6XD43wyQ4zfN8&rZB8rP;Wf{I{0@{Z92`(
zQvs*nJ=r279p2}J)EqvEai<96-juYmvN9vZhsaZ+(D%eRbg-7%+Inb(J>a=3Rm<i_
zwqbKhceshfQ2zDjTzh+Vs8%fDKxl>EbYNc#?_ucLe7I*+l=Eh>%)Dt|sOM$=PUU&c
z4H6&cp3Y8{q}qo5PBYVsfan&TIwCv|rjy_LwcNn{eyf at hD39~T%L8AS=#igR<g2*8
zNW?il8$rQYCAMwF)kv-7;1(^a4XtTF)lkp>98dLT9&7H8=(SPs4>e*O#Z{r|ocPdC
zgqphBBV{XzkC$Ziw~wOL4E&hOjx#ok4-`njpJrbK=zAdJ4a9Q%k2HSA1d7lEb9N at W
zI<m+=r3ViJ{&?&(+FeO#Daqz=4wZ&GG)v5mYhFK1&b}ofN?Yv8m^^2mF&^k_I<H0Y
zvAb at 5rSY6fkzC`am^sdsRvOt at xSQjREWd^B88rVnacPKMpp(yljVzC35p>%#Nxy2e
z5N<mv8(eTga}ueMBq`^aaFO#ab+wXJ8m}n+aPk=p0&(00w#8ictS7V?w-dCSAS8Nr
z7Q9A*%l6SVoI<l}jS2yv)AF?<(QUtMN%nInvf9KENT*!L9K|dFRA;ZpgajHi^R4rb
znA1)TrtW9#(fj$S5an<Vbb3EvonF9xUC3IV4)%O5It9&1$$0Pu%Cvs-P*J`-LY728
zC}=0 at k%wq}G$S4+q?fJQ>DGpuc`!sd>wL+2tyXcX$h_s<pjc<&C+YpbSrusgo#b0+
z4opqY3P)?PHj$o=D)Ju3Yj at FjjqLh_JE&`_5sQz*Q!VX+h~c<PJ;x81zt35mgst?B
zdKQ*beRLgk6 at Cq59(!#W<oY^ePXWfcWG{`9PegwlalCpJ%UutzW4RH17`iFWbg6CU
zmF?gt=X<VubM->>VaPfK7&iyzBEw&Z>8B`EyZc-?edXh-w$7?JFK^ZOSVB<JnJYwn
zw(*PY-j>>LldwOaVS?9&q<SJE(>en@$ArfI>F||>3Iq*h^DM5(UWF3%_Y$YqEve@=
zwQ{lAg2{A7iOB<i7<LwjCSO5)Jw=Ja;xRjs*hzY|&8=b7Oqin}^_!_PW;t^^5rPuk
zCL8$)L!7y$#k3ZuI!%85@}Db9F>kW%tK!+D66r5;MJk&7tLrr#5Zfl4lUka2$*}zL
z()UtB%-dUb>F|2elC3s9CV%f(7jY<f_3EF95{PM+C^Q{QP+XiacPedu;e&-c7xsxJ
z0UN<O at lfEhcBHpAI5E4K8DEE5a4IH!Q|f2#G&G^(?xG**Er at 4_amjwS^F9Kv#qaXJ
zWc6Kt#`fqQ&J;eOD^=8+c4!P)D%SOnZ-F{Ls-?2KKA}2sUQ=U58w2~7c8ydYQ~9DF
zI2&*uu|0H6-F(0{I;dTng~jZJ>#WKjhw|A at EH+A|AX|&K_;d`NMV5J8Pj(15iRW at 2
zx&5epNkcPbOUp8*;TB7|fBtF=;MYiP?myn|kL>006Q{ZNB^9fbJUg3oJa5_f3~O=+
z{U*~1k9&to?!i!??>?^=4p#5x%LAC8^9pc9_p|wGF)Pl{E?0_4`h(tAZ&C>Qdj*^a
zO}a;<2F6X;z$0e*-n9H-p?E*JE&>{dT)d#A)K=nx^v4nrSm88SRsvCTIuaquk+~=W
zapu*jn6AFc6a3oqAXYzYD-J{TWpUMWii_{zs%-nrVtV27&7cXFF$Q2_G6uuS-CqkX
zK3n+MU{p_G$%mMV at x|qr6ZS_c_?^<lpIuUX*xftNP at 6n2<$4Q!J5|_Wp}u-d(MpiR
zDdX0TC0cEco3|R#CrV`G`JysA+nO)S(k)`_bppM7{rhr~uuJ8JdCg&Y)uaS^qN<cL
z=1!g$kghnG%Ronr>Tvia^kAVr_Hf7EDH*2jGmZm=nTYJ7j1#JA{X9>Q8Yw at 7_<3%*
z4o at E|v0vZTuW5{Rp^VY78Z?k~gH9}TA*<Ymf`r;tr|%yf15k$%&2Q8gdXVQaxRuQ5
zj6v{bdhK*$h|lZFX-M^A2HmaQ1s6q~ujhUWo;<!PS4cwdE*?WWp(Sc46wBSknsMK%
zZ)XDi14*?{YewT3|N0oY&*^;abX<7!9{Y{>9l28nJg)6HH^=uu-|Ir%A-j6C$%oH%
zx=`8ZI5``rV8O<pvyD=+*zcn5O5=jHM0|M#RWut#ZAfe8Ef<&BNLA*LY226BXHy#=
z4suDlJL^ka%twP&nQ^WJc>$|uKy)9YC0AJC$ZZjR at wc&_G=nfX{x?5_VNV`c8%mf1
zvT4$a-<t8%Q!!o*a{TNVTFc#|2sk at Osav84a<Byd$gjoMrb6qcDP@^SWI={3UMO>n
z0r^8|VT;XG3yRvX;A*XT8vE*nVc^(jz|?tZt4R5afXCZ9Ul^7L9T!|+<%58%)*EiG
z9J#{9 at RXEmpE1gD{MJRXzTNq740`$3H*#9FnO)5p-8C4wdMx}Kz$Rl}@?@KUB5V7r
zDF*PkxFRx}fB8Wl#Ac+f-jP`4J0ZwulK at s#n7X`I&Ke=BUGsw63bs(DuagKJ&~E6x
zZ{ooa&;(^00E*T`rKB)xX%%wK?{=Rv?C8!mv4bR2=X(M*r3=+6dP8Mj5_MHP7GHCA
zT^6^z&24q+8{H!q^`@TCpsSF6&1GzAJU^iU)Y6^}YKxlL$vNNhl2~ZFh9PgKYX6B!
zVT=r!%o7Z(FZ)Yx_X<(_xdLa1v=GAC>$5NBOcgF+NFJx3)6UEW?ZqNA*f8cU?D}j<
zNJHYbewiK4%N3^{CzXHn{0=DLxEp0*4tq at Ch2tfg?tLA(NDAqirx#x0uI}nEJ-SrG
zwB`AYruVmT*^7Wt7kho~wnMB7?dO5475xPr7n<A&<78|1hFk=_oz(p2m;Hv+<^YOs
zL+(vVCO<FcM at Pj211%(nZR|<0<>hDPNvGh0vGB#PZ%C>ZGcki6+A8YJZWoyracFpr
zpD{nccXkQ^@2pL;Ry4YgY4c(c=ZKmecj#qrI>u%Ve1ZyQwSe&@(}R?&m|QwOVJG at x
z%Qm|zUz-Z{2SN$+)+kiX^?hu}drXL-kJ%XI!0BoTv-Yv^v0xb9=H`_uhaDGUwoc0G
zH(-bqirVDip#EUL+;i)Ov9S03?aQu)u<>z&UHqpQfI+nVonnHdq}a~oRp at Set9jVb
zxgX0?IJn;>M{ekS*exmc$t|<&H;?t3a~=Fp;)nNtmce?`n$0$*Jx)3ZEmiQ3!j<f)
zkM&cG1Kx0f3VUKynfWE`nm_17%GTDs%4<!Qv*}}|9|^WQd&sL9|Ak|VvM*dT{)aN9
z)|Sw&ft~kz9)&&WjKdC0>^$&ToEU#y=4OB#ZE*b*M{-yPHHH`Lg#ibL*eT}E{$?7s
zj&p-(MOGs3t{{Y)`%^%P!_$?V&V~ABe4|{IIaL%Ye9sNla0kgnf9#C#6PNh?N1=OU
zidS)fEE*J;+H~3BhXu=wWXk_zMW%{?zWe6&G2Na64|Mn3FQ2&gD``cQH1UP62}m?}
zq}G(&SHwjZq{Hu;UduGzAZ7UNMwcm!$!g=WR!2r#OLJ!OHD$m at 5TpKR&pA!6XnVk-
zT>Qz0zQx7+=}w<&&cu1${a9{SH#}m3DIudtO7)j6nH|Y1gNl(Pxa*}>c4)xZ$2G4}
zj4RB?t5D8$q~a+iA*=MD{Xs6+hg7 at TXn?|7l!N?G9;UWU(CvESM at k+3R-m?<{*4!P
z8|yYbHW$gm9!|;tOBEmJs9z<ODCh<6l8+Q`#cy2R_mYn$ZR=jD%=twj`uHoPp;Kv<
zC~OH!Kx)C<=fOrIg}R}Sma#6}N}ct)&^d6r->Mxi%Zy(>f1I~DT)~v!#mAmBqn-|`
z>cMbe2*ZQ?1j^ifujCi9#Hnwu5EQAqo&$e=Hn1Ceeix<!fe9=uEWFVE-YoBSWpoC=
z>8!dq$N>PXPvp<n_){&|M2{k3r#7x!j?T!^4Ia`ZZqiWPM8ULFy7 at Ez5tE?5>}kgo
zg%i>A?!&7xfEeU##wRrhA18~eqbH^)Gy2{*A11cY>ZPtJbfwW(_g?Q7KUi)i!Xq4B
zGz>j9<tKgz at jVEoJ4bnUV2+aeHo>JE)nvRcH}Di7SVf`{L=5Sgf=Pk4#GO~@(mS!{
zN*}bvc%?v9-3#>jnRScvU1Kzk&XF>bd;kZar5_8fy64|VDakKzKWQ+nzw9rs%l~e#
zu}6S&58pfNG!5rj%{6FwBT1>q9$Hp;ywMjfkE?EWmqO5O08O<9EMXrE&>(~eS6E>+
z2NbG9D%`5kSKugY#HHz47q(zcE_)`s&oQBaY-;Bs*H&PwB~6Qfco^z2VJOq>MlP5z
z4(bg2S!NrZEyBMOy%;TfFEGG%NBD>*snPN$q4^fj*?^@Oo2?1Shv;_sPEKTP_B36#
zYz6Y?+J$)q6aYtbV+obV_eCB(`1IV3S=5KK>TtpB?s-0E97S4dztT<C8(>+Ll>_d&
zmH`@h%Qx=%ai8m_Czhyj_?9AQYV17a%uWNJ{YwxG<4EHYpFNfuIxpSR4Y7`#VEXP%
zG9B=kNLb&cYMW#X_m6k-SbVJ6xn^*&(!d4pkpKK-n%M}6X~nC6j15G~t<B@#oEqC-
zw#b#T#*T<Ts;3fk`<=!+p=FHf+R4nJNqhTMDVd-)&QLI9o{Z$|{C~Ls8xlso*yxkk
z<G&d>iR)(L&6Bmbo~_f*4l}#%1;v*d9T(6v^TCbgoFSSu6pewMjgt2`oKoO)#<(jA
z<h{#ueMAI|T55a5f)Ehmiv`~u`+DU^WPCHmq)M*00wFFNA2sGVg}1EukvAr0zVb|_
z-9bb*>I9#Mam}6fI`QS0LlO{AIC7%|*xlQp*ZrykF<CA`92?B^LxOtyPmM}luIZQX
z$YxO(S2t=Yx3PmhzhRH#4s+mj>lS{+d%nR=z?(`l?SD;2a<=X>irnI|vf+ey*^8oj
z+j6m(i^^uiR_ND4_+$&tZoDY{@(mt$3okU>VryJ;1!J`=Tty1c at 5Zod9qW$UEI-mw
z{Z1Z`&!t6cI=b+nZ*gW%|NFJZp|is#JT=x<_H#9bz=fRv`g-Q at L{1$vZ5gL+r{2-e
zMiC%<=uvT*`O+zAV$rnZ7a0*RfRk__<x0taa#Ogi!e+Uzs{L%Hw7guy#@arl$N41@
z-eRjWd;Vd-6kaZ8LRKqz+&wJHn8S(EA3w{MrdG38`}ZA64ACOxo!Rp=|C=xp(FX}*
z|Ad~FN;Kv+T99C$bj7m!6R-`By;~EG*XP6ggslqB#coDFzJphTLX}H`l}q}jiNw2o
zkLOGlHqz2QKQFui@<s^}8jnxp7bo=fM0+}K(1!P39bvGBp+*{B06I#3LL8jQzQ!)>
zVr;mlOGg=CR83azAnd$?iovDj&Hc#52-!dNqV<w>#w7p!#EpNY;|Bqz#frWK=$&&;
z1IGBfFlo7YN`d&HK7wxlgGEsE+1X0u)JIJ0 at zK`S`5nLT;cCjB`r_4}mR<MbjXxuW
zr8bn|>l8hdRN>7WD?K;ZR7Rb`QIUhe>z8xuz;luH7AdcElNH;?-J3){n at ya*CGuZ1
zEgdLUL!x`W`LDMW)>!Xp#P(yp;{hystHns!=6YQ3PbXck at 2E9o(B#*pOHD_jT3W6R
z6m;}ldybn&5bbVpnP)c`Lvn(FHQ*^nw^PYj>F9kBHJLgiq+i2orw6I>QO%ZID-B&-
zWDnS at ig``nYRbH&=4wh at FUDt|^E822_36izS1aa~wv;qE+<E6lA|gf;0L84aVt#=6
zVf~z%y>eZE$`)DLp15dm*#4Dsb>o{YgD*_0=tm7qANVczoqyo^-rn~3Cs8<q?vBwT
z3;FIZpW|S0G>h1v^$=tUFa5R}w_B|zwa{mE8isbc4&CRS5|C?VrhI*&LB4w!Aa=4M
zp=ol2GcK4DOqjbPv+qJJYJ9(N0E^`z1qPvu%+nl#7G!0=j(YX}sc+o+n}C3+Ko&R7
zy+3JoZwWaiNs=DFJ5NzRA-zg?Qm(d0 at U!QS(bUcE&>@kA#Yjru!E?GON57mwz*}!u
z3A6wos!9?LCU33939kBd`dnx4t#Rm$^<7OS!C9ShX8Jrp at gUdCt5Gb<kS0*hH~{AT
z$xr+~cuO|Rg)Qop&s6e{+7DI$<y8~TQk%?^K~zANqd9t_)hz5-jY$~;q@=2nu(Fl|
zk}b;EUW(*GKpdw6hHNt4^-qx6^C!dx6QDl(a<vaE)o8wcJ8o1P#PSz|%_mgh{M(8}
z@%VF5qApPkX8%LBCESqpJ6TQM?%HR{Xq9kGk`n+lnhdVCmh-Z>&&osNY1q#M38!0X
zQyZ;MBP at f$%we93R!O$t>ezY-+hP&%fe{toCtuUNUU%1tduS`##Z74qf!dGJ|GYYt
ze{n|H#|iNB<HiqRH!nYKUakac#l%VbbQ;aIv^$;m9e$~Y<&KPT3f*J`MEAbp%`~bE
z);_=d<ksgaXyA{hTumkp!M+^td{0PK5-daf)8C9nFwP>=|6;4aw#{adlk-_6pU at nt
zEzEZDeB}q;`rG=gK2m>vO@)1t&>vXWTXJ<+JLf&e36HxG=j4K*ggJzXyu+B7UtFix
zW<OF8`-1`|ykAeGU}x`i#=U3T`UzULnmSxt%k43l#gelhnTg3|O_A{eDqrwcZogym
zby<r<5I;Z8ONTm_o_^h~Y(5t>Ru59~g{`08{M1q}9o)T(2nZ0}4n3<o>ThXXJ<>sh
zhI4P6_Z)ud+lOzW<i=at3w3iGlHzGfEo;RE4piYcj2wjt(3<KxiOKGlLLg!)?FfE5
zuFK~zIR|F%@~2QEkvGx0m%A}bP0!$9Shtub6 at TvI6d9^0 at mn4itwjthM@dPkz~ii8
zh>pT)A%%cFFZRA|i#|pYIfucfMRzAwKy!e%QY2F8HWHQc-&(>kv0<~N%%aXSeIb4Z
zta4V?2x&h|Fqz-ZPl&<PkWZ#36v3>PaJStQmqv+?XEMRw6i24T6DDV-9v=6nt#RrF
z-Ygi*gZZ(YMKGv-#+!v<GFe*U?n9BQS=f#L at eqO=Y%(GLt_xh_`m%d<9{B44wQE6s
zvYhUi^ta1SYnC)fr?0M_LkW9K1U(%IWL{K!BLj;$ia!hL{Z`p)?v`Huz2MWH(H|j~
z54V3s7vNuAlb+m>HcCwP2%p>yr7IPJ+Ti{t$IX42g8+kluO*+!;+9ipT$=WuNtgTI
zHV6)DuEzwrF9c@#VOWDXSn0M0?+Gu}pJbcjY=m5<Sga0J#|>u7jR;JTn=2Tp<hyx2
zo$2$;=QKsWa960cBBut&Z0y=x_!Y-T%NVS_fPQq1AI|t*@{?OMaCd_+E156NnEN$X
zpQ0=ZIYv&N-Tmjp&|BA at bUS$26ZwD|57)^rD_Bh*tKR9pdK-T#?jNtmOeykY)rz<#
z!&X{rKRl{BX=dsRtt(BP^s3t0^TczfD{@5W*hV4hBZ#z<tsQ0`@p4OlPNz`L3gl)|
z&BD|ubrp)BaAt;l=bA)xs_>%VLBXH*_4Xa0C83B#xxSVQ at v+1MU4r-SnR!s}<Xkj?
zn6YyAN`GA_E9J47na>OC?6gIN_f_eh2gtOglFKrG+uXkek~{^Ll`&!2Vo=pE7*;p6
z<yw~O;9t^%2?OomKelj8b1d#$s9KP0?T&4+7HOoN=bjhoiaRX^xN*=E1Kn`@53QeH
zM at pH>Q({o5?PKj>%UL>tb|gz|DyM|H5y`1AhX>reX8#T9g37nh9??Mq9P&Sa3OZMR
zTAy5}6|cT6Gyu{F+lyahTQbfB4Pk?!UAIlTrYORw&ArYL2&s9+rno3|yfER?smXS#
zilOkg5$4giU6%DiEWvEXE^e&`CtlANq7|ajF?g7B(05J4H|@v${?|xCzgL+-7Vu_M
z{;RypDSK~+lxafD^>?Gppp19gy`{m+B^1}Ui)czVUx({0KK&fm=LWhJIU*q3y!`%J
z)d*#Fj?i at bBFU}okj<95BA$gjAUtZA+aTq*Ja}IjSl*RTbVB>>=!I$9GJP)DvB at l~
zZ}`6D$#Z1ubL6&U!!T at swUKE3eDOr>30~C>`>ep~V6yq4i-vgSgyp5Ih0rd`D!hab
zAb_|v-a&*QJ9E#zhx4d3n_1quo!r at sN9B(nwm0JD;g76VR|(ovxzLeB2>?=HVa7XD
z-4_>JFIcxUb+*#D_mzz3GOPi0{dqhMM2aS6c`2RN>NyH5<vF8vdfdWdv7Gu-Wo{?>
z=5fgwMpg at YI~l7*>zmxrX<zQ0?@ImY;2_i4Z$fSX#!NmsQQK+&#wRpkY3*=W=fPk#
zhzh{;#P9Xx<}3q86bG+kRV;!w%JFUT8S_npgbdAl@=|Dz at mom}nU;xD%)Z7P27iQm
zl=&iM&{%bR$ppZF_4`i(Wu|m?Qmg8|=Vty?T}I(&zpjxU$mj>fFv2`1Dw--*>=UVU
z{}K4am-(9U%Apa8d^(#aVd~T!M?7JUpwb+<=M%7gbDd(N`+JkNX<yO`{Z}HLKZKA!
zJ+09^H>NZSZ)<yaau-g1#W2gBnXNre7?ID_p^@#fU2=4x`ze_RTQ#{Lz0E3u9l7Ow
z@||=i>#Rs%rYRsl0gs)fULmQhyfk=`)D)Ur+y(Dvb)-s~WLi|6*X)m7-L-tyA3+bw
zNVOw)_e7mO=Je7_s<WZs3FeMZAO}r-ePx=iU%u&~)!54zMi)gV-KkN^3bBNx7Suw5
zBIw@}2u&L?aKgn_?!`BRT-Kk)6a36}?2qB>KtdS)ixAsiq4+j&el#7cg~+qg$fF&y
zFJp4cYe|1-g_|@5>&<?lWJx=ezoP;QUp&&B=(rKFzkzMcvoz7q%m*T=!rvQGb{IL0
zUgAx562^%D3`fM3RuRr!zFJ0!yV9N$k`rC8cHHs0UGS#c|MZ=NLNt>`n%#*IZ^uH(
zZaGK8l2+D&83a{_V`@L)niM=qAJbt}=LR%V1l&aFXJNI(+i2e&p5K_<hIATU!QHUg
zcz<%oJj09LH1oXf^%t~&{%oEdBLD~EE_51sb$%fy<bhrWj-|P>iRRo-#cDx6recel
z)Aw2zBVemz=<+YQ3S_<gaF`3(AJ}|{P1rAHbqe6P9II_wi;Z5pOC#Id93rKbo=H%e
zoORDT?C%j&LJ%5vzh)W>qw3PC%HeF at c8lNA+hmGrwE#FK=S*XmBrJNd+iy9`-kRQR
zaB<MUdbHu6bIV8KlYX>t4*-eo|8)6=H<de3F&x8TIbJKIuz)1iT=Mq6(Ix*QG;q_y
zaB0nA*hbJz?8lq!692ZmRG1w>?HE!->$Bf*{^aFkj^<Mn at lc^YQEw65JTb}SslDYd
zZ<o~%Rf?FS$hqSgI!MfEo>$C!K++Cz8>Ug)`e at 7fW;G<y)<}zjhS9 at CRqfGW*xHao
z{e2_JkhS`d{AIX3kFiw<eJE{MYI?r&wMIHD>tOp>w>Ov)Hk;IS*K5djBg1yVBejlH
zFiiLK-XOZ&F!&}lWtFn-O&uoLgtH*hml~jDjDDIb#41`45<WqC)`X{X_7EQzsq^h+
zcWd9c=!?_PEqkt)idFEqYMf&)x2$PZ&qG{sJ9}w!^Vds`268F<k81X)`y(38H#tA*
zOmvtCuL|3KFmpxb4?hIZK7Fduz)AOpvnTbHy>2Br!K<R1EFBuwW(<6)Dg7Pb*99oh
zk$Fp{J{DG39x+O!nNm=GmS{LH at jW|%`8`2s?ZeWcu-+#Xuc88`!r#5?-P?Ppg;gQD
z*caLNl at y>RgfzNW6BR-4Xw#9n|A?+_Frc!kik51W3Jvd95V9&rOkXkP9ILR;c~Dz>
zenTr0IA@(c at Gj~{?et#iE7o_P%xX>W-X$X5dQ=*8!XgUrSw=@cCWgGDjhahge*e+G
zAS6ZeT_Q~kn at pg!P9kE+h!#gz<3lpBuCB!)?!AN}W-aZ)J at 3wEM-Y)i)ISM6$Mne2
zXkuAe*>!heh~hx9TFyjTi=p?0hW%n0QIHh{VK_EFC2wZKb^^bfa+y>@t_ti+`&?V&
zAv32lF%DMFmdyARXYXr?*UEOb-l=J|9UTPW%hmH`Z01_G`D~_IJo7pTYPQKKa~Bs~
z2e~p|c4*<<EYN6dAucAS#_G+e(>>+CAne4h`wwV=HN;WdC?Y at B(B2QW;apE{Q at _^W
zqCTibQU0lI^~l at rQ-6NTFMLVjnvRZ`fq|`-Q|%mZNo=QU7dt11nG5%GJB({xjpUCK
zBqY7servI+V_*<6VX3iiiA%3v#qO252n-iF68)J2j+!*6ivIfb$>sZRZy`UPDpX>%
zEJ8rcR3Wve?kf_9GnIZkOGz-Mkt+%QG+j;DHl4H<RzT&qhq%G`HZZn=5K;h!9IyWF
zo|ZPTVI=MPBU&m#$*8J(<!7SuRq+mqNe_$gwVq_cDn`%0meRi>CwU^D4y*I77Hw8a
zXF5(sfFz5beHOd8 at xuTe!Cuh#<GhU}m~-pu{?WQ4^vgboS!AWE<&du81Al|oZX!qj
z53OfKDK!Sl(myTxcYpOqH&SIkr=gO?*8dH$mSyg^r(lMgYTrO{q+9bUQ_zeV$E`l`
zi90#=ByEv3JxgIkE8K%i<o&_>=ZtEY$b3I8lq6K?$c-^I$1&87q2M=3&Yx>1R+&^_
zmO9u~Lm!rI**<cZ%>DcHG%fdm&vXOHKI~h(c2~ODa&g<9TJQO~LbVBtGB`0YM-QAn
zbCa-gq`VdPFIoj~=q-jS=;cL@**jxVx{RPNf>bWKDagoeEi;PB+M;9(4Txnq#s8!K
zl5oRTGSC`Pm at IFQSSH3ehmw|3UdD3(KTY$sMWhegLsQ038ylwZ!`|J^*555Q=4s>t
z79AwTlu+rz(FJC>^$@q_O4j6%Am%=Ry*XkUP@;_QuhnW|Vaz{61f4#_5TjB at v;|to
zwT;?wgldoa{g+(SZ;M_+8v8ve|1x5KV72f;K=>Pc7Vj!vQ7wJ*RXe&`XFHGWzbP(0
zQ0_p(RsrMETc1DCM3pV34l{&fD<~XTCNwyW1TqZq7;t!wnrADMJts?BcW0!b#Ha#v
zjFk5vzn<DnZ8+1Xc($&3iGl+LWJLU2^&AY0-;SrDCQJ(YD%B^eB60oB9`}d7BhiTr
zgO0w@)e%qgD|ERbPT?(ozfqc%)wkls^7KA!nS~+7>HrF!U?!a2ira=aIyvT5+F9tj
zxnpOdW`7p?k7AJl#Y4F#9=bmrOF#0kdXQSVOxY`l8R<Ktj%5>3FRRu>BHN<g5G;gt
z%wFwGGBH;RMjMUs^fO7KXQ=-rNBjuR^g at 2OrJ<n+r6}W&(a2TXWj|E?{qF3{b^i8j
zZVkgi#!&5;E_^GuvL}aH?qJ#{uv_5V2L)~8rpwf{G*f@)C)IbGq at VnJh!i*=P5Wz+
zxU{S2FF6?biEsilt at ie-YZ1=ph1+)}%&5icpTFj*J at 2%;ZbVT=8sRi|7il|(yn}O~
zs>y&{^q#;^?c6 at _A&8W$+CX7%==Wys(418x`(LP$4<;_N8p`T|B&Vk6%Q;37r+}(M
zkA__g+LkKjp>Q9U%cST9L~w5Yg)@cir2jVoq at 9qd>uPSJM8R42 at a&?1tuFU=kX4*F
z7fZX{;q9UehQc=@I$RFq4*8JGPL}fLP(7KwC+0)Gg9y5r0VT3?%Y<BZK`LM}bdrLx
zwK?S|Rly$|7Qj~*n5 at RXP}x*LwB0fENh3Jzt2y(`YL|<Lmn~DfqfW_xrA8oEF(4~E
zQ?VFBnde50K3!(wc3e784)3eoXc3|!<jYjCV{}XdCXEzvyq<Iy+cpFILONYxWGGt!
zu at A?;qcB{rYHP&ib0ZY|*tF#riRXbf7=BN at 9f%DUJrQne2Y-sMU9!I(&FR!JXn0MG
z-(A}gBesU5qZ%7?@i=C`)iv<fDu0a0!L;~-$*_wzTI%r77lg91Lp+yoCQfh^r=!Oo
zO|;&iX9?u0XqO0gD|w~l)Bm+U{!1SP=DU3sTU5EZxmkb_AbGPQYO=?RjJXq%VW;0W
zlc<`%e`nx3cPd1x5xleTuAV<w=0Ms-8gr35VTN<Oi;)BT4i?D#D`5bm4r!c!)G^wu
zNgUj8ppf1BUP$ooxMguMb1V!I9mBA^7YOJOr$OBq0|OR^++4OuuvIsDgGez$@Pc1~
zLXL(JE{G`LEltgG8qcLBH=x;fJmMchE0+=t?!>ULFq1|-P4m~<j4$XSWk(#Xx-Rr9
zwFn+Ru3Q8ZwH(H at Y`p-#qs at B}u<TDn>qrD8c(?Ug?KgkXY7^;f)6L2i5T|4&qYhc^
zkGRjqrgNI>)De2QY-kI*FWEg-eMbln!@WiV{aiPAfC$i9l*r{q-vd$Oi}MzTD6I64
zAoCfk>t-Y#S947OCj#%(dw-$`^=Aw)?s0eivO1gOpC|8sm1pRqSx)@%58u+$yJu&U
zZ9gyA^TT02rIoKW{TDA`dTUx~Yivl24l6x9U3JY%!Nr#c19?FH64%T502rOj#V)5R
zq4Gfg!)KJ^0*ww?cRR<njK*fIXV8*$XSPCg58#3iHmePM6a+{ci*1WeI|Xl%wm9#;
zG2qZ%sXflU!`IH#hc>Zuazc0TN?Z<t<DEYmzl6}_PKApYUY+#FY5s&{_4S>O6rt{r
z2TYjbH&%|SBtQNar1_tK*Ae9S3b6tA*>DzgM&5c55D=`NLWgP=?Q8TZf7IstHR)Bl
z<jx#U4Ng=^U^HywjYz+J5Jm!oi-+fed7h1(y$5zaKoJmms=e9N&>-!yJlMjLOCte{
z2 at J&I14adA?k;H%bZ0wD_~;#jmdhjxvC=<meLh1VF$x~mclxWw|BHVAqfZjMYmV9N
zlHe&=Fb2$;vz1X%AreR5xxEz-c-EYd3qlF``1oLU%*Lq~2E?ixT-%3ZloR;Rpe3IH
zmTgA76n|wC$XhoaKs{f=a6fLn2Qx-T00;c122CC#Q~YfVUaS5lKRQN&v5lBn`1A&B
zcV#n1f3#-L*pxeLfXF<)b<LmI4Z*y|w$vxU_OQgKa at CMW&CA&&%}ny>Bx;ZY0px{*
z<nROlBc?f;`AgfF*fHVX_U-2X`2QFk6Ed at K?bymP(F~_;)e&BDSw94oZ<SaZZ|sb{
z#3*3&^NmNSH0sdvPgQcKN(K+*A?TtZV at hzNffEKVdsc-mL86*p-txW(_{TZIglUe9
z{^B$)l=3dVbs2W!zbFFwG3*!IJXanYm5SKkv}d|&md$eiA?^BKy9lPdK=|!G?k at Rz
z*`V)Pz<knmOwEER#l#`E0!#nMQ2fgp{dY~&>JOT3jY_ml9H>W at br=S4 at Bj$3`~N>j
z{lAr)^+7$u!}$NS0{^YL+&ua$$xIT2k=$XNH=KJePUMRpuTuVRUFHY+ZRLR>4ZqHJ
zv=~Vhz8cAshoP#p@=r;gsoLS#PP}7JdH63X&i|^rInSG7RdVeeby|`RN~F)ncz_s=
zRuRv=XJwzH|3&ZkU)s;+__B_6X{bsfJw{7IBK_(Krl5ZjsP_i%*}t{hpWP=-qhfc5
z5jbETBf;=9Fh$C!awXlr_xPzNM`KRT{C>1-A+wIIuH at Snnq}+>ljQ&Y+mXv-?&6r|
z^mTPjar07_?)~fP{uND~j+hm!X=7xz4?`nG{;fOGn at Mt&FfuE^Kh;(LEoSXs9l%I)
zSF`E<{R_&H=PtOkf$wOEF_Zm|V!@CWJK^6y8~Fb}TloKM4i<EAO+E!!nBAM1nR&xh
z%&v18*4%ED`LM^ar$5WLy}cH<qL;^FD1$Oyb^Z=N#ZZet==^0SSJ-%T%WP)^w-vFJ
zC0_AexwoUazq77ki}?dbPl2<CxiitlRTNp)IlYmTZY at F#v~{c5qgYGnEfpLq8D}NO
zpie>52mL_}lV5n|l)QqTgs$>njn$>YgiB1x3TzbczdT}O`%=XDm4Z?Xs6eYXJw1OP
z@$8J0+CwF;vXXL4#7FhP|Lm#|xTzIIz~)<9xX+G8P1kp#Bg0#{*6&J0on4Q6!|a}#
z+W(Nz$mJvI{P^xucjO+Bgv!)!Tj$_B(=exlkJr7gXx?|TM>I$1SA6pjWMknER>53U
zfw?((qL_raxx~Xb#qLJ-&Jl^2=AqeI4#7*>%T^!UN6V|NZ-+^qLE(7Jf;=hW;*v~%
z8>sWhQqkRK6zw6N&WA{?iFZEm(EF8I<Nisi+R6CJA5=KxBwj#n^GnKjIn+<De37^*
zQ`LAiq}7A(O<uWP{8H703&v&p?{VdPI$*=*vX|^MieI{X5K?H03G{o~V``6{TjIQE
zYj%HCs~Pd|iz196>2=JJp4bnO?X#b(>;)~K#>VqK5u&yPuOuZVXL+DIF$^>;)a9k+
z2Xc~!9a%P{0}Cx~%RGSBZoHVT;}=q;N36x?7$)9tdiypo=rz)-2}qcl$J1p>-oAAR
z$zEOpyAP8j<x>VT3-TwSsOef&-HT|Lid``XY at 7f7p`a;Vdb8|5{x5)(w00$Rqv1`5
zQ=Kn{SmN_~WJ#0AAAUPg8%qsdjA&E(xewoIa&#anoafkqH`Y{~KhkV)e^*^S*gxr^
z^^Ya>FqL}|0B2!Tax=u;f%~|Rpy#jjVysImEeA~+u?)?>v=-r;Ct*4GGrIH5y|0E8
zwk-v8*{}|_efx7Z$JLNwmhmiz)KCfc6YFBw<HH)SnQ`h~t%g}hL4Ku at 1GsHI;3(3f
z5!r={eaohmzV!I#{^ObmSJ1xQ)}`I_FTP^sm4iY4+2(Y!XF^}$;T95Fh53dv+7aaY
zwvrBf`*sfg*fGyJiF2eB{Mlzz4WpOzQn6}9f5q)BJs)@I&W&DxsW}(XaISs$x=ZH1
z*@&6b_Ni(D;-i(E?t0g-b>0-q*^K)hYu|58lRY>K>VT?~qLlsZtJDCxtTKVJ<(x{Y
zp#<Z17H}?(vg|aB(?p*0m3Pj_E~|HWF4(Jm>=A9$ek^0h;#MqN>1^}RJh(LT(d$iv
z{;`y2I~i{4tD``YPm|r@%s!4Pc^^iABK#2oPJ*=e()Th|m%X>sA9$p46}K^|ey;h!
z`19ASs8M;$t`{QAa8+PVAh6(;!r=H at 0`ER`-Y{2m=*zDIZ`KcABQa|q`n||s&EN-3
zKQH{eE>-a~*<)V(eUdCJQ{aG{GFR%W-*|lrbmz3<9zHa&Cj|0>CSNfU{#CNW+h5JR
zqEdoUN<b0QN*J%e;GC;WqXw7H=U@%jjYUCht`{YTi+c|)1T`}MLg%UCIa%H5gXW)g
zqYp&KXSa2(1fvMtcD%U?FK76gBLw(h3wE*RI!jMr#C0nIGUWPu(?90}FN=L{jI^SQ
z<DSHtk`79H>K_<cTK6?%ZNF at Kp=P`sRQuo=fh%&ZQHi{EC~k7i6Tl0AhcyxSPs~yi
zd#Dsv(tWXSpANYc#8wR`E0ll9Dy1*brvC$42j!Uqr$RO8_8RjH54HISlnf(oT+CLk
zwIKp|oMTry+sDN%sk)cO9wHszyy6te=e*|m-Mh`2^ZN4oOQ~PJj at srbZeLb4Hmn3%
z at p~w}yI~}*cy0a5FPFc8Vk7q67mZ9|*||CRj(*?TqY>e>=>kY$m&h9W!#~VG6Pd^_
zfMN>Y6GQ&L`@HWJt^J`nXc)quU*7&msnN%ShPI&H$Vk{=Ev&1HaJF0_a({Z-O4=7Y
zQ?MbXHL&z0`xz?ilEd9|_?fgnc14*YZ)?0yCv~IJORg8~KWSC++F;V9N%G%g@?WNA
zU~;po{?<+jv3;peq_M_5=H45x(y9DOon}<2T54;Xp6+FInsYFZxR-8SuDQ%lff4>I
zMf1Biz8z60-Jkw7nX0J2RGtsfHuu4nCx7JHw7_8Z1-7Bg%gdTmMm>~KMbS~g278$X
z2yrP^H?q_difii<>R?CzZrG9fZmRQJAf`DJR{IBHX<xZ%`I^@tih#Fe7LG3yHR85<
zpEhRH9O<>)X8E;v at Z?l!qCd5T+B*R9jg0&EL~8f*If>ryn8x%c_9VDT2WNvRI<y?r
z5k9LgQk3%KPOwgNEw|bf1zmgzEnFG@@P^3<QBD*!Y0mS-^TsMJk2QC)3^{b-3zKa;
z+)AgT_zb;0fFC^4;~ml{cOy<Qbn|NGX-d9s+}52nOiQECp6m_hdXsWZ!wXfs5>+0S
zJ*l4{1O!-Mb5pc&S2Q6nV})i{$<shIL!U_GaZRQ?lKjNQdNU}aTCL-Fk4dZ_cPsk4
zD~Y}D`3g*q4WBiSh2W_<e<n9q-{x;batiXt6ze`O2}&|Q)2TJjRkG-J0_+Qi*Zmfd
zac8;O*u!<FjNM6?Xu;eHfNpoW&O5JgLU&J=!N(#-S^Mh8`C(0t<cOukP9^@1v)h+>
z?779&6wA?i(|IfP?Xf%mhrREPYO3q{ynu*EQ$c!B5fJIpJBWbvCcXC(s`QQxL at 5da
z(vc3KLqab~6X_5L5Q++f8hQ_9E<W$`z0dcq`DbR$KeJ}CvQ{qPo^$uvd!Jo?XP=Wb
zr%1_$>~`Ec?>;6v=|YDm at a145t+3^uke~)?!J;`91?q&5F`qUfi)>S&Sz at l`jWzA)
z`WQ!{@W?sqad%MP{jMz+#snup<|l_{qc;x1Czz#HQ9}hz#S!vX5~J6HirrSjh7l1$
zaxe+Tdp9zyw at X~&tUFJ%P=W;5r&P4WRlf}9Ufv88S*wpLA+PX4JT`9>*Qft4w`V57
zcQtEAF*Kr+BuADk*qhF(ynib at M~^HxnCaV(j_M4x=Rn&m5@>FrWnJu<9TuhD3qbg&
zT2FSc(qgPDr(Qb>89F}Q=aj6E9phrIbjfzUE<}A(k1c+m+EWqd^|1X=_oD{}1ia&V
zL|_-zW}ScyxoDoWLZGv<EymSCB?YXerR>s#B6DmzNbdYdOm|GIl9$JEEf0(497<mm
z%K7=0u*;c)&DMG)IRN7P`@a8nzB3T{4#(^H!-FW%ScX9d)fRp>!K)GD6(1!^Ho6S-
zR6E3&+<**KURcf5EO{XSYCl#|`vukhy!F$$xInO0VrmNS{fK*Zxbj;1GqEq3+j)yO
zuNZdrcga%F`-i1wd`{L8F6iKUBb!X{G=>l?|8A%GVJ75r<NatOnv=jbx&S<$Mkd}=
z=))<gL|`tHys(wnrht^p*B+X>XLu7)clS+<I`aaA66Hn|tZvcmK8h}5*`?sW!gP&r
ziF`C4!?vz>pxR5&BdX?sv01mivB|iiDBG-S_HZC1G=KObOfB!i%{Oqq>jH+V+(FXy
z`_+oKvhD;7d|5wKTa=o}>XC~1Hqo*1#uG;rWsEI>*}`pV9Bm8*qli<^4x|#l2vU(Q
z?Tg=mm{- at --bvN%6Nx`mujwY1 at eo_|4VM)Zs9x>~2trdkVmsku?Y}>^s-&n^ZiZJR
z(1h>Lu(xzq1qrkGJdTPjzcm;xwb-a6G`m17>+>|i2x(F)yAe_4i97brkqtRB#2_xL
zFhx6LXETR%CUlpaC>6%m#}$$T=!VtBi2 at pvzmt$(gdOqLK!f7K#gzEuLRkalRXNGk
zwKYrL?<#S{s9$Q^5(Qgnr>a>K&My;IDlEzx83Tfe66fjURE(HM?$LeR=Ff;ca9W0n
z-}&yXU&~JRiE7gG_!c8C6Wj+H&tHn;uo74OaFv7?fy|k;&@_*FUVWj*Npz3Js$nOx
zl6w+RJ;t5ZtxLmAd<iY?Nj!?fx4RW>`LOu2R|;`{-BK0HXFu9 at g|t+i>JkBhoSo0w
zAud-fPPg0Q#@?vZGX3f|>hD#wsg7jeFI<gDma$9|os6|lna_-88|W{d^iZw#iFA2)
zZu_nHN^CE_zCysy{RzvBO~ufQJ9hMtAcq7Abh$THXCvn5RfR~NU<ZF^^)|vUe7?7L
zUN6~dI%vKxSDbkej--k|3hAr~*s6-deEuEe2Y*h at qo1PrOf)KKalO+%H9j-+b0NPD
zQ at 1NwH?b#&xZ7IEaEVLRd2Dyzc3~#hm|m40iB6qVM*FKCp>6sfA#<NLUlATkdZf@;
zo4#V;oL8<N9HX-+EKjW7$k%NzRM}-ESd^0Ddgp&e`h6Vf3T3kn%rV{P^wbKRl`pOO
z>hQv0MfuThz at nkqsAbcBy!sR7s6xJfR;P-dD|^Q at Ziq)dRiXt$=>2FON_gP#`_eJ9
zCaM*@IFV%UfKk0Ka0cLN_xITCSOYMW)Q#dpx!mA_6u0$cK|rt|t<e<Uqvo{y3|Kmc
zQMydugPEsjiN6!piqWkO>M$pvSMnKAW5QtWp=KMXNHB$Jv?OCowTL7q!Ym9<nUXb2
zCBDg;F;DLTO2*cPKW at GI`Z+RbB7_oe=$0E$MQFg4A}}>IB|bDf8*|rxWIAEUM}S^I
zguc^`ChVQZ$4AzxLb}&e(o>!jh7Y^Mr~OKp%mp`(oGj!eBqaLbZ9P%I8_G#}|IP!E
zv)vT+Bd*uF-S6;(Gv$PFu^UK>({2*DCyd9tnjYaebS0jhKcXMpBXY=3I#`O4e^jMJ
z)vG;fbvvmT3pyEMbjh}=3(zGEp7AlQ9sS}Kid<*ps#P|182PpvZ%n|p(L+2<!&@PJ
zQB_ at pO(>BUzH|ldzfULzh;0XezHvns=>E+1jV{;jsGrU*`60tkDdgmKAMk%3TcV{z
z43w|f-cR)>wQY6FZ=tH><dJken9)v}hC>e<e7wABasoNQomzs4R)-#Z<#RZbC&lNZ
z>}r8>>Fj-){>Lt9I1WkzD5rUnHi7*?HG5I1hNzYpQZH}sFHk5E14FO at DaRbkRG%>L
z_8vXuuT)!aI7`#YOPa>3eR<UFs&i`A2UiMI&$;!9yB7THVm{`n at U0L#tSyK4AU?VW
zQF~e|)YJ+T4xWw*Q{QFn6g%|92ND&HY^rJgMkl_NeT at +S*2rhOsJ&x*2HmZa31`5Z
zk|fxJT(_}^!DVLjtzELgcVmI8cTyepCI!3VP_I`h&fae3_<Z|mH>gmoVGWE|JL6%V
z^i3h}@DyC{rV0C at 4dcT!^+|>&=5urM#AX?lN62E`ceXCGRfMmxb;HhykP0A66?lNE
zB)o6*K2ho*4dxs1vUq#D$|sWfewxT+?8|sZ;w(YhFy$Hf6l>-K|9&CSM%8%JLTYX!
zJl at 34??0#<5-HkwcoY-W6c#@(EavZMk6Y__*pc^svKdsKF2t#`drB&?yxBbw#69 at t
zeRffcxmk8vMOXj41=<25(NVJ9Hv`zrQ at V}NxPAUCN;myfRiL-5v~p=ueu20t$?YQa
zVB?}OQhab%GPLcK>-Y_}JzaG4ZkNR!nd$Tmb>G0{b)Q&a{`kAT$r<~T at r+gcMC+V)
zlRS~_8&(?(Y{>TCchONa<`GwE>FMjON4w at KQHjhiWZ+ZZ%-_6u<MIZ1_C;A+sW{HY
zxXStXSY#>qiF48FZc$wCI7g;N at Z%mA;}qS=NyhYLI4Q(*Jb|^g?096Up&<No^3((Q
z=o>KCC*1=F%LdMtDV$hU$;6K`GMj>aoXoV=qkRNkb3OtaVx{wvpUxU+8aG%7G^O~T
z>~K>fOA}?+eA`!BJmi|s-Nymm%vQWAxM1%&YahhFb}_$l*uvN9y1U<WokA_ at bijc(
z#NK9IV;qTk&y{AIUPVXST&j}9?KmNAb;_-DB1tKf-z7A0#@M^l$Sx=tbN^zn35Fk5
zIs76gF+ZACC+zHI=@o*p=^*_`*G|_W%PT&W7;2p`<hj|$TRCjWxWoVurd<WYZJTJ`
zqjfFxb=Pceo>{F+uQT*p57F7p>FV#JbM at +BBK{%npgQ(QVNx`-Vk<xB2wFRxxiXTc
z;2nFi at V;DoB1@~$*u^m4cxHn^- at U8cb=Pj0>lJ?wN~oWV4pZvpgsht at ALib*TaPwH
z7q&hDsNFPztHXnF at Ppf(idt=AcnQ1RN<w{ypvhSp7<B(|#1c6(z#~{w=sN+`6gaqB
z!FR@}2B9FT^)aO$gMGyJ$Gtn#WX)Z5gUrk7uxo8NQe202r at wf>gueZ=Yr_j*s0yRQ
zAiE!<x-9AW<dcU6Y~pP3s&_xbBfT#$)qXExU@*40zqU}z_fAV&XJm|M=|jFpm}lLe
z6sXKt at CD+7T|GUb6rUecB76p24A;N0Qgdhmbz4VY6xhZ?H0s8FeiF?t(I^mmNlU_6
z?E9Tb`fArpp2>kFF}${F$$--B$N;?e4RaX2&HiPL*N`;{wn%va1;lT{p84dF$lWen
zma<L+oaN-e16dOE72nj6R-oWsLF@|^B7na}D-Jy!OJPjkd7H^Q#XqyC`w^wtMsa8^
zw&jC at q|V9KOFpsDr0#?;<UZq%fEiWJ60Nxrmdr)5;G!bqk4Mc~JS(o{`uvG&4*C|I
zK8Un^u?*xKjv*?=Hq^3Q^fuh^RZG~*7FkcN4+aiN%WIeo5Bygl-pTKyOq|v=MNkKx
ze$Ayrh4l}E-YcBR;y2BpHxqr{aG{)6s1xTlbtCFUbUocPeOkL8UAQXWRu>~!S>lfX
zcxN{{l!v%xq_|Rlt>)$X_ at Ck62emg0Tbz=8OLnkYKw~y6 at gEPT&2kjwoCRaX-_(Pr
zI);r at fQpwObNWgrdv$Cg$haM6jQ~;DWXh#92ys{$QFY!|LXlC9(*@8CIzFO0etYFA
zIrO2~BiGZ}HQyr{dSm>$FYJ8#%Ofm;zEP>doEoz}CCx1xbV`>Br{8w!^^pQlzK#v#
zg6gF()miD3d<&To+Dy1DE`@22491V>Co4lo%mm?w#R(uVN~&@K(30&+2_?LgZ^aPm
zrvU?zfunYFX$32^I)OP2;}#@9G`5!ITW->JTZe&?w at EkW`-c*T8q}j7`^CmZZe<EN
zUkU3u<V&OXPeWu{tGV(Etj9x?M!wa|iqDa^l4TS?I&KX$X}d*;7iE@@Nsl-LIjvd*
zeM(C^F|!%OlTEMt5G3WB9$E;I>V38uwKSTasdVV28XQ9dj7Kjw6OGTKBbjQW)5w`~
zLke{g55JdHziRmH?>Glvlpo9A!#qQ#_18GCVAvpZEK2XYtk_A&d+t6C56*A3cMd at h
zNY^lYF(6JZPqix?pD00JUGv^_J#8pR$eQXO^RosE-wFzI6D+L84v)^`%I1$x89vAv
z^KbB+rOXTk$*JupY6Wt9J-R62D_e<na(a5Ik>!jUJP!!G>!yDy6`a&}Q7<Ir=IUju
zz`)+!n#VD^S;^U&s!cr_8LgGDvNXCvPtyuTcZ<h`v<l7CS#H#t&EM>i_7h&gCatC-
z)`V*rX!Wa)TLkj&*oT(iKOChtHFT?&z6&ae=5 at FpP^UM1yR at X_!7b1?eolD$1YA|w
zm8|Fs1bnVUwLQE=3SmLcDC$!XM%-5Nm(9xIV+RB>OWsa07Qn-iRhvzbPOiW5SnZSc
zoO}G2puHR^#wL0h>d`gy;|Zy;h~Jg3b<l`~AL8Rh at 3kb&O~!W@^&L|yZU^UmfBx*_
z#BL5pO7Bql9<tmc)L7GISR^x^s2Bb#=~MZxV|W(&_#LO>{`7`{+g at 4+s`2+k=H60S
zrQ76`2qdb)%gE8+1sjyNq{4B~?L<`3>dHD7(^jXB8Z3w^bN*?RxHN~OjfUIJW^QBK
zwqcJpktr*_s)^?|!OdsT%hC88nN}UlXCC|Nm^cVXWqX=tYn66vx^b}6YKg2&bWMGn
zKky7H at 7Nd=7ikp?oxPk>`%|+x7JN^l0ABC?j{WPTsmwI1sPuy8vLjV|`#a9D>N7;&
zZ)cWG6~JNB=cMvA*$umr0WL(*FZ)`P8vMJhW8A$8X81jq-WKM}THa+ at r_K?Mazvn(
z^a40mT^e##`d>ka4ROE+mBs?@rFysxGl=YM%@8TZD+F%P$`yql6!sHFMu>!Qt%PJ9
zncmgzG5G8-%Y&D<VFHqf2ve3*Gjp?{Nbs4MZ*Pr!_O9dJB$;&>iJp}?D9HAb4{~yB
zstl$ay at o}MOk_)(T}XmsvQW7TTme79mohcZoy$*9FTPy^Kr+Br*ewO%+Mg at n6ECjJ
zUsqYLZvwb~U9v<0H~zYMV0k6%uPYfs=KtU2|0BGVA=T42UtR1)7;*VjU$+^{FXyTK
z3MX=Ggwy>|23(mtjY;idhPrvh2(b`DqE1(1oYxWM`G>G#<!&Ayr<{-WcWX_bqF^(B
zZhv|uOvXnY$D&{N&HEWR?zPy-2-D+h5=8Zw$5UmP%hQShnR~#MDo=Wxx>4M==)>9%
zDDGU$l<S|?_ra%$<I3Q+x%@AE(I|K|3<`xB&0JM!7lZLLS?d3jB%3NZ+_t1065rL;
zPS0Xdv-DG(mIfoig25Fhs7gz6lBhF8_N+_ at R&VmWv$#|(-I_lxcMI{^hzFUES at P>w
zGHse-)lkP)7?=*ZFL9Yl_-c1U<J%)v=h<`v>vh}7C&%yhPun%84Zkwh_ijM@?HoX3
z*Ss*c_2Fza`4SvVE at tV&ui)?}fjX$BhOBd;R3RqmqWAi4c}z=V_>y(rhHN?mD*M~C
z>5YE6WD@)XE<Kb$OPW?I)DTtxd6wRQIk6+rC}F<$qt{<!?X3jal-KrjPp*%iE)%lH
zbANmH^ttKffSXNYm86<JmCxn%!jWb3V*U+!{k4n^R+goayJ%B#7DuPPypvq(AnkVe
zivQgKzDtH at E#S2ko$HNF1iSkdrcCLn*_`yzZ6G}wk){~rR;i~bW`1u`-S)zuxwsO3
zvY>fSPB*iKGgIf*uOaljes>M;cnV5NU6 at 1e3B1T91Uy}ERJ3$6jaO*Vv3KQI5LRnL
z$0dRv#+JHB(`bttK!_P`{@{D?W1g?Z$1+=|0O~n`?t#*7xS8op=ze!`Lt4j?L7IKi
z%iMZ@*?aAlMUEwP-|sIxHi7l~KoFT;Kd*bn{4r|bw at 3l~vCw_50jB5iYq??t^a==(
zH?ok@(b`8>2#B0uXG3YtGiN at 8GK{G8G(2bRR4C;6_30?FGBg}5DAB4s220162q`uE
zmMy{5Zm=6%`<ztoQKH&^QE}G42GTM5+4_~xVT#|5Q)*d;&y-oT?G+2lfo-GGJ}d%-
zf^N$^2&Ln)9rh<VJSeX9HTe3pk`51K>Yda$5+I^HWBO+VmUbUSLeQ&E{Y*D+exJ<Q
z=Y}41J_0?B3urhgCv^+e=DP%~)%s(CiK$As1oa~rW-IYU!s945%tsx{qY`L+Za+t%
z_CGItooHxpHAv+~#ax*-LUtGc23ej>cKi*&VCku8LvFZ_o0L!;UP)o?q=;RTtB5J`
zQn=2yS!jT=6Ia{gupn(16;JVjNg`PXn~Q?;;+|!#QNf at oqI1gAP%(2R<td}?e6L7!
zolyaVr?}-jTixz+gMsOqa*Mrr4AT%a7MVNa%K?i)9u_ccTEUOO1Az at QtA9zM0|p>G
zt5%p5PUha2wHIn{wLe%tD5 at 6P{a!rJHn?JSCZ8^z-0q=D*m%7jg9%U-a`MjR>OEIq
zwF+)_(m>h-&Gw)x7ci7(DW8qHD1JUppNH+hglT2R^C<Ci=%x)m%AYdWnR6F45AEi*
z&pYuRjxiXpuebae+*87<VLaZw9#52DDOfh`45_?v&jF^r^8A5<-W|)sqfVjz`)r1*
zZa(K9jDv?CEqaaRjFJwD2k*=NAlTH6hM9V;+ZT9W(@Ye~goNB#qs1jZ(@&QxnNNz}
zjMvW<LLzF}Tcp0Oz7*rJC*+PXM|`%GeU<!6Z^<3b%7W<e8GyL4WbTgPgZ+>?j40qx
zu2OSLe7_-+IsWQXr_wiaGJ2FHy<D#c`vSanjc>9-xBijpo92@{$5Svd{`?c#2p?Uf
zG1%-dg&Mk=GTLBZUVic(CT6Gut<-!0>e!oRCjq$<^hVoNp&CJFC*XnOp2Dlj)-F=L
zj!Pp7uNWZ$3QS^tjoG4(A#pWX=y*~llR?;`)FX at +bY61jghw3zae<&+%lA<y>HWcw
z;tI<?OQX3SI}LT0vPzm^HYKSDcy73Lr-SE|=*RnNE7|i8z98 at kh{;`G^>4(Ir=C|$
zhWz at VszV3madIM$`LerQOe^VrUDZx39q-Y<$3=`RGeW*TgV5ut^#-<lMs^fG)YU~6
zhdw-eaC?2KQsF#?m7f>#srJf-ZLJj{ARhE)b4a;Dyiz)pkX{BHNY;}C6JVKoHO-53
zDOXizVW7wQtY+;9)K3?38rJO67}1cYEfP(4*h`@B9DgT7rY*iY3Y%=G2-rGQLw;B`
z#(e2kBI!oyL<uqZ(qs77Z&c|a8`jN#Qbd*91)TS7mkZ~;)Yk-lK4xgINMTTj5S at z{
z`bn+V9jo%kWJXq={US(T4cd|+tJ1YEV2on9*ix$zeH~wv;~L-e4C<npbWPyBubMz6
zq%j`XOnlr%LAY;gReLw<R&}VpfHZ$ja<cy}<mRy=!PwYX-o}O*Ni3G4s?X1q5MNMA
zqHtrw)%%dtX`1SjCk5qj)ExAe?EG=_t5>uPhYxu(?<$)Sa{N4W@)9{nvGfndd6P3<
z&<C-T%5B at 4@w?+2I8i=y+GOWk+ni0)s{g8a1}&txNH)b8R&{H<uP at 3DEw?>Se*HvX
z8dbU>o2f at JG83>%4L69r3o<sWG<N~F?K}WWwz at P$uMj~#SOA))Kfe($)FB#uM}_c!
zUcaFK0LM$0J0dWaCdWPPAk+l5zhCTI*c+px#>E_#Hnm=15VlQQ&^98LQg+S7hq|9l
zG?uiue*MOV$UYwu;I+MP-as=Z9;Gbsc<wQy+)~AwUjC5wh>AwF+>HcDVEX7%`9GS)
zn0imN%IUHZ1X}B3P at xTiz02^ir0Wsw0mnOeTE8mHj2d)mAXd5wPU7hykFWb-3|`$1
z)wgOWLEZ|HZ`uw-%`ng-FySiOODx4^&0jwRnf43KHRh@$r3f-A$F!rHO}8;qy1^>G
zQ*TGISca-0a at azT+lMe=8^76^Tuk^`^S0xlql<$RGAeKKrg`9LVDpQt0OM8i!E!f!
z1MMtvA7W)|3Ko!Sn(vf30h6J{dG!}6aE%CcX6+Ko=rrkdI~p}+Tf)L`XNFY7hQ@{p
ztD-Q`eKTJ at 8r-_0FPsXgP@W%-S$U(|lD at sQa49q`km1 at JFu)}8nrHj)*_W7K#TrZW
zEz*gl!;>$EAG-!NGLkF(f?W+`mkuT4o|^OBbQ*`~v&uKI+Ff6~?vF9RTict<ovh-J
z5}bTvO_KZ=9v~=yU<)m+<dC}M&N7sKkP;q#b*vz$w1~rl>Dz}|$!3!MeMfV;v`9Nr
z!1(HIx(ez8 at 7!8(?^F`ZyUs7;f!FgBXaEKKtMg}dYm4e(;7Hr_o>}4iEEZ$HP13{q
zJ1C{)A204$)}mKG?}n?X<GkQ|?DBY at lnH?}-j-UT^)g(%1yJVn(>zuw0C-)7Upfc(
z at d15{X@}-s)cZ7{8n>6J!y_;S%6edl8_Gnfz at 62{<S(ON69e!T4f1%e)tm+9O|G1!
z#{V`Y=RYS4e{3fH9G<<AZ}8JwUn$;P2d^!k6rUMgQCFeC#V$L6G0U{VF}^S2Ok+w#
zcav(Y!gj$#rB?sr(St^Zk(!wky7q0yn%Se(jvnmWveyEB!rRSVKAG7ZmT#DE_D8Y7
z$0VqSl<(7rrf1^_8czlLihOW5Y~pduwT`d9^Uf5Qm>4P3DwpPi`E at c$n?++tFWN7E
zQbR^7!2np6uwubJpj}FM<ar%P&rde$^BPCFwxW032RIzd@>Z>dk9eK|b)8e|6aZ^_
ztI5e{2;esvf|IZyWJ{=d-J94vMzo|NrTtk?5~-}=dL6|dFYXYGWAQtEMMBcwni&91
zipku*?W-j}uI#T*J|Kra1`SF<0E19*j2<EXD`C!GslqO!Eq?A)bcWP=f$LKKNgGqs
zOuWTqT^-Bf^L6sKa2E5fM(59D at C=7QmJ=Osen|eB_~e?XLwtZDUZl0Q+w1HioS)IM
zsR?mhI9c8ZW^iy}r8ym7C>+C4E*381L6^3nH=5=xs9C^Uh+eJmY}54CF8jq7O+p6o
z;~JCBPj()4+`R#~<_Wp^0H1^L4GQpS<M7(P(aROc^fUmGcm?<tRkL`!OsLti?k52&
zj=F059%Bf^f at Zg_XPICDd)olVKCPZPH}!jg`?^iKosFz^^(_?ZQy-ykdHA%;i%@)k
z^9E^tGa_J9rZK?{lTR68_wxExdjaw)De2;;BKO at kU3&LWPpDTm9co^?ku=N*KDbbQ
z%0Z(yRdLk^Beh0jFl-S-VfCs at j>9PO2}LDB*-L)DmhSf;O-3v$L0B{c=`XX6TNYxH
z1ecQKyOb<FE<^d?BcooA0E-{Xce*Xsy%Mo+ZLh!j7Dq`h<(!Ey2=9F3sa?U|W(@65
zWd!unpLNMTi(wupd9O~fN-Y*4JV_bqZX!4i&IZ at Z(9Ah)7q%wbg(NYDlaX5MM7;M=
z>+^F4P1yGYmIcWAmUze at _fJpKN#dA8$|wbjt(fAq4HrSd{J9GrE*YXgmrZ%U6%e5l
zn$c9;EVR>3S(=8w6{E$}E<VGwxQ`s91dg^3O~6ZW?)c(dCi(D;I3l3EJqaUSsGpw5
z)=tnH3HLlGhpHR03y;1_DkHx8ElOpKw48rKYl;4bnU{&uDDQZHR)I$5XuW5pSm`Jg
zs!F41+8wBaO*I|kScKy%+*hlof1Hym&vxCHID%ngPEXe~({kTxDdBx-cix9f+1li!
z72L2l%I)wMoS7)>$_A$|V=CwipC?!Y4pdvEYydH~kwG7Db#T81u(02Hb~r<ct>C59
zHqzrApa6VI`GBT1HBtccZ3y8aY_MT at iAPwhJ*WpXp^V*H`eRG$`YxvF4xT0-cWgX=
zJSL;rH1#&&MzJ{YPj9uHSV{O9Ec>2k%}QHeC<R-Vj2#Fn<pf@*1YApnsF;D0VzDwI
z^OHs=?;ndzKUP+Zl{VW!XRkZQ6 at k%PIg(FWhf9nHO>GN~&ujllGO8?-%S>Sh$TG_U
zxGs|Iaf6j9c{P3NOH=XZFso$T>1k-fr_Dt{pk|hN6BJF&^w?INIsfimdA;no5~4T}
zwJ*^RC73?>*63q|Q*^#HupaAI!TKNJR{Vko@$-Wl&>RK%`OCqh`TGa^9#BNuVIa<^
zl|$Z3 at l_;zG6Np;jHdj;3+$J#50^|ayauuR!KS|}-~G`at|L)B+tgx2Wh}m!nlb`z
zG3a8fS*;me{!$DcF}ZIbB$d+}!(pulg-^1~Azps_g|BuTJ{B}AwWZuxV2Fd)R*FFX
zz7iJcDaBWv^(L86vQ9Vim!vH+1D8RLYuPD0K at X}i4)t_?Omx}u#2Yql>6M20J4CIk
zv?~aCR&=r;U+rQEcI>^Mc7~WMzI^n-eV5t?$c~cke9a{h#c at q;u-fVP8o=Cg at Z`wX
zcRHWX5+<ArXDR;aS1u+dhFD9lb-aiYOX1Fo9_U2~ZO(-IH8zpHI{wxo>+R)L2pKZ)
z7O4f?&3xAg0WhBnD=oQ?C*$}SMuV3+{lh1~-b}w-wbjkSuf)F{rA9}hGX%J=)%cI%
zwGn?Uvu0 at JY#gUppjI|=PdiVpcgD*?Xa(R;ANWYJ(j~=0^h-zF6f|E$tVsV5E1akW
z*{@BYs9Y2WY9ubogwKw5a}woceiOO$tsSsL93(dhbLYXB{eQTQ)G54a_9d5HaA_=R
z`10g~Z;{~(hZvkJTiJvY%6#B5voqF;yc#yL`mCUxWZm;r(|_1jT#!2x=cjIj#ShQk
zU$e%dW1`2}_Jg-Yfa!-W+_Tr(OrS<CaGee!FJiSb^}}Xk$Rs`XkN=O4o|=F`r>fdi
zrD_{vAXYJd$fasIn0VMoLaSlKD?G;xaB-}dIX$ZtE_A=2JrpGK3d26?Pv^>U!|Y>C
z_AI&sxt6-&gkXC1fL>2TfO*rRaWUg%WFU#r;h0~JO3wT|?IC`@=D at 9oW(~O~XdnMq
zyYHUdOCbvwn>ESwb7|x$Xra~E>B4IRlZ+FM%PAT5l6?};jH}_ze@~N-71ecFtH3n3
z-M2le2sEPNSM5<Lg`Oq5c}Wk~$7m^cLol1^3BT|f=KJc2Il{zBgHn+~;+Rk({ID at F
z_p=$u0b<t@*#ha~kk+4<!^GA+$(o$hGtJr^YX4$@gaNf4CZ*i8VDWicHVtaS&WxPj
z#9W&KO>b{c(i``UtM?3N_c>YHa+GU{<#x165^WTF!xydYH*zIoh>z6C^|#jH{sS{d
zST9>U-Ut_=$*b=`+{sUZuc|`4&I(Hp4hZPfox;hwzmnHw(l2JJlfH;&3sX0D9-sI$
z|2!3qrk7eD7g)>F8=EuQY&wzy!_NWJad&ud2j`I&^xUKi+oP+iThxF~bCujGJ;rMo
z#RbCIBi^VuZ{X;?6)IOR9OpKH8U_N(0wW{GCTL1vydgh#>oa#|Fa7;7gjs?;*WrU+
zB%dnZaHvWFf4FqFZYZSBfA}qNcgtUPb>7UW&s$IhTl`GdG^f|49pcc9HX-LXH+QC3
zrnjdcDQ1yk8Gr89a=SIfdenjcY8VM^no{Og$~Ayo)<|GsEV}DtucEX?iy=oAKZ0vC
zjEnh158d2=nzmp<j0qQ8i+FdKKASD0D=ycN;PJMdb@*O>kf?xi5t`W;k6Jtr8$P!5
z#Qz=OO|bq=a_y-+w&=$t)84reTnQuOp~_#N+0ZZO&4a^*V6b|`ah7>TBztq;{-}+5
zj;Wc`58-@*#4`!%0|(Zo+1L^uLH=J_7q8Uor>1V9)|o~T-%_Nk+_EtfXc9k~@z?eS
zWMaGC19_lj-s*cD&g7MXg2Y32UvvfO_!B<6UhmR=AkKPx!|e0O#1>w?iCv}}tY>VJ
zXRxC$eCl%&#A?=M1IElpQYZgat<HZ&`F`$kGEIM9pM%t=rdx{l1<Ebl6?T8^WpOp!
z(sBqf+x_wZy(IVUiICI?cf&2d+S@{m$ZDnDy}5kui*VGXCC=jYc?Nu at qHCJF4OkEn
zvgJ?CGLqeH6hx_4)Us4o at wQ&Mv`k#@K@=ZE(z9~?taAW5vAURYrQfsRB)-j^uHf1*
z5Jr3rK)wS3bY&HR8?8%o7_AMfBxuKSYezFF*dB0JyAlSG2l00n`;Zz_5)u-pl^xsA
zNB89ssFA|(a0PF_WHFM<`@F&X_MaOFUI_#L0$&rXV8;)Ia4Q;=b#=$=bc>4flmEu)
zjY)CtT;B7456Z914Wy-}f(KV;|JNIC at kIpu`cf3&>x0byU!(Y6U7XRp(c9Y#MjPOU
zItqC$1ZkNCZ{gzNqSb}b)bL-6KMONEJ5{W#tQ5po1tld*lapyc0XPwi at 9ovR{F(*+
z;~LKUx4;eg(UbnBAG9+kuXcl{yx|dGIq%nFsRY4>v6KFwN)3Kc8^3_}XGjL-gF(%k
z$9E+|&(lCjPQAE&{f&UMbh-Ut20Jw|B^EgvBM-dIKC;C=8J4R`*KT#rd~mP=!d2oQ
z<~EVj(`l4cRQta>iT+T51b3*S(ddOk?EAAd$L at PTM?U1tu4VblggS=;E-nz(k3PhL
z4|sR}CI0eZwBYqM;F8|dvXWubJsIZ$UBjHli2?=ySmy=Lx*W`u<~boyzw8`>*j*YV
z{OjhJz;l-na6m0qnLc0u)_w!f2H7=!58&j+m2qycim()iff^`8j&ny|i^7%*x9#^O
zEgU{K;5tNLn96_iKN=AHA80VOjq`I=+o0@=qd%qj?M8M{KbBZ~_#KyYqQ0I*W93s+
zb>UdkW at iO@YxPua%=>76vYCy2|LNw~A{)K9&sk;JG(DHPi2l;BriFR|cW%(xw?Zek
z80bz=tkinS=<@gZ>?>iOFYxOX@&(1{U>6}nM<H$&{xjIOk$v3X7kvUYo8!9UGtWv)
zpOuL-n(jUksI7B09%Rj2LF}{bOfs<ofDb*c49LnKMpwc*Ve@!xOBsrwZYVM}zQ6gf
zWbB>O;DLkwn#n<dLi<UbtET=bhp0>aVL+@;Is-B-cQzGNr12d3gDP$a+4qbGaYdLz
z1tI!xWBB(SwYr5QfpwkUlH5g6UDn{>r)Ba=CwiG<`wseYGI0o>U<)wNn at vSat+6@3
ztWP>QYN|X#8rdV8V>?<NH6JGKZ%;B}oKj}DLdKm2FvDfl!A_|u9uh6(u&cVhEsD0j
z*Z1S`fVP9jz*F!ykPP1g6?NBu;I6`Aqd}i*K+ehf<Jcdr=vx4H;kt9IlP7&lO+#HF
z7OcAYB91rZeO{U2R#F)=PH$$)J9TRttLqaYli)2^+{Bx8Sf)WOtL0_c{&fa&AyPKD
z5w!*blNxhKTHO5^HwNXClcFyyyAGv=1N4i2Tn`)_jcilt0n!<N2UqJMVis~eJo0Uf
zKKky_yXM0*+&QH==bH)u?cF6vX|=YOd`^Za$uXtCg7J{Uom at z?!bSN}V*kaLp(LL)
zaQ;PJ1K2 at nKyCt*R5%uJz at 0s}p(|qBVi`t6=H0mqB5uLsyjj-51 at Q{<B;IxVMl*F1
zy^+W+g at 9%xEw7?b>9TUWoay#!#K?(e<ABt&P3 at C1eS3TFV#}eRvoNWR>&x at G0PjO&
zvqwTQbH$I<Ztu{8gnQ?a9S&8y!Ntydbe0*`=Jz#_bq`Z<1IiG<RziTdL~&H~P6Kb@
zRLf9!%y9r-+eCepUOLZ1_7bxGgJxg0!k;^}=wF6<Zb-j-&Je$n;Wra+zq<(vix<SM
zS-n7IXAl%T^9MDG?9G1A-TO&w^wPD1RF8`x%PQ-Q139yki%0O6=S6<k{7VG0dRX}V
zq7`lvU)i7aZ){1<xyZiTY)^up8l^cjZyqNIa6$wXT4tPAjj?=vD!@d}VMAPeDYo?0
z_NK1UY|`OoG<2tFa$pxv%)?%cakZ4YZ)N at n+n~`+%LMUahnLG@#5Tth0wa0hRV$IK
zIdL`FiTM#H6&&{+<-z?jtMg^-V}hg|hn~fduOnjEOfsdBoop${yED$cqLNuI{UIsN
z&<%g*s}({zo3C&%VyGN4>^C&kx05aB*oT{3xzbcX7(+Pl0W at P(lsFb1Hvv0hAg4jk
z?aCFV*}XNRZf1T1x&*cpWfwJY-W+ at h|IK4MQdBKDH73Hs?tF at M&QzcA&z at ps-txl)
zXhMy&(icPAZ1)+X^EadzukWuQnh8zo=hcafHs<IB at ZuB`hat?gpRcXT at h@{gnRH!{
zX?pwzER-jb%0vKLL=;e3vi-5lTXHziuCe?G8Jbh=O%Rr`08~`<(Bn9$XGY`O7 at 298
z2dc-T`4}2 at L4}EhXvgi9N at QeBN!VFbH)S0T92Aa|Cu9>9OQ3R$G_0m-2Kl*?*lup5
ziOuDh+RyBC)CxksWNn|0wY at fLw4j&c;#oP@)Re34I=qK|w!08e_@$6S={g8zf2>&z
zEcvlk9hbcgxFe4}@LBL9x{x8n!W00hgZ>P&X}wgI>5^msB{uw+QF8p`Y4-r at OGoo0
z51!5+U5X9k7-Z3j)ULg={5$T|C#OqRkC9fJYecbos^b-v8ce>b%hhXLp-heTuS2}4
z0`{i*MU^<Z5X&HIb(h8yTwA3CE*d+DkJCb=6q0fpw3#5U%=LfIy>C|3J_+ at dX&f**
zVW at RJr8oEcBw$;Ahz|2H_0z7nSpx=aR9C`4H}VMvx}^62uMXf4F2~mJZJWn`gTx6r
zi8Es!cMqqPFTlBjTAm8KDK_^mXhz}MbFL56f&u|<PZ|eE3w_xs&4`O##zSPuVrjAw
zMjL8J&K>dBfc_y4$EiF~+Lb5f2HH;(wr at V4#9EP at m0WBH%6$^cq<JSVC#EZ%ol2UM
z_q;L#81jF<Qrj>okY#F5fPg<xX|s7PDc2j9n7 at A*+;yY+OJL-%Gt&W!!UPS@&oml<
zwmYbX*~9JYp;(kwY>R8{u~-o%!0P^N_r}}Y!qqbBZmwnZ*8yBF-b%=2?1hZw5v1y$
z&OH=**LMxUiSu*v?u at z6x36ks0MC)&ity~5K5kciCfzo5w<It05WHciIily##Uy1M
zg7%0$GclM$b|J5hHGTp!7M$I8s{?G0TN{q98F<<(;A`BgF}~Jy7=OHEJxjbHv6DQP
z;we2`8Qu*i@~bO5?38nW+S}bQPI``^Zs0FmxBwTd+XkNe)2dg`;<?M`Y_N~P8oW!m
zDUXO#bbQQ<4}xNS1XZ8D<4XKFo|`)>j(*$P5Fw@~T=?T8Vmq*QEWnJKIk`-nC&i*E
z<VnuB%stw7u{G~tjo?Yp4H4T139td>Ue7K`ApT@=nhFHFt?Ii`WuTc|%{P}Lg?>dl
zH8TUSnp`dOr#T at x=tS%8)i0pedo-XVP+Z at 6ThiQUc>4GA)4H?w_VU{ITP)<ASO~&6
z;u8CYLn?)+bDHk8bQkk0UMu6~g19=$4^kz~TOx;&V&}hrGwkKp4 at MjH{0AJA0St}S
zs&vu#?`=!%0BR;Krvnd1A=|GX)UE-8(t1yLyjPu_D`WM$-j0a1-b*~R?W=A}E1L<-
zB`0~6Xx-#|(V{+uwD{rB_-Tj-GnZHd?~Me6QG<%kUO&sKyB<t7lsQUPyXZK7GIs*%
zN~VY;LC>dUB*H)>u!&M#BLFPe?gHQ`V%a6~fPu-CFdDozmSE>_9$OOEv00+RMKi0K
zIEvH_k-{%|EWtr=#RR*z)>mji>l$oQU^RB~6b5cJ#ZTmv4VRqXcUAeEd$bI%O7)D?
zvR+c$^9W*M9Gl%+uKrS?27IpPQOC*J9;uiTV_bU at Y=u9i6Kq+E1f9uJ(WpbermLWc
zC1Llyohy{{f~&?ug`s-p5 at sK57#JK>akv_JbE|fJa6sr~Fp%QYO at MYT)@h`QDK=DA
z?)*cUDbq+<HC{31x|0C4(lpcayPp}SlFw+H?XP}D7a5rvY1xPtKixx3L?X{p<r1ax
z%cz?Sak2!QT6iR at s~?JA+HkY30`>0M!RAWGrX{9TL_eF;N(jXT4gV~%NXNyTy{aku
zDZ&*e#Th4S(f<2R#^A~BT}N(S=%8y%_oiF at +Ip4=Q4#ZV3|`xqp|!v-zSO|8<CE!k
z(IxmGf0_TuUpv6Sp8t at C@?MZc+%*D82D0cO&I~9`PGyW>j018~Y9=jOa`0$VXf1`X
zS~hs%$e^WA&F|wqp)*84d9$wPJCDVFQOBNZ7V2KcI^njaj?dRp+(a3}J5CZxFZo-5
z$~iQ86=}-(rf;QaAcv~j&<&tgN<9&?dCl2NBu0rn{OvWO+){Azc&9FNIW$GK(0j_&
zS at wNmmlTS<jl0*=ywP>q+#QUziax&0b at RqBak)6AeQ@(p552fhW3RhW6~(wd3X^%J
zE#NWOU@&Hg70lw;_&{So%S<ncKEr!eeb=;6Dr<t`=iYpUD9%q$rIhq4`nia%LD_Z2
zs6-1_q<3$i-EdmUnsH>TPmOwXtXf{PDE6Tnjzw2ytef4w$JyI5zmn0l=np&Az9$#g
z++q0|I0v7lGr5Fxj;wR&FAKFNR{j|yWzpo*LxQstHwaDF9zom76S>Q8)(IX9QW$)K
zGQ*F)h25-DiZf%;vn{QiK9Uwv+dX~j8t{0>FW>8%iOjd8n$Is at bsBp9*m`Ruao1ns
z#gTGl0=oHE)EnY}y?+%Y^HI?r_c28i+(|%Y7P{QemA{CO3ih}TMD!K)v2Cb23RDzg
zXJVr|<sZQ$-wQ_QR|YOlUNO%+ZUx<@n2(T0X!}!lJs7fkKe^s$yZ9m!v{}?S+u14&
zKAt8_bE!fD3CBi_;CkdTngOgzB>W5=Qt)163ao(+NDL0YHHvFt8lOv+{X$8#H>nmY
z)k6MZThH)a`LnbK%rc(W_ssYU0A!b$J-3ZE0<88vQgDV at p@6N^!l|J5wB7{2q0E`f
zpGS-RGg~?i&(MRBd at 1~YahqlLGwJG&p)`pX_@<2+&&ySanAcSpVarZ}`B>Bpf5oAl
zl`NQX`8 at h}dLR#czN;$g<EAcLPG;01ltq?m_5P{f at 5A$VYHE^#pCp#t282IK=w7n;
zsvZRqPfRkAiilEhu;DA??g2JEobjD(C%UU~Q$fX$fi$0n5{_u}A-BY^r#$~bUM=K4
z-|FCwn|#vmuS(eru>uV*R-z$HI1Z|<YNq&p$jJ$-TXQLQoin98*@QVCi9^Zyiv~Am
zQq?$B?<)2FI^q)(q)<x6ZQ|4zqP<%B-J7lQ!S~A4uM1&pv|7FUcXQN&zjPqXmELhf
zF=#nd%UA;@pVj!)>{F{%I1M-LuTi_JVXu^!e_C<Kg;Emr_5r*?3_i~nJVqY$fhEkl
z!P9KWxV^r!`ytY*^QR4qk2X1y8_E$wo7D}fI6q(3Z>g1-4oEZot9&^~eL7V=B=mC>
zJ36vcBlmW&o*UuIcxsLp-3n2-Kt=q&6U{OPCID^a?Jw{7o?~0n-dnWz`*W++Ouon8
z9mfXs16pi2l`Eyn_kuhO2b0pMW_hP-OP-QKJZ;wA=QunYOwxNE=t{XpSU&!2iQt)!
zC78ej3(alnEJ{luDjV*0BW2sTvj46HKn7%Q58ITRQjb)I(koxDiG%A3=PILII$M%h
zO8BWh)Mv^S+DG{icPb)Wz)EB8Vg0UPV(ZPM<#*_~+4e4Mfa{DjRekT??oC6X5F!21
zR@=(#LGBJp=^jq2m>O6rEiurhF85EbEo|X!2`awg{?z33HyrBgjDTx}Q}FN+;%EQF
z94srhb7euxqe%Dg$xW6G$=XG{wp-RwJN at tqMT7xO{oM~NnpXe|`#b+MpL932v0!hE
zx<XR$W-99S+u}ca^$JcX1*xvtkS^>PddCXZQ|MvvmzIJi7)DIoolKz at w*a)<GvV^s
zLZAC`xOE~0<lZ?At;?qrplaXxr)s}d(_asBE1(2}54(H+eCUK%sQc{3Y|yj2Yh(k5
zx3M*N{~6?4je;1;d&akznuicCs{iQ?un>OpKS;)!@NTCR280_T{+r`{@Xj2rK_N+j
zV&CsQh_uQCt0XJ%{;ek<f<d7MHU<0l)M&#+Fr{tk80MsY3<dE`hku&GJ0QXl*7V<e
z4)_hQ6Z6lc<gy_6J6L`BciMl6TY_q``M=juV?PNXmy({YR-`#lZoat&MiYh8e`VvB
z$mqfhIJL|(iVzz!jiamNNSkqFOwhUP)Y at vpOZkf|RV at l#r at w*^@Md7g6|5DVWDK?-
zKgY~A8#hWHnS9|a-z<VE2b#L*AN+K099w@{Eme3fBPb}S5WMw5%8~IwKqCkniT<;b
zYTP!q+QEs4&_-X#;l{&Y(d6TON$)Z7djRnPB5%LC3JzVyfcVi8#h)zg4?`OJ2?2ZW
z`YHBP{?%85ijQ2a*$BdPFQb1Kt3T=Z9gx1TCe$ZjtH&k5{@R7l=4|Oq0xYGkf&|2p
zYNN9Y)3rbl<!^2ZF$45R0+LPD&_P8zhT4x at KpKhE$3UAWczAfU9 at 4|k4j4>YdX2NS
z&68QSc*9M#&zmVQ5+Lv$<26kRnCH7cc*Y+Nn*PF*DIfS`Pj(R%I8#qwYfS}&h}}Tg
zAeT<Eil^-Y7mJIq_vQ;9=dkWCE^0hmoaj;>3wmyd7k at VbDLuTH@-RVPuei8aSvO&^
z`1EJhOP at iKgJo6SyoaM15a*n#D&>R(pWw;TAI_-!2k(C9{9~{jUVw=BmSaGc?)k?S
zhw~2B<>KMD?cXIE0e4?p+XIWr)2OR<3{&Wq(pCDGJx6cbQ5$=hE2hQD5dCzQE$a1R
z*os^_D+c~cM7QBm1q)yPl@|ZS at W%vUwbIH=!+IfTm1e(TYdX*@uWzo|(*bBB-IW(6
z-?48VA}dQ{Tb>f)*f)+~f87|FoSAd;wM~EdwQL%%ZKv;084O;h9R5kM10Vun+8Nuw
zvj1EDX}_S*sHwCAym`|M4OD0g+Di>5r#$Rl3ffsD?>%7EHC_?;wt<&^yg(kj_hNMU
z+rxU+(%?QhaM0Neu}*u#$@~Y{(o-4xfwW;orr_Ku^o#5WJPP>)pMO5l23S7(9i<j_
z at NpV_$ktkudNu7<Me-swpcneE+;(cK1WSY+_DX;S+(MPlJe!_r^k!u-AtDt(#oSVD
z(6^MrmFe|-EToeUT{XD!I=ir+;}0@<37CKIeM1DiI;nXmDFIc!KDe%UZ9GUS4laoW
zw(#~Rrsv#7Y^k<%i#U!R^O*ImK8L9l`l3}(Arldw#v;$qqCiccx~_}<FdojkY#;T1
zk_^^IoIPH2{AyS)<;zx{ABbgcWG`Pitgj{lp!E7A2dm7f7TY^*CF`$x_Iy~Jo(RTR
z{wBIK7|LaT^5Dyj1TwR?9|AQ at mHI_IGiLRQ)3h`+A5m)w(1G)o;G!34GY3wMFG;av
zD at 3WCicXEJ3<?Z-&|b?ti-M0)pl30^glBc1|6|gY@#18me6GwI6+g1|$_xe^TCKL;
zQ}HaE+z+;~bV25ty`Da~&ou;%<5)%{DUD5XQs0`ZH3bahL7#&-xP)^b_5fRBQ2i4h
zf5US~CiLP=T4%{P0->d)00M-UZx;P at HwNtsY$)pmY;Yg5Q)Sj1pt~;J&2pO+s3B<>
zHxZ<*<lL~N0=g7`O(HP-q&OB8y>=fztaf~wt*K(d`OF8 at B!64?Gr6>sQ&yM6vrqvo
z0sG1-^VYP`0L9pI3?F{z_9o1IM~>^Xpmq3L=n37MbD?dAv)a+a>amxL9(NZZYm?^+
zsOoXdaOjD~#ftP<!Np$Y`RD~^=Hg8})9R#o=1@*(psKa*rbCY;oaJ%bDM8r5s2fse
z{ALK41??B8L+7Q2*%nt&*c!G%Djrr{drz`9o+kA}U~g4*3eL%V6 at x3YCW*^s+jzoz
ziFO;8fKr2kRf5a!sc6r7!~;&2F4T7~e!aGv#n#)+mcB!lEDo31g`C76<$wVJ6)Jxp
zB7GKVHw%+!fw=Yt)trkToaG`74w^TX3gFUt&6o84oA}m_lMB}byE$w<`l6js@@zM>
zVD4;zLEgOS!9nKYF&W^ZI8j>dlydt~EhJRqYwQBtv3<R*Kxi=f&2v&HIdU>0vRX13
zzKEE69{fvfF7fOo+az8aVr2*v*&EJF!PWy?E1_pRC+LFE?E3l8FUgtbPe!HBJWf4M
z3Z%#P_<D2H`cL=RwiV~SBfD2Vl}{#k({;6k#QD|u2RmU)%zGWNhNyq=`jU2E<%^}5
zi#IL)hZ=i(t>;Nr7ls*!z!0`mQRszXo~yJ6t)=~^HS)$znOn at 5b-cEjVu{^1cBQE6
z2NNYzjmC|=gB|VPF1?I1)Fd;1R>!?cg$cYq%|RtD)w?KM+tBmxUsC#-ai|jEI4pW4
z3~cb-MLmM_%_Am7&_zaHT0*cSRz!P026wZyz`i at A#2(EgKgbz+$FSATT)IkPDq&xA
zWiV6dB7MUAH)Js8?CIcn$IcNO8gkL$A6SGnhJ-Hvtv!FFaWSxZu{js2!K}MUfgRkD
zAPDmrh4?~z_ZJsF4CLDpaHFo;2===+`~9K^0qH4%;>Oc at snWBji=>0c%W!0sboqdY
zM0qiq+|>2lBr`;NzM>Sd@~yhT1T$2&;}oo|4~;E$Q8*XH4>KJ&)ZpY1&T#V$l?4YA
zbo;Nt9BpB8uAi@);$JK<REOC3*Kn+Pj$~f+?Hq9~Lh7Hvk at j;T=z~(2^nWT4_M+N%
zA8g!tUM*3MWAPp3%+wP6tN+)&&*7BH6*CZ*aMnGK%*b8mS-v4+$I*x-ZAgWT&%r+d
z?mqWb8jIKUsV{w(K4|3hd+@`~5)}8a#l8Z%`*Lc!XPT`SJ!HRQ70!lsr~?Pc(leQ`
zzGGzZ7nq~qUh9#T^}|dv_QAo1vxOg1O#hsbp(o~3XXPhfPB>yO+1Ye8tjq}O*fhYg
z&Z?h;S at T`<JY2tu+eWsKQZqMagS73w`3jzMQ`*}os@<h=`DwrnM=Ah>8|V=Q>de;(
zFHOd4a5bt7EbPKQB;(kMXL_(@T^(ZOf2#BYx&9EfJKAz_)-fO3>L#^`rJFEIJaDP|
z&zXk6&guKtO at t;cfu_jZBxkzngChKTbdW3E_c4Lki7R1?Cy22ew1$*Bac{BI$+L|~
zPAo~x@(vr54KXfM>gb7ijH=!2K#6hY_yob{M&HeG0$8me&AL)!fyJVtc`j4t2mO8+
zsm=$EOL`wV|BIi^ZVV#}v9sd~u`O=K<mf}zkUgJ~*7?EX%Ej$&cJto6s%EK0EV*=m
z_<3E+L6eJrkoY3xzsoq3?V$CrRPIv17f^sI=drB6;?;%c-i{rTS!HE7l7wX*l~F?_
z8Fh+?#pjM~7`@ouyo{T*toBHFy5?4-LO{d9D(%pBnb?K^1q$NQR<|#chWM}IQ__eZ
zQWHD*;Gsa!{YT!v>|91pguwOyYFoOnYFs?A+jll`Zf9Azb!o6d@<M#>z4Xc4amMk~
zW at l|u4O!}0Ua+(ZR;WqxKV-jiwkfLoC!ujE{g>PtW9bp2Od&ky1j!c>iQP;ggGU+1
z)PZIryE+_;`%314Z2oj`l=1v|wJT5FPV>J_<R5$4dWM|~Ua+XV;AH!gV8mU<c*?wh
zL{@?HscX-8Jkx!~(hF{%#{Zbr<13+uAMrrWrTvNGl^<T3#Aaa2{Y}PcmbO%Nh5=(H
zc+s-S1~&IOY1t%5R7}O>>A^8>d&iSMrWF4Bz*_l1GU~EHB_jW`;;Hm6KX!i5fBm at S
zLa&L at n31U<sJ~FT*V^_6vPysTK!+nZG}%1!<aBRSzl+J!k>_7N>t6$$^FO=5r2YZQ
z5#xWTs|PC9hC(C*u!W3E2C<y6YwT-6jIF_lBRQ at E&=<C!Yn!)@Z`!+%{q6i1#zHp_
zW0q4l8F~UZm0=g+XQ!ZtVS<*)fy>7BqJP$G6P|(LweE8qi>0r at J1I;-jLpFU=WbxL
ziE-xM`5e&f2VV at M6v<=9Lzj+DYBr6h9FVg$X9WnOTE&aGXWg^X&*ptgV2Z&B^)(k2
zA&r}{eaO>~hFz@}-kXfx^kP}Vn`O-xIT44&+y8^PuZ)YTTl?NLDyb5Z3Mxp0lr$nD
z0)hh44APB&bPR}yw2IOxB9bHB3_SwUokQ0ELk}?Z4)?k5bI$ubpWbipC;08zd#@}0
zSFCHTy)Ies_tKiU;sShTkCep0c-q0rDu#1>!z4ode6Bt6BnXuqjLlHgvpQ4Y*5r*m
zgoe-K;qpI0;Pv>JWs^Z1=a3r;o5O<I9q~=X#dFT(cOfx3%?kd~v{=PrS5GLsxS+{o
z2LmmLlfvo5uA*ZP37^q|K3+V>Z$1IVV1k1753 at EAxe+zHXz)xr9&-ZTe&UC*E2dk=
z`w)!Lu%~SDDHguD4z57M{a%Cq2d0Do%(+sX99*7F7_vH)b|5j}6H8lHriOr)%ou98
zyb17gqs3|yg2nt<02y}yGF273yG`pc2}h at zSAyX|tVW|pEs!_sFbJYXZQfKD4XwlK
zeHK65L_2Na_agABJ6V|6T~0sG<#l`m{;?T;{Q>qIFa2YG5?6><r&l*-)AaB2R=}HV
zVck3fuZ-Zc?nw*Z6H9)>wtcdWeWUYP90kS65J;FuR?FkR+DX*#Ih5ru?7%k=b85II
z4zjCEwd-2oCNDUCW)-tuhlf|z-%+oSRJ3As)n0AbI`62BYpAiu`<$P_w{hU0Y&kbD
z2*UKAmHms1L5d;ZSZg(Hp9PH2!MI~eR9GODaxZ at b_8rWgBKT=LIZN>7$P-;CbbKdI
zLD6IgAGTHCt5Va8`so7a at WS*^&a4HP`fqu3BmJ|PK3_lm>Y9ignhSE<SeqB4ZnBxc
zLqAZ2K)C3GoW_gv5wap&NITeA*7OM#*6&=_Dz_pDT=oN}jp;wlR`fX&mJG%z))wlk
zM^W`$lf{EmDStLkRj-4uK=FdG3Ee>)KHQcu))TFjc;dH3v5f4DMZwGAJApXGQy#%I
zMb>#i91d(vUi;!vuWr0V&{~8E3JW#s2WO%=PrFXT%O;PaF(|kPJIZwkhderjPGRv{
zo%0xcPSfN6EMO5*KqZ4tRu8C`&Tg)4lZ{^>BD)JNa~)jCj~WWwSDSe{Wj;LNF`0Gj
zbOKTQ;v1tVJaQ;Co;i%fH>468XNuAdZjXe#{DV?o+2rn1 at c-`M(}L+KOe7`}BqjD2
z-5Jl#nmNV~96LY%%(#jkS;6{g<Fw_oBJYGA`k(INd_l0d-3e at z*xVGl-gPI)tds;T
z;p_l$du{$%Jm3uS`CQTWr|AwlW&-06XZ3$w%he1G4GTD)>32|nv4Aglu^!sQQqGpp
z8Wu2Sjw8GQ8y9Tm+C099p at r6IgOF&78)gC7r6d7fc%ATBMK=-R!rvjmKE7EpJ*bU|
zwUc^y at e|qkFbWjQjv)G3V^du^zAP6#R)wd=`Xhbb6a~gN&q58bYQ^i=kX=q*U4olo
z39K*$?aWwhTM;}2`!qx}?J%nj&v5S2X^uVFBZ}pif&>JBCU%-2i2i0VFV4az0eDyq
z1Hzyf>BjyAZ6CgC at MRO1#z1Im8+2Zdk*(K1VV|2b_|eQwA%PnwnuGYN_?$GC%A)6W
zV1&_Pj}h9}U_PgPLFa{m@$RLl-RBcImt*r9 at d<IdQ;73I%dCBcr(1ZUV|Ia&Il`bX
z2^Y&PA>{Fxx*HwT8?3z#nB~hsASB%C1WWD3E_2fdtF+W)??d$>&Ta|AsRIucn-i?r
zMr~v{jhDksgK=u{dOtn!9N6i=0kD?^ggnmLAKK{J45BftHptl}s0w at -GOLC{NTE+Q
z3~U0#EzD=gX?Mm9&?g-OeglgnDG+d3R#+!dtjV<8k!_vK$<EN6$8vg59aJ+&jV2j8
zncp8JhCS&caX{j8R93fs^6Em)W_`gu&ABE4sN{7CcP#6JMs0SA9tlg_EPM_PJ3nZ_
zRU+UmIZYl|6vgN7DPWw>R`Fy}PVQP6q4!iY1jP!o+}pTyX!yk>u9J03t`_bK??i)g
z(C7>}ybBGtM?(lUyu6@*?O!}s^tJ{Mi>hP&b|yhT=D8!`BqZt+Q28ynN>Fa1f}&jI
zgmhd)LXDKabyjeN;>qzJtadX^Vv!Zz{FuE|XCPGS%>?EF+5>M+%~sZIz&{$)GQ0K(
zdmdZY7s?&!R57%RWQHAmbl0?kEe&;7uwbD$^IS!IXy5TjWAzUINSH75DiS}`jvg~A
z;|Xqr%KS1QiHJqY6JQ0sr)>(8?L!Rr<FHwE^0GPj(kQ9RCn#^i6#Jh&AQ!nT0e-n<
z+!W&8N7+Uc0`U}okSX!rUPl&P6AgV}7_Nn-Lhf$U$&;RDHc-~-bbU3n>jc?|!`H0^
zyQLfw9J!<K^P)uhz at q4AV>8pyqEpXcNVj4Y0?Y*jo+o+lpz|2}%mlr#KCv7RvOh`n
zzQJPgKlX`g7=L6rxXWaB_urk9Zd40f^S(y3aLLnzVQV at -2US|-wB?`_Ju+hKD_-0R
zJ`LaHn1qyZ!xIqG6H&*GtDC<XGkjKXDehFVy);`IhgAdlSt$@K|D1d+9EXv at JXLUW
zc0K%dm-7uFOT<63DqFB>27xkhdfJ at wV{J#3jG6Tk2UEhwV>u+Yc-o(y5U;Ee<Gtza
zku?kr)aVB|7&<Pk5Nc;kMSA3X>J$`ofZmeUd*zIWfq4ePg8h&<;UFUvBsK78bi<&f
zXx|C1HG$e4Lkb{kim~{8c+dSo$WT3W7 at F=nT(N1_bx0Tvb1__N)ae85-6SuQE($~$
zCqARD1jIaZS#IQT)1l8F?S*$cL1fWjU*xXUfqb{V;*0KL3j^Jr{u+fq at Hy%U at tG{^
zG7Dp;RmNt*aHn_o)My=7`kLxFWS@<U_`5d8H%nvc$(PnWpw0fvW^>Syk|`ynfqW8w
z$=On2I6l1b at G}>QM;gq2qlE+8yQ#hEnFc#3Fqn7BKT<WTIWx!bA2RFRW)GVTaNpnz
z&S_Y4_uwoMISG*Rf`Y$Jy3r`&+au<6MnIr1K9f$(1C6PHgF+J^PQCTCt^k))ofH;9
zWYT&WsuvyzDh+$gEa!cy=!j8<KE at -L9fR=D?)Bh8rbBbTVDnG7`43InwA((-I3p6J
zL#HM*-q1%8{WY_`DV3VElFql#u6?c^FNNG_T?}JE58xq<Bv=*~j5f<Ne>~E_O``!r
zLVL6_3l)XXR^2G2rI0vK49?4^4bF>eida3LfJn&7LvBpqpWtpNU<iWnR?}TOf-}XR
zukJMFmSuIub%O44MrY}7Aj-o$jN&_WA&r7eV at F-A{>%t)&p^)`3u6MF98R7?g9FOj
z4seqF6C;q+qoM;3Gy-4HA$mhy2Hz#>=g5&zmfPj$VFdRqaFO*;vcd-%Xj9Zn;IiOa
z^*CDGoZSKS8z;<Y1B>j^C^!wy{@3r#<6+=a!ypi~lcWVEU7poG34smU5^t~Ukc=-n
z#v1pc5g}Mn>_oI9Uw{g2AIcw|74&VN0_3zk+F*;{f!r_4Dw{+mEvncgX2sieD{@Bg
z#UM^|M-iv+-90!VuSI5&oIAoZ8*#Bs9RC%XNl98JB>cZW%vGb2)(c-P<63p{hHIC6
zS?4T$B4>=>scdRbgqdb$l|w~)my^$$%3`oNc*4!UWtl&{q==!N1rxwUn}j&w#JQdK
z<zTn?&~UE`OAzJ()N>o3)k)F<13SR+Y9P7Kw^hMl18%hwL=o8DV01UOeoNnA)%?Q#
z)ocOjLv0>$0v%xtiW9yTW4rpP*f9q${HlHf^%e at 8((Xi?&k65#bI!!~>Br)Vl^tp{
zDwEIG!H}W$y6uro3{qEZZX#|5?7yn`6Ge!SIGc9-!2A?c%6-lOj89vSXv&<E9J#AR
zeCfB6d419C5~;G!UnF^jopp3Gv)@d`Hsn1wVezW?DfsC6QWx(fUg~G}ek_o)eG}&`
zvoQ&#uZ|&2RIUyeG$|MVT}_2LY;WB7V}E2zYPEt4GDAs}+peV_%6r<1AMQW!%+9FK
z?i|wIKU<4k9h<XCd-_AlePv8+WICo5ES#BW>nF^vh9q1bcM~eDU)tGlCn1McT$*Er
zD^<40@(}^|6yL(>x3Im6)Yk>Ard;-iE*}W`<0e`UVVT62tVJ=b*NEX$AD~HN=5ds;
z+g`B+aDm4lp_+`semv(IV6i8gCVHAo6ogA5&ij3{5ut7xsCd(s_0dFb-4S^+iuF&_
zOs6@&muWbn{fW{COK$;#ZmEcPJ_s1X)<;-NA3EKA=(T_OVFH=)t|o22%k^o!0#8+q
z=%lz at gJu8Hp9yLnFwk=zS*ccNf!@@X$Wcb$hY!bM+|~N`gbSK~(Bf+?Oqc`i;8B*h
zb&BcjM4iDbLGXLS&E|Z$&p2n^X;><ZM1W&jk<O2iT^^-VdHwO^rh;$S^Wk^~cKo^*
zBB~N0%S{|&EtaBbs|DzQ#@GNkJHv=8 at h)xQYEqYjV~iB4pBwTBOBFQtf)sxXP;`2Q
zMeU50zQJEzePzYVlc^^40>iQo+Uf&Ro>A>6goisbtKi)@ZHZ!#c!ttAyH6(=j-<wW
zHxX*TEY3g=HHky;rR-4gcUMyYawv-Rc8B+a2`{R}{O0IIDcUfmtouxFIkVTxv at Qd_
zi)AvW10UKyS1c#{B4EscTX!BoYj6MfqP#a|M<47-+to485qT0;ivcNiEm*N?AkoY9
zjpsDY)mONYnGA4G?@PIESgIV(U?wJJB`?o4;!?~+ at 5O66{CPSLz#p1DdeF-<earBH
zQSFlhrdmu7O7yg6K*aC)TmJhS;Qnl0HKF)*k)@NKy_IPgBo{h+I(200zgm0uy8FG6
zsHS5pD*5AbK0y_8<4+UK(XA6Sp-E89Tf5U?Ik4vFCq<-6Lbvudy2O^t+aQi=IpBa7
zx$G_-O8I(j2_JT_v{bm6gj&q5k>8}OSTL1*^(8DEAGSBI0UQSL(48;({6&kGC`Hw~
z>RS4yLYWK7WA1HPgo%M*LR1RJw}qfHrN5<kIq)sHUX*h6^d#})ml9{%kdG)y1x%%5
z_h_>^7HIJ#x=Eckbu%{nKD!8Wm<F#tplU8Rsc14y;_iNnl!@MGaO3_sAt at f0KYkod
z6rvLELU`y7Z(`eMgQCh_0S|qk3#V<zw`c4 at 3``s|u|}U at rns?X4>Z!1 at n(N4e?G$w
zxD>(s(0C$3O{!;t0;ql9c}Z6=g8mGWq&ERYE+3>dxaVno;KAzO7s6xgDA&eRWxpYt
zV_OFxk?>19_fNl+msrctuBdFKm_ITPxT?ak6R=mtBg$2S6d{gxG*g_C5$##EL#(t}
zc at g$MI<uxA){3GK&?PkSKCKgG{@1Y_0Y4W?Zino&#*Bu^vA#nt%1|-dgU-Cp%{u+E
z&0I^IUIsS^tYer58{-t!p?H2doG1CeKyPk-7x)Qrqyd7fUzO~AJez#nI=rriScw>z
zebKuuX*^?4-~5GN3;M`!D*0aUSp_K|yo)6L*p at ffrZT&d19~M#W*tOf14tW+;F)Xy
zUxzgBvvY5DCXUk=!AG3eEf$t0)!70Tn$xrV4FZ31bm}x6go^C_zQU|cq{PTHUrP()
zFub!{b9tU<@s-=jwlKW~#~TQ{|8w3jOSryt^~+hG5`R$aIi^*4F-Nkq15dK4>_h&E
zQ|uTUX1jlDB>t9HChba3dRG2$P#>3oR!6By-#>c+j+eeI`6@)zo(d><o<mbStlf7?
zco<d_{Y|;XBCo7=5rT6Um%F;CL&u$biO5gj-l}l=EV`CJr1IT0CeeEzZ^t+n at zWWY
znVa at _SMsgrr+Vyc1Sqz>`+aW-DOY5VS5A@^edp_pPVJlr-#4eaH{Gh?(X?LEsZTb&
z#F-qJrJH_DIVr2Vh6bB9v4};=hvpVbDaOR9Z4L5tCG#if*#(HmCbahbxf4^{>n42I
zmi468oM9_xVPD{ltH^rIoAeH8V#V2rQO(PZNO at n$;?4pJgZ3c!<5RVYy83`hnoq){
z+37b<x&1jxR2GJgDWhioG@`$;RUFjL=gXD;Iaa>m6N-S}y4B|tVSat-<wR$$vl(z{
zBA#KBx at q~^OY3$@xfce?==o%Lvqb+HMrNvIv|FRFys7ZRb0f(yuY@`rfAd5Xv;`Si
z36I^cC`8}~K3;8Itx^##9LAJwP4@=!7 at OsXLr~$6th4oq6;Ss&Y=ag-cY4c{;9tQ}
z_#v6V>Q{nCj6_NV?|Qf5Z=h8}K+&OUTTzoO0#$!pbE|^#5E?6Zdo$PW;8J74hO`#$
zrM-Dgp7$s(;^fx6IRchLCUZcRa%6wba3Q}a0paU^kYr at QC|^7#J8_ at 8jp~}|Z);`^
z_+{FjS8JiKEqVj$=I>0!SSqR?hT2leSz4T+Kk2*|?6cWMXP)dQ9cYQ}Yi#DpbRxea
zQ(St5+=7F`JI>X!ur~AioHBezcYDZFJ<n{2ne{mFg2-3Tijl1z%M&pg`V=;KonN$`
zY4FaF(RXOF2Y-spAp1>jW4d)R&>`{Snd~{z_Emu9l1Eb^7Qc`^8 at 5BNi)=)p{B~|`
zTg_PB at S-~sJ1gv0Q*HL5+(tZVeo@=l7xHm3@%}uVNe=J1vufan__~vq;vnp$At#l5
zQlFRdKx&I%D*hN3>IkTe!o#0-l=l<v*S0>oofSV5_n`^;coD7_(ah6nZaSqwd7sd@
z*4?I*c0>&%=!fmCYB2cf-s|<MrG*xElcY;${ur;XY4d&gg~4NVa8AeZa~stR=0TL%
zk7pbuBfPAvoF<a7h^)Yp3Hx?u3|TOK1shkssqP}&`MtnheptZAY|{gu-RNB)tr&&H
ztybxuV?mqyH4q-)$=!tRl~o(!kn_SdU?C-9R}J3IIw(BTB0#+)^Qt>IaU7-CCcsIL
z`kKhHc at H|1J)0kcJ?yPeHo`R?CEGke>tZ&*z9bKWi2!m{fSHkKp at X1pP12BC^Z at zg
zE<Eww4vN{mUY32gU^-A1)B8}Hi1?da&4|s%l3{660#>h<KCw=@$GFbi3=8RA<IDl4
zjW*nl?$mr)2DiK$9<IrF1Fn3e=&Z9nf!ZTK`dWqLtc=H_Johx>z*o at hx>?)RHc3+W
zQ;p;MxXe4qQ!l)Ea*U<W9!CO*$A1ilU#0bw7wU}#F*w0XI*x<%*&|(4w<0B`Fx-77
zo|`sdTtd)#teAUj;z%40EuYgkb<<z6Xc~_S4!fb0>~gwD?a?%V$rD9lps&64cu|XD
zGnR1p*R%3<ssy)%Me5pL at GxfrnJG7>q6_$$=WJV6&2uy-6e<bX74 at m}PLT9 at 3yZ1s
zbo4m}X*sQtRWGR6n1eZdia4)PO)*c}7c{j3)g<;=xCSyu^50t(1+Tbk##~`FKg)vc
zjRia$=zXw{5k#K1q_0PSc>S=tm9nvi^~go)4g5SZ{MJGW$EjpdDV{dXUEja2RZ=Aw
z9c-8zq*y%ET*FY0tMEEtCw$S at Eu2;;UuF~Vz(80x0{p!;m~;x^5b9}$Kxsd9!(=}|
zo`Xe`?|uC7CeDFSt1xMpP3TkPL#N7fWpP4^;_&`~)h7yUeijnV^Ti7DM`-PR*4Jw}
z=$sl#;B(TJuUx-$L4Y5hw^%{ct+*ABCq+ at u3VYrdaPS<kOA#pr=?4INt>~c|zpy|R
zz2UT!)ivskxkhvI6Ib*2<_M|Z8iExwztB%N?;Q;O79J?vIUF`fQp?DcQH<gYqGciv
zS*AE7T2N{|^`xy$0=-Ox6uAl-Lu)|6+Pa0SJj at D=q`-GswmsLLuO&Vs#)0Sk4X5WB
zHG>U)VV761lp};BU_-K0_e<;H5qPN=WwwD)CpqVs4~gCmPLs-ZtMC9x;)Geg2Wd^i
zvix3eCoS1Evs$2 at JNK@fL7W(1_~?9z1M9e<&Jki~V at mM50mOJO!e6RXRV{*U#uUlv
zakj`JgY#ndlp9|@?9vWL5$uSWPbyeasJidxQdEUI!;>O|GVM|<E!!WW&!z#^L<a<i
zgD;OOV6`z#(%*UFdM(QPNaJ<|@KM<UZG40GM81&&WT^1@)ly4)k3Y)UR2YVY*D}hB
zZT!lvDL$X=T|onwgMCoEa5ev-pf at g}|1wh9gtD2i8uw>)#KxC8>8`G!W~}A5z=(OW
z2g;Ri(ER#NwUR)ZK1>&Jp8pj2R*e at CtFHJ^n6=ZYj0S}9B7AXmue4RAZExUDi~14S
zeL##Et^F!v>HL>_*f*>OYz*or?-}&#OCye2#Nt^{>Dty(($dFqD$LBpH??`Ne6#O4
z`}bR;BO9m*rpc^69)lnAeYQ4eq1V`n;smo{@1An6-U(>L7n_-K<y{7;;K6h>cDj<0
zgsPZdFSz79VaxACgQ9shSr#|v6~FXWTGQ`*BVKRfQbC||9j8(}CZLi744&>DE!gsh
z)CLn&8R?S5lybNn9b2~ycbOz~_~V8fn6+=9vX%&5s9)|0 at G;OwW}!M{SvovpK6!Vw
zutOpLo-lcYRAGRzzUQAS35A;JL!ldDKLZX9BrgE!3GBHcUbaIwZ=JnYKi`HQef%-y
zQdv9?YPyJQt653&KaLN|eG&{ywKRm`Ph;`l6iKZ6xqW}r-V7U>L%yO{S{lUP%p`L?
zk>uXUAS!QD$?!fm=|oB74eq<ayVRVTsZm>Qi|uZ1Em^4Gw>Rnx26-Q*P2~Da+;g{I
zkO-^_Ymcld8mit^sKp<Cm+o%o6>>En2$8#jNy9N%8N7RE8(@0+x{oj2yoLpAR6!K9
zq+);Gp*_^#*Cgk(I)(zh59s6bl`1 at G0uee;t~RG0<I5+*1n!57>%+Ucj}g}wa^vT4
z4^GfMhhLgZ3bUx*pD09YkC$|9R-wL~t at Erht!v{T_mVh6jzU;DOO3*z^0kD44h7zK
zOx<USQ0#{^JhXY$J5bHk8P at dt(>R6GE`J82ZWflpGvrYb_MN#uuVN|MAjc)+v8kr)
zxj(FCu-=;*ce212*io6gs72eoYQ`)dNjp9pQB5(i(2)uolH#M``SStxsQ}di;e_p1
z746q}745YS;1i2bwpaWmwz79x$D~UgqqhRJAttfoXo&+s4;%`)|KUOYV1*U;vkxwd
zh6&P#4u#j4_*{getPUVH?Am>ZtjnjSi~|i*!YE2F)B;~^76zmlxsGR8N4*Ztt;B1u
zMhXMK{q-T?PKZJ&Vm#YrE+}f*-#y{rTxaV%X<|3CS1|%hkoq-CGl95__MtJ<Hv%E2
zy#$i4F at mh6HkF}WxV-5aQb0wRsR6e>(H+7TU+%m+w&ZS{0jkz8UkrMCfBj at 3;X<D$
z3V}z52?yWrB=jW`6N-B{(=QR$11&XHxv%BM=dYmVg*%r&DZequk$L{rM8 at FyDvm8E
zjpGITz(K$0@!8OM_TWne+y3~FaW70x)e#!nwv3;t9~(3w1-do%%Sp`{U>2oZK(RRi
z)w5SBSb)^@4}xL!Ji>0*fKdYp3P2lT7QP!x`z>G7=YFs2m`}YkD9NNe%M&rt-Md at w
z^{{@pJm$!NP+J3&|9-R3dmP_}A2C=k0xQ-BpOg1Ppq%p)aHahH;L`vxrD}>Mvfdho
zi4MCu)ipD%=qSeIw$n^<cS2w4qt8d*(>gV4ISs<B4o*Dh;W>88Va$n~lr^~xyUItn
z?Jt;TWu2qUUF7dY(moGob>ywTOQwi7`#fU)B$n&c*$?f=nKki=F1kLs&teVZHgq@~
zaPXa(Wcy?QCyD|Z_mxk3??Kk~&zNG&dYTY?@-pwr_9V{SVzQKxT@*uttFRS!8w<*c
zKMljBIKwA3#iuE?=Tj#IQAK*juS5km&4NfYn at +kztYt@V1XEv%)_m}^Qy(SFtXq}K
zU+6trB17}rw0%+uDtBKnxz=A2cclxmLixwpm(rlk%Hqz~hV*j*9{Bv{budY()>Bz)
z(QDhVN&8)PKg?!U)VeO&&Yk-qK!TbPp#@Ojz}mDbfhc-8clCY`?>CeNZ>{QX#1jep
z;Hup__gSfYm}xq9H?FDF5#JeK^m^xNM7^Y&Fd?ef$kuHa)^D6mfjlNk{z&8qdFa02
zzH8R5HvtrEH)$%=`ReU7{5}Sm at kAlOH*654CK2;Bp2#nn at t0kan;5kTZ()OWA$33c
z@#F?J*-lR^?M3t;vXX6m!o66mOHnpey>?eJI7d9DPDd0OdUM>_g--%Z7EVW}k@%-^
z_ at in4|G-M7>z4pR<qE)Z3HYp$24puEDg(Zp^@#DD-d~Jn at 2d{%Hs42LOVf|d2#4!?
zrS94$+T;xgFgPUDHOVMe at yEL5b$}myBzjF9mQ_1+*3Gl=vhFbVWrrA0PC|J-2Jc{+
z_Q$chp>veVHYlGi at MQ-6Wei1^o{8P3gXRbhcUgy*za938poFooZdq-nkLxD-M(@Pn
zU_KuE&{K-<-#71ldbrZrhMxa;BIpq)6d<(tL$9qRV8b8d(-yY7vc6#xKUKkX{mI#o
zaIisTqiQ^Uq;^=AZ=K&k==IZQCgd_x>bKv+zOveO(PPI(qLx8oI37KB^;N5-t!s#U
z$f!H-$3#*~TN+oJC3uwYWx!VCU`ghU{66cR5m4}4leTF31G7PCbG4;hc9fa3TJR4n
zYDYHwf&R4&R+^B3m8Gj&n|?90+J&Ff9zAp}8tI!^^#&Ewe7Bkcalvur{b2r5v()Ez
z-%?$*!{1Ej_d*Ps at l+<U7M84>SQ_$k!qS%Q77Wa^pLTuo!dlI!&dIzPbAeUy-?QOL
zao6+<JILzho>{GwF~{p+yr~v>M)ws#N44H#CGD&8Hvl8e4?B&M$J&lQBNSN%qn*_H
zW^Znce?u9-+~xCR>{HZZkTa>#pt)vM{^^=@#hK=4(7>42w`L9o!L)R^&+96KvG;aD
zuL=!*4s5RNs4g2MX%l;5UIP>QE-U^EzCyuXXv;0AVO`#79{ALh-#u<lC&S9jD|~=<
zlV#AxFb({7S&k4`l-=lo+rpi_SA92`+slh-i9=TIq+WnY9yo1j+7K%ahiLkU_U0vP
zS>4+#LK(P$9E0*!jSBWrQcitJsgMWofEpegEUT+UySR2QVP_+#5p#+Wc7=s!84lr>
zMi^j7u)8erpJtz>)1pIxhQ at fs*x<5Y%+|Tz<E_xKP}g?j)65_a62&shg|U33A*N}`
zo!NJP^V>fB1)6Dj%WkR1iBnU)Z0AW+5WMK&cF=&rOAH2l;&-dbAWLoF>Xwq3f>*PK
z44xBgu3&&MMo_P2X@?6`#S;C<c)7(<wo7i_R|VN+s^Q+-I^2*fR)xJsy9Z-g(jB%a
z0P6 at vQ)4v9F at UdqTjKFtb&>}z$q}DnnUStP)-7m;UqQ4UYD9sIp8~I!Xtlf7b#e}i
z^)TVnNvIr&jm_&s3jvUo9eD4yLI2s1N%%6T4}m8<C0-4^wgVksR>Zb6=|cxf_5KM2
ze_3o8aMLgH?- at Go80VJb*^b?F at dcWxX|ofIybGI0jNx^Q!M1+Tt%hMl(EHiX*x5Se
znY<od2fv^tyC_94y3{UH4Sr=H7ez*x_U#5O`W-dz>1n~h6CB_X&hQ(Oy7C+5k^7LN
zWpGj#a_;PY`n>0p4I`?XC%v$jdKhCE9^*9aRnE4=N!YHw-DKdZi-~VTLnGW((;vzN
zuY6 at 7G;jAuPjKU)^Y{{3Fn8%NJ4r~lG}q!y;$TG#4j^t7`Bo#%?I6aeEJ7CoN2=YV
zdn8`{<>>Q=$8D6SB$R4x4`pf$OAW;Zx;E8rGCvkDdS$xL+eVZV*VYQW{j^ci$D0;&
zi|x;t?sp~mJ680h#C0A_MG-Gr`1?81EJ*h+BeETj=>|G?X-VlLJA306tAFTsRx?Gf
zOq+<XDVqvG#&6%Op#ZwR^>~V2jTJ2D>tfg>rE4Cm79R7I{-7lC*1mG^k;E93X14Ed
zIcJ(43ce|Zf|_rAR`4kXrOKw{B~H2YOo5u at O}Yxd)J$(a$6SZb??d;9%7KsUO7N#K
z;5<%zgE&q{MC$rc*9K^)s%>dvS`qRr at i`_ZMCs18KFI8kQ;@PNfTR*?`gIV8f9i(!
z?*Myf5kA|q&t~^_QegY!EN-;uh+-lnplz=t+w8^Lti at XG#ap%xZgK3lxk at _b+g0ZX
z>U23*mfbXFixpwyOX_?t34Y`Wf1Soo9;QQ>?^A}gUUo}Yn_Pa|`7<N4pzKnp at 4gtB
zyr8`R9TV)vD<?;lN7uf04h`GC4K3iQXkwS+R4r;Z{*^i1&ealiwph8Qy>-itDQ11O
zfUGeUBl at Vx)lic>wvy_Xj7e{5sQ2b^3kOIs)p>fS-@^4#fHXOjAAHwJ%if@`(zR at -
zjHXhewRmct%HG*gO<*@{)tk7*n$$%|R+D^3TDt$kW3?-9%U(FB4w-YY7tN7 at E9pM=
zLZ2C?oA1fdf{S!7DUVg$G}ts8O}zwc6{V7dloUb3A)Lm#)w1L3iQDT>hkx4oj|tIs
zYVX63_gO*htGeLMRXDU-Y#Fo(!wbbip=VUK#3acwXd?fY78v8rV<^vPw{@t@(0yDp
z92~MyKs)HxXtuBT_6ibvX$Tq^a%JtS9|rlxj~6FlZ)VmDh{SoTDO|s2UqPZQF&gP`
zWWhI5ov74WuG%ET+ at lFwI$GI5dfB&#g)ttzn7ItSOK5vwBS_jfTHSK(Ig&GM<O^-+
zA3ykN{@9vJALre|S4p5t`c=S9JHnReuo5M9y<84b7>OWRD2-EzWcGXSG0h?t7i}5B
z5wxqLRb4*%#39|U1B`YaJ4S1nyL at 1zt=9iYL!o9OqR3u?c-KvnG=3Zr36+6;ll*Hv
z<R-APcdSyh|8<2T#pZ!6YG at LVi15%j at vK7|q-ITTVa9M#MlUee6$t{<{pSz=ecbq1
z`h3l5%_ZRO&`X-^!4Q?pls|(bj9NJ!l39fEaLPQA?~m%WaX-86VBZE2b9wVq`Qamy
z`LE?<3S^I>a|)Kk`Q#<N9~J6Rq<0q#UHipy+!7Y=pGXz^;2GIYVam&|(;Nebd-g;d
z9%j at 4vjhK?sKOl at -hj_{+e<W_=9lS{5%JeOOMZ7+<R#!ZMhYD3_Yt)~i|Z-oDGXX0
zp3Q*dYmLo=j~5($IZf{fuVSONK?R2gR?Q>gCht9ZbQe$lZ+@<WcVPG=ebh#fNw5iE
zF^b^D(9PM0&Aqh#osmIgZJfX?BEJ)3%fIby68h>Rn{+9?G8yk4!-k7>NZt at lL{r(#
zJ%>wc?>QMGK;(wSiCpbBT%yFzQZG{pN*G!ANLy4~50M{dw4Hq84%myNTJRaFZF}1$
zOGF?qd!Jj{jEB;{Ok=MmZjX8p7uIBU$*xG3R=rY^kq at eKH^6G&yx_rwX%tSJoW6Ey
zHFtVk!QdUyv>@^(Zn+QuqAMkG$-E=jUwVf6-=CyU9Eogu{xkjY6=!c*7Qt{_q{UmF
z`bU8M>zl?UR?pl2_Dmd5RGKvOL?N9}1QV<ffNd+Jns*8q6f}?ghUobh?ld7 at c56VA
zOKS|z^LqYE?|(@RQhOQ?M{6~?^}3M&F>M9M7H*ZT5ML%ksuD at TpY3w9PDD!k%4QF~
zi(G<epv`;)?1$gIw553KZgV!r(yl{YUHy5l*V^foe>Fp- at Jl&`V-eWTfjlD3So`Re
zgW>mLk86YKPDx6t-&%BRUh17uZPZHrSReq{yFN_b?7Tr+?bv=jmwO`jm+>*3%LHjJ
zd6C9Yz^C}LSNuSv^<RRTJdyJ*k+ccXkmwkP5C04bbfpKnuv)2`#`;amZK?9xRANf}
zN7}?D(V$Py{y^kOO@<PxM-?v%c-NZD432L-)(H6J2>X`!_j)1bunFFh<b<>d<g94a
zKF)a0X_07bTQfA>JbG at T1sV3`4UWoM%0IpL_a7Vs6Fv)xeNQkCeTtCjkdScwV(!$Y
zkUv_ at -z<J_(b#|g`Y2jIcm31Uoj*~961Rx$LbW}`E<x9-an|(7R=@7G(hY=ZJ06RR
z<(QGC8(&jPPQ#=g7gm*Y-f=0S21;Cy(ZiJiW;a}R{LUPXgL_vEC;>;R?p41>^2Wbl
zq;AFa$8 at iqj(_VO6Mr?eU at juPu&1$U^A}F+6i(4y0sFq at 0nE+Bz+L+IPP%9qz3>LJ
z<$-gpd#&Kv8SC{X5l at GPK9-PyYh(kk#bLwzF&e*2waU3tcY!~3)i3ur$=K4jCIG#C
z8J*t0&_oLaqqFu=6wR^1yG#N>I5Y`apkhTM=y;9<-Ua8ZO){D<Ixl5QnuebGOTPD5
zDtHs{e~BwN3VO1HKdiwUA!iN>Nm`P%bJycluh3D_RIi|B?>}f%<=9T)c*Ez^rj|e{
zXK9S|yx%@I9#=j7va-ijC7{8C_3j7xh028_Q`_*W)^yVMm3Oa+PR-f7Ia&3LL{(RN
z*SfHTs6=Vq=PdE(Gv^pLR`Hl(u0muFKDzWu+;KF&mlNVBZ~wJ>Ti|G3(uMNQn5x7`
zq47+#lU9_~`<j;TeC|+wML|X&QMNlyIrV`-16KU(&@OV#k7NG{u;b!lpD;U34!&)4
zlbvLiEMkJ(Vyu?NSL5irgabQ-&z!<>>TmC)y^G~ZHwmJZb803VNOfC0lt^#9uCSiS
z;cn(yP!+V>;4#iWqPJF%0UbV at DH<^_NdayCFK8LZ;VZ^a3kd;u^}nR0q$Q$9m%jJG
ziAY5^0k~Jmu^nrC?a7myN<}a;Zen!~QMXlLEQFLMCH*V0Qb|exf2AqYG%y&z5Bwrs
z88t at kF%ol6BS(r{<?XfQbg9PeVRWiF>duLYFOR1)*S_EQ!KLC~)lb0)Fm67`Pl>Rl
z?Pvqavn2*bEH~|IOwN4myIwtVl2$Bn{4YjzX-iu3i*{Sri|%;-`P}|s|FCWh^&!hs
zqh#kReD3|x`0KhmXroV$`<*$Q=Y5JB|A#9klt1w!`ly9b6{n+SL5K`M<=7bT=jW8{
zv)8lvLrw&<HKsjL4OLs at 2uqc}mUOxRQo!)h0B(M3=2rV0AwC=cBRMxmfP&5iQ?zc9
zwUrSt#`v662Ytv+XXSjF0o4aJ<EY9T%}VhPse7C3tEz=(xoff$lqV&oofh9z!ueBK
zElYyt*K6=w|HaiVell_y6-<&<a(-9A<X9`+Dsf#8?ogswbDlZtaV*~^<8JiQ|Bu2n
z8qO^|HIOCh5cu-8yy^{!gMpd<_6`?L0`z<zzdG-hjaKyDB19Zke}et4k8ZQ`7&cI3
zSG=Zec^V++ZtH8+C at Hrn%^X9{OqJK?-WdTnsf1d#l(bmiODF0Q>#-7fz3 at k?_cFkU
zxRpPaTRMF_SSqUgc*s0}r9C~b{->?6zEc2wY^1tt0Yx^X{8mdUFj#zPI;wu@&C^Pg
zzRWfnEfM2Bgp%N2v-k%<vij{oe|(MmN*dm9 at 5hrxbn_>Zc@%Z!eT~IKsnu0GlsbCl
z#El8%X0XGbm;YOZ8!A^+J)n_wMwsmXPaXC|;(trw=}Ty5qcyp5P%eJQaH5~09sPro
z#;?(@O>loIJK;oz);}$3CBP at f1rcAyA5lNf7g2r^UP=S343&~~CXzBGQUG6g+`2tU
zy<<~6(mD)_^l7K}>h=QAm3J$DA0J$lwwwYOnn^@%@b1$nWvU6Vg$y7gpxHrt6m3hg
za#jA1Sq86;2m63VXGjx<NGqlUCatgAU5Rs~LQ7^>Dapujjwd_RbvRFlx7ag4NUEIw
zwa8^5nWkDi6QMGzxHyQ%DxMz7<3DI4v3BW#3n%F2Tf+Zd)g;t at IVzl!svBa@{+${9
zEeIb2Ox8Sl;IC&@@F at HO9ZLIy7y4tL?Qydp^nOCf^>^2&m7ea38ZNNgR9FA9olm_#
z!s6L<iGS1U`f*i at t53@!opX)UEjr=!ffs;<P1BuRd-t`T<=2x#ql~<t2Qnx^!fm_9
zGH=KjG&_!|v}7peP{Aa)vcJZyS<`I`w2WyKIl2fJNZfe5XcQvPl2G)M$iha*y}7XX
zcwVi6=f!PymzKh_)Q}ehQlcuNCPIz>DRy_ovi`QMsLf1O1&t_IDxk#`W`8l3qLFtJ
zx-WLo+)Z%m=X5oU9=FSSOt`^RyN at faZ;9}bKRnTZ9dJaAFSZz&`l%c=YB9!A1pMI9
zX;r_hX-~~(#}Vsab(4r9TK1-Et~`Bs>(;|Z)NE}oEN9bnj1vY|fV=I2XYz~>NKEHH
z at MTC(v!D4%R=<y4$)x~REGnz`0(3hAQwO8&Pg)xqR{8S+OD-hUgoCpG)gyrFWzA)B
z)xqzgPLOXxgmA|&lQ|yK&1M(U3z2*O>0yG|>{Vce-j%S`lm~WWa7A|={@tCBaKuL;
zB>Zt6=|oyv)y&6^nsRNegOiCfKdu6XomS8P72jxp`9?q8_aRrVTuIK#g3ZpdiKS3o
z$l*d9rk<H;Y3&${93vy6^{LO{+TUr>D91Rz^1XnBE3Q7*ihp1tUN5$0-VidiOnedD
zN0ih{)}VhSYDMLjwV~AuQhLqFbfL=1+E+D>VI^$NMI6A&*=^&J>0^t^$puG;(1vcB
z3Pzn(XHB<;RT6;g)G~Br^>IS(a}wgn<ARM&qY{7KbQ-(L7Tb!}UEVLx&R{<dE|NuG
zEknM^S^Ka)TS9(1Sym?j{616`XZ!;v@`+}Rd$^w4+1Iit;!HLyYP9pZs&>e_hVg^G
zglR3;U%da5DH0Qteo<OjTH-3768JaM73QX<Us~ZFA>fuBq7XUGFpcF5`#hKD4~wn>
zzrF|xfz78HJ6rT`v2I7rE02+c$em6OTUOSnJzdEq9Dw~xp~!%?@#N7B2E*q}gvrZO
zm-uzRN~b?RO{?8*00$o&Xu1V$5 at ylb&tQ=KxHhqLRB88RA`6Ll)snwTMCt&qdOZ=>
zKX5d7o0Q;63#_yr($`)-&K?e|t!^tKCaoa`VoxO9mx!wp_N1%cb1;?P*r8utA=M`f
zk&CzfZswV6r3 at _D3v+YYetvhkmm9bmi#pIJ1B at 4*bFLSTg^~VDBu}i|`bLNwxjUEQ
z+H49IW-ZOg2to{hf67=+?+QKnF7zBy^!AOkVVd~7R4plB*ktuQ?XR4O1^E2r_SMKo
zT!h|sL2uAN_JUHwl|<t9pa*dzb|S62jspRT7OfNk6<3A~0UC`QbDg`=CWisIRU#@d
zKTBVy|BJ}gr)$U}GHALDiBj%~bAC6aaYpqw`TiJ2*=ds1H7nJdkZt3c8-w5cv$zHh
zDIFUTu^HR9pfptW2d9IU!c_X2v09XgsY;89TesGIC$9vwN?L~W?Wl+^2qC0j-Y+q6
z33vco^qRRcp3rI?Cd{H5&2pVFmEGrF9Qi^yLzq3eA-f=DlFV8eVCt>$oX(!l`wxE#
z*=aRf^z?ngs+cP9 at h|2sc+ at wmVFjMXsc}=DHtzXiDaixd#I6bsYCwL6$&Xa<a8S1+
zkK2~_TbB3RIAgABYqxhBUMGTTYv!_Z#50AyUft9iP=C};blS+_E5}h;6R>bhMi)7!
z+7$m;^c_iXj!;;zZxim$7pTlJUHtn+l)6g?3Fv0b>D5=y2#K2cOf>h^qjvtp?&V`{
zwmypb8k8 at Lo@S+Ia9(Ist9ZCxy^H=5`NFa90xkLCq3^;KQu<gpt{RFdB{{!96BqF0
zLP>w=s<2d+3`knJL%qXI0M|iD^8fr@=)X1+66%-#JoiMO>A$wX5SG3F(f#*ACnG{a
z%k)DI*ci+dd3WJ7^hN)d_<C7 at E|S-h#zXcMtpp<;pCr^c_?P^XqA#57Bq4odAX54p
zOjjfIyab*8wJAf^l at PC@fSdn<8R3S)dcxQjUP<DA4MC^{60ZOGUmX9xa}*8Syzm1?
z7pq95fcifue=$aY#07uFgt7}iamYW{uNG_(M10{a$Nv{21QA{svD5z-Y&cx1_d8r;
zKa6FS+O-evox5P5UiQ&{m?}yo4N1`?&(Wcro15D^3na)haH77V;#!W*2e!+%*l4Vr
zov98F4 at rsDZx4Ug??put?xPHU_}f~{-{3y*FX+7d%YzYet#0cD6xw~YhvCnkKLmji
z)aId|@#OZx;n at lzjx=|Y!*LAIlX9EyAh_OdL-zBi8gA&*9({G(7$34PP3qILd{G63
zxVpLrZwaC<uvAAyUb}XU5V!rA^1l;e5#IqJCcP-Q?(grPNJe`5KN`5Glj!iiD>8sA
zogX6z0ZmOZjS$&a3S|<yTh<TtgFYY$5;#y077$q28Y`-?c~T|=^_YM=p4V*Y at r8GH
ztIyWDt01%3u13B|x_ABZD@)6VNXsuJPl*=V+KAt_-i+f^jML%$?z2x=A0jB%=+)mz
zm5+}Ufu4&ab%ibyp!(dV!ss+m;l}H)2ZWP#8?6<SD&Pc?OHJ!uc$?RJhR<0R7_1O@
zKPD!a8ACxs1MAfG0rHGT{jGoGqi at bL&XSWm-fw(-5N3gYOZLKA3m*U*hi4*$Lw<ck
zpWJ>ytw9`e)uO?y-?k!|5T-XaHe3b}u7?{Nyo6|WVN-;Tpc7KF)W(D(Af}vqxnBO4
zeUIG+8q;tU8eE at t71V)WgLJPh&6nNOHhx)-B```z0SInm=vMbw4`lY%VBQII?5MX)
zkLSW7UfeOJ(J8+AFLZkdru^HBFg&FOm>3yX?x5 at F8u_Z4j{JgyIVK<=*zeyT*3KQ*
z4R+68l!{~XzW7*Mzq_#OLc?C7D1EMfQB`{9-zHb^kU-I-K+N#P7S23dPivxuoqmXp
zf8L336}F^wLhORK%Iks at ye|nyv3~CLWVx?9A)+ApzO2mMG%Z!x7$x?J0J!FVo2p*U
zZ9rN|Dt}Y+?#1LKyjnQ%nM?+uvAj?{xay!N(XC2ub(@nWf}qnU-=nJ7vJLNW0m(>f
z at sMgpsdO5ObS<IE>HvDJExb-qQa(&52hvNCrM+6JV9Js<+;m|o|K)lZo)U+I17BGz
z^c}rHjKKUZrts_h4k7&{(5&}2&3x?p(yi|4 at B8*19fN;0jbt{m{iXo(Q3!!Xn$iic
z6S$D7 at pC{#bT~c^N3X|8Yb!bo4{eRCE6msA`jnV;8}P-RAD5?hTd!Oc-3>JqKj-ND
z+;04Gru7X`k#M>YPq8-x$1!pS9!Z&|3#5apisMih7Ew1Fej-eqT=Ig0VAsG+hfW8_
z?-X|0Z0(CG5$;Em4o5MXqD~deH#R!x=Ay6bcj^eFb&Y+Zd&q6@=?OpbW`*ab+-YK|
z$MH45I{m1fi&!zNfW9=5v6fJ2e?s{1 at NwV`x!L)9`FDlyXG16!H*UX>qs`QQCC2iY
zmV`*yOk>mBoRDO%`4NZsJE;=2;MN3xLKHtd8uQf3t!w5urf4Y26pMUh9Q=YrDRX`G
z4*Kl;ShTVUuOPQrYZ)ZA9o{?k{>l7F&(ZLv_~-814+#g$pJOn|#}!1ARCV+82P9Wf
z(h4^+OXcKko2IvRs+86ypb{a=+swLobzhGBG70<rj9>M9Ti;`~x3^bPQ6Z^zb@`|W
z^|O33dpEY7n%Z7^G}lQzsev!l(v#cnS1y617!(^aX at ZtxD#y?O1d2Zo8f#*@4g8i~
z3s=VoIyqDK!YO8BMVP5Yj7>l6%MlAoCTrfEoDFtQlb+swnXGABixuq%EBTfD=ht-l
z>j$i_#F;Hbn1?1uX`nE&idG=3709il&wTyjcWx(n!W30eA5p^?DT!T3t9|GULM^R=
zo?MhVx{2(0T_chBlz<3J_z~4(ZUITAx9%K)Vw4e`R27|Z-rD>uTI8?cXdg_A^ZTjk
zcfa01>72tm3I98X33rXFT~0!KhPe4^^4eK?uq{u#gP*QUzNVo&F=Jf32zQ8!80ARN
zM=SS?4s?~W5D(oKk8>`9Rda{wYo|Qo5>!+NL^7UnXFLmA_w!3ZvxWC^Dc9J&w&W$s
zT>nH>(@iUqer9IMFk&H?mqQ-XdDvS54aUmUr~X-xronsKQhIuNUd%2!7C`${u+V_U
zOJ!V}1trg*dN at ZAG??A2AJ%$<#-g5bqv$r6IOO}+ at 7o<l;^N{K>$r+1Pimw+4cw3V
z$i>B-)wGF$Vd?rNqM3La2K7iih3gGbLC42GA at EpXwI3fdFE9SyB|r)S+yC?c at RY79
z;y4a?_R4yR at A2cuB4StD#tPo(_i6wi-G^!K%WhBDzn|ND5956Nna~bhJak!_ncaN9
zfjRy0E6xb1sN|YK5liZ{R64t10T`nXAjcWn&KqPGGUfbbf|cEz?9UhMpyXKvKOK{m
zXmpv3hsCG$*8Hv^9 at HM9t#e2;26QP`10$5W(#lgR(ga|cL9Ix2LPpRFBV-C=mq|io
zb)Yu13JM33)gSN$b7kn8=lLEp+SHkCyX-R^_!ZaIxH$?@Uhf;4 at A_ZGSGx8}ZqNH%
zZYw1Qis3<YeQwB)6G&NArH_vaRSSr+6M1CV{g6B|{`IP7du{H&va)!SAM<^E$n~kE
zGny%SEpHV<D at PKyytmnrKI`e~>Po{74rI4A;a_S5M!C$T1RjU!aD?6HuT~Pm?{hR-
zN%S^RP(Qv;lLe*9Tp#j0qE2Qp+pCm$b)B>DGrjP3qMZk=+)EyeWqkN9$w0_`jMTha
zdG}_ at ye|`z-3yQ6uN^-7OR5A-GUOh$ydr3FK_}mXs(tpi!}ctWQ6|6qBVf^<7V+8_
z`79 at 5VSHy2oJ#aIk}j_Kn7lfwiNdGZkCH^!2=F`R1f4S0#;+5A0)ovg=diMjxu
zx3=e+8PEf9D_ at 1*_zQdQ%7<nS#9IcakkHWHE=-!3rHtG8Iy at D%<F>83KK8)9Vq~(;
zOZFs_@~c^rjY`=YsVxMe3=&pw*pW2(0u;Z7BQ)69E`q=^Jq?I}8pQF4BjCHxLWF5o
z#HeJ_vPtWpfsgC-`{JVV(?)3vC#tQ75A1C%0gHr4qL5}bpt2_XQ;h$suXxe*N75<p
z;5J{u4NdOk9XE>i9w$)N%y_myy02u?w%=NNb(JWq(;{TZUfJXkZ$QHwuS%!kZ0{^>
z^5E!N=m0!2$b&^;FHrOShw;Sha-r+M$12Vwm|e at ETq)H#1N_=WKH1y)H+mXYZn3y=
zK8RaZn`guavvL~&y6lrL2 at cAoVSm3s_w;nZb#!9F%EVJqM2eS+WU88iGfO6XO`dq;
znm;ygf1k#E16Ez*j``!>D2NNPeS7!ztxt|xR{_nu7i1aze->6s>%TRTZg~g2O^Nx1
z-QF&4gd9Cc(X{mUXKA(2DQo^RvMDZvJM*eTEt(*!7Xk<9x_CU1z|*`J$y at H1X5?@(
zG?;zB9Bdk>Bm-tB7`;7fOSFPL^5I<2=EOYPkpJBj7y5|BY`Fa+C5_ at Hq7}h)itY?m
zT+Ag={2Czm$TxFpJ_H`P$Aj5t5+>|sBrFp6ttMG!WMt?E+SXhm4<n=^{A!yV+h5*e
zb`_%z<yDfO{Dj^A?(Uo~E$)jpPnQlL4(NmqJhKknraXD-z$O!A6#>5*K at W`_WE=Ff
zmt|p at Zy96*{wyA)wN(cwX3 at Ril#U|w at k?(`1%vLt5tovydxc<?X5}b-VeXLbs{(-0
z at tG}=xoB0oTFz_0unIBroN?=~_3|7;@5}7#GA)>R=4<Qk&|Pad at sGO$tQ?It6Uv0T
z4N0~wt&#+(^&+T*M5$HOcV_mNC_ekMMTW3B5g<O<kyGvN*VMg9GI00-on|e)9x3V&
zg*dC#CiQLe&s<-0d$Gz&o7>b$7EwZPyUFRoM$x~a2Pk<<d;aR=!+XEyb`dE&_?W>K
zp-7AKx+T^bwr=;jOqi1@?yvl;x8(vYQKTUhvL3>HnOoAlK&z+0Cl0x{=jZIdu at zFW
zYl2+Bb+;pLaC!i$w=Srm45>${#G>Xsnj1W$toi#=1^&+6Pfx0DUjm+nJe|4sNBGBU
z57f2PJ!Iru*3ByEc)d^Jqrk7Lhk;k;z&LgegH@;LI;M5uftz1bJD%UC=-<0yn#i+L
z`xdUyA9}w|L}KjH71-jj;_BU-H!#ch7iwXPDZhzYvTy~Q7n$N75Akcv4ji@`srV2a
z%+7|QY82%#qaa;CDT5zoX0L>VhP5u1NLNoy8D036{6`y}+jDgi6w at p$gTJs^=^KrF
zuAjPwGN|n*gFn<UJ%}%{jBhNmBct@$z&sM_%gkL0AXQ1e!mdIH{c$vXM9i%w!)S6;
zCIvvnHZK$=RdpMvMO6-7gZTU1d1oFwL%Ud*-Y?p?zxJGx&4VVg;F6}k$YIxuoXJNh
zSlh-Ym%e1;kGpP+E%3M?>4~AxWr|L)n49d2F&`}^7GeQqB?(NC4Z!T|+2SnOZt3zF
zp3{3MS}A3;0v4$vO`s}H04$ij!^i>g2lUrQ>@5S3`*I^1gQRYnBz!%9w&B2Gq02XO
z)p&5lSSss55pl at yYf$ETD@<<5o7_-f>6ev8wB?8U1BVME36%Cn!1mUrvUbwTffnHI
z$hqR_#oUuHQLbtO7HCE%ko5j&^;Fglq5nhPSN_$}Wa~EW8r&^F2*KSGoZwDyC%C(8
z0>L$cYw+L}+}$C#yL)iI&HK*GIrq%D^AFtq at c}k_ at 2={qWzVx}tpYI9)%uo!Z<wT~
zxyB8p2 at 2GOS#{*SQ7bk#Esfe`cZUHy)2R)+LKVei^GS)6El$uZV1Pw6nMMPEuFZRQ
zJg0bVrFaBj|D?~9tn%fh0u6RZ&pH7S5d(E;iW6pxB<<Js>rIsFgAIi1u4pp+v*oa}
z^>zCs9{ZpkL#|{4wnPK2_o68WwJ9=`scDeq at i4a~PZ+bW6JD!?Dd|#K12?EVM|p^6
z at 9f@{j>AUXVckpX9ToR9S1Qara)*Qn--CeMnZv5C6!t+;C%BN$ia^;Z^cCtwN>90{
zU0;XQReCz)9=)|=FlM<9>HthA8ZA$?u$Xxr!14CQ%={?iFc<;Q>C#3+oAKa)l}!~F
z?T{zozr-UVx->@qNU}HwDGsjonnNSS{T*ko&v~}T+o%GcHoxqSBB|iU;JK;xv)>#l
ztv%6)e?y7P5v*$Q3iUF$)%AK`xB}(kVt!PqOS{GB7?}9vSB(l7FD(>u5-kc5hQWOx
z>N*B7*)5Tj%yP9EjU(wiXh`=w0^nqd8-#f#fDyfz4Fx#u!_kcyDJ`+j2r3=k*6xh#
zZ*r%twdMWsLbweE8$s;Qf$IwTvH3OX6u?5>{jm#I;35?ui$NA2>~P?FM<Jie8%2sr
z0=va>z4?m7+pFdtz3p}}FD4Gkpu~-0>$W at +482spD#NsjQBi`y(CKQ+kIWTJ at boT5
zXFM!`vKg-}?7!Z!6!vsmhF at 7(8P><cly?951apHh=!_73fnB(r+4mIX#{ZPN<&N~=
zlJ;Cdud}qv4TJDaq&-LV%7~x0E<8ji4=bfD)WN~scAKBpeu3FuiKL!Ur1zsv16P!$
zz$<y^wa)7UM(j{nGxMHRjxB&f`%zh*2K#v}WnOG!7;kI${PBvDOYIpBg0~i42p|DS
zdW+MEW0w2y`F_1XLknifkrJ6PFRWGAek`__ at j!(!zxrXg&nhdIDk<8b?kz;K;l!9N
z*zB^i<H}(z$k0({x&57Bx2?S6u3RPU!QK4G#~=466 at A=J583V{E4drJfj$?1Fs~X`
zMP~HpSlY$OhN~=T5rUqFI=73^rVZ3V>#LNpQ2LR^(&+V8Le#M3rFX!nmJQI`Xg+G>
z_M^{M=^J})dCNwAuupIq?&CXAxACvF8AQ<D4$dU&8cb|o{S=Rd*%BKYWx-Rr#VkPW
z`;?|PHA4JUA}zY)!D1q{!~uV#upJOjV&4u%rnDU`A|x&aXnEJ!5%2BSWb(^_faC}1
zFTl#+AgY;}S&S6TM$SR6xqEZ(-4hMsj1U`jUY5L_nHju_iV6V<iK=&ABKf+BBaRoh
z{R&rOs39(WL?{Lx`Y}sV+G=al3Dg&F+uX%gI at d;z9VZ>Z7X2NMQL^t)Mk_v*0Fd{4
z$D0lT_}aG+Q%LPIo{*UMmMu~2dSj%`fg}n;Vf$BlY8Tk=7-ZPLN)KJ<I2P`M7>0qp
zeav$>DYaub4S7L1sW@$oXxHDgCj%v7m~a$|MH?AfIWsp3NnIOk`)xw4y~*)e&kJpy
zcy#n6&Jp(W4{u9AGpBLu9nX1pG7oD^LwwR64xQMp*4%^IjUuD}mQ6cjD=E>j(~)p3
z+{Hyhn|vsnqvaLpAyn-eKrs>!eQQudaOSHZr%ng0tWckT5s6B`k?>|t5ZI(_1*w1d
zuCi5<R`%CG#%uvRWQzpA38q5%*g0xxY>v(aYUjQi3C_#-)bqZM&ykmxYZt8SLB2zM
zA~aXjd|#&?{L?|`?=O7fH8wCcecYY+h$(S9VmK1#d1F at GqD8Rga3aesA#v+qGJ<#d
zz%&$s8r}rs#+l{C5~%pZ+t^f0c5&fl&j|(|;3|T#ZFOE=9_#GBx<Jar;VtZ|>_4>d
z4hXbidF;HQA{3C_-Q6Ga((iYjp2|~=6auDCR{NMo$Hx3y9(Mh at f+^Vf=zb%n`ii=@
zy02q4?;Up4Mf;&et(UD9kFd@<Nx8>-bY3l7((|6Xck&3C9E&R4nPCQ+Sg}}gnbNWK
zx|<E@<b5}Tk1MYN5fae6Sd(P8pju5FW#J*%3t#(7xrnniL?}dnm at 3C_JDsi$cnc47
zLOmd+mYFuPDJ}F(6jBXkU`rL7%H!Y*z at +A#N{GS`5&c?koKUlq2g1;P3jxE&xJ&%C
zE>Aa~y1+KVdz;@|SBvYMB_x9EJ)h)HAN)UN2Rk0)GHPtTE9WieUXBwa&uX}PpTh4Z
zf0F1#kka3O9J5rhPr(N-y2Img64eZ2-vuo))@MR8CI!1{4_of8?3Ap@@kxp!cR#?E
z4NsJVXuvNxJ$L=&SMAt_^|xazokw at VyO%7kH&nL|f+sF6nS}$vOn$;a%#yJgX?`Yb
z9*O_NSDd}UV8G3Ad7eK(Yu<Imy~Uk7X$RjwV~5mkeI?E2Ig)HXf`uO;8AN+1E|q+U
z)8*kz062mHluCH=f=g$68f<Ad5Us*2OG-=YmSqSick(j5=59!MYsBY2xW*_n`$nX-
zX<H&T at eOM8+9^+oZUZe$tK*yVvgDu<8;zluUVnDZwe!($JhE;?X|#n#O%B_XI<;Kk
zv$Iw|mrx`)xMVthF1@=0m1wscrW_56pkSm4TWCn0^pPoLYY+Fy?g=N&S82nLG9 at 5r
ze0*Gr=7)PvZ`%$}bYOzSOIi at __$U)B)T2G0h$JGG;d<><fRTg;khIHV#UXu6=_1yi
zeOPYYrF6}(#Y;b41pVLC9V|P2+Tmk-3f)*TH&IEqABJ~IU6`|$o8QTJ)A6sgd-zxp
z449mu!S;DGecd|mHs7%t8r6Erp@@1{?g%$C+u^N1XJyATLPK8nDe>U6Ov at Qzh=Z6<
z3F$Mw_Zk_f=pW9BmCDYnHswn0N)gD?!TZ?ds^!3=bHhFizCQN_7Fa)ZSE9RtGf{cP
z$Y{nw?I#={>k3t%iihHjed?|g<imKK3_k6N2^^zx0(f|MnXN891Ss=Zc{+O+6WGjH
zELmAu%9o(S0I^5PR(_RjM$5{{`T6ve at W#jc_ao at V=``{A6FMkIcTV8s=3 at U5qyFuM
zoI}~Y>kRz at 1djKvd6WyjrNo`<wSrCB>LQehln1}N8yG-9{U&b7l-fGciG%&|&@183
zZ_J>J<#rt+H-XZ+y1i at _ANn|P(26+UUQW<LwSM2Axwm;^U$<!S at r>%j&LX(+620-C
zvk^X&gNguz at feT*c{w>lOH1UhU%&qO@*n^X^ZJ})ZOygrFpou$bb2A}!TWHIGa@=V
ztEENX$tUySWzYI)<JF!tAUCJ?DN31H;A2x&6sc=r&^Kj1>m}<Czg?BJvPTYn9dK=S
zbMx|sK0f+BvlRtK|3phcudpue*$Dl`@MI&ugc3ngEbsyE;!$Agnrx&F)2iK9id{HB
z-`4ARrqSb8xL+;%Jlr?p{{gMVv=8qx0%xFOac8s}5gD0TQ&Y3^2%^Vd9B~JZ)dy6D
zADfz*{(_IY{-5wMh-PQh>!u|nh;R^nhgwPf)7cpaLg&kUY~TI|<omBlfb}j8j*cW~
zzm7E!fU^vGo=uFJC8wea40qr9`g*PB1;f4X)0eZKG%XEX#>U1w`}@?-oEU?;o7<J{
zMf6$@v`E8Z)X|Y`Q at Fz4YzXo{P7sM^Vs`iRTrk0dNVOr at z5DvQwoxZ+mSbiF{GM9J
zO=OUL;F#9n2l)eyB)#eyjL+|C-A}3h0^ZBtWnzLY{mz*rW<O|ZwkEQhZ|M1K-d>-s
zgOrIUe)``m6Ijvsui^z}Y=m_+gNx_ndLZp^B?S!uZ$Lmy-0^%zkUD5+#<0eY{%0;g
zOx75^grp=`tf1knL1j0-U%}>Msw#e-d}{l_0VBvj{EcEe*DTVhBR?Iu@`IE`v$aGg
z=6}&q;8AA^iiHKRc_2tJbZno2X!#%A-Qi(*?~6$d9)~s9n@*(ri&DR?X??%Q-QABS
zm0Ew(BE;bM at PEb~zi4P^z(W2U2X_ziHz%j{@tFsqg?eV|7MT_sJzj)|hiif}2T2dG
zuV74{iEVPJehYfqwgZS;&nJyIUV)hg;D10egSkU^??Dpe8wQ>acl}Q={S%0{UH;OB
zjsz1F+-O=hkGi_VKly?5m2<ol*f<5O+P&u3ZdlW?>YO=5Eapfk0PJsq!2P8wxzRud
zBdF_5|BDrTKMHb7#|bZ2#G9p8qCp8fqS{3Qn&i~&N$6$_dVRR~vGm|E+P?F{*GwW7
z4zz4=80qozL<P{PcVG5V9MHbdd7NPjNtLCY4*M6k at HbCfu=g7UkeIUu;ZBJ{lr~M}
zdm;Ez?fa$Gu?Nap$DT2h4Fmh at xD<)s$FMzwt8Y+%TZ0WA9`93AOny)`;{J>J_?zrh
zp3K1jP=CaNp5{TwMsawD4QIQ7%Rq+#H3-zvX3eOKhDewvHx3`$1{RFLDHN(e443Gy
z6UgNYwGNalAYDtJ^38aS?6rr=>OQPgA at 35Sn$-&UR`C`)j)+x8E(%9o(h^6&XV&}}
zvkst3fhE7n95V at g%a}E0 at tL`Mz?3zli5SHGz(f_DAOr0egA$onS#1-Dc^%ME?0o>s
znz7L~DvQ>^iMU7SgKa{>(pTC-lya*1eKee2lRt~b|HgMZLqS-XWl0dSI<y_<6H286
zwP<;gbjq~FG^b|5Xhu4=IoLZwhAfcI+i2UFlPi&;B)*n470azJeq!ZF?DUc2s?~`i
zQC*j{uU#n9hE157!Gi~rr+EU;Wh2o!cx|X=DqDr|AeCdtS+#aqi=XY;&}+2l-)D8e
z)uc4z`qM<`_fT$_R{iKZ4C=7_c6QnAeiG|SDVPN(XUm;*fLHF8jelxDOe9`r!J)ls
z?-k2f(X=GuFH5^D_$;2_{{An%`#nBDfDdF83o0AU^XQnNlbD+Yb<&QRv42`e1=D*0
zgDh?LW4$u*ow{vwnoZ|>IWQ^0()c;{r43$q!Maib0pEudc1P#K@?P{ymt%4Ysv^qs
zVO>q_fR!7XqzIA-c?U%M1q76ywmtOzd4wd{6&`8<)>m98-lsa&#gXuYK)1KNeG1ay
zn2rZ2Jl at WY;TjK57iDWs4Hy`1{Qmb5D*zS_2prRNS%$D3N+7uCo|mS3Bh*@}zk|DT
zBDU(3)anrVC!10)Z)SbOBxu&;Q=c`S*Jfx(0Io;Ziitnz2=&p6<u-f`oAr}0NMwML
z%slumnsX_RIl(ZSS%LdBb)Lh>Kfj<?Ui?z)!8?1k43!W8H at 39)sd$X4$MDPVXfLOZ
zv>Ucx&%<N;m)-dXf36mv2E<hUvOpb>3+pf|MvQ}oEYW+*Q}YC<_|jznu#shR)@9Pa
z_*cs2$M6(K;*v2ACIERTph?~#zZ}k$*N2}3oj+;r6VdKxL+-F+<SLH#v58M{v|ysn
z&lR1NKH)8=zK-NKkznStPJiY&1EA^X1^OaP9sfqw at 3JFFk-SldQmwmZpvV7+zmm}v
zS$iHO6rg*w+H)pw&lJux$PMB|Ih2hy2c7t<TpS-#5osqk^HG66tQZj_2v+YCq^XfL
zjHwrz=_dq{Um950ja-bP)DA)e5%0mO4X=#O_+<ZJ8bFy<hz531HvPdgh5}?nA at 6M!
z!1Mvrzvx|QfJaz3`t;O6r`{Q9)gFXfo<ST?L3rqcFM#F@<WQ#XTuC5$K#U~Y41;`z
zA!KM0-j4#XOGYs(M at Z(U5Gl5|%3{f$J`iab3I3HU;qW_(w$oh*0~}>EfQg1z<@tc<
zu5HL^zfvm!d)BW+0C=hbiaP~#O*PR0i-&Jnb^_j~m}K{n$JcB|sMl%>5*%4#)1f-F
z;Ui`&n!fPbAzZx_-<*k<qP>QOa$orE2?cm|AxR#*A%lh1<0)RlH2MnD#={IF{k0g$
z=Fs=PY2tDKV2lB4Y}ozHlxHk)>pjoud1 at 6)dgz#n%wW=yfRR6!W at L(hwOUf&^dZ>P
zL%Mz6Qq|g+g?|MfDs|)|w7Cfw=27oCu~*)Nv9Q=(Ge at _B>7F~{+Z>K84S~`U*X{s%
zxRMfC^89NIQ}n7i)86gSt}#n?)_J0_8Tz3Q){@^8+Q&`QvQ61GX`xoL^sw|~*m1er
znTBz!&&1l!lxnjR10v- at zAxzcm5I=Pjc at tud<`rloB#DsCooy!1Md&3W}zRRbZS4u
zsQke-Y6{PM4SXYsmVl)v3bkx}q3FyOrO6SdDWGLmFWqUx+G+G*<#;MJq6afl0&9d=
zUB_ZRfkc~)Ofn^snvgk39gL|3 at J712vehCFpI7-GSuM^3KltcCKlnR!{nkG9PdAWm
z*U{<Bc^`ky)LjAmRq0Dl=pSNktEIXPN>Y`h*tEBg*oFL0)q%{R|7PdG?3vv-aTj^e
zw!W5h9-5X^J<gV?CYeM1zw>$iKmD4OA-L?X;~;h!qCjWw<9m9EQxsH9V$1TJ^y6&)
z|9GU9a4 at ZKolFR;XE%QiFalWw-Bi444p2Rt at 3BcqNj=b`hE?C7ze;CrIS_HD)oyaO
z3yAALqkT5(M-e+oV27h6>F<`jRfPX76{A=Y;E9&<6S`KJiw at l<!ep8Br{h7_ff7F5
zSBNc;peR5GPgy<IXN4J at a^)BC>B}0MxD%|}YhK#B!>aUsp4V at Mmg$jT at ir}RX$YC=
zWsxx2{TcUs$G8R=y)*oA0zxuId!NCT{u7oGS+&jhFMW2feMHBt`ongIMrO#Xt7U67
zTmo#L$_r at vOUQl+J%0k-IJZ~9g^%mgYOLnXF0<O}4IT}ZzrC}@g})#yDS*ePjvL|D
zGZ;%@1m!i}HjBfnR*_c24Z&s;&yz2(_i6K=o4l@!j+gY;bLvT8y at eC%FGMP`t~Vas
zPLCSMDK$|90d_+Uavlf_(c_5;f|+w|CizEx2n at p9pXl;jwjI8uh;>rqwdIc~y!HTs
zJo<7oG-!%{v#EXr2t)_`VR%lC>Kga=*HrP*Nq8Vz%s<`N<B`@|{b4LnrZ0s}`frMd
zB2vchQw8l;fF;2twIyNt+1tUu(<AVsD%rM@!%g8Z2*clQv^`NiQ1;X%{hi3Qv1#^9
zhHpZ(e*Spg4`GJT00vln?j)}qX6zVu;wcSSTy^V&VSr^cGn{2%I^QSx=!rtcfGCB_
zwK}>zMGcK$x- at sB<8<SJ_^#GIx05f8kGu!IS0sT=rK?%`$K55Q4fbpa?`XZT`P00R
z8hjtnmu at c5CnhH|OOB8ZJhxRg?2QZV9g~nSRtA{Qf?3_1!RiFe{47Zf<a}{10d*{&
zFfd3&&Jqn78JQ@)_EDs!v}asppV<G2t>F`-dp&Bz7i2%%gon3cBLs09*<?~@*Jz)B
zi8+6o^;%As_`<P#6&?0u at b!vGZ^`;*(!Dcz|NE$Jbl{O^G|zf0(=;{d!fP}M{!5am
zI*S8dHthx$r^X3Sp4{Do%Y^R9$h_{!?~8Dgt}e>8I-z}z+`0Q+`eGZ*{14&eru1p0
z=lMD&W+t64Vh#UvoQcIqUCCz+-i*{tmo=uezMa;0)1xOGN!ORAl9A)TD--RIfQB%;
zmNhm;3<bQ<Nts`+_DZ(W)YA)6Ca2t6+EqARY<g&Xa?|xOM;i!DO at 2aep?mO71(yjV
z^Cev8BY+hXmt$b%CfV)~vBeR0E}1)D_)g~jfLI5x5O`=8+Lk6Q5i>vls@{^@H at 1Kc
zte6g+XlfdG4ijk`YrRmxqHn1e0z#ZEpXCS8aI_IZA3yelH&8E*j3E}?-sQ1IC%X!u
z13L4*OHMmo^6+4P_ZbgLJ at Pr11A)Pi{Lioz(PZ<naN9)RhETEBW at OA>C at 37@C*^(+
zbA8#CMT%`Tqnfrx(kgxiBvzA5+^TF$#g#Yy3c&Z`EwT}kAQthldto&zNq=M=RuNww
z=M%Vn3upfboow~`emfMms7RnQ+?6<*n|)@XQ2S~s{g|@hSNnddX4}^Ai~Y}1UMU at O
z9i${UPU;O)T;D^*gq|fsjYFB?XE*f&TUY&h9v|7u>-%|l_`wSsoJvBR^y$-UC2$Ue
z0(SZ<9;aAS*i=b2rfBmBKMv0L9IdoSG?(FQ1k at ZgSx0mSeq5h-^8LDE36S(cnDMX}
znXYS^e+u8>0Y-0yICEY_rKhh`)NF-VAlU2mm>I!!dCnh>oNa45K((?9EcsgaD401S
ze;b00(`W=TG=z;#+yv&_D=I%;EcSoE^BQp}jB;(-o6*sJ%N1YQa;CwiSmX;2ahm4Q
z?Ayp#s$|v$b>s6 at GlU4pt6!l5%@2<S+aN3JeSvoF1ROi74n!Gm+MQ-q0_MnN at k1q9
za2YDg*jCqaluoUNbInNixi2hSe<t8gU&p(SLD^STQ}icxKfdO+aE5N}I-~|j4?u)A
zeQ4#hM)YX<FvJ!2OyvQxcB$#tNB$am6b49oWq1#_4$FJ095b&}_T~p3b{$=9D{mO#
znI=|OYKl8jUnbIBmpO0j=ZczOn^VX5S5srY&FfO1Whm};faRki1KzgzTO;!!zUDd=
zF$YO8S|+=9R#r2!-t@`|(`7gLAzR|a{I3V3LN2TH>DTT#tzU}^^oQYp8G_NN?N?Y)
za=?&@YPmQ0<{2#v#vZ#|Rvh^h2Fv|XaBfWUWX2vIgc#)M1}8cr+Zs;tdVK=#E+9{*
zCY!5VmzOvuU8hEiL8{TP*`Bu{BM+g2wBOdy*?y$hT%d{&_b1VN*}UlL5w{L|5^mnK
zw;%x$`199g?S9NoI4JvtNhX>yGMl&684&X$-QA%;h|hT+cA+8oJTtN(IsCuMYia^y
z+s|{jLCmG+_9nv at A#F>&$k(?qkK%Q|pSR<fN-1aMLU1F~R$Uk*eeW_!O{449hcaC0
z6NNAi2scrKSA&fNU|&)12AuRvFP}rVGN(E8x?MI=3toQ#>}_Az0L4BpX5<X#j<?NH
zw|nUHi?!3k)zR$`dM^0(dWzGez|tJ@%(E<|YB)-t#;;W#_2HLFcd8jP5nxmFX1Z%%
zqwC=UYxkeO8#({Eri_b^FVCB0Hgb6xzPX7jV3&RxANpOA<*C~*m!a3h&EC-=O7IM>
z=XO)CamO^w-MGCig6em(KR*9!^|>#EpRaccY!@~BZhK{NpqVm?c&3Zjn86Mtv<Wz4
zXaEF7ps(1#gV&#~Ue~wWRx<y*5dvmR|0W&HSIk`cel#%dr;(9n*sEjruAWl>Yg!1O
zr6<g~A)h+_G(_3z>^P~jqo=GHd3fKwwlQLp6K>nW*gVoNT5~z)_61E)cHI(uBn%+<
zrjjnM(cae&$pdIj8?pI*=X%!a(6LQYb{YD-2>uVgw~aOTm2{d~dfi)ZEA#a9T(q?H
zx*c6Hw#}y6qOu}sAwu>NNWL at wrZqo5wzET*=`gLMl&1TQ+vBgmf-OF)e?>kFrogTI
z+9TEIO!G5?XZIBb=_Xcg?%>2(IGpgUQ^Eu77EZTO0io_w2b5G_U^KmK`re9sW*^J;
z(QM at b{r2$v8UzyW at 0WE=(rN(A2$WF)>ETj!ogd&6t2v8I*`~HA=SN10T6WGXJ_XOr
zdNH`d;$V41H|`rX<JimxmY at J7h8{PR9Ogjp4T?z-pIZwH at 6+<uK8)+)U1N!+5?$lH
zWZCJD9u$ISs0k_(6}NLC?TsZc>@H?thOylmQ`g+KeU{>r?i8!s2%477 at 2HO8AzPN3
zTo(wXQ_1mCReRd{P~G%t_%`DH!s7E&o_0-J6D!QpD_!q8%bW42-3sArAptn3cWWBF
z3x#CPwP4B?$D;#oAB5lEq#b{Z7XS>d>J-RdmZi){h+Z3ZHI9Ij<0NaU{k?q^h at k|!
zNxk4 at n~Vjd6djQQuuE&Z_)SW__`tbc%N`Vj`GfAOw?0$A!4hn?uI^!EvlSUdc`YPI
zcC5O4xt&V^#zn7k`5+!z;PVi5)NYg;e({;`GPz^RTc(c%Gjnq-=g><Ua1b-G*2}YB
z?$X+A9XjZ|<776*cVpB7WA11p9Ju|i!yiyAJv`79E-IJe`G8uUo|~J`?yuHj>2f`x
z42Dw~e3T?F`GA!(_UR_i(&uoaA!{u2Q^=g&>v#ApELVX~geE6CPu*U=*6AzK4hR_R
zukla^NmJaRTNlQefczpu58eR$ZPAtKH&frIfKI|+8t!8Eb#y=#^=UA4>-M63_1)dj
zPq`5v_=~&vO`DN={gks~hY?SgRI91YAtx{C7|E$7GDELBtZ#HUP}f3Wc6|hR4Ss|L
z=nB0M0sk}ZVBJ@(3K>lvk@!)Ie(!Uz`xW#r^aKE)-fu~)ea^y|$mz_<C{ie>;Il4Z
zV?E4 at vNtq5^r2_=!0ZW8WdEM<?&(pjDro6=i(`tGg8wM^;m3_w(RxSLag|YA-Von1
zbCN>YjXeV0As?A(1wEgh(0SfG)m(sN1S4IFk}Lkq0FyCq`5R at 3#tJIli3}7I-#dW0
z%E+!W5HvbcPBH?HP at SHvua#4W|H4}_B-TYfe{Bl(UYtA#1MKg&VYY9>mu{52?h$7t
z6%L%{U96dyjZL*(0w`mLlO1w>lTNHm5e^N<>}oXEp;}8mA9a#f#gPmBn$mPWvONCe
z_3#5~B+baQ&WpX2R)4%y0oh(b7=7>RE6kEx7(1WJ=9TJR8WyAkN57KEir=E<#s!0%
zzvcUg;=)4bQuzGh$aDb)2C$dU0JnhxheMM4t)FM&JhWwEuNoQoMgaMx%Ma6-*x1-b
zGircGYw<nUT-1D7_)He=7Z;qzpZ2E9^j8Q8+Af=uzlu^_9zuOivl!yc7WmI at x7C$u
z+E1fm6R#SkSCZdn%sDR8so3xWD;#F#xg;keu}l2tzT8={-nJz}l@*~)J<;Vg8lCb?
zR^ko<o>acl_*STI=qh;J^@1<&0gM;k>`^aL4EfurAHx*VM91|En9WO3at=@bsB?wq
zr(3xH5UApYBE$lin9WaTT$XW9M6k;fZu&(JNb^S<^c0g3l8wf0Yy^Bxp%rk-Lwl2`
z`oR=ms#qb^NH|<r4mNJ_3J&`cH at gbh8RA!h3%nw_;~7Fr673PAu22F_a_YWE;rI-$
zow>5Jf at q@S`gY~rP>@7PWHRBUj- at 3s(3}e3Bs*-Rajfbj+bI-hmEaYlal%831lu`v
z<&9S1D-Nc9n|2-DZ(8ytxg>3&<}&d(*X#<tB$+2%azhweLKJawieFe#v7lpC#32ql
zkuy7}7n)OXSmP;K$kG)N5&-fkX)pAH`M)uWq_4a$&J`2a1)I(}%fZxHU<##2sA at Hs
z5I(y?ZUcY0LU;glYXiA+qx&W7CUZ09$}x&SiGcXS#YHo$^V}Pb=;$%)D at up0Q}rhr
z9WS(2wJNBpWH}P<Cj3ic&lamG3oHoLZL29#k*O0;{(gzdh~9w~GqoA=h`-d6jg>+X
zKH)eSgF=_l at wR(Kstc+1z~S2#7X7d(9YAq at z%>UjkD1qT(rF1=b84`iYok6r!_7B}
z^}Kue2YMttxx|Z(Z9YHzu4zVVKP-mgc@>Uwy91E7XI=odc_?KU>H9bL39tBErCTgM
z06iZNxL$9~9C6+cE0lfJ-8~Z=6Mm at Xwz+iOl}U!sOr7kMQ?HdaoBPjhZkn2qnH`>M
z=Lvgx7iuXEGjdlNJ(U+0ay31Kv at M_Vc=<0RW!-PW{=(?IAiMaW*B7$rQ)lXy#>eG1
zR<_8A?&vk*&~WA1tmhK~u)IQ9q3c704?u)9!G}f7?SJ7_FgXeR<&@{kE;JFf?s(bU
z3uaCxEqFpg!r4VOXvo*eCU}UObn(N>$AO`VFJ7tj+8N2GH*j- at Tyr+Z_!VbPzJq7@
zH{njchc`PdTP-tMZGZaFhoN**Y8+gr@(wa5g(U9|tc$$9g06w??~CD^fbH9*@tb>J
zp>~pi?LX|^^y8-&e$#r7cYAC1B-;<o0g|r`Pu#q{q?SW1T2pU%nXOvu$me(nBx_dP
z){>zij*TWyjY at Aj&EK^GGH9nx#h*-g5YuViexd1YqeuRk$WSCIElGLj9YcfkWkZw#
zM^cNuXg$Xo6^guNYWpiz)V8~7nw~f#fd~bGcypP58KXbkm;3_WK+(5>S;V77PVFH*
zSuvz8is&u`^<gHx=Kk-c<FF!37EMDgKYk}^htir*c}IaG{&usqOsS8G9sx6qHa6^Y
z(Jy$ak6{#`i`Ve|*}<a%+$AS?mwG&D11?@$PdTXEVtPLsdBF{Y+C<~ff^ZrY?*--H
zjhoVjTksqS;Cg&1>$uMqkw^>!VeN7$QfE;y_nA?2A at GDV98p~baE4k9g)ARr(P3BE
zqwm)83E^e>GR%|8ah4z at uVNaarC9~k)?5kowl(o2a*iByqSlGc34@@Tk`7gZBJMMx
zigAvUu}Nh$XdizlfU)D04QOUwgBgUc_eD?YE_s4wkAN$4Qwnfg^(jJuyiZJF_eY~1
zq;-R$0+Yvvn#%<BXvSMUP$Er9pJ`e(iWEg(z5&vhKgo1J4D&<6=-WhoqQ0cnrYKfq
zH<&;Ufek<mTFd9^M at +J3i3_$R$hQ?^Y|STmg~%hK!=@oppd;R7(!pPBm`?rq_b4h%
zwQ_$+mU4jM1ZI5dlN%tYPm(ky!e{WQkKQg={hek}z)m<G3845+nKv-AFy!JC>v?n9
zuz;HrJUI9JySUJ^{l244I-{fh!~aodF^Ki78Dt_-DyWvfn4-bGIFT0WW#cx-S>}!c
z6_Q+=J;!IqA(5;vzg9D-UtTM!Ws+I4kk~Uf8Xiv-dO(XH&HhYuT at Ya~$Ypt5a_J5u
zG6WqMd!Ol&?#O14dNv`TAGTJu&jTWeY!&ks|9p<&-p?T8l_bZug2aZ~@7m|*)l>v!
zK|tRHgIA@((E$&Mpu|KJiGx85dWZP=6Jn6Km>zGmJB>x&Qy9)_>SFDM7VGp24(ADU
z3<vl8w{AeIYL4M#8!>PjQ#xyE9r%*03Ev5(wf4tF+$sPWdpA_C at X}O*yW1L|?<wYl
zkpo-RK5xFrzc-&$eMRpxGU^Q0eR?zz^QDU{oM$n!MFwu$wNxh=7{0S{eK90nfm601
zK&K#(6~&(}{LJwqmi~7?W&bWBv_D|POV*b6ecaX4R>-b+1Rtx1crzP~V4rru3A)`E
zh at p(Zp^$eHL*G)>@EW{x2K%qn;`E2PPGDjr2+!N+k%oKzJ)EKcG at KG*APLK1X{$p*
zO>Cop7;n_r5py+z6pMg)QZX#~DIPP54hv=83YsAjzJk(>6eH-9t5#bPHFS(5ani*;
z0zhaS6F}MfMOT3gS5tJ*{CPL=>_K}D56NVUAimXd%;B^8%N0FJcy>fV9;<}$5AU<n
zOg@$(Oc=W?y}k!ZoK-Y{>h3R$<Zn;XpLxXBlABFB8kvqSom|inEF}rO10QngJ;|4b
zJW#UUtVm)yWM2eDZ~_mh0PTw+&rZE$g+b}I#!#1a?T*g)NbGOzVTnVh`n>{=RAyI}
zt$kGaN7M9wI(C0a-2b*yJfT)LWeX?m-8Dr!_G_0Q>V=uPAJu=B4G<Ao1_$SVj66Ns
zhXlS%jUTT;4}#LQ6PZT%UXZ2E-)UH^Ao%QTABFs<Db51`olz1M7yc=)D>m(O6#DG+
zfB~tl*2XimUoZTF*N=^=<!kq(4FUTV9<ay21*VPs<|RRoICy?{gZ_V7$D=oYhqh-N
z&-MZV>2LS{IRxlEYLNTzk8mL6`73TIpeS}9!v0-Yf&dCostFUvpY1%DCZU0Mlk$ui
zM_UZ1NAw<NJAkcnpHX}8%HL>o`e!ZxTi$<|_cO-)e98Z(+5Y#@fidF$DmUQP0bRvd
z-bfH|108i|)7TLZBj0 at t*}CrwxtAx>s4*P;Yrj)dI}t&(_C3=M{Z#4CChq}j=;kZd
zO)5u;ZASv--^kt8^K<&2sw>Ok{_$v$zXD^%)@X3y8!Z~ZSsiH2 at He9pnxg#qk?gqC
zN)6`^91ikgT(GiGqgWyzgAAFBT0^%d*su&v)zWj>$r2aNBgavC8I5__!&a at 2k}#T*
zD3UU*|3|i-xi*4!@ec}pWxH#k9~iHzuck`0?L5(B^x86ghqm=p^uJGZZ}^-;5&ka|
z7^C;~yE-EEy+4(l*mueQ8D>6`7V9ID`;%esf)9MPCst&|#$6punsmYW@|LB$R{G0>
zR#fJ#-ikkzT<Gl8VL82}aeM(~H-ToAedGnlfa+~pR%iD6DYvRWXdRGD4J?$I$5@&>
zCwetc=7$_H0)lXziqx+M9rNaqGI$j@@1%)Wy^Dcv0;<ng89O}NdOz%bQ<A?c_|vpk
zc=az^_TMF|<FBWAf6{^Be)H$$@bIwCn9*YTa(s8wlgsp#sMQnLRo33sH7K50e=V5Y
zmtZb#{-j7A8Bnh at Wa(Z($y1yh?5%{CnMDki at yDsUQp706K`=&Ljbu2NfJw^bJz!H3
zCt4GN*T3iU*MyNK4`7}mAN{`0mVnceJrWdeM}U?cKyoQw at sgu+#0B(FVmjtccDJaZ
zE<V70elN)vH5&}`;BY0!+|!nT(ci1&LoE>+<#aUD-SZQNJ-sy9eW~|<lY^j}hrD#(
zcJOfTsAYA at o5^$VuZl+(U$Tp9wSn}i#i`4h4{sVhFOY>F&d0xZ58jQ60U3I4Ls(h#
z2id<Arl3MtgH&^%vXmq=FDVH^DR$N~r2oLh3~J~qQlv+;(oy~P_D4i!2*!wXB&uMJ
z&=CrU5Y}y>7-qE_en$e<eOA8*InzU=7{c9q>8O^WrEvRuyF}H`jVQk0+N_Fvf};uv
zGQpzU7N!5S`pGF+X3i4hD|E;<!xXFT8w%{I(#YJ(ka~zJ+N>tx7YhZ7FJf$r{x{Zu
zd-WeLxzgO5rbdx)b&(j>z{)kUYPPjZh?+1j!Dq+(a4$Ow3Q0x!ZLC<r1d?E`jHmkI
zFHs`s=HmP=^ab=LeFqwZ<&lo*TpWs05){d?xnD3c-It&f7k!SPAxRB_Uzj1^91%Ns
z#MpL3DdOCq`ji<^rK2)_mz8cd$6-dyt<&J5QsjJ#jf8L21i~a~(tPtNEHAzXiqJ<@
zm`#uGa!aFAnF`{2FG!3NPt}@!!HDHJZjs?Ks*(H>%kVM4XM&!Z3ZY!d2KCLn$5GjK
zX-y=XQ2|bSMTBbIexmg^%s8LMr7svl`iL*(1nk=AjSTB*n7T8BPLA$$1gxXQc|)q!
zG?7=}doFFB{q29#3vd4tJtih5MbJPvI2c0Z7 at DPdIXJA|3hZ6DEgo6krTPfcBcE^y
z6uy9hR10`VP{tg<SfM+`5QtJ}eHv4w2#>eXrw?-Gi^_0M<f0x%W_?^^4mOtRmMg;&
zt22ZVdhsnsMd_NL(jd`8ph8LFQ1SE6Idv<0ikNRh6B~%i1qo{8=&yf=!1KZ)ZL410
zC}Z|H6R|=`dyfgAc8Fx9to8U%c7AmT^uE7OP!7n9$HK{=`XWn>i=llHZ;Xs8+9RP^
zF_$dggT<oaV7ioB`2Bd%+%ihiEcdnO52_2~_8*M~98o5+BFdG*I1R!)5wopXP!H3(
zzORm8z8Z~^xU8*Hg=Sco|6I`Su}qp4MehQ;gkvH}wbSXXOd|orQV8z49pyN`)t`bD
z$6Pkru?bKzOeWRD16j*P;Zd{th1ro}-G4)?D$^h=!gg)Vpo at 9UTYYk*rNmaCwz>Sy
z93<KyBE$f3rid_Mu!Z`inK{L2+aYDDf*Af}u15MjlIIiDEMK$IN7PFtQU7RGvG1#<
z{3E27_k^Caw#ICcCKGyi6uHhhnA{8@!J_w`wA3VWZzoAzPCX_}4am=<O1(SHBMYqg
zJ`Qot{`6fpzT^5|6)X!dv+Hc{>}=A;Sb;Gg6%{qQ>x>9^YG$=(_5E06zMcyAMPhpa
zNB|<Q8V$*(VR2A%$1r;~Yhm=%D!p~<BY(nCKu4{AS8e^oB`-2&g9W9$#-<;CGFmT$
z*iC~DhYAy<_YT5(Z3Krvg2a~*6XhHd>V=#^BcAcWMo4V1r*#9T855IsOH=reg}fRn
zRsG~#vh@>#24jmty4vrzEVQD8&`dwI^n5wY?Ix67+mj=xn9eWz(_C%GJf6WrNXTA6
zmuQY9dlJS%2y>=fblCt}y2B9RHyC{=Y=rPSK$+4zP_Tcy>M}?ZM%*ZlqH-{h{F3++
zY-F8R#FyACrEw5a>d1!J?XAe+l+xRK5sJuO>UN3yl!&@Xe5w;z;hIbYo!ckPG3c-#
zKDRCcaj6^<fYX$aCU293-s{5YVIM2C?y2iY6Ltv at 9jeVD|K{FG41}4#+LgH>)roKO
z85KNsALOhi0fnP6bLo1fS?<{zsgDQB3XY83^u at R5j+gxFTfzf8@8;e&4-sAA56Y`_
z9bGd0<lf19{_RL8X?nS at MqSQ@yaB=GF<t(}T|<N79Umlm(x>`nY0piA)1tYyu5JUb
zaJ=*JNGR%9ElXNHl6|`-*+sQbEnm_lf^D69pW){u0|?`@T28c$wL$F_AHAKGc#!%w
z-FUY=kOj1Mbcj0hr8c{QV*apy at 2$HX?e(BGKt3&$eVObd2b4`apJJ07U12lorKAF7
z{K~J%zqe)+q=m)Xrjv+>#8D1F!J0^mE#L~McoXN;!r2e5I|@Ww=0rGZX%?WWjjvXB
zCwMfWb);Y!-&amlzw%dKiFu>-7zBgT7c3$Y#5jNmE9UtFrz?GpEgI9YWFR*l&Oo(@
zK1*{N9_4dBO>2T{&Y#F2Bk?bZN>O2E87asg(wj15<%-u7$CYII4HzSS?$?HuY5A?%
zRSH*AK1};C(*YcB*`gnjDX`z8EudYN{h&yVpft%zjsk$Lr-9FComqy3w!fIsvA*&|
zaG}D;3?g*5E26>3=!hjJ+MvLSofC=5di3{5XFqM>hH2<0u1jCPnd3y4anKT at OR}-g
zZvQZ%Jfsvv9C&e|#0`+Bf)%3<uI?TDJ}Wv at Dd9ixSuUgg99R*`_qd(lXPBrxE%!<O
zi#272T6z49L!jMxkrj;>M*ySEsOQyJqqY9{sZLP1i|!$DP>MM)UdhT2DT0;p(61I!
zSZv!a%oz-Gn%3CT+BySGK3z<eOVD9du77vDt=SX-KZMWC9lu~y9cB<=n0Y+onC}!Q
z-a?+Z$HTH6<U+jf+{3Y#($c~=k9*1%aOg?yxKKdNI*v=p{#B%9Je6-Q1z|twnD4 at 7
z&{=$bkT%SXXet^SNEh~tIy-Yh!A?vc85z+{zk8cw2yO}Qgh=g2(2HTJdAd2<h6V1l
z0wf1n&9fsrEI%heh=aLgcRpl|z`k8h_~@pL37#2<eg45I*Tm`5nLJgtZ8_j?>!G&-
zT<s9YP~<^8{L0gF%eI4cvmk^XHLTt-yxS;5;_G#d-z5Z<3U>ky_-=c$4#uAE<Lq|S
zvcbfjb%*C4qgSe=v0u!xlN*FR$jdFDHnUN?f2dbwj|+c+llG>ckZnOdY9T{h2OvR)
zt)oACbJh^yyj?eP5j457`V(+OXyU}Uh|kWA?fia*gsJN4vqWgJg<G?2e99DXQJ0Wb
z!7 at dyfOL^`-(WhPi_#E at G7^cG{23aJl(@bamXe1F%FG%YwLedsCD&c2con|G7wxd~
z$-QaaJtJBG${@W$5HM)jj;<LKBpagdKLs+}bm6c3?-IFtjIMMtxQQ${&WXwAYx at 4e
z6|n&_n%uTrY;GX^gOn`0EFF4D)5d&Jxo?{_Igeg{Zn=*)yNe|$O)G)u+RBln&$&uo
z5 at 0+&gKt-rnj7|mFmh_C=e+eYyu7~ZDb3Q$O-=3^{I-*J at hu(4Qbpyw(1*n}$d2-M
z9YTT`>ie2q-o{9mdSfEf;bW5G09N>?cG|sSyuHacLRWVhf-PR*@5f2jY{)Vu`6O67
zGM5G|T}~pSYFJ-3t6)!&dw<Zpa9XMLP?RiG>zP_ZB`}^L`b at v14DvX4v(dtj77zQT
z!%h<AM}LBJg%9ov$;fM(-Rd4-0ffXT>--T<8&6!UKG}HA#_^p&m#GaNj$(k^7|~R%
z=afi!mF0KND$ouOd7$d)Mu14y at xx6=Z2ieJ$n}L+F5&EDn5C!cgT7R5BWu}#4(Vm>
z`XD@(TJrjSbsad7*}U3kXCKlGa~2nw<>!-h{OJXQe at 4QIA`K}gTSnV$Ir8LzGI&WW
z&XVLbQO@|IygsY2)6)y9r;an0b`Qz- at R5U3egbOF9l4O2^h35O!aD&@Z&A*X^{0_Z
z64OEupmR`lu~R&-eSMX~?sK77<W+kbFZ{=aO?N~*GS4&IfrSCsc-1QE?JNq6S~Y%y
z&js8hH_%H!@!w(4UM!m?tL|T0SCNmi^R`~5{R{P10d^3QlR7MomOLF!MwpD2W5->+
z%c8WNssJ?=@P##zMs1El?F9B{IXPojL*48Shx~Rk{Bn-tnkeQXzZntx6n&O`?K6^l
zH8<7{0yFj0=8uLxw(#Nm+ERmZ(JL+Jm+avu3a3ITNtebS!&?}W0DCh-ET_j;4&Lb6
zdj_iGAVRoSw7hqfSO=Tp|E}jQ%7K+L@}~0_oZrL{+_iapS)x{1N&0*1tPg{lE-9BI
zS at hjnE<R+Bv*IR9tmu<NaQjIGuY}nU-sJD2oQ&B0xvjcdHAfwHLP at Be6AqYMq#l^I
z1!lUB_MmfzJck)Gcvi&g^ac%FJ^SmQ?)OU8bDB39tont+Bi5Vuo!B*dtv~pHXD|X}
z%fk*kQ%?4A%<#CxRTpcwF??OYn_X{X&p4jP`uR>`nND<W{Z84OPXvqK4lDS}f!b=G
zzJ#e&nA0>ex-M`xe${wh at bX@>--LykYI1JU<vMRc$?A|A3u=yR$u=YOjbwuvJ|3$u
zd*n?7l1BH=lPfODqn0&kwMSF#c6n37M}MC)UMr31Rc^zl37mT;!lOKO+|WA0!nDe8
z*JZWo?bY;=jN0!jF}6?qMI(2t4P}8{yyM*C3EFcNw^>(7X3Jg?`gwS4mF&F-8s&97
zFx_Tlex(+rH4=$u(Z9A at XK*fyLo+)v7bd<)c3OXxq#3d0^PTG6bG{m>cZukF6;uE=
z4m}JxrhQ^cn|D<8#B~#7 at Wui1e=>l`x9{~Tf&zPV^}NmWw(s_Gm2S1ry519IwZ0ly
zoIBuvg--dDMofkG+iTo!e?A6w{<xcps)+hFA;lLhQyutCvsd_AaXSl<6x{WxMLp!_
zx_iaKNkqc9fHDMTjHY6i<M+pL<=(B=X^=LLrWfy|<bhs-Y(;FDoKNrK@}4S0WUTet
z{1cf|#QGd`!tg-6wVnB`$#*se8FlM9LukH+rdU<7?=nczPIT(LQFGr1j+f0%p)eAe
z1D%@#WpX0WoQ#oQxFZvECq$^q`+rdge>|gf+ksO+xYB3Fsf03+&UOo0Bc|72pf at p&
zNx)ZqVgDYPQsZZaPMKRaS`JS15XFIz-M6m`+^aY;-;w_mgk0-(ZbNu3yBQf{oW<yn
z^`+ig)0?V(Lt}03$gl5~eKHR`cDI`1f7u_NxpksV-|Vkk0CA6*rcAgbs}Teg#d0K+
ziRsCw5bky=0Q=svZIbBS#!o4m%WXi+%{wVO9Qz$O<y05K8H7dCY4>wR;}A2He07}8
zP6>MA|8l7J(x6)j_gB*uOk$)5!=FY(4*{N~E)HXZ at k&iy{hmE41>+>WIfOZcdpJi=
z^uqmpO>E{IfxVFkJ_CdCvtDa67UstmkKioyppWPJEM4ytg#*wb7g|SW^)3sm!cX>3
zlQq1ZiD}yHx3>&tc{g>5mh;dM+D@$z#xNmL%;HHURyv^doe}B&R&9b_J1b<W?I)VK
zI=f~HE at 178LW)?%2#8aCZEFPVB3K8RN~kJnAm9CP-%Q`EM~k|=_Mate*(`ih{l;M8
z3mhOv(ed!LwFtsri15Z4rgaUQc|f=&a54}H-(2YeakAW-pYwGZ6nd%|tn8dFPKK=+
zSz%(JT6B(4WnnaaOdsQ{NYG9BH?5vE#ui`S2BF8BfHd9sk-V}5t)4yTbQJe*N(kCi
zf{Vf<K3wdkOI|#Hz=!RJ{d90{X7DKND$qPtLD7fulVo0nu1#_VhPMky%pVZm8(0%{
zO|6teJC`*X{Ce&05{&T>zvIVV?>wf&T)KTQImWfMZN}0?kZZnGR at EGh9#v)_Xk0i&
zE|ZJ*tBc)aWXReQK6&pojckicWX*1u?ij-2wD;l_S#kM3&11f?(0lgqC80WVBAemk
zj7jY4yV|I=tsewVdIRXr8F)42$2$1G)HeJ&2{3aS(-Yv0QFts*dmXpWlyuhCjVLR_
zEnV<YeBrydj+~#KEg at 8n?FvVUuA2w94Y}hT5`fMPVh~2f1!hSR?j>uUiSdLmXK<b9
zNeiD&8;#Ebkd5A^7p6!h1*8V`cpBY{`&`pfkW`(+K!#KGZ+QJx3Gsk$0aGPa5v)@F
z^!<1Qqe at aiI#+)_f5{K~W0_NBoM)KkNfbi at DN!nKg)PmCfJFQE(R$Y#-M|!mi>$x(
zk0+JvDvwH0AD-iX!4BUIEftSW+Pweay}ihj%W}&X^to59^_Eb$4R2V3(`{7F95k9>
zR?ANO1HDIX8Zm}+A>35MUe}oD;i_7A;zQPzNaKz_3yW;^*<Xc3hD~vr-QL}m#Z*ld
z8AtfvwD%_OlW_eEal3i*jUyd}nWdY1x?EWY<7|qlX6&6!S#(s&J_7oy`EvN>vh5KT
z)SbzcY86gn?DjGH5zZ3UGOX&`9~o$N=1)Q=CmzKUoOIG5HZwlXU;h!g?&-m_cIomz
zox8`kqzu}ThQ at yob}e=b#f!`B43`R*R39ptV}7ZPQmLs~3T<&3Ke;PTY#Dl<-9X~P
zBAfO2X_j|x!xw*_qxwoN-|)xx)B76c4Dogy*ix0QcGPHDkT`qcDqKKF);7+3c5Lw#
zCgo)hpYpxA??KI6?;uMpHH2?Q4_tng86mFK-#A>+utnC6^y_XDhHn0nUpXDR91z*z
zW};yn_%%3^LV%PcH?h``@&U8yF;{32hmy)POdrk~7ucFP&Gc3K-peeAHalTer(o_D
z*I`KOFNpS|ny<bv%$ZYu|DEa7VGX)pV!9p!v~im7pn2{HJ06?`C2JQ;b(I}dux<KK
z+2hL0?peSjp_`|%)ikRsLbMGT;l8XP?4`Kw9gIjU^iunZYq;<S**DhO)2^zqX}qpa
z9ng?r&kMidpC|16xQpK1Q)<LJ8XD%st_ct9Ew&Q0Nh=_2$fucZJSA9PO6VGWx at WSq
zyzF;a at 0EWV=QC47rJ#FuLBWZ^!rZ#Q6?+wE^Z3 at RdaiuDo^(V~a_GF-`fghIniEJD
z^a`r6TaL0mbe+GQ9!S|vaP_>$;lCk0IN&*`967n(#gdn7y81|(zA4-hu1;*Huz!6&
zlD;yZd-br?>=W*}$-W_67 at _z0a{lR0Y5Mwz*D|{GliZSD%AKIsB^X16OpRJ9s^JC)
zS1;ikV-3Av<~AVUtNMV37A=Q`+5uS_RV23ern0f($oS~<!{<DR=cpQm(avhw3ay+g
zG4~=E3B(p!I2HK?Hhj2NZi8~)605fC?+G_S$&HU%xF6?QrRQZ)PC2bVO)C<YKQ!99
zYCD_r1|=Tt2e#`r<2BbV at T~c$?K?eGN8P=?-eH@{-@*#d(E$>VQ5h-S+*7ZJN->D$
z4APrx$^|L^<?I<dDW=*%+q|Gcto_Z`egvw!vr2&<UEW$p`3W_8^tmkjEg{85ZXa@}
zP1PE8UI0~D5xLv(V6lO+Dheu_Ev~Njv+j>pC?RbGFv)3c?aJMA{<C^8qp at tSAkyWV
zA>EGWhraC?-DXM`-lEoqE=h(zt;Qo<T_!&T3GTOPxzz02uV^Y9$*g1A0-Xa#aFF-9
zH(?FoDpYVI at Q~cn+z0lA)4SEH5d#S^X89{??Do?A%K#VEZ<9?oA&XN>E^I at -vu=Pm
zKcB<G8Nyw}v at sT!qsw(0>~CEcW+wT_M);NT`sj<vmxEdbjpzW6f%P%7+*JhJi{BS8
zki(M4<LM(;&T+UosEp9g3DaBhG+^|O*C`!EM8FtTWvj`|tf-#pkX!tzHtSPUw{~GI
z{fa{2c9P*0L8<)m=^gW^8LxaK3T{%5Oa7f%lKYczI{>L~GJ)!tG)fmYnpYcSgKyzw
zcIMgmHSHpRy*%z)bfm5%%-8xegd}xHmMla^Jquc-gN0Gb#Fxu&*Y$C5- at V2q{ps>h
zyYcpZU9Xlw_EsFebnY;7vs&K=x|_iFqVIhb_**FJ{q5KIv<siR%Qr%In$X5A5;lXk
zQS*- at RHzZ+ipPAeUmu<4cs5 at EjkM!DU{=}Tw}=C-1Yb=NM(j_Wo^HOh#BF|-Q(^t@
zZ8l=$!oE4i4h!wxE^7R>D~y5K756^a(N$)g`_D5`Bnhedowpz~iCYjEaOlD~JTe!H
zR=IECVN*1EQE@|QnXS)KeEwl81fEsJ<Y8rS6Z_GM)R6yc>%w5wq&bTExlT(+0asWe
zY#cTcI#qmJnVOAfG>Y at 6ZO!NrDiq{y2`FngDhVln9o1n7#Mn8nbgN(THm!uq4H<#R
zE_lKdJTlt(`!|((O#^kSfCwJoJZDkEAGeI}+5oKl)Nj1Lx^!^k7l2v`*~U22I?g2}
z1MFLf^)8opIy?p=W{g$XHUAH9Zy8lrx2)?9+%32hh(Ln7yM^GvgF|p95NzV^Bm{SN
zcY?dSySuxek at c;8 at 7ZUsbAR5}Mnfkw7*f4g)%(1qrqQ*XWB-1?&0xV-P1d at 0D%7EA
z#)*Gf8;FqYYIRKH(Ql+GO;GV&b$Y^(17;bR%O40=kCM8R98%#xNxhz_E!KjWx$X<+
z*5X#<!#|gw!L*VDBkYo|u{wNk+Uw(biSp)C%|0RAZ1=Rc8o#b1(iBwUVBFJ4&f}?^
zoPo={ww0dMRckPN>WbZP2?_G at Rx=3#kdmCdc6c~=Z}B{S^f*V|(|B~WP|LZzK@;|}
zC0Bquls=WR=J6aG0Vdh!X9ww9i3%RS?`f8spHaz~{38SkH^7&dT%h^Dl$OQ_K>v!d
z<poN#av)1RatF9>=XW~kH)ldOcdAV<bz3}Or;bfMGgOko_i-(9m!7!-NewJiCki at Q
zeh^~+In_ at b2>UI{o%S_>jL21J)*IJ<^*0-G0r at N_?sl*UlO8`+;Pm=?E+ at Ur8Ff}o
zL(trum_$~1JbXVDs6=uZkhYZhewR)+US~9;9Et)=4T%lX&zpvsD0iV~+j7R8Msm?7
z<$Lz%C$|;5e4*6^vt`Gr!J at hx2om6QXS-`Ll7^$Js_}l`t(c{S7|2lWWHpFe_+C>K
zH2BCnjnVK#KP{SQCqCwI>k|Iuvq at 0ZG~o;+Q7wUe!o(U6K);w1Y&FcWU~s;*FhMRm
z4WSyslZjeCDBq?8W^VIJ5)9Ihs260RYIM_Jk}O8#)BzjaMzK`Rg()tLS`T)WmkmW=
zRJxXJqP8}<Yr2+6AhuPZr_tlqeg}T*0eT+yYtsyBV~>+V#!^KSYk!iCW)if4eTh5E
z&V)lmm9{;-)+~v(<AVut2ug^WhUQ-fTRi;E`@~9nwIvlgfO7}hlh<X1rQj;u1P8di
zn$fxO`#huPueUn2%uHaQ_PpNtyW+m%*NPWYGyVA79MbbsEVFPvvqmvqOAXkWI)AM^
zeR_Rm at VKAZ($hUL<MeRP!mEo)?(wX+nCWjpYgmkXb)oZw-tzDs=@1IR)5v+TS>gkM
zpcD-iF`8%jU#U#`Pw~<B)9OE=rxUEV+3KALFgm$E^K%8Rc-)it>!tk+TFpG=X6<O5
z>*H^)z-W_%ZA17&+lMc>F7RTs)H3Db=f(`3s;;scOU>)*qf+>7YC>z}Y*1bNhqI2y
z6Wc#s=n5X=e at Qjb0K&wsZFk)LXT0qk0)oVDs|oF|R<@Oh%1aXZvZDC6v8P8mVp&6j
zuYwVjm2PS~HN@<f8A4zIsH)C;=VQe8^yR?IBxQIHtmn2rx_uCxk}__WObYijLqg$}
zw9MsC;H`xj`U1j-m8MuG^BF1o<eL2Ww})gTx~|G#zGt~_%LO>a+d56wWa{EEf6XKN
z;R2-9-*va&(@$o?7<O*M+b2rcz|h!3MEtw1D8os1N?eNKN=rh}-fgqwk>$^7Z!xU6
zVPiHH)pz2dqX$a{4k_LXEib!cnWl;WX)|{nZtR at xgC!5bM)(D0xoFHD?FKuF7=TF_
zsjKQ@{a|x-yy!~#5^ZqRgnH4*vBAQ8_N?sJs}N^noodK%9C_DtS^2uf4Eyzu8K#f@
z+n!E;o_|2K>W##EhCKTzTb!tjVI9y`<f~iMck`wa-$M&_GqTkNLzJu8f9bLip6pol
z@^u&fvZwti9d;p+x>xVJ%fV8udMP5&^%#AJFhO2E at LyU0q^JrWzKG%_EemT)z0b49
zP%mG6kP?lHlM6{-(X=9kc+M2#taeWGPnuzc=zmG^J90U>`XLHd-OZ|lCnmn25QLd;
z|MjIQ85y=8L~QL9CtTt4 at Got7#+$MuYkB5^G4P1^Y1GQd+W8iKZ)1ek<Qppvuddsg
z1NOa`K;c(`m)lD2;o)VqMlJVCIr0q*54G-*A-FLC4Syp7EeH3YTNoa=yS5RJun_^d
zvloF|xEPPxP at TYya=Dg{xjDk;i&(d|ON5qN<HrMX_kb4sE#tz5S*S|`HxEbu=|Z`)
zDD`88XF`wLjtYlk>kx)9vugRkJ{2vG+Q*MjbUw2l4qPu022*Cg|4~xRCA0ihV>H2f
z@{a3*`<!cTt<bxuIeaFWAy6!8LQldUAqEAF7c4_!LEnJKX8eVPQnCBs?TQ-{q2AgB
zPeD4rwX;~}Tm{vMcGymf>=HC?j?4&s`h3L<!XX^C&rB*eeTl|_2h*8wgZYv4T${Vm
zvO`Ngp}W8`dJB)@puv;y4i|~8wmZqX)6D$bkMh|~T~OLCJ2KqRy>FqfYN6QH7QA&(
z6P!I~s=9zTee*yYx6*w*UUZ=O(#{<|^lL#v^80VLTC<fI;@zRTjG0#x at 8n4?9`#17
zevmuFuBeo=8suVE&<GgiSoSW^<&GRQBE^;(Z|`(jHGY}B3PpE}I2s01(jrphT*em8
z6M_!X!%}Vtf0&;ip_+n6M>le~)=032I~2>Xv0c*hkI;j)5p`@r><n3Za(0YqQXVdp
z(;Pc;r>l{IRIfYZVy)&o``X!;dSW|pN4`lC^5#qCF|?+p!$|DlNu1n}OweQD^tRAo
zM-KiS0ozQ)rE8m7M19Sd6$f6q#ch_S?W)FfTVPd2y>N=?PvPDOixXAGVGKDV at 9ixM
z3S~;No0%8?`%8OwtER`5+dwACmrDuP%uv<Tjh#?0KDF)}W8;$hq-03M3Z%1jR^m3o
z`m58!HQP88{JSUQ6^%r*Kdn6&1aV32eSNtZk1~yqu`gZ-e_LJp49|dc at Ww+W3jtbJ
zK}fYwPvHm`*gHIv0@@>D1ZoHF?{(S;K%dWrUr|qcutiINW8{B<Dk1-Fk&WidHu at P=
zZrv$@J;_n4xzpS&?oujuJz~LM$3gF&QH*lKR0{nZ9~!iexJ}p+O=|817i5Wxjj)S9
zE}u{^p|K|m5~~shP)Sbyh~7VU33V*lyK#3XC at eCcR)$QQ){a?)?HRiplqY7^i`b$J
zVQmLqkI~1(Fw2vQgi9oyljdk$nbkhrPgX7+Q5nX>l+~Y5OCDMs%GJ%-xp_dQ%e9>l
z2AYth8<)rohDoo;V)<U4&5F2Q61E2h`rTsQe}6Eaq6TMtdpr<-*CL;jm6I#>NKQon
z^MKZfnA)=|otDm69rqxH;03j3I31W%<CdjbAdMj>ZOTk&#-U0Z0&;T+jEvWNKdz0l
z;bqpoc|7)gM)4)|_mXp`^ZGR4MAOea^e5u7P);;!?Q^GqzV0{-EHtyBx;O>qs*Pgs
zdTGWnxrgJSR3V#=loKokLYOf$Uc!#us*}H)67(<qyk|d&HG$jR9mHN{LoUx$kIqbd
za?u~+=R3;x8-M at m|GwT}fZ8bhyGJ{2wS=1SkWV*XlkanIonz+ayK{bPA1Ax;rX=w4
z#WT?sS?T}ap&I|SWOL?N;Ma+hy}Hc)SN5g_4>UVpbl=b1IZtl*0J?4`b>@&(qKK-8
zxtG?yxtl-%-P11quDv}Pa4d??bRi}GzQ4N`aQYw at Tl8J4QWgx5(1TrP6;pOor99(h
zQ!YVU5d^am9uYcE`>KJWl;ClD)k982B(u)&k~jm|V_5lm#m&bjCNg2;_Bh`Vfdr5<
z`p0pqg6CF)4(n}QsI>rgROI*y)rVv3Aknk4o)&Rt)#`roo|dJZABh(v{}yrm82f(}
zF^_hN9QcftWpKf-LBE^I20uUb7D=j<_QQ4V{TVh+jStKr_HlTo?Gr30ZW4=MOYzuu
zj2T;GY3gb}{nclJA^*Kx$|`7uV#1yX9 at 9JSg82(cGfwd(2TtmbXaokgGH1UJ=2h&;
zg}PgX)mgtXVBIiDmj8q+)^@)qcBSKon!yuz8V*L)e7xkTYIgNS2o(y4AZyKZ at ujZE
zf;E`+ypYuR=~p*rT{uu<`;zXRt?th+Lih|s#>U2ZMG|KNqEHPDP+($nSSv=HW9s1_
z!PMLG1l_fQIO^mQ3<mqxEbw<6sT%xTe2`#716 at 0k1eI2p?$Z#Dr)enR7Lk4O7pxWr
z_nD0eg~uhxbK0}h`6kl;exLjgr6Kq~g9T*JV)O>iX}cVJ at 0xHy!r*$b9R>$@T)#Zy
zf$Iv<^z?LD%{9X<0{II}2gAz@%dQJ4QoI)vp}7Zr`sL0Gx_S}zEX)&0s+?RzInnCQ
z)6B~=Idv at V<G at Q7#}W8f20;7AUrk+cuk-u2e0`h at 4t2e5dBzH5x_v&Yy*)fLuy~Pc
z&L3Z)v)H)2gp<QELVXz_e-16ZM!B^Xc;I2|K0VztfBe>m2Eb$tzc^T;Y{9^N1g9%O
zbrT5BwWLqEe4BF6I~vJT;;#&U`Mmc)mZ}rL^^m8Sj|u$wl9QQ%BcH!_vgIDI1zoYn
zYM0&db at ci{|6d}xY)6!RyLzVd{I`Z*Y&$a)I at dpKMi*T5MBnID2Yb6UdkUuyoX5I3
zUJ^ySJ!_=$G^q&j>v*%<kZ5kHlW(|;H7h!FGUd*sZQ_#b{~`r<Z~v&L|98dN2GE*V
zVN at 9un+jq>FqogjS-(~&>gXK5kn#7N2~ty2BIvANI^i=Ls4YVDJn&3gjNc;!!o5+g
z7w~9p-F#zay<E3%0NtAU6akTlUN*=1`C4_!?d9~V5^IXl!hK0#;30MDC$+~~NK#75
zdg01Ts_v@@R$jj4En;_G#MKj$Z*UvVB#AU_rOm>$yY@>5u`Mq+Xj&~}?i9dnvy2G$
zrU<oivmzl=cWXvJBEz1t=r_Xr3dej`whuJsy!~fb$3J$CxbJtki~Ok#bk`o~PW$Q%
zge6`RejjWM=TZd4d?}t$uP&TDS{VH$*Iwx=e-zY59UIVG=wW?}+)aS2(PH22G+pY_
zWRi+Qclv^n$Wzt61#u4hPr^}FWPq2GQ!sO^j@|X?zWS;ZZRxxD2I>xxr?Gy3HjD5P
z_-JzS at U-2mKmtzWmeqFR@@u!ZDYkbwppVsG1i0GzZdO9H{EjM;uQpmEIym2F at qz)S
z at D90DyQzI3Rz|gHu=-K9`Gsr+azm=k_BH&w!IE~P+yg8Ifym>TIe~xpNy`KJd+T9P
zMyF}H>2O3hFyJwqsx^g<j*bX4bC^@mD9)E^_%pC01GH^D1p3+C*~i(j8 at huC*$ip7
zqle&ma*?LPwfY9TTE?U><bOy0xt&Idjpe+^OOd at DN|S<(V*Tj82q(5p4R*>u9IS5H
z&t_9%5hH{86ZbyjJ?3VT1ND~uD>Od_WxW(0i{nvqd3s`*|LfU$+%GIW-JklHl$5l(
zx!HOD2!1?ceBo3ZX4i~e<xu)%#)P%VTzYm(dX6n3H7Uu-Tl|6>`#4^Hl(wUAc-VZ%
z^+)a!_lc{W-Fm#nLD4{8AJX!q<EjBFiU+ at 4aUVDs!F)hqn{C_HSWCRz>Lq+aM+X8<
zrD<)>c}<E;@w1<jY#mGNCyro&yf{5s1!WR+6s=i!?D5|;=}m?>3>J<Osd%Pu*`ZG-
zLENU#2)^(q7G0BXogz at r_T3bB(2_KcX4xfpm`MGUE`0$e+#z`z+0SLs;_~d7$$zO0
zDK?leyLqWt<Dalxoo%06E*clKWdn)>X+D7pyEDl&kuKY&O%cwNN>5oXQhyTJ^fIiS
zQ^7N6H6pvSvLkX(L1$8$5YmqS9h#E#P7O#`>Z^QwsX23n-9$v*;-#!m`!Z3KDJPop
z398c`m%#rt=&!cXJbUYNGbZ~7jhAQJOLKNwk#LK&HIs-}81oKz5Yu~hg6bZ>SZlK_
zG+&ZtRPk}jY()`v5<yO_8n<ndFF#2{Kj=7wjhVP~5M at fAzy4YC+UVuMNo|OaY)coX
zKb_x3dR9Kq8`D6yIc~$*CN%%ejZDF~=NL5=?E_}0Xi at V|H>fwoj%e4$Z;8D~f(@u}
z%X{oNk(8?j76bFiEm(Wn#rZA6;B*+_vok30PSq_#EtNDq2l0a`sBiMETa0x`O1FO^
z###RE2<-9Jm97C+%ZwpvcO9kV=m3N%`($yAza=z~q*J^as$(=gD<g8~Z0{G=f|Gzk
z)&C`SxjVYKS^PiJfj=cbpo{f(bgpjeu8wA&fBnK{ZFxa)zpM0U^~kdl<hFX~;qpk@
z07V5btyva14C0YeU5EGv at 2Fy=s6Hsxc5vZ>c{b(-!>S#pzacNBpcLko3*4EFWLD(>
zqQn>ZEBJ9JbcXi7s=d3{O5Z_o+BWezBT|$hQGOko?q(eH2II)U1zePLZdB;`<Yyge
zq09skHBS;93STu1FaFiX;~G_aTVGg2B-oDGJd;tWPmM=?I2l4vEbYXjXfWAMtp()2
zpnFwZG6T-Bv~w76MA(x><pq5#ly^)M6$hb+|K at O?CQBP1s}BVl6;FM}&?W~c#isCu
zc?l&Xi)e_xm`x9FgfhWWe#-iyuoeM!#8hAE4zvUBTjMNpEs$5=id`^<eps0e_!QXr
zE70$bGm?_add00RmR7eJ^XDF`{%iMU2JQ8u>$#(03AjjP-ze!WI$hk4lMUS_1o;-o
zdS@?1z{u0d1l#go1?1sh1>~S6^y@&o4p-^Awb$f2UWVki_Hp0?1>N@(E@`klQnshK
zJd)Ow>h?>`Jzs(p72(=5+lf~2fUY9!R)<Jl!G4(tD{2QDp7&VR6|LHc3wO9 at r-k5*
zyoLO(`U=#Ddxu~#W at Y!=69nw`kn;e(1Cf66t@|jbw3)><+vdNzMxsg0&b8P#-s|z7
zf0r_7fL^;tIR6J<lc at l#ZuCT?n`-E^ej{V~QjjFjh(zqzQaEkAc+kVO5_)LPN>p3%
z6hSWV4&VfU?r+VGbLqG0Z*gG_UR5Y#IcLUV>Y_HQwaI4MmxQSdc{BNsisSmHUqtg_
zH?vA1GW*NVhf@~3`Np^{BE%y9DS#v`fLvfuqBzzCoyl<1+!12%6MOgfYZe|$+uJ)U
zmM=J;8=yK&C~$RkX;&rHC!<1cTjP8e)6wb=d)cgeDf~D{MyU}%d5d)(nZnnEYMxqb
zAYtn(=KDyTCo0bZ951uqwt;bAua1T!=mIAEIX??pm)29UWA`Z4%0p>FH}o~7u61To
z73F+^`m*X?Flm&sEWBQh)Ag<RMl<5OqXr96 at 4&2qW5<w-EcxkhUW;hwtmGuo4wB5~
zyd@*3d3`C%UdZAR%K|3u5eo=9LEos$7lrJSVOyCi)p=y3M5X$}Q9+oxTxkOvDs+i-
z!gu9}nbADEv|?rs%dw?@A09wZrGqs_8ge>|9?%M{4OS~(vYi~g^^?xZYp`Ny0nS5p
za`sx(Cihv*9l%rDK49j~=uIJItKniO;?zJO?BH%|Vsa+vviU!l3J~->8EAfac0JJ9
z*||{<NMy!_Zg#oaSE)$_Rw=M4x}kiD-j-XbW*(5B^fKLU0?-wx>gW^{<8Y8M=mxJC
zXGndSmlLZ+vbiwSTlxz`^7j^F1JIo3%- at TH-PrvkIZZ5M44O`Pw8!ZJ*>)f4C!~hi
z`dOR#Q|do??qNW+>H8%F_9OGGCaOB4f+xVhYYiCHa<_Jd_W#8H at AQd6FcPOrr|ZsE
zV!vQ66|VTky-7txdcC!WaWJqI5go0vl;BO}2 at KRg3sYAIN4N=3_Z!gS%>t)@?}&Y2
zw&@O*fx$P}D&@d4270?QdOq^u`<+1FfttgUrr0dg@}fbzWdoqNhIVqU71>vi=}Nnq
z`6>>l!y|N4j(FNR;y1<l7IObq#kXubxCE;RQde3;fS{a1+qT+45|WDUc5Tm_QF$<D
z8zb<qYY at t;idtm_?1FwZsn%p1Z441MsG#aGJ!_fwkp&ej#o+yiXX$U^>C$8cm2X>2
ztm^<%g0XZg^>A>--TZj|8QK$4jE{H)jfqgCAS#-GBg*<p=*{0lj22IfS at nuqPHfV+
zL;z2mHeQUKumVU!3eyx6&q}tV);;MZLY0Ub&Vg_4#NcZg=!W)`vfOPj&+%B-GVj?7
zgC{~;!Uo=H$@f4Oi*(ws#(JsPecEppGs+1v#@;+v5ZCU{mxlR3rFltlBX&bmn}5g%
z6_Sl1Y3&P$+-Qz6K`l4IsSlp+;XsSFGZpO+G9Ti at lNPxEJfqz30qK59yRpn+zSEo)
z$fD)P_l at ZZN7x|MZo=xsN^39P$2BPJ6NZO=#O)XcHzDU&{xpXMKy;hy%$vHG%a1O{
zB8?%EkQTz*!;?lg6F#2s^8o$>k?k108I0tE5&-y1izr8Zo}*b0WfHyjS~dTVEDac@
z{yKMpl!|)V?$$u;bW1FgF`@Pr8V|pf^U1?w<NP!Dy|shVmUqDHOgD_DzlvuBlW#>q
zX6Qd6IHCqB<e}L6JecFtXeC0a4nZ#5L-o&}OS6jd_*nY$Hv`2(KMms;+ze-njNJIX
zK?kTWB)N@!Q`LLEXEWgdMEm|t at JVp5>P9vV<4d8aDfe$}Ia+rSfMiHiG@%;BmPTdK
z&oIiLv}wyQkb9t&|CtdLMw|{KhzXWTkMW(Jh()_ at j{i;)aY5d{bZ=M74ICfTVSN;u
zr!)0hWpl67)3~~$>#b5)t|s!%s*H3N;ZT}Z2Uj2J7PjZJI?P1yUKvCVG4UV*MBEkW
z{0A-IcK;3h$EEp?*;Dd&4IXwRT})4)^Jn$}oTtxzA)4EDYOn(lRf%yx?y%kLKR5Kh
zg31g65dITdvril=bo<aiLtQis&wu46_&;vyQ2}sl=<4Mqj>r8(YFSH5L}n({AGf<#
zS1wD?QrkN&O~?0(C%24^d*=a5r3)a4qh<aQg3s{xl>$$Da-4j8U0q#pP=ay?7;wm1
zpuyiw+`%T3=meZn;oGdvZMZ(W4(`~0DS}SFM at WqH{i8pc4$t97M>U6wx+V}+p~=iJ
z>=J%?%wE=X{g^<Prl^345rm`9<!{zemgYtBi87X9<Cor!tMDu0>pWsN11K6yk!B at f
zdKz}3$X}zOYdoby;$afILEK6ok at cap1JIOfr_)e!&)4I4#GE++*0gP>WVf|9pzaA-
zy%{|Lhfb|^3I*W);yLtuwoEf~Y*4vG;(~MQVxx#jEJcX>4d!)_x`O(W1IHRFN~b*a
zZv_>0%<D5W-GT=D#km`lE)Mw*xS05frLYsYBTW0gEIua_Q|y&!(&8U-1<M_KuU`L{
zUD=`M84P0j_&T9KT{Ax|S`I~r(YF$}Fnl|QDC#>IZcpW_ewCi<+#kp`K;L(~z3=lC
zN*~a~ES*CA*1*0GB!Kr}yK)01$Tprm)u9}z7ks{U7nu)Tn!L+8i;^o`?`4XNP1 at Q^
z>N8i~Q8;q5lc#P;!TDK)T2nA1JAqTya{o`@%_I(NqwKx^&Q1Eq{fQ{m<C*LEwnt!n
z<>hImkDuaUgZw3MMBs%4G`khgooJI2cmkh at 3;yqofNm?U82$|tZ09>9 at l0>EQCXjj
z*4AaQ$_lJ%3LPPHT`EeR;j7mq>>Lb%8Ab$ozsJLq1Dp$N1Ya at ivvom#B$4#P!fgx@
zM`j}sN29T?RnU1gKYGywq#e#*ihT0Zvit?j6y0^EsEMaw3gf2n at wI-jL$8p6g~+XJ
zDdjt!ef&TQyq}BmJu_&)7Ck|BW+ZC;{w~T}1<Tn)rAyEQSzzgDV+r2g-p^(_d3|<C
zRT^1?XUpX-Cpv7Nrasi`6VyjVRvMnna!^?lmM_oDkg at Ow(EVhwnub;{XT4Bmr*i0S
zt^w?guX!?!nKx+c?i-*ttk(ylP at F9V!IU(B+4)B^YhDi*Yl4k$&3Wrgc=vn<$6B6{
zHr<tbboXo5o^0CB^g8Hn(-LuC;kB);)Yg5cWwH0#9jkO_7RMmX=E<L?yrZt0j-0)K
z)qwv|;Q0r5LxFz2-H5nd3m^x{H-WSzt6vbn=z8a`EV!*jXv`xsH2x;N4`>}o1O*y}
zQ=_M$lo#BpmD-y_Y-fk|-%YBCSciB><z^gMiww9~CDdnZ-5F?2PVejXIaAoGo}W!k
z*d|#|!i2l?4Kl|(bF`YnV_B9o9_;^I1Xw394#ze0Lk6G6s+fBGBm at cyf;&1iRuC(k
z>Y?nxIUMGi9?b~Y8!b8lsE6;Hn6fYs1P(fS+D;FwCm9l^*?ue){U??)Z2bo|G#FUY
zCiWsBo*)^)^y-n=VQ{hPnCLHcN~}wS;JMUD{3|NV;6G+Iw@*urKMcvsmOA6=Y5tbB
zA3Tc`#NS{FKc7M*OnyQn|5GgcFJSur5AgH9n01l=%>m|rT-|>o<^PS6C4ch|cKa95
zrD{B3H~n|v{$B{{z7Oc!dGql<@Xiacfcala6ng1VQ}Mkjc at z9w9nX2El^ZJx@(9Xe
zlIES7ZH4?j)jALiwQ6Pjt`yB1EoGVI-t6+k7JW`EnOjM%Q}Y~Kb;B->5GEFTB7jP~
zsrt8GR+`4H at 9Iz-EDToDgw*&Wg!9K;AtGY0ciiDGHE`=Kh|bhd%hgEc+z7!%TyOVZ
z&Me_}$uSIR8WYYu=S at 8W%B994690`_HN!rD`43Rsf1NXX&`kc-uU0i2whqr%db+gU
z^P>l>St9(tidzT85h|XY1Q~wM6bJ8$R06%3km@^b5GzaORsI1<iBLsELYc};^uT}3
zZ0WNtA@~XLN#U|B`#nKZ+q3Q6GhbLNF?+1e)rSm_<%{oNlnGjUF+PEKV1FKW8xi>M
z?BjLwrc~u~u&NA_X?2yaBQ?^|D3#ThaXT8**AixuG9pV&WySsp=0?Vc$F>jQ3mf!5
zr4y|3KJ1oE#2XhJ(%b02|Fmu(Z4?#10>QF%x4YdU4`O+8%a-U)S{3cYwhf2y^UA>*
zpyuz}ffSHjB1}-&y%N_{PqNFhl8Womr#0P4k#4;ovOaIG6=dp-$Zp=$H~{?7k>|TT
zB>wgYc9o@>2jKST;4e~`{f|q+0#(CKsRVd86*M5(Z-XBFM%^&my=fflQTz{|#e%M)
z?3p+fuL>>YT98MO)7H!m0VD(;19aX-yaUxWebjiD7yVRxEHhr0f`HJFw%-NxY{RkU
z517svFeo^s)Co2zG9#5+JG)yw#@m{#ch985@#d_*bOIde2t=d?hqU=%YT7lG2PD|v
zqCP+_UHE#BAX(5P`+n?izHl8I at CU?G`9jo-b0f@{+S4`5!^R?03unlMm*s3t7;Z*S
zuBvXhlEQ`dF}lDX=C<4vCPCd^fP{+kZ9<@RttZ8NUq@&ThS){P>?KD)LA74}#jwZ!
z!LX08mM&)g-ZjcgzFd|3z-*iN2iSnX?`K_hy<#M~^yvQcT?D*QXi!1^dE3~hfxQF)
z13r^R*qQF6SP>zq9c$hLxWY{{BK)f&&GVh&?Fij&dDr5cd3ac-fq^6eC{csgZou2L
zICQQ1*`co0SC%$+`m?cc-}h?4lvGrQ#O982_V;~Agu0&CZ;`-^to9_b8WyZ3S-I9o
zqQxF}diaQr^edX^Ib0w;K)*LY)D}BFav3xfgnxtU*@qkades(@{2_ATcU1$s0hxXD
zx0ay5jxMUodznsNC<`fwG)(K=2JcjiHuz(5A5U!VB5P#=_yy at V$L_c7{7zSeu*d?)
z=-7$EMq}AmZGGiWB1V at 3+pzm}S;!|S8+oHh3`Mx}{-jE at zI9tYrTDoZw&IwgzO(zt
zRa18C{FIUqLN&pe*L=bea#}|@yGYmmes}{pOWsm7>b$;+Kbw7Feg|XUpPdDP*9&%^
z^yzWj3Y~w7JOweBnDAEE**;ZkpXBm&<x&mdM}80RB%|3>bLiXDLC-2vX+6k at YNB_t
z&nM_$B#Jpr=5YnUq{x%K&<G|o#0W|z7QVKqIhy#!rmI#>wo{f|j+hk%2cRzmGQw|H
zdVfPgN<~0IiQGtaNS|k!3F>;Q^Iuv3t&zGzp&vXw2lFRsE1RVdu13Udm at G}yP`^?4
z9-3uXVCHX#{rpe;zE<M<h)x7(GN9~$y*=mxtYRi&J)a&2Wy#YTt$vvR6F9GU0p8qE
z;xGzpdy{qKY<b#kOq;WcyLs}cAm3Ge)KF*4Pn)kX#4f{;1>KN%^ENwA$g=F5--upD
zP*rg8xC}sRU4J1fZmO4-_Dld0o|*$!Z7E{<s7gsggvf??*tLxLwxA7=NCH=W7|<85
z5O<M4w at VO@V=6LrE?`Tg*F{MT?qC9$0b_XqNePO(K@=@f5~7dIuNOpvuL`*tk<ZTL
z5BjI>?wHZx1DFa%cFE7U^#W7Y0h=?<uR;n6w;zA at XU54P0fsPw_m+l~{I>MultH}B
z?k1t at ifhuyq4i}eEIBAVk-hj)A$QWJVt#^ySb`;LqEfA2bgTx9QsQ?^O8Gs)he}<A
zT6UlXmu at s32t_EOMCh>?vr4)nXC6=1%Jy|*Z~D3(3S(5)ijlM8Kl(n3V=-an=d>@l
zvy_sKY%(JT9SoNwKOo@~T%<4KZ;<FxHps9~DM$N*mp<E46c)z;+}q<8?h at VahHS|X
zz857w^s3;h7(w3UonK^(B{n;<ccSdIKF**cAN-?Q1PcT(pJU+@*z4A2*6P(7cv!hF
z`aGpP*+P4g=YZ=rJ>5TRAK4h62Onr{p)w^C$6^lU*#vQdB^g`6#_azF>-p%Q+*&KG
zC3=RM7<e}sSozwH9$r;E%<9WpEW*M$CKX!y9V*7Ih(*t>$nAC8D-c%bb!LVK-dUdF
zv=6P=ukK0-zUtwA;JSq-l<XKzGMI2U?naHW&5->S!M$LEWTH57*UHO9mti)!;MWn?
zzPom1mUgDQVB^+M>bS9{$J<n69Xo9f1AI{d>N+_S7ZfBsnS6s?e3f}}MH2RGnIoD=
z51HEIUHnCA-M)mivU<zlw!^_ at F%Q1gA#2KaHcHA2*_mBzz`t at u0^*o~Rzd9+Jf{zZ
z=)dnYek_vz`O^cWx=3<O+NwO at 2!BZ|WR6I%KjX)TpbqN!&Qa<Q{hHayW at H-=%RR2a
zQluiKS|A7$*Kgu=r)S|bZ|}H_)~Sx*@2H*~en7Puvj~Ao>sdt+sc-iE<5|^EkJ)D_
zSA54w3=j#NFeVSY at 6Jov_*P>Kw9a9L&Y1syJz(5G8qv|O3JcA$R2vhFXK}<)Yy7JK
z<5-MxB{GLOKvCKz_~kh8$h>7obK+n>Uy!o;1)ontHtxN0HQYz~2n_xR1Tye#l>4sK
zq4}7XwCIO#!Hx4JMHk`mGN8HxOCbk3Xb$5U;pjtfJ&rI`6FQ48OV;D?R|#1jqY`tD
zHNZY=w4MUcG)l^Sm=dw~z>XIcy(q^kH~KO?OV2Yq!2u;0LDN3|=*(noRMNtE1Oo}D
zPcTS^b70uL2?pe0wmtx%NBc7=a4Kl7uN*nf1I3^z+Z6^qrpRNeNx~q*PEG}tBRgI_
z8(t&tJ!3m&<)+^F68OBI=-kzX33ZMf at M~3*UQp_Yny;N?TDsZe-#4&82-<;eO_B>K
zNmRF*^_eWvr%D~qRHcjRsDz?G2rU-{C#pk(N0evae%P6e;B72%<@OEYkv?K*y^)84
z?O&L=>92W7)jy^`uA(=OS0=bEEs%$pLztR_IF_00YG}cMj+(PJj}MTN_j)|3LcO^s
zMT85{7DB;SH}y6-_o=fZ#*zJo;G~jBsqC^jRuMWn+;J>HN<0x- at Q4xo@LSL-QNq$;
z{-HNpf1cYf)Vb<vXq$9m2pTAyNHbt1(wjZWTp`aW5Xa|o3(U5gon<@@ZvbY8yd`5A
zq|1!=-5f}%>7hOCyXO}12$5nN9JOHc7vb6M(mzAB`W(ew-|e~NLZuBf#1BS3JSYNX
z^Xl?9-tOT1i7UGaOZN7H6usO9!8cy(;whzY^~k^_Z0A)gU6j=8sNQr-?66v5drxOO
z&}pibgo}j4!iNcg{b1pg(LYJ8(UuV4{Mc{5ug!uDTt{MKr4FUnFUl{A^=@>CFEpqa
zW849W!R(sR&=%qTN)sWFyz8kuF0?-74VueJs5J+W*Z&_|iOg at 0&wqu>px4Hd6 at CTn
zM&GaZhUAfb6`@wOA*!X?ba2qt?bQu2IIHM7u7d{ND9rjSik=I^NU*OKT;{Z~vAS2K
zjt(NJ3}jtdp#(7^q?k(@X9h2>hJ(Lg+)e0yn_LJ8Ve(}+6p2Sak3tN_a1Zch at ce_t
zePl-vdz)$>KF51{@(z`z_52-4Xj?3c_}Q7GlO2YrVQkxb(x~;qlDS$+AW6zrrKckk
zMsNeY?p+<nM>wY-TlO|0+u_cVW$~2dJ)tRhYW0UXYx}fsu<;9^qY)~=Dp880wjsHP
zImr&^bVib>deiQ%gAHtAnQce!M2j3{CP-P!o=tu6yt*_oVAXV`@=~)}actsEaUZ-*
zaEEpiCxEH6_^yWl6w|a8LJJ<0v>l<LFOyJmkD~${Ipd*M=969NYskPT_sG^zAky)9
zv=byAn5tsK6Cpm)jWw^t0yO^)9Qkj-TVwMEBpKGhG9D*4cl+F2JdMWS{k at jy)O~3~
z6S>CA3WzIIR<e+glCFWTL3yylE}6QrfX*mk=*Ap4$yh3($~{&&=u2a%5QjO(nUOcb
z9&#jpAf|y4#a!*i6}Gh}N9fq=ef!)xw0fFd_O;Z22OrB}%jg8w!kga36}t-}sYrT<
zX#J(+E>$up4EKCNxoW`y$6!Cf&m-R6g1fpl8H2#{bAW^zlYeJ7f0iRIP5D?)&LVEv
z2j3$X;-M!rOY8{w=HN9rAnpE6%@*HM<VBeHCltK1{GxS6ed>&(aWV=JOJK}$x{76=
zB1v}TNZdFdUQds6;E1Id<BlBJ=SHKnU}>=<tkJpkEDUf8H&U~=1#XT-UyeMS%OpA*
z at vmfXv6mkEJ!#_svSOOU2%h`%2|;0yss&|3Valu7U*3~551Yu}%5;`ENbn)ccs*2H
zlM9xI)^F-CjItGO5)lb at h9u#tP|;xq+3%!Uf5_1W94)<TU{}a)daLLO2_j)<52oI>
z54 at ekIRFYs?YSJ#cRK%Ei89X?bBtN2M9JM+cr6wHWeofCn2nHHj!sQ*let)&xn!l!
zlRCP6e63W)2-S+A1sXfW{$uQ96|tMrLPmG~kjP<eV`m2~rcgpVbqV(U=jApIzD4L<
zKOWR1&U=U{fZz1yuwK?Q8~%e*3|1o<_iNeGy2#!6PV2wxj?=?m2JEC4LD5+9H3=fi
zoV6}3OPjPBw)CVU1hAVyM3gSDCU!{qpDrqaG}EC!?!@_?1K-2d%7fQTe6?M_E<h<)
z%Uj_;!Sxh5pucUN*3%A?I-JD1AmG5Tp{VYAcza^h8Q!k{#Y<9DkPE at lwepMOQEMhL
zpylPcm*f??Jgi-rSB%v|;KP73DwNZwN`kj9Z}ki=<l{X?gPg<kqLaz)>iWn81&w|C
zPb3)$C~^GcA$L{OwJzNTLA+J>`4LA-t*k03Y6 at Q~$9P9*?Z3B?B<g at skD=P#K;r91
zdnN#9%sBajFnY)0rD!CkC;K}}r9@&Rh- at 9S8-i8r@(u*8BKUwg+Q*Q%xNo44ruakA
zFH1$;A@?JSQegvC^nfoAr3Y3IY|LL=nuu at DO>S}q@=bd)n|+hEQaT8HMi|L0AZAV;
zE`#;?QIPK4<!eWApZ)vCAiWi<nd2Y2|7jWDzIy_N_)bsvY~0D{+AZ$IP}yQRF%VG4
zv3FIG>alVJIcl*j+7W|V_BD5~1myj+pZM>amhEV)I{00hQq+DOL0_Rg>^gAoYF%Dr
zV);LjfxqXTo!I&Ef$!4j^4l`gl2OsynM8#hn?U!L(g%ZCkz5X{Y-cg at xhredhPoFO
zLgQnDro++Mo^J>HH^!HGcg~LK&UQguj&trhll~pA at 8|yzX1t%LINFZtC!TQTvPt&V
z5IH{4w&p9_*C<};X!8p7 at ll`YRG!C7_JQd=Z`&%}_ze1X{m&>b2G}siub!UD`=}d|
z*N~Et=`+WJMqgk1Zn;gb_d*Q~PsS6RQzg%abnSl-6JiD7Q`gKavsWCjfm!!dF{~#{
zy_b|o_h!F&s-Tt9=ze(V;~<B6;j<4HVQ=1{GKE%V>N^<1-%>C>h2)#Wg<gw-*;89B
z((ooqA0mypJx8Yed7X at pTy@w^+-)H at KZ%R_fG{bTp4x(mH<|RXxZPS+8qCr47e?M2
zB7{HRWV#m7^6wY|>OU#^0tjYPoI*v^g+KosCDnX984~5%zLE?ue at X<SJgB{C1?R1p
zf+gB%cOo4f<vV2okGYFdGjhe3sd8{;VokzTIUx!~^~chBQbR+C5{KexJ&DG>qgm$j
zFh>@J>&@T&M#FEQEXvWl{7nfNgj$jXKBh?PF5bFA<q5%_VSkgu#RF-^5BM!k6v~uE
zOisT_H1PG5yTc at CXHz`MtDG}+MhZ=~JF;kK|K%vD5P$5?L)X>PXRESkA_9ZJk)*Hi
zGU!p4E($+mJh at J!ILc*C;#C5Wk)=SwGbwM#?qL)2Q>inA$hgdNL)|#K-{$LdWl+r9
zrq(q7v at NHyNsaQQ)-~<%3h at Zyujek!n_uAp_nW03f9s;Gl3C5q;Cty(W1(!ZEmgke
zUKPF<<=Pv_ at ym}Dh{QitxWgt;J^imsSX at Lr7~cecn?-S8WMi!A(d(32JuVQpf%oW-
zkl&;(_aioXydUgiTO4$Rbtg%xGj5BEh-OK{Gn<*Q&euWREIx<SCs_T-oNjLUS)t8n
zjOVy0+!VX`A)1viO(B0Mh at LIRvTcZ9oMVssPmra{NYw|W$N at duk(&&r4SiF?rpM2T
zd`SIHp5k1?LKoUIIhU{3L%p~<@<`FsPz`a~W!;~dfKUbW^A at ITaeRX<%<MAaP$mn~
z63q5o*41yQgNdRCYHj6zdS2YQCRo}w9n5e6&H?Qvm+Yr17K8Y2gD%ZtsX9u}6+Nn!
zCl8Ar|5jU`Wd2==t!RKtZ>|n%!%Q1wf-SUnV~m?sq_zEsE=%j_T}al9K{1F<gpxdn
zg*{1Dup8f^(0kI6QQk#`yHszSod=-7s@@?~HezqB$`!PZ5In+VTH{1_xW5_T>Gfaw
zd~5A3PJ>kXMKq+YN%G_r5fc}<-}vMU4z}VAC3WU6h$rEQM0KgQy$PsfghwXjK)q<+
z6K8GAZ6kO7h;GdoR;;M`;KtdAkgqa6zk4mNfPEqTL1GQ<okBw^Z*=YYym68&gA^T{
z9T&Rw_mEoSL2}KdHBN7hmnUi^bT*wts8xdB!X#GJ$<Lf-OLG|gOBzT*wO<MaH1Y^M
z8}zwjCx}J+<gK|5CH_=phm}w4N#wuNWB5qnHG$;e_E~hQSi}9f`lEH%8k%vr0RfeD
z70^@&W0BpFVEuFkjjZrK&K2BqiWg%B%<N5WOK=w6e>+=bAK_yd&wiCbsc1?2d(9ys
zbGkc#68ig}x|LRd$KM at p<CEx<mFQ=)&Pn7Aff&pi_;P#B?ISyha at D!<)@GOFux#dl
z_xhoK)?VHGqI^w!ZGMFM?yCG(zk*Zd+eya?l5w_X39fxH#uRbpqWkVJ8y5-Uh`kY1
zqv>*&M4V`E_h_P5H9y at Mw^NbItbVD~@5rIoa`t}q-vI>AYFYjmIF)vt=sD^rQloLw
zDdb7fA$2eEw#zTR{OM-ch$dQ`zM-`&3wPLpig>fa%-AdR7QH)Z=6Y+2mktK_rrzzu
z+dUA=U at 61LP8K0kYW%y!s?ow#<>@hC(nCE4GzkCepV;){UvVQFkcW(d6#r-HZ<*^i
z)SF128_05Wb_fd8u?mv#cOte8P@#7sNcI8X7ozYmKuTXuNJvJ{PC{Y+!|M<3D+w at P
zmVeN_U~GE|Y&w6A11N>5ke}xIR|QV=UmR{YJ8c6dsAEwO8=U8UvQ7hO$hQ62Sp*YY
zV;b0mdQian9CQEvADaskjBMr6HR*I;LwTTV7yTWkt~wBGk?))Lm(Yj(1s6RIt>%m(
zFTJIj8gMR)C)A>PF%`~>$M~TbN)Wf#=EV>T$0m1FQ5Vj$npGf{BSHLiVS5+Fn?wql
zq1xfJI(W|S=O}SXpOEEuA~NLr&5k5z;A5D=GnJ$c1pS?(=zm9{o{vb}G!(|B{y0i-
zI~J`_5`R5>0{83<tLse~m2wOk+TA6aErmd>rU%-c`%h3?|Hizzu+Jv$U$5tjx~x|n
zT`0~eFXZRQsrp!4h0eQu?dsiBH(yHI4^QsG!1!$T-E at 4EzVYC2(*|R#j9j*R^*SJm
zo`X?=sx}V$%tGiPqmyt2dnVG|+DKNQW)s^`xkY_Dkw+cNK=)~IBi at 1fW9=tTnk$X-
z_eT)BfvQKomJm(@n;c^KO=tr95%@d<xPAiQ9l`gv(HT}p?p8XQYc`Og)w1f22}tt#
zGR?NhywV(Cy7MP*XRmy@;lz(jnObU2Gvq|75NK5w>_bjcsV?MSaaaiWKVuFXAgyv)
zdK&T3Eje{}IQ<r3B_#Ozr71&zGcY<$SI8r9HV6TW;WL2qT(&Q}FMr^KG0etC`{yIw
z14a%JQbx&V4y!y2#eI=^vuATelPG2UwnWLm2WP{dcu;XuJ)h{$^1{{QJp#V!!Q?SF
z?}&*IhOiZdVhLg&b}ebJA_jbx<?FJL$HIE=Lj1v&OoqMn?au2-99;&D4DK%=QSNCg
zj)ui%#{IP{v>XdC8)NoIFkn(yOBRV^6Q3Jdi#(Qqs(pM*oq=xb^f>~N1f_0^?$o6T
zb+9mZv at bht&Kf)A-LdS9C++~ldHlXT=?CgwZmu*>#mcLA4|GoU`#;L3A^ZiY#RS{O
zkM%=T280#<&dZpV$!I_&k$n7u^;xzbOLH#7kuuf+s2jiS094^WYZ|}$BP}PUT3TLF
z1Ov&(oV-sDk7$lbM3xP^u=KWzGj&iCsLTtWn$Ma(=~_m3d^=pAah;;`iMve=CjjX7
zzvGsZ>Zse+#$;z1RU=Z*ML$wY64BcrVf&rjc-VHSR_I}H9hzItchfk=44i_AE;yr4
zXTE!*{CZ+I^qUe7-!qDP?E}x_ at eg>=qd at 0*3p00M8ZzJ2u at rDy$lQHriXY+r0M|@9
zJM+WcJ>2TywIg{=tiTK0gU4mA#O)DzbMnH=K at rG$rtmro|F`9r4$f1X5zpVkErqxc
zQ>Ybp3-fpJtM#$8n$bFrCEy)%#(YN*cALp79yW80?AKkAydbhYnHjn`##%8)J8p|*
zioN`*F|TC1rQDN%S861}sUhpAwWt)zL^2)+BaN*KGwd6|*JgNS%%4a0&EDRLZKiXq
z2DG at WCY;q|Nz;x^XmlMecCiToj4%}L$EHAB4X>r at PgzD|BAAYjvi*;>GZ-y1D5c=r
zK<)2xmap0cjIVqgm68S;?gE!*_8gem7<GZ*d!PG)t(}L^S}IeumVs3ST*<HV+Ml^&
zwP8-xtkN_ksfx1CiGbCl`X$N6+-+~<JtHW=kMi+TC*?{No{j(k#lfH6+YUTnUdK4j
z`|UorwQMzgi;lT at 0~6+kK{#?vqBZZ*uXGBUFRAKEJ!Y2oDKq4`Lw2DW+bIH=#7z0R
z4z%i}3xq@%qeo;J8993h1NJiqq$EGa_$*BGuloAS`Mc>hl6G!vHj-vu+zr$7?1vbq
zNq`0!;@I7pi6J=8%rQwH(S7r)RI3eF$DU#%IuGzF{*t&Ed}fK;*mxz|z2Ub*oazQ@
z^!e}B5jTD at tm>ksy4xBqEQ8i%ynl88gVc;leOJ|^mkt6L1E%kEJtY&V;$OEO|LwfH
zEI|d-X)oym1OcX|XF<LcU&zs=<^?Lj>$+9^^BY|TlZNZJH<?0~GIV&f<`|ech(2uM
zDB$ycg^?4ZJ at 7r1iA`)8WmuDbRbUI#HJi5Gy_Vg`md?dWrE`*?S`ly0BF3lpI}y)#
ztGl+Y_nBIoQw0F9A3~*7ALRs=e;)1tH~IHavuZ{}ZcN6Q;Gna!zsIY+ at 2~v$%pb$h
zdZ9i02sX|{FI at lVLwUlL2F@ms8JG)LK&}4V!oRa{nLsB7X3N?K=7=E#5&2lIgL at LZ
zTCLMDw(s}v?7#Y{iCaf}BW0Z(+SzF0oMfBYzWTa^#k0T+BgiIfQ+*ad2PEOfn>4{Y
z2`nL+Uv*;1<wVK8D}VpdzNd$JgMMXtgtow-nw at mah>KmrZDeM`G+CQr(TZbne?D%I
zF6K3($#|D+x^M8eu<0ghY#lYVU~*7Ya at dL!onPW=7C0GkOmJMXZXL<9)LQpdh<m6d
zu-|AxGWNrEo=J7;)}8}O&xcFx4*f_lDuXqYq~v7N(kYLIuoF7_MYElq9nNPF_)w<D
zr_yhs{vwxu+ir5FavmP|p-h|2Zq28UW|KONuE7^O7`CxYi>|X>cX##qk0za7Gcz|Q
z-dx8UPUxDAk}pL)a*dX5XS;F)!>3-=kKYb-t{%my0H-N-QCAQ0BUubZ2lAs~o9%~j
zNBAJOtK=H%SyO`_wc*S2PgSk{q)I;uISH0MYY2)aO7v^zyHDY(wsNY at jBX7B9Ubr;
z>IH6`s+ZIsZX>ml|GjI)G4=GfNeptDy~clYCTJpSE6wAKGp at EQ%oxWix}Rs7##<2z
zq%}=WP8W4y7?hW2m(dz11Ju at Uv84A+!{pzH#xvo5M~^Fu;${f_2jfmY_LM;5{`F4x
z{crDemJJl3HDpA at z+*cbNF3+xa?y0-<MAo&TEErXkh&pA!wJh+thm?Wo#hEr_>SG2
zlF5Q5mQ{T(bA=x1n3!n+f{^s*bDFJLITpE=ZZ(W>YPVgHMj>93XVvQVSe~Ztl5h_6
zp=dkPUp(0eOn~>U3c2v_x39m329 at jl>Zo{LmfDCwff8g}Qju9<&sK80!9+8*<t!&B
zcVCJZa;7SjFjD^~;)^zZTQEK2^9YrC9c0KIX2=`_9(8IA90aoZay6ZoK at Y!U+CL7b
zFRSJp3scI>Rt?nGxi9S{T#E&pe!*fZhM21?<o0MhdG`>E4VEg~E3Gz;gKNOqMi0x{
zxbmzCYkMF0u at 95~gNK`ulse>YX9R at zbCyAzmF4k3jt_AwQ69(7qh>|4b4|E;uH){4
z;jC|o+~9&?#P<2|^)aKrYecvxDXB%4uuUKX8~^<#i`z9e!YnB|Fm++;8tm2@;8q<J
z=8FMZh8~64$kS1-+S%+Lo`Su^ZWGpV{>tQ_)o`EGl`W*zSd8Wl6IS6yoQ@?)!lp4q
z;}N1jCr!joeZ<AJ9lJWW-scAnji+Ec?<GxC`YX-mRQ;De6zbrN>WRhWsX-_7gF7+-
zcWKbYt~dbJAkfmPy at NpiA$jhE+ycz)^j-0)>Rb+#u|aRgmYd at zMbvuCeva6WD+>rL
zcPB<_Y+HZ<(swJtuO%5_PuK9g;h6ieaTpvO at A<L_U_Kv?a4rjZGnMro&-WM~u}4Rq
zIz?JvPp`!MtLCt;0wdV%J!>WzNz8-D<7_DWEv at w7*J6QC3~{f&*rqo}nDxsWO3O#n
zNsU)o-RK!s at ZIg#7$AWJMXmqzCvV6_Rv*gU_*KtGXh8>&02 at bypR}1ZzqdmkMgq4L
zL-T_iU#0nSb<CRgx!q{z2zVA8RB=6-DrwLi;&$ec&gYQf!+7Gy2Lu at KA%D=G_xjEo
z5AC_XO?+ktcdm!>w!B`*=>T&(K+6H7#|`WKMMUPjhoB$r)GZjX=!CeV%T-s+^T3A0
zrM+Jzk4d#zZ}5<!k<jv<Empo03XrCCC&r&hu9s8Gr(GZz^OZV}=h~(63uZfS$_E1F
zo$%(5R&|r3?7!l;Y7y9?9En8h$6HfsK9{G|?Bm`f`xiYVF)^6+XVmK-&X5uPW)7et
zqR_T{lmTqU9CD8T5HaYMQtDAos~ZkeI7-{6tPmT4 at c1e!{%GX4$(l|g+vlH84z+3E
zzQ-^r#3k5Oeu3}Kai3CNk21cctW{KeGT;3*Q=9Cp+tKe%c)opjrgtla2l2tKxz9i1
zOvn88yE)G6&;snlNPc88U&xg^7frFB_c{pFXfSKIsy}nI>m($`xM^v?15!VIL3|vI
zpxA8RSWZq(rZnu^Bx38V5%!A54QvFt2TFc at h#ZK89`>wzRRx6lwAr4d!xxJ`eE{!&
zrRq$fmd=in>*uBbt)%3pRwLhznnr>8fDwU~hzM9sgC8fE97O8#ZoY%0d~kQe5~=HB
znY=Gg!##B`a}YP$@LV#t2rzIzKFDePIqZ4y^mu+`c~ndC5FyG)vGw9QUfY`^jQ)jC
zSD13M;nBL2x-!%M{KpYiOrb3G+{E(f at cBKo2K*>zecX#G)2E+^fOh^FSK|D#uiW5-
z^NF<tLEQU at XCAYavUn&1dZiUE;E-xZ-zIB+;5WIW{1ThE{4(msjN`VrgnY at kxFx?P
z<#<K>*&>j78EMN@$6UD+tGSYk*gA%osYgoR9a+%Q$Us&C8fcWL*1iJH^XLTD6(Gs<
z-G8XrM5QOvUXuZS&Y6<Pn3$z#qw`Wk<7&?R<Pp*3uD#Yla62=Y^rzufqdUP`tO at jd
z=f{R at FER~8dGbS~(jtnNS5Ucaorf}lz-pb!==2M at 6F7whpa4FJ3MuJ_devv<eV at XR
z9;FtOx#D{I!@rDC%B47H^dxLRh|b8sk727h=6EeL4No$t4y5rAuntY>)=-jZa;c5E
z at x?@;H^@LjVu{OEu66$xb8j6LW#9Jw4vjPd(jXzBv@{4vE8Sfp-O at FHq_mQPG}0m6
z4MQ_ at r!+%%^PYHJ_ukKQ-`D%>_m92y+Ou4;WX5yO^B2djKF9YP-sCi_I!Vg9s>v)U
zBtH46#QtsR6vft++=!J{4H`b6X|y$475Vk-)|l9$rP=efqsNLXEPCo?7PKL*sCVk#
zTvY^({$=$@+eY0RzIidtxxn!+<{XxZ9eA8*l4%XNQ8yV9cg#tzc)9gnEt->oSGnr?
zE=f1ee#5MNzo98D%m at 3c&-{w10NGKWjoEsk=_7AoS~hr{z*zWh>U9)>`5(uSg!dhf
zW9-)6m_#~!8eve%PqmO-eI0JcVM<o3uMqX6SEKRGGBveyqXI!La#({?9FEjF?5u}|
z78w>rRjx1k=k2A+N)Arc;e4k|LNn7fpox&)kCbtTqT(|PEgkloi(;76sc$^f{e);v
zUpK2q-XpjY`>)csjPmsHx(7rNAv8ErDnN&1_xJ=nL!tW|Y%YW?SL$t7SC06=$@9^Z
z<_YeJ%UAmgE59~oDo}pk>Rew%f&B%-smd8wvA+u#Mq;F<rWlQvTH1_oZ}GZ!W*DZ2
z;K89DEc#@p!H$H1;ily-L6~(<fyS^3e%f6UbXX7}b^U^yXW0nji40=;*&RR}_!-Zg
zoF(-HcxlrXcC3pvd-#r+2b at b{q$(mOUnSPMkR6JDipFG<njLDR&(tJOMdio`5uFSm
z`W}Pz!#tdM1w+<cFzw6DLRFpJ;Cl|<&zAj-<=_Ob4y=e4X?EusNOi9M_O`EG{`4iJ
zg3p`uEIGs-emeGg>n}`Zalu#N6=}PvPJ|&zW|Bf{R(1dSTT4fm?3K4wA-+;}#<Ug1
zZG{p-YAf1OvjNZ*(Gp9<_b5G=x~S`WRO3Y<AF6zk8zhQ-N<`2mfHS2u8Pc%voQ%c}
zvbKo?aasc(5)j2W=A8+a8~l at TfyUCL19FNrSX15JnrURw`QKQRCusVS^N}{{ScWQ^
z0%uW;-1;mEh&L!5fhXR;iLINW1oiUB&^o%wuxbm_C-z?=@cAL#f)Aay^C6cwjNF at 0
zwSMQ^Njz!mfk^vZfMv?FacNx-Gt~HPFSjV)O3*{<^}5rxkA6cMyDJ36PZRA+^ejE0
zXue#rR|SzDeYA)W-iX)lC$x%h*ydUJP1A^@u-D}-1=)9bTyam>*jzymVb`vcE57ux
zEhB86U;oVBUVu0)In>#R7^<=BV|o#dC4z-R^XJ8HJE|jjeUpDyJpjAsVoLbo-5OOg
zn}~gezJ44Cv+ at u{WCVtUqS83PA-IBQmE*+z$(M7MG2O+;^}Ygd+In!@kaJgk5tMF~
z9nu#H-XI8DAe$f$CBTTUl?umxC7mn7#^MK|k-x$k%W;Y5e(h~JcW^}Yew(wJBna=z
zLPV3+iFV|H?Eu{@!hzR!9zWu!?pO1U3B{|K>vp9jC#j_i=m|gkjV1gzQs2-+(1e%P
z at 0AOE@Fs6Az{H at -L7pW;UNRONAbI}re9L`Z4dixlPeJjp{mScXLgUid2Kz#I!wPi2
zwTX!ds#jKH2>rZbkGj6*_Y5wty>;CG;B0CF%R>#k?`c40@!Xn|WF<_2+%WQn_vxmx
zTyghNFCq2lA?o)Ai~$D}p)`Px0RDC(a-uz?A368Lj*_#e+7Wx=1KLbKl5G{OVnT^D
zo0j8kC1aFs*;Kl8-3KG4bt6P|2S at E62OkK0Sz=y?_J?=#EP06mGa{Ri^L_4}ZvhJt
znB&;jCrgyoxP};hALcf6y|FUCBLHfnU0!GukXB99y%khIc|-K+74;`}At`S at tQP(o
zM({j==p#!MNd6j>j=W9|rvjXq%q_^F60L_lPk@^LdRev9W<D-9MAQ12{`0LQ1 at 6%e
zB&}JT?&)Wlaq>s5YV*QoytKWG=;=h{c0arUQ}73&Ht37=n8v}CZ?9rS%M!&}yZSeh
z$8hDFJmgQ_zD$s!er{;?5wBz9Lz<<%&9t~LU<D9VeXiFsXk`20!LUG|;FLoH^}8-I
z)d(c^r;ndFR-L%W14k#GSaYHuG$SfmTgb#Ws>$OI8C3yl_19Z at C6u#Mr<eb7HklaF
zi^67rd+x4ok1Qfc`(qXTH&G=kLWGlP1d)X_mXF8o;(}Nz1}FK^mtI&+NI*ZcrlEz<
z#WQ9mehI10u{ZqT!_t2n6RZfAL8F!;tg%idN%MrgIQ0iIK6#l<vNP6A&&_zb``YW5
zsu6D~A{6E7fO_(`6IX38my)yzUQcp-;lg}x9P;tFr_kFJcaR=;FpYRk)u$W)%f6o1
zD5i`(=&ZF+GZ|*|6N(mSHjTivo`M=@>dye<8uzbI)*SU&n}%kB?Q at IKbyy6r<o%ff
zYz1tupXYZMTBO_b;ILX}lxsZQ?lrA-d;Rk{tTNl=+a${)HcANR%c|cv3>+D;dU{cS
z25wiT%Y_VsrDpH8T2^OfR6g#r)hc7#dw7Hrvg(WQ<*$?wTx)@r$56-$eo}aqR&Af2
zs(P{sDdVf$6nzZ}{S<KHN<6(lxf-J&^!AZ4dDfA8u at B%JD;E!KbE)@tD#dz0huOOD
z;1vRwOk}~g0%OFBKCECdhEVEE#Dmqj;FnHU>`yaOHJSW8FN7p)bw-C;LVb$Yi%prt
zK=zSm1 at I!%-(jJXBd{;yn#qGA*UpGUVtEV}2UU&~2wO*5A_=%Gd4|-!9tLl6(d>7D
zy<&s#btHzP^%1;g`vC6KkXCRE0<i*?H-TyG)98s+lsS8%Wu>9S%(`^Dmmp4f4g<*x
zB?0KvPSJ%_UMT)`c!(h>CP0$8ou<DjIwHOn?sOSIf{;xMX|Acf)?GcjRwTGD$kF95
zDnBWv$+<Cg@{J9X!lw+qM>_VX)P{7mSo7knd#Yhwnj(n2shXRXyl+NnAorG4!NLMb
z(QqM6`(N8T2;4Mz3!zXa=U8=``Ib%c4Zy{VMcMD!Ki_5#U$+gH!f|;v at Wg`VBWUQB
z*9YovX*Y6<$Jj1;$emTBtx#4hHN)iyH=R4=dZ}6WG`iC><&MnD4<kE6kH5N(oJ>5a
zbmT*bg`-YN)E7PSmz2B5&Vn?_-zFzJtBc4Fb_-AP^E*ro<dbExl<+7Z(HZ!Lqc0v4
zL at a=YMF$+r_;{HyTfO^gn~FS&_4{q9G>r>&B2$*9T8!9NrT0NA&lqEDeSRE-c&`35
ze6=H0>D4eb-(ZpHdGAq)0lGa&dk6<wjv*Tn at W;H=4DLlCv9PgO#|n;ARhl1rP}+pN
zY?>M}CUd!II at y=Jh<fDWNQzrof6te?GD4U7VHmPPmlS;$4|uKsZgmFgSWz6mBD_@<
z%ya4TEMUx}&?tEMT$`}20b at 7oK_e^@P#6$v_|d9RaYNLXY|j=%dDocJQMqV$<-Z4g
z2$_W<nhU-O{B#VWfGl6lAPmyy=K8GQ(xqZ}G<nY(VNgDt)F9(rzd81~aJ at 9yyJ1XY
zS+%pea$h~#6n^*)T4o}3`PI at Cv9PefIJdail1Xlf6n?m7n*IB1cz#Ko4%bg1EcF<5
zcook0Nr!(E(x+M?vUoY%@O1M6a_;rPwAVSDj;l7P8E;f!+}TR!e4Ia!*}`s2Q9xX+
zJR}*c*JVqj8A~iXhLh`JOmS&tq(#2P at j~axe3(pw7x~0n80(m95S%%oR&!b!NYPzI
zcv%M*Pp0NU8pyXy4=^@CXuZb(@sdQa?Y^5{=%IP`B!od0Im$fOU5Lp%H-t_`Yoit1
z&hCiW$_UCC{F0gx?ts}g<CvLrblAf^2eXa4;%Tu~6JOvH6rzaRJFx)EsO3)Ks7~3N
zP#3VM%unoNhJn)exay&B1|>7Ebq#{}Z=5eXbqhBI4Vg0Aq-;5;f7c3Wc;qzKo1U(F
zKOVLI2czB(YISLd*o3A*5#4smfS+?oW#K7JZbzaBzQWg~!rhx`5AZFQU95*;2Ddc#
z>e)Z;PM1;*d3UK{E7-m*mp0^QOZPm?)K+NM#QJHe6j{rw>-YUWH<(F-FYk{Y>@D&w
zQQ(8}_sFptdTNR8>8?b=!aa}ee7Y&O?)Nv{F4q&LZ|EPzN;)s>J+3uUsRxMeOQAkt
zrKC5PEk36_hT$s at H~o&cLN>_0mIZ4*S6x_1#V_yE9!`9aj4?7I?9v(NwRKio0Kba8
z;MpUeBH@(dE44(2a6msCuC*!&4YUUe4G*ZL(Dg%AuEVrm6CH+Iern$apM4FiocrtF
zb^nS2`{elrOqU>mHUz1)dyx;ni};^i-Zsy`wQAwoWdW<I)POxNWU4e7fA%sti-IUe
zIK!%n)?D?purhS(Od3PO5f^5_cmzS4(*cOD)N#LYy9lfva=hzMK@`^A)|(QgsZ+PO
zA+(C~JsrlNxN4BSy1;{R{h~!$_y%Q#pMuACiIW8ct}69XV*tenzPEp at cc#+r!00v<
z07}dkho7^#NpTd|^IlVCx6u=W2u{BtnjOlWZ*&PCH&-y$Ve)>qy;-74F!+N&6L!*_
z0VhIuE|5hG*1EVm`1H at vBFIgTn+U`Hbj$2KKMo7~DXBB_*;(F^4D<D8c4PyF=hP at s
z_8z)^!R)lJd?pOSDwitEn6tgG#@vPLJ7|jeS at jcVfsump?jnfl{Q=*(BbCaWuFs8Q
zrKjMa`c-pKqS2dI5Hjg|83bTxxx7wz5J>cwB1xstxD29n^|~bOsDuBmM^?z#MsGkv
zVE=vRdYhFpU6 at QC#)|{eHEi;>F}kyG)U`nSrMH$?57uZ0Ex7FzqNpVgQtXbQ4<7pF
z7SH|!DdeU^N{ZnlgqIr8Dbq$+)MhCK=LXkvY%%-3oYd1MJhLGHCg#%5qo=vUbyUPf
zw6cf;708~%C?s9^N?+{)1e{cK4Gq~dBr?O2@$d-hQ&r1V539Wh#1D1ePPx}Sl%N7D
z%p45duX91;w#K9|YRjR-$&^n-kheb)azRkLO+~pSu0b`5D_#L4H+Rrw8v14f_T>0H
zLfQRl&U_OGXnF{xH4$M>(wxqY=IL*XrW_!2NMFMDkQ(jUz7LCEw^(8C;Od%U=hVx>
z>gP%-dw0Tf>dpXJO0dfOt`bE`4P?^t0x?#lChC&F`zJ66nEX8myaR0U&O`REV8Bt)
zuL;YHr2~WSZ+z}`Z}P=zGO8Vd957p7mx+~<WSsx*LjRHSreo}&rF+bbwUWbfr?{Rk
z<oY_$*K_s&$jzM@%l)8XbT<z<cUbN=`hlyQnwly~{3w5dC?$oU(lB0in+k{{9ke`9
z&?9t3+X{|P?ZdqNfGNVsx?{McnBd*Lr=X_;vV at YX_nJ+L5MV7DexNrAs7%7OexDR;
z(3e`6Oxn_uKsy{pMI7iJ at 8MLSjq+%S(6gaeBMd$38nHa4TViV^=*w8NHEziRFM{!+
zU6ibGaC@^DtI7bG%Oyl{J>e*-*ctJr=BVq~?wax&1z5}eTFo6CO6jf+7<P+<k!
zGFV}W;qg<zp5?t{sNE;SRh0>PECaNLGyZDF4=PAsKR3MusZMdM;WkZ%h>11LePE*g
zz{KsAluJ`)H`a0mQk2s$X~r+G@%}+{B5MP1jZuly(^3t35_Gi9m515S&(6#%G{Ja-
z{wwn?B%2~kEnzMVk-E}RMb-Xkz_xw|(utm4ZWN#BbV<#Xe0w;;&QLkX;|YlOsTDbg
z6exLuZgxU0fXr(Z6Nn(>*`3JDS9^fT0e>jFx7>T at h-PUpp>jiLEHv?Rv7O{^)OAI!
z%jB!$4?+b3xG2AjEW^S|VR_YR;|3Eh-&~At3?=(~?9%+_HL>Oz<S>G5#K|f$qwT8y
zk?RDYoV&9rUOv9I3Nz^8?#%1Gv)<k>+f^R(mi at 6jpSfZD&Uavgn{c#-aK?t6BOqgY
z=CkCP<I8!KjC2pI25wT}!buys2Cm5);Q!8zYa8nT+Y&*9DNAi#M88|!a00?Mw^xpX
z!aHW;tB`6YWA%p;4*fq0o~>L-B!eb3#(U=D-KMez2I1_4)VKtww1;!y-A~<3kVrf7
z8Puc90N?b+W`NMs6;dCc;@_3&(WF)rtJ5oE3?Wy|4;w^w%hvXMopEN|!qZ|$-jQUz
zL*g?AsQSjTk at WRQ3Ff%e!83B&-0+HXQL at K5U!InqAqm+KBB*Sac)5OrehwMlF0&8(
z6n#yTd_M^6y4GSU4I;@lhjn>rXQ$;yq!fT8+XZoH5i7&?T-o at iB}B+JVFE+8^ps=g
zsvoPMT%MTyj6O+|>lN`@Z1j>eWV at TPxGMt$Z6)&tAMPEdxdC_8P0L(;PCL*Vs-dIg
zwOwgb at m{>3vmVBaY{4MoW+G*(U_SU^ykVD;jT3gG)Tn{rL<_KIbm>m==hGz8YukZv
zKX%H{GlXRKENv8bg8BMSv&g~~Q&dfL|C`Xw+aDPfRh8yq%2W}q1vR^Hry17%8!alj
z7xp~I at Xu}OR`5Bkxs0$z&MrLni90SNqX$m^R!JFXO|v6Ek)C^QIeBPnZ~THzt?SgM
z8d0XmquiO$JPUrz7CSW^Z=0)VzbdJ)<KENXIRSXWl%WA37CY*4_DZAo$tfCkElX0R
zt}`BL24 at K*!7Bhjs1P_Hc8Vd?A}tX7h#?|v)>iYei<geQ%{9YbD;Wy9<<~4v1*auc
zoxE!?o6>jG7QCpr3iI`VAZ_%e+pQ*S^P5gRWc(u>XaZV()Njx)<-xPh?;a1PS at oPU
z3fuXMdwID&(bEiW at u9hSSWhr`3ervZqS`pU-*!DGT3z0IBhe`?{;|Y;fh}~mqk at 7X
zay!B!TwS3~JoKb~&f_(pUhMH70re&5P!9--3RP*4se^LNDU+9of_!{+U+;hd6pG=-
zJCxvFY^W6AupQL(&0X3sLm=ZQpPB5C><pGJ<ExPMq(L^YR>_`;(fY@$1E)HLfO1&P
z+=TCVfhm%vdh1!n+|B3%fU}o2UjvzRfH^DijHlT at 5ux#LzJTBhB!*srQ_;!EDf_N5
zgcxe%+APtn at n)%k<)Qif0iXulZZFyYmZ-ZJdfWp34;UEU7a$TLfbt;t4rY)wVh(_p
zI8stlTP_VGipmDA4SHiRt!}~@=QJNBZ*`rj`-|cSAK;TC=A4Hxg9j2|K!2oC|MeYx
z|M(q$fMd4rvWGxq5cD`jZMmK(JuH2=E(Pd)K)|r2JxeO;@jY2Oyhitv4Q0m-y^z1H
zX#oMkf4J%6o4Fc0F4Rjvk?T?HfYqS6(@l`>1|&-k1 at Zta4(;?$mpJ|(ud?b&0N)Ix
z)5r7%>>^YG at _ejF5Ai9lr<nid at qp9PTKz}EUhTgOd*A$7Glebz?7Pf4+??~kci7Xv
z9-QM3x%cl3{l5~R{yuXL|ECTNIN55e at fZ#L?PUA<pBnwYQYinGtPJ>H|8Fzt{<iD=
zKfj?zbKu8j_UAQYQ{x==UrYWm-MLBUFX!DqQw+dWx3a*t{m0*~x~BhAs_VZJr~k1I
z0Vn9f9l8PH|Ea8jjPT-uWHvLPU>{L7;(zKy|DWDa<^Or*YeNp~mYTaBZDaRbsQNh`
zIh%91?@awb&vHB4nNWUyNT*x)KQ#^Wua7M)?9nWDYYP<+vCJ`NhrwKbs=-=z&cWt)
zK7ceo;IRw%R|Wu|VcG4Mt5yFS`uoR{8li4!aX&$(r>9rMU++_vTWWOAy5nrtKfg4A
z0_0%+od!M<@TS|z#^BG5fd-uasc9!|{z(rxgH3HY at dE*%3OV-KckOfF-#JtL;Ct_y
zi>e1mSt=ot8(s-u&-BL;`k%WKATUaYM at 9j-!H4a3R0Cd&KoIyB4;%N_3}$Eo at l)1k
zbyvaF!#^l?OqUsnt4`kdM<%7yrZLepg-3Qf?_GC%jfv{{%V-qSQZgB?acw<t<7lg4
z{8-80gV#Liv0?t`!TU!xys+QrJH~L{_%ONg3*n*yAQ!@JV_G-x+0X_0mS%xbp)N!p
z<_3Pd>gACuq;DV9lpep&WBZ$|<w|?~VE5y2Anm(o>;@v%m9 at 7TLA39-C|*^dGwM}l
z?-!F+0Hae|8ysCsuk545;`!L+bwOY0^;LhWkJ?T2b!p`P6(<1)yvMM%`TlJZ`>&5S
zkd;RQ8_+jp;2D)?i|-5$W{y9)0$I=}@AxopBO7DvJ9QlHvws61<O*KP>^35?diD;h
zsf`CXJF&`g)omDnS$v)%mXr}h;rWdb-sMgiOY$R}N{dwUHa(rpg+}*VNzRbW;9P%I
zmwsVHM3wM?GCC}kjC%VlllBO{FY~JT)7=X;NGp*)&s?IxG;i9og$tG!uphP8_0P_3
zEH^Lr#>;)obbkKgem37Y{mo1lCx)dQY|3%~%@mNhf-s=uKBUeg15j$q&Az~+|1$}#
zvcUuJGiRzIeKhm9kiy_&Vd_J{+>Ox1L&HHc&0n6}=Zk-(c`fTQ_S6&4&&1yu;c^*A
z7*?pff+0JaI#fBZ at QC$aHpZR#v-3EqyM|Zl2(GzTT>H<bBl8#^64EjhGZ7j0RBuQa
z>PI~^6wl6P4bUk+3$Gi&SxCnCI8H*XY%%Yv5hy_?9Ij;lns at B=#%`#yzU`uZ33Ekd
z-?Zk<2}{+l{defLkmzS8o-1B0=6C(A3aehq2cFwV!-t~fLtl_CrqRunT1s6am*klp
zp=muP_ectr0UdsyZLQG3kk%jXrn^igM{m(H*3{8M0R)T at jqd&#s5N^|gfUriy6|B^
z6Jg4r5IESY*qtcUm{kyX9j^r`+SEC{l2`|}bSKW6p}=fHS`v7j3q6MaopU&mpMiOE
z5l#}`h)Rl)9xGT0mBC-$W`Sy6hsU>5%4 at NGaT@QZ<o{vY+5g+fnTcv2^TTGeFu!~x
zsWh?#-$sD&k3iJ at x36GGj*?0*J6BY*R5Fp0w}LJd`fvU7E73N#a#r8)5{t3zq8RIA
zVqjScq7~3a0qU7i^tk8zZAAWK<d8^`x1Vh8HGUDC(P(dAry^LO7?tXfJ{UF%3M{C9
zjmEsG0={1OJ?0H(=f3{aeZ$^E9D%nl_M~dZKR5oY8QVV199MpxuzDz216VKkcVt0C
zE;?3)pYJ%IK=~Hz8#*p)9&m%l$b&zolM2H36-%V%mlrygEkW`KejoCuB>A+ at pg~qA
zRdsS`RxYau!*jo46s~Sa at -}5%i37xWM7-i$Z|FVPj))X#{TF5LF;=<J#rT=U6lJ&x
ze&)_4 at 5;H965o#qa3rY-BBn9r;J$^8j`M9eiHwQc1Ot68-lF{zsj!WPS&Et+E8%j_
z^QlzTNJ}Nv#(TWo&ZZ6XfwF)+e(dlQ3l@;BplRVC&<ZpKFbAd*c at o9Nbfd@anv?kS
z89P^8j*V at 7$f~ecAl^@a#$lJeU^wt4Y32AE+V8ORe9tytsn5tY7zYlTMNO`{V&ex=
zyd;53gRS$3pa^BSbf$iysBXY1{bzB0H$Zl7pA{WX*(BHi;^z<1*R1^<|C&_&nYh(p
zgMQ;EL0a1d1i!t{|AOLBdahVb==!;gw_Z_EF$;5EDYp83Na#{cJ>Fgh-wYAx5xgdN
z1h2J at p6|%75?LaW38yl}DTUm~jbI*B#9yO0&VOEt{^r_9h-7Rey?}OM6d}ezf%G&;
zaD*n47oRa*_kH^y1~zzV!w2idk8NZ&+oP)$tSm(q8s_w1 at 6J&o6X8;tB$f=__hEHi
zH^yo-d&rJCnAl}#<?{Na?KF-g|6&0eV<d)IeM5Lc$=#W#<3_nbikB-&cr)gSHzDr0
za`A_o{3rzlK2;vymk^QQ2J#%6m$3Q;yP%}<S&eF<^Uw^1>yarHoA0J{XyrR+>lkPc
zp_PZU3P%&L%~mTJp^<Kgo3}@9DRlcDL-DxKF*`t69ZAT+Y0uQpcQPEHzGI^?&=?5U
zFCx{tp`0pM7dQks{d?FndbWnY44b1~e4X9FqS5K0W}-IVQx3wuC`Y}iW4&u*a9N`%
zw(+3J*&OBo;FrW=Zu)2Q#>GiJxA%iYpL?0mEV#NjQ7x>e?9f4ttz at M?o8ZxMl!iBC
z?RT#0<Q_rL=$F$oR>ah=CdL<@XXj_6h?MMQ80n%b-`Z3s2P?OsZ_t9wV+lY*@bA@^
zD+~0_u1e;F*6#8C(wFh1e4Ok!qr;`wpX(Am62rm!PGWGw61tvSIM at yQ*;uIJYe{Dr
zSN37TAvu_^k)w-7a|Zq%1`CCVzEgxN&w};)Hhk>sMR*A4yd7h}06G2n-bZ_g)ooSC
zWugd*FSvtW|5GnE<kmdGA>y6~gcF!6iHz=1m*R$VRF26 at R)g~qW92wwaq+XOWM^2a
zhdI17@?pCQL6f<hbssc<2M=GCG0sb<;xJy5E$v}He6BQuM{m=sr3wvfBYU+H3ig(*
z>Uv3VkC<WBB(I3|+9rJBI?Kd+kas}}y#$(nkKtDNUEqmx0CE-lZ5tDo%_Q;auVFjs
z7b%9ULs?1Zks6dO7Vi!@-mJUcdlA~tSOmmTM=a`;%NeMt=(*o<D;|6X*{>uPbJ9PH
z%23*IPMsfXV#{-AL6UIFs#~hKEng!e%pb|ALd32C=s34c`<?k3i9)eJ_VaJAytcW_
zsa}FE;^hMNPpe!7fMXCZK+1av3Qed!aw~ew(IK9Yk9zpLw093Uo}{!<2z4g- at O5sN
zJEyrE*<VoI7lb>2XS=eNz<zcp=VvKtX<2jNkcHsAb*N9<J>}gtF8C(cZu9(sA7=2g
z8IV2ydv@=60C;$LIKP5h))YUtcBUsAMy%*T?y6Vyf78*Ce*N4UL<FfS$G{$pC~}qj
zh at b&PaAQbSREc9sv1_5pL)+T6!CUD*AQy>Bb0cjP*TRDAmEbH(V;5!78P^C#Z(wl|
z);KWR2{H}}p at IBBm5iCrAM`xbcs}70Eho7`Xz}A^zz^FoFW>CS0juxKD4^V%uDg8+
zV+;}NXvJ at P9SJ!w-Q61FI=@d;5x?TWO}pBks7FW3;R2Lp03Po%?dWT*aZnQz$bRw6
zVvLe2DeOy6gLNGTO^VKn)r8h8cRU)2xxVvl&PS3Oi4#3vj$Bf33!#1~A-E+(H at Pe)
zsqVfI!8Z(op=lz|L?M=?jU+ at lpkYX;RNc6w at qKkCv9<|(*`)8*1m3H6G3cjbJP20z
zLtC|#^LJldTWqg-w%$}3AF7u(!<r at nve%Y;JW6>?EK`5j=597~owuAkeuQV;ofM)5
zs{h}lq~C)=zA#Z&Su$J^-|BE+)qFNwgeMVDV&=Dx3pTySv5<T5!%$G2EtM(g4G>rF
zP*nWs*O`6<;R~PnHL7ml7<HdE6C);4ES3&FOd1<kp7%*h`p^0^qQ~1%2sKEDqUgD@
zg*q9b>ma>B8+qBlO;7>{D!^4cnq^l=F+OiKH%j4dw#eI#kr)2G4PRXyE-=Fa<a&2U
zG^`Aj`m{Y(1&FAJ3xCwXEoDcnkT8xBtri3tGM{TaN(M5(&4rhcK&QyKQQcfJIb+gv
z=)YF$!r%=1&-=qCN-&Q~j0V(`@xr=?8E&quq-WB0E~r}u(pKM#iH8XIOIv~!s8i%K
ze at Wr`hK(0zS6LO!|B|WXu?$b)RakOC9*f?v-WLbzLLKDh;t~WPaeGzQ3N=SfCXqUO
zx3^^7K0UqwIP_2zKJu7W8l}Ja<bM0$0BB6}2~fgRgNSP at SA{=NDo2nfb_0;&z!OIq
z!FzapeXqyX?M(*tvm)G1JG-=~iD0F;d(uHH^eeu_`mQi_30MO6_5iQHId*vvsv+wR
zqOm+KCK5A8pT+wqT_n(P at M5`9S<PxwEpjC)NL1$QI`%lSCjBHzWpfJ&sPX*+tQ&It
z>~mYT5vDK~rW1d$Mj%pe=%RjVJ7eYn)9<fQ4hRFwFd}WZQA<YPSgauQRLKqp3|VF!
zly6Jc*^FK4M8-OLbBBoVwRuL_w6aT;RDs?(sf{^mW9=T;U7k(?5y?nj`!f)4j5$c?
z(Tt!ak5|8tvx#~CmK_Rt6}1#At^;K3SAY!L`de>b5Gl|DBsA-|p++D%h;zTEXlM%k
zCkRSbp|;ss02&r1Z<}5C9K-I`#g_nB*bO=a9=xYm<T!WnRpt!+WYyFVP^u!c2S2~C
z;-k{>f at ziUY&O)6xuQ at IPNYy3ba{ES`rUr}<s-wghJ68;kK73hz5ZF$e0yRB=<TW;
z03Kn)_h-2j0mpI-q3yzRcGSP^sg`zEZm$w9*Y=~zt`atReeQ8wi8`93q%tG1xRt4R
zJ0FlJy^o27ZoVMwVgcFjSG8{>{!^;Sp6~L30E?1i&L&)v1`y at _j=Il#d8L;M0$(i)
z0Kck~VV{qP9U+adKQHnN=?)ZO3Th<>vjq1C at 3#14O_VawKWaNEL)UK@&(j)xGa0l6
z2KV#^!#97W9so%6zuJMopL_;wP~JXw;m-(pT1<J9D*A4M(GBrf0>_}Tsc%#h at 4XOE
zfh-b5#ODe1B_#f1sHn0BFsrfepup?JaQx-Mvlg&5bt~IRu9DTeXc7VH6lTFH+aDz4
z8xirt-%M2BJFs`pSN{^xgEDCsEGybRXZBiFgZmaz5SrlfoLoU2-gkgp(mgllXU)#Z
zLPXz>+ at m^Y`762cpI2To2z4vU2r<Mq?AKZgpmt)GbgKS5n-_sCSNrt|fC=IKkLP=9
zBho*ckU!Q1ewr7Eb15un=-~P0a6Oh+sXhHFB*LT-iGh%)#lp<7b}fSNm&R8%O}3>5
z&qlCorEh$j#w3FT%uEf`<Gm+QN4GuIEdjSYz^>ygUxW;bNal_^Coxy;`+aM>OFnlt
zw}Jm^(BW<|mTAh~ZCdo*uDWh*SA#E86}o-=4P#wZaNi<@i;GLG8ZA~4Jx8WI^2VU3
z63-@(5vh`IsKDG%;s4%>UtenhXS<qe+60tN`wq|$o$wtg$N`_9o{pc+YDz|c!fm*Z
z?pzfPFOO=XlNv5hX^<h{a1XlxKuhWW=P2%f&6%tMDTYa+$9E-(?_dQQb?|?x7~3dk
zHnA)&Sk->JYoC8$sfF7>QeCd^eKD)G30A1;6Hff}j_J3Z)?DxYU72nwocO7nNJ;kt
z*{8g2ZJl>-&JvEsC2zLU*j;{KCz*xU;YJh)gwy3xs?!Hcdtz>$b$`VYIO8VQz`?gD
z=$!?9;xmW$g`CP|QLd$AtG7`6WN>*mxp9M`wWGUMWBbDDI6|0&z!&l*l%tT at RQR<W
z&f6L=R<7`q-ddsLpI~q6XS!+JcS>t-Y%X*s+5`JA(*CfxCMoxolhtb7cG?KBomlk)
zdab>gSCLOF1Apbe*|&$|_M{~eD$GrLr99*0ecADr9GtWf?S5a%|F{f#0U4f!w?GHy
zI$+!}kUsxfwWOl$5NXUrL++G(OTo%xoyB4o_H5~-n*nKX>O1%We_7u8S0~VRcdSSq
z>2o)YfEmq6JOljj^H-oo78QJ?CJzYMni%0GFMyD`Z~vY=NZ^9P66a`l1_ASwI3w+-
z>eDG at Z9fs2@Ks#15~P>LtCMIt<;Km!#nciCz)xN-34Ub_mxDEEL(sIWEn~w-g~Q_N
ze29U=0T#l^+T(Q`?wRjyrCQp^AviO!N5KQ+Y*NSoD9g5^QB`eD>hweKw<4Qj=NC|b
z>w)kn^z1SX2#!nl{b>p3xwyZy;dTZ8wO8@?+8n;sYU~dH`N at +)Zt}n}tEB${?+E+)
zcV1erW}9KUxvwDyg|T321UjToAdz)}ycx^TWOBzRVfZ7p3md-o4+bKp6?!ZFEjK~^
zz7~y)qeNkAW+VqXV+Mb?SYqQ#c?firV!tr#dES+`R?&;@-FC+h?h$bWkVCZ2QWzY|
zZaua%4=mNk^AX<JNVa1m!%C<IQ24#vqqD~2m!L*ZAMB`yQ-bE}omaPI)xkHECtM((
z(~}@%5J1x5OSIYZ27Ede2?MDb8Sb=QT*E9;nqCTDG_gi<;s9E8hh4c?k3;Vl$NZeh
z)yp+>Tno2=fd}Z~++Ckd%66*H_%*h6V~rahhZ_NLBcFwDqCDsWzjrGh3Q;5i#@=gG
z8>hq{+xDM at 2KbDi+p41rT=e<!%J+G+gVQ-NY}{X+Bv`b5+Qd~desN*A`5so)^TC_Y
zb+7naWg4Z(?riefwcAvK=I^WvJ(xS3!}`k-gO(txsgjlJGnn#^#^a~ptl9g%<gviY
z+3TO;lA!k)N6k;sVOBqv-6(~@+i0C}319C-CGiZr?~!y{Trj6f^t#cZ{aamytasL|
zo)jDuEjJ4XsU&cRi%p(VJ}YZ&{wUZK3J`~b#W!faQUUPK`G{t3-<gJjm-Eew*B4Zx
z<oraE?G{B+k$Fu6ptr^j&)^RC7a9hk=bPS8J3NrV-Gq~ccPq9 at _5$HO7X5{Ad!YtW
zs^^vSqhAd0K?YmkV55Aih86 at qtzXK9P1*piOls}(g|%Av=zBVmoJ^s~ZhP)<N4EyQ
ztqg8R^u3NG8ZUo`U0%N`UH+NS9B6P`Xx;D-7M0|Z0$g!br-m(M(PAebskKma*~EFT
z$@2n8_6dFJh3Vs_A|a}OCDWL_<9^hYaM<_Cpu6Ut&#Ld>!_qn|A?ln<Aq?aOn`8#;
zOvvs6V}R!tbQ2`*23$#O7wVmNOLJw=kwiYRRbJuAes7;d<XjMC^&HJqMn5IPlW%la
zd3v1P#!ln4K^f+a*t&FoUQ_FN!D3oLY+9jp;vSP;=~a24<vQQsip?Xn<ckBpM6{q^
zTa)<WG7|^K;9AJEORn+yM{8Vy&rFCqkHG`Pi&^MJiF at giIW<DllwEr5(ZfmsPVM<I
ztk(4)wczC9vH%AM+7$ZbTE`o|Aazq8EcV45&kJZ2N9_;(o;wn&_jfmLtl%dGnBY*)
zD{OlSRIe4l%Pi3aM(-w%s(Z81Vswi6f-^NWv-Xa^<cXivl3P<*@Ame=5pY9O`d!63
z!d+ at qhwDC<Vlt>reh0T_2CD~BJnGi<QB4V at OWYJKcYAheXmE#P3c_6xq&$Ek4)xS$
zFL-?+_rv8j|L#@c(9G7yvYW5<1LT%ZrwtSmo}u}!8JataqSgr>e)l0e#|15U9=w^a
zb2Q8H)kte_+#H(C@*b>T1=>Xf=rZtOHTiP!qB-mUe9>^Z at A~k}=j?|r%3<NdDct at -
z^7C4{=bc<$7xXQitUkvE_HxB|wba*DLTRb;xcUiGcexM8te0n{OF&(eej3Aa*i*Z0
zc-paZzSzLiRtSA^8+hS?M|{yHe8&}l<F;Sg@`Yy!OzQtY$Fp{g?&>=>Cfti}M0MEW
zb3pILbH#WMWxYiTz`6AC at j+=hBt&Y36%0OXH+bLjdm{i|Q0FZosD7;853UTMb8<Qh
z2lt2vO&6w)_jW#4BcX%PRr9D3PvAGIsJ_1VaCQszfsfkaf^I-btv;o!v0cc#bp6Nx
z`sSZ8_=IZhxYg|5VT&51KhB;!Xn#^{SF{9L>*H!Xy))p>FXf48>2 at qWnQA$eAmDSu
z%N?UCc>-s5nR{gxckcN>+toi+$`pIkt_J6 at r*jGP#lZ7%_+`R-77K~(g*Jtjv!8+0
zZ!R>JIz4MXCfPU`2N0H4^$}_;-$fxl9#vi(JRo!u5L>wMllNf?m*{sJRQ6r}E)<4T
z%0FqoW6{6=?TGH|eRg2b-F>mIx5X=H1OJ>V07o<x<G<hjv=m5o44=~H_Nb2Bb${Lh
zJS0)$IS3)%;{qKNl6$~Vs~TJne&65Wc{!~j3-Q;@>8j)|PA2=0ryaa>D80H{L!_tl
z22`t36BcaK at Nct;rk*hZX-rB3wyWoRbG7b{)x#wo%q=ldLhX-@&r`i}G~!@zYQN#k
zQI`O|wAmZzzVjVYJhsbg``-8xWy4Z4lN05WGo^PmVo{uOjG(8Ys8rc__ at Lgl;f(;C
zPwvaFA9#0ZK+QM%4Yl4k-174BK#LyrY6kqB+c&RokISHEHW at bVDfNJAb!}blvxZs5
zhO?`fn3yV2V{ZfI{fSINJxD!w%|S6tU%tU+3UD<l=dP+=hzDG1=I;*8fKFE{Ow3x;
z>$*9V0uefUb9UvTbIupPH)qng=zXDw<_nY}>Net^5W`0mpi6N%AdIDl*eciU#BT#G
z5tyCYb!1AY*}tz&uYz5RL0xSQa_#|FCByR(*24+bTY~!+2Kdqq=PmtbdP6E8THtch
z8vju#UN?I+4zS7M2zU+e{mEh-^fVqlpRKaOX0f at kvwN1QsjuFTm4-L-P_qP1{;O{J
z- at -+c4VaW)F)6Ugeo{?l$upG>qLJ+jvytNJXD6dew6X4a`;$f?NE*@=7?-loHq7~D
zIWVhB_!(aIjQC7*XRGT-KTBqWp3- at rS#oLOIuVwN;FDtSQ3iU(pe$y`9r(Iw_tUjc
zdBXZRX7 at 4Tgm8xr<doj0N+%U}R}R%HnUUIvjX*u%&G`IXN@$Ozq);_j$S&9+Qkfea
zdr1;-_)BSrQF1uImuHp<IVF(epl#SXyWqRTZ!uIjVLqKV{p-xit%UIHq{Ra6&pl)H
zOxXf`32N>N#I3&|&24^tLZvIqnjW_>y^u?N^gN(-i%}U=bJKHG<|v;+FLQD??0#Aa
z+ at a6}^fosUi14n9?kF+6*|^#D6#ej%<*jE$lnOEr^f6Bs-8aeqYh^y(CVoB6;n<z%
z`KU<nFuZkRy{w_GZ at QuhT)^<xJn5g*n9l=5ewj76#??ssi4YF^pAPIT4D6Rz4Ey46
zLqG-ZJ~JE|k;03jqS7QvF{|-0Q5jx92#1GQ@`SE>A+Jb0g(cvZT`2j4U54^cK3X(W
z@<*krW1V&9UVneUuZRL&-rpRo`eO^32V??gdECO#PnG?e8jB?-di|dBQ^Lh}56k}8
zhroyaZZ-6et!8F!Ln5e^`)4!_r>4Gw<ejRqTMkwSRx(362dr(Jlh>j8PT&2hf2&`~
zyRXtbOr5=|ad;iW&uDJ@%EGO$Cj{6rG6G)6`5Q?w0D*ugK7+ at ZI6hcaEgl&;z?24q
z%zQ_`<2YJ2?!7XdvSA)ltIZyZV?bnn-$;5gR?w;%74<=#oL-XY^Y>wrwQPFW)fv5x
z^$}qGi;7MLCnNKuoir=~qD(+8aa4qA7%5=8y#jN>g}i#n?k9#V3nj=@i_*nLOfGmG
z5>2OUqC?@;Z9ddc_7pKL&n#f)VjDHmqTPiovEFysKd`c^bBaeiDsHO*86$V9lJTH!
z*a^MEw1|VZ9=V48&NZnLqBpjJ=$}*4+v;yCQC$BD!yC^f_CpGYmm+}8nTsXJzqRIh
zK$(*LcRF^ars|(x45JI_AZ(oEwr{XOv>6C;uSZA|K<_ccT=#Es!bU!pOskC{rkZfx
zo6W-Q<o_yGNcQ at uB7j}i^g{(J(_TM!B_Pq&*pafIDJVmL2*Z;NcFr;Y*gcm|T!9 at o
z1=}Od6q4b~j9Wk5y&g(Nd$-m$yaOgWyg9426Q}_=!8->+fI!4*Kx~zYqF4cJFNCj0
zqM~V^Kvvmp7aPCyejG)8f415CvHZ||>`Jd&BB7<Qc|FVOPC at 74;WSs6>fO`ZEh*u4
z0C%By;~@?g4a6iWPqD}T59X%qP-D%t#o_)PwSlDw*Ykl?6jf6R%Me2f6?Nr#smqdp
z(@*oPIUx at RRGB8)3y2y`Y!%IM=y)&=KlpwQj!Xy5zTToE3Qu*6%8BZ^6S@%@%_);s
z^;6f;ba3x8`_HIK%Xv#`I)sRijRE)jSskj9Vi+Y0UH|zW$}ia$3`AJh?lY${p at dYw
zdsOz~;b$~w#(sHsHldc}GYa5a_3LDdXiCjnjAAtxTkm47o7*x{n!F5rwxE8|SO0O`
zpwN2Z?RXgQ6`nC at CeQLiiquS~(J at hNlt4^lAW?IoqFw|Fcm4o2D*uKZ{10%stjxN!
zqd`ZtqF;mhQju at jKASO?b#7;UeoDgCqUP!+f;W7N*bl#Ky;gWXgI+yHTRZOktUls7
zh9N9-y+Q>s=rraYKaXQZej#p^?HKb#;uR_>WqEWQsDR96)rbA}tcEk?7`eChCe7TO
zyUQGOGZvXO6u17^_4R<uxx<v8=C2bs=VqwOV$0o3g>(jBPkds^VV}IINf!Jo);p_c
z-osXdwBdSH=+N_=cenh;EX_Nppum1}h`jM^Qs;67+b6{5w%cdz2!mYsb_M%rQpav(
zC`BNz04>e?eCDl?7%EjjbU)H#AibIPnvY>^b`bKh84^W5;jDc6^=D?RDy at 7`Kz{MX
zVmxC_(pZ`XH>rrmhYk<8Un%$TZ8#_RBJM-2zv>!&ON-Hb7wt=U<$_b6@<7nxm(PWu
zA8CK=XUH3-M2IG;`yM65%6u<3d#?8$j@#dT{JSomLMV%cxhT<!U~xH-sMU;7U898M
z*P(X7*X5$tVRwD3Yl)gGjW*s>%1YMnX-AsshWW at jFD8vEY;DT<)hfLUNG`ZT6 at NbM
zUz?u%km$RC0U96iXQ7KAvZ_Y>iiV(J*V#2uKbL86<ES^8xpy5|{nnllHyK{k3cW?;
zvfh`C+G1%&`bj~~Z9d~%zLR6tI)dW)ubWlK!|kL;?6F-r`P at zAE{$j9iEMQml#$Ui
z-(~#wPNdL&5=voF@<H;!(%rnJ<8<S@*x{LwB{k%!%3;a`9jJ|+v4+n)HW*3~tmpD@
zdjciJ{WCYFPxJb$AasRjqIK+s9O)ql%!S7!Z|9!f)kHxbd)L~hKf|jKw*ovt+=oOq
zOoSkdKI!CYH<cVYk~Cry&jr}s#e)@vdv%aAyy46<P=bmJoN5<Qhd$y|S&|0;O~t~-
z)@@c~t8_FzOXw|@2u*#J6P2JvI>H&lgcUP~#_v`2Yxf4q{GQ=dzzG(zw$fKvfUY0M
zTZ*Nlo696?<I^xY1-%S*GQLtPq2^WN&s at zACSi>&zA5Gc>A>jZuZJX!fN-ZNMOtFu
z=zyVvO7s?4))S{)glIOJG<ckP3{}L>Ue3n~x1Vy5AJv!Cx at KhYJ<fzvVh&sfn_<#R
zYWb5SO!*u!Lg)ASXqi at CBBgizY@|oJ7m|GsOdm<TEE7Pr(;IiQGYjWuKP(g2?Yc{Z
z_FrQ^LveO!KB)I8-JDczfb!e*3EF}Q>z_<TB`uWKq|7ZsNXhRUgfHKClAV`%GQ$f2
z*qoZ$ksERp5cu|9-0#6&KTfFX1QkKFC>2qIfUP3dob$?L at Mgz_AjZyFb&kJj1j}G*
zDP{HEBIVsO=_}SlkYe16zE9q0hfd2w5;+8KpIhozGIxv3hZ%;rAg24paW1^{uaX4K
z=RzyI0)}0atC|AXHelIR)3hMlP;1$p%J+i-u;8t;XRZPZQXt*M at ysUUoswg}r`yki
zHZ=$9ZQDbYie5FCyk>MNw$pHh!y&3C3BaY^=EKnr*>(a^ah|GdTPerRP=V-RNUiqC
zpxTcOpAtaknvRqXdT!0wP;@0Tv(1;zs;F>wzY-;1aiZ%xmZB_O;9x;u-UI}F<sw?e
zgrE*R_~l3!mzp~ls!tk}u2PpQWp6?AP7nIfVy->?OREHTm2mbD`01R*@R~VFyEipW
z5j+CdtKi2#;#79CndURJN-V_EZU#gMoa5a;!C#0QN`npr$x7#>UQnc7ZexLys8K%B
z4iZ^a18mZ>+uK~U6=M$9gl0>$74>y&9scQUya=y(ZVThvbonQ;YUAUAdh$O(g?d)W
zPF?D#hCg at MI;`IsPS5UB`<rQp%(ky7hQckHs|^%Ld|Ag|K5Gx0HSZuFKu^r))G-Nu
zY^*W);j@`;u?!hTm07pI<gUC?J@#XYyg-X<3`nySS_?shsrb_0VUB1P(7*Q at A;EQ}
z&cbsZ30*6?fia)*gk at 7g+-I_jhO)*#YQy;96m$GoW`=mU#kmV$gXTtZb&Z>Cm{NHl
z)tFT47QEKiCiu(t$m!8w+lyJQK^#7;-%gX4mI7Q(1(V-k3I#yiKL5I~Cz!nFDo(w>
zwW@{G3f#5a#R1rs`Sdc~J?27CQy- at LwG9`(UU(L4YxNkZ{}k}>e)g+VVxZdxRAzvr
zu}oQ$2`$M(CbTR6#R9w at 6cz4`ruUvsnin+2sN#;#n|f79I5x$es4B3Z!i9d|*@O#m
zhc{p at T1r!u^T=oOrge{et0|>S%psxp1S5#_1KYr%Ok6zdOtR+$(XZGA#_1K_e@^%O
znFqR!Ql_jxySY?@w_G(132n~_epy51kj9+Xds&App>m4}amivl7Lts&73|WEAG5Bo
z@?B!nwN)0CZ3ZRDlgO!i9m731B9s!9 at VaX9Z?&BWa-x)ysAR6~W4B(HRHOTvBQ~j#
zN at w&KOfOVEv-gO>bT9cCK4d-j9<B9LOaRGu52p0*LO~XxZ}YeZ*hK5{L$%EYzXbJl
z&*ra$c^CAL?%`OZ8sj%aK#TEo=@6WovPv|n<8i;>xh2h>X2P?@eXe1HA4obwMrw2m
zIO3Ja=JrLcDA&?)5R(6TEM?KL=dFGAb#G6wVXr2a+U{WW-2GRMoXm-LHSC at oTKuye
zJBi1xP*q=Gi>4oV5HL+ at j?U1Y<zv)F0irg_Y>HFhU&A8z<Fatq>O_l#hq2jN+d!CA
zF#?8~doTFSd^7>3`Tdi>pWH>k=amBIwjJlqTX0j5VIXa#_NG&9$xP^RGF5?V*SHvd
zg?N)-VTb*4{>i?1PG-AoZRE(yF_G9j-hxRFm$_>Ukc5!Ai*hlx09lE39tf0(l?)_w
zk9alxQd<$V<z^#BJ{i}cGUSi63=T3X(_W;0-@{g9TBF1m>8_}iEYPpux!CTW at jXQ4
z#eNB at Z~kmz28b<?9`W=%2RoFL?RmI46}<gkQaJhmk6<2BhKH1zPsS3#w;nAb^ug2Q
z`%ID!KzW8;@3OiY=Zxn-B~ZznHP(b^j$2Q&Nxw!cyq_Olu9b3d^|V}C-|7M)^1Y+x
zG|+Q_*J5MD37;F*_Kwn(P1UN~<^XT<vS-7E;=>ImTfEDj-tkvv?|Ck4b*&!<H5au$
zunIFjgv~+g(U9Z_Z{~IXiFikWx#<Z?*N%gkRgs36lHos5W;6)cSWL9#E>*-w3jNJw
zmpXUA90p%8gRx$(=LAbR<wlc`nbIKW%T&jCiC^*I#bDV>^nuCSCdURDcUx%Ao`PEb
z0)kqvnx9sgQt^zmRy at PxLQTbO{nEk?S@*MmUsK|m#k!0<NvIVm8vAl;nTdmn*7mXG
ziAL3>2kPsRKJ!jZmCmjT(ap8_C1_pNjtv55+pR7X?dL-JZhM}BHL>>j@#wrKjrs5K
zCD?^q><{7{8)kvWsA>Jr#~_;h@#B>mmJBMdfA3`f$M*$(*$p}GdXN+kY#T|Mu8Z1$
z&7JgxcN$xN#wUx%@QPt0Ka{*Z9K3yAqpOs;nRtlYu!{J^T at ZhZkM74M8I5w9;^SsO
zrNB0tchKXU!REiO>;Lm|s8k6kLMKrOd-C<7X^;Ce(xm@=@6FtGl;9fU at txVn0a7d(
zPqb&<4|@CWl>$5sjwlN at u&w#;{p0`MHu<-h7Q_umLk&h_NF~OSvWldJM?(uRH-n^k
zmTui1Hx4>5ZD{9axSON0_JK{pb=ofb*j3pkYv|XMlXbVpZNdMzwU{P`KkND=z!|d{
z2S>kreSV8tr#3mo+s%XFgaTtwQd_Wuq$c9vYKmZvf0se0;O6%o{Sg=H%8D$-=y at sq
z^wd8VU$1`b6AY?l`eek2rx`5iH^7+tXZ8JfZ4N&c#LuTsF#30-<B)JfrH-fJkE<gN
zx`5Nlsun?^hj$3%qUiQ?*cSiW`>seB?8k`A==h|kS&vKwY!{33k`<z(iN}9o=p8<h
zMKz*k1PyQ?RzHzLMWr&-r1-Y2Tb7seM6e&&92O-y%tDPcdftbo8Y3jz(ZxX8&V?9&
zn=bN2X{&wsBWXZR2UZXRT&xzbsvM?-u&H_1uhaD6UFNXN6%ilaz;1Mwgo)0RZnzdC
zg-gYXxTlzD;$>@<u>JI=OsGjrh!Csm_5HWcH at ->)Rz~bLAop9PymAbXx8cF8-!|mc
zr+J6ZNTwGo{DXTHM*!JLKy+b8>#3+6br%|j7-4<RwV7r}5<Am~YlQlE9Eq!(R4hS+
zn>sql#7D#$VgYjfdH)(Q5Pm$$5<AIF-I4C__Z)U6F}qzOO^Q)s-x<{E92z3I%`P=Q
zK{2aYe!1Te)<9EgBI`qo7kyjR=>3|T-J at 7Gq}z{c<^76e*f*i&t~&@y{7tQ8{Gd?u
zg)WhcFL-Up=667%>ap&dT+Ts}>~>I1mCeHKylIW?>MPjvt`51iN{&5--nqh928?_3
zL(Ri3Nlh0&H?$OpjGQP+yfqFs7b$0zn?0jm?%$R#cK^Lc4uIj)@#O<>hHWSv$Xb<I
zTaC2Saou*TWU;lrb||&z==%<9h$jAeT+U%sd%(GN5M`KgUEK6yNId0ik#We5x-ixX
zGP()z#MM<%nIdEuy*i60WQnE6AXFl29nT(4EP9u0y<}GpEM@&!5CbUEL2Qf4Jc`db
zwVfrv#;lCikV7U$FJAvAzU=e$2XCiCNRk9Z0-t`>N(;k5s=`_MP(Hd-R#~=?U=>e5
zqgLwob!WA8BFPh2g3-&N7~yk@<_ahEvX3KHR<~BX8_wg<EG`R!&n-&<W`fqcSpp#*
zxMXLZcFJ&L8Rb=hY^gV&@sm|42W!9d6?DIpMUU0W?yJHLfV1}A7lYl_;s#G$vp=q3
zuP;$a=Va0r^fl&CCQls(r)|#RUWn(P=;PBk{Zup$B0dI#`Z<&8uifh^Z2C`5Qe3Nb
zm)yNvZzdP3866QLneW~b**BubSO!1r64m at fs~!UCgJ;&;><uvBKKr+RKPCYh|8ak7
z7x)yZn8 at Vhvz=kOeoyxs#zc4jI%_V{cPo%k4%usERa9-(o-ZC(=P@(7(XYkE%MAWn
zTD~bI64j|+41G3+9Js-CLHGrm>a-X>op=B#Qt;b|vPE6f|Dx`_qv34Z_R-NNN)QqR
z5hSAb7SV!`qDG6}yHTP?8KOpwL=d94=%S3?qZ33KjNW@^FvILyp7(vf{XO6F+iUH$
z_g;JN|FEok=DzOxy3X at B&f`2zhjeLUFu2`uv-di+U61<GqLu at 2g1a$y5kJrM(cLny
zsvs<gV(;%ud6rpZxwnlQ<Q47$3_%$mzA8*kkxfx~eq1K$F3-U307{jed>pJcZWHef
z_OHDqdpUk#Ig(MW2_hz*%<H7h4b1r=!22y!p$)zYi8Y<juleHZ&iC}g1SOfS9$iWs
z950BxIM;di(9CVt`W)0L0UQX(xj8lXsU&yB48f|5#whEX2<&1-Ea8t at AonQ~FF%Lo
zD-nY(4~Dr-W7_mj8=X(>xE<@ETQyM$y|a?duqj{d|HYafC&X1`<UO^Pw0tT4d-|N|
z(#BdEOb}5zM<M$1<4Yel{i<V94X*|!5I6ks0L9M?()t%F`VBy)@=O&w{fYhV7q~qY
zC~&-lFsH65Iv1gVtP|?p^!{9HIsvx-5Wf4Hm?GDtg;(kJ!GpfStVr|9_^A8$OzYT^
z`ACwVe-{_LUjz!s8COXrxyzTeJ9n6i`&z#uRvSg+Uw(O~+&#HK at y0j3anP|ITk<Qr
zY|Ve6+`D?Crs_hmOc75KGY>NEKV>Gi5mOxTH=zbTr*-U>pZ1piUYAH*)bTrg;NxH3
z9&d!ssKIw7VUsI3Z}q2q-_WH!Gnxf(#Ch%I1%n6O+ at -Ib6oM1!mVlwu>w>r~eS{p@
zCC_+_1Hsrn!2OXy#vf#!P4b5wA at m2>+XNV0F;zd$xLl0I!eNA<YO|u9U#4Lt6<!;E
zOgydxJwz!Znv62(2Ap(w>)Z~veNx6?M|g)B1T&gIz#R*{o9kBL-A!9%22>8do{~O;
zz})l4qJ0WrU#bvcm529A)UgWb;>pUE$eGkzwpXZ;oM2|T-yTWpEp^acrx)2bNN%sx
zD1#KKgoTEve&#=PuI at G2qXfYtBA(q9dLOys8Ri|UUszge_zW`XOKHY-tFOCP?C^II
zV%TlrTvD7zu89u2rai`S+-5Bauas>taL*e|&<rfnO)R$$29msKdRvehEzop51W}5~
zg9BEZlRkFI(y$kx>3Jz&i5_FCmfQG2Dp0 at P0jUSq-y(kQE8KaR&E%InUy at ylC_tL*
z2719?kJE2pF+Yc=s%XFV*TxfExVgGApmEn&SHBEY)3{rLZJcsX+}aN3GZx*GmYVMQ
zuXi%Fp5)3xAwil0EyMSNa<^|t-^foQ8`=av|H5y>9l4;G>$`cxH>#_qRW<*E)7m_?
zDvsrbM!~NrwiZ3yZyL|O<rG`LFw%?s9>-RJudk=AmUmb;L`G&A1QSd`iq|ZFIo at t?
zOL5B&1^ds~mBK`2mqo)yXrF9uvb=?y1Q2=?`Sas>CeUl)RYBm*a5o?1aq%x~<FZPk
z{ajRaG~)I7%ISI4*lztM0Nh}I&s}}-THdKaMeZ>%<b{pq;<-CUx|<ux+R27nf4pzw
zzBa~}h at BXv(VG?QnP at z;?OrDf8nq|>O*d)Xq*qG+F!3P)p+5(5u$198V$1N+73Hgq
zb|T>dNS4m}Bbvi(QauXxO<R1UWCYis`p=RdpHinSg%7{%XiQmFd<c{ta)r&JrCV-Z
zJRc#)eia^~_06nFEik|{j*<4+fIJJwdwIL<cP~Q3H-t`7o`DoKUgpAS83!qFVN+kn
z_lNEM#A$_gek|1vD&xQ9dNFe&cJ;BmM6Ff|jOE0onqd&K+`$~Fx7J=Xt){IIYgb6R
z4bT&B`)9t#*z4|$!A{ZB?|jz|W_I+f$U(sl%)2qXGhb4h%%<;50_PCISK%MeAsZ^=
z8I5|w0 at nfK?{_W}czP`3xTdwtC8~}bd=tY)yk0vA-4m>jA<Sq!`1TOX$+>H`hxg6*
zIaj)egf?eA^+zW-!?q&@tkr&0^ZZ6l%}s_5*yY8$CO`7IT^I|BfpxoE?M|pA^YJBy
z>kwuTS9a^Bwn&xr-L#hhodq7fT;zJ#G7}M7HDAndZABK{R_^Fb7s);f^0(1*S#Y))
zfUTTv#p9 at NF@buI7w>cV>tz1qaihK|t_K@|WZrvqY)=xA91N1a#!SaAs at rRwYK$MT
zfi~l-T4S){9-|-9);ec0t-!{rvSREeR&i{M1)r#vRxP+rY#Vbj%X(Bpoc$cC^{Nj#
zZq98wBsc8kzg@*fk6*uJOo&yua=l|=o`eFd#Mx8-n%??*T(lr*xzB;6!D=ZGM=PB3
z#@kyhot2Q&R!#QIFQ|cQ|AZc#(F1N((g64%IUSL7c3uwQmu72ywQz$BRhW)~PRZ1c
z`1fAyiYT);*Fb1nsO2|RxJx-yQ<F8h9Dr9heM?`)S$xQxIEpTq-t5wYj8>KGkW6mk
z%tUNCgbu)gptIBDcHo+i`FQTO?RO8m+3J4)jni^3M!Xg!yP=fecUIaNI$;+$$1)1f
zpm?5#rj`KbIq5%F(e*!0+Gik3CnfJo?n(mQz6&QV*&H+5vIgqUU6lO_0H7iN2ax`M
z1VR9M8z=4je|$>ie~PRB58^48uMo*T3gXXnW3hdr-w3_<<;2)TzNIqKuq3)e%!Oq6
z>6p^!t39k7Fq7;EhgWaK3urzqfT at H9^)9z34<h=|{ZcG{`+8pP_J;RiZWC%SB>jid
zr(n_wf!Su=&Lz{@Vmu$l`whb(eF|hUE%a{o7JTnna2raHDI!)7j9;)v#frMjSERAE
z at bAS5uEz@8Qw&t-?a5=Jd7XEwQU-rJ%U36VczsZ%8bZ77J^53vq_k>a0F}2`e>tdm
z<6!rvK1l-1*i=tpKJUe?BLn|tR**=ky7V3%j#s&%c}E&d-xC`sGWdl*fDsqH{2sRj
zPs&^P65BIA^<0JOZ}&9Ww`zgkHDprD&1n!whMnZVL>E1VhsV?>7iYfi#S+9DO9`^1
z!A1nJ;0BTLa*}@NE#;`74%tnYiZm%W`Zwm;8X`XPoowQC2T)XIiw;+*;sSLYx;|GH
zj*RfJ#cgTaOUqb8C|%~#GPw$ZeYru(pQ+;+5j=wQ%DivL2=ZP`PpDe6ynhP8{Hdn}
zm6u{QH?!PzhUn#pGIEkOnF+epJ5NQX*}Ykh$@wVKcTuJXshsxooyxkU?}`YvD2n!;
zb;;P^E{~UFWgc{un=HqAb!=e9*H+#?F9>(oz{sG8e!_0>>@t^~j5T3jgS=OhPyd2=
zMX(J{7_Ps}MHQz};K~V1-rwQwk(%+-5iVku-m@|4CcvV^Y(t=95k2fmp~esCO^M7r
z_ZcM?T_CfN;69N^3b0NQNO&xh$E_FWAVwX%6~M_yXh5Abemr;6e9~YI;^7S`slStL
zhvl>;>gaV<<ZC&j<#!6m6;T~ux68L5*=$WR3R1_10^NfagOBS8uB(TCe at ZH#IGK-R
z*mXP1(Kv5je!nq-?dBT!y_8SF{Mk)~O9wA3nK`XBF7t<~*-u>>SAxM3h35v;+?k^O
z`8`yqY|!r(>t9cv2C+Jg?%h0OQkb6@`a(AENzUTkKsSij;=5Zq<dMy4BKjLYSF2i^
z(Er)pUmaoB<u>QejVx?c%UJPJ1h@?ZEB~6-&r4Iog$gMft!32<Z_-1IV`pScW&Q`w
z2(^7k==bOUVwR5pFHtvf?bHdE=PRz7b|yKeJ(LV0+n0AyV?S^Mo0!&4O8=?gnP>R;
zrd?GdVzi8+gnWznCtgZBw|lmhYB6>FGJO at fFup=y!i;aTYrG@&5z*O at bez+jjba5w
ziW^M2<EP8n_r9Z(lA$}dy*brgIF26X6pB7H6zKhk#CelDJn=n^hgAMUcM*z=k<hkv
zr~|h}G~Q+GUnR?YVXBlhh_*MR&>LXqg?^2lt_ at CEjVqo{>NW3fQ_bv@|8!*q3Ok<T
z$SuF$kYBr4|8UIKf&GEf9Hv+`GyQg!y&O%}2g|$2Wuj`4M8WEQ`NM~k;pMBrli_#N
zw}VzqrZg60!3H<{`QLZb{_4ox82bF)7)qQjGr{-Fkq^(a>$1bTm_(6L1J{_VAhDPV
z4OG%X$?oE-KU}wdZLTKaUrGdKZqsY>$tT^kE at lt3`;~QiM+Z0&TFA)iM0mW#{Iwz&
zAq#R*$+v$6*EHF+M!}!a?%qXyp!C>Iz2&mJm-Iy6O8Toz?Ng8<>;%eqXy<M8$d`?n
zfa?d3T2qCjTV*nrU32tNt<RTWt);wI_|sym5B*;l-AH>`CV*p+#vl9;ciVG%`fDhD
z&=4QHt at BWu_!GT>rvfqoVt5nMbz0!Gp4wdR at 2}GSR2`l1vNLX&1SL{Q*k8=K&AL~>
zPwS{~m*|%ow$1~E28*6aZLLxn?370~%(awlC}SC^ALaCYo5A^qAmd67y37%Q|Am at 1
zEwo+Mh?es*uo&qgsdf`v)YQ06h+LS at MtS<V4xSrk0W%IQjz<~{*!sm at TBfvA20p`b
zLR~&%LTvFsq<IeoHRT!M#ClT?()(rH=1AD?TmKu%e7TeFb*6rAkU7MaqJ#l5>Fiot
ze6q)NP~K=bC9^y#&i at ij5`SHrD=oG_*5K$^_kPd4CC!~RlldjAg5(rZRX9D4vA}YA
zWn_W7n3<+guziAUETYH4eoIq8F);+IT~IT7qV6!F*o-?kgU~lm8Kpm~m at 6&3$-GaO
z$d0Ec|1tj at W+5AXI<3>you)9lnF~NS?(8__BV6b8cGxPsD!9aV4I<(VDfL$4ot6Am
zpDOj{s9$%_3U&TWyS^xky_5QssU~`CqI>_dgNr-qKO`>|rJ(ObSWp|TAGQ84_FZ#e
z6<3FOZk_y|xdmEdYO$p$#5R8NiBS4W>$_>}`A^ovuvRTBUN!7=lUBEx)qNj^R4OJO
zEJ`!tOb{$zq%9O-gv at My@$C&y30G+fe%x~cKJhNwaRmykhPv3EU(N~?cq`Glw4FZc
z$-~*g!aGx=nBum6Q=^<TPC}`iTP*cA{1Lrylj_c)6Q8rx(5FrIt)|GtENSzxMdc^&
zT(MP3;h$XQLnV%7fK57 at AX1e7GA>8sr~3yb5brg3tJd*Q1LL#<g_GYm{wn>UZ)24q
z8fM^z6S^J=&a)@z$;Vb=7r^pxs%H<22TvT3A(?8gEL||E|GYpW53z^9Q;Uf&F at nN3
z{8w!SC$b3uQ_`pJ at EJ3>9q%2g=TrF!^sge*9$)WRfm->5h0-4ZCAiYE^6pj7dO6EA
z2$y$Qo>kEQO#Fj+n)kfQ8d}kEvH8|HZfb^okQpNo=g~dRKD%eiV>Z2F@*F7l?Ykc7
zFI<E;6J<)CR;TLvd_`1q6|5pI=AMG|*E}}HDd!zv{mid&U8^IKi03ExecfxfA!ddq
zy9^HB$IsN+8mb at -UdpV8-=ksrN<4V%KjZy}e5&r{e0yT2?%zk8YQtzdX(m<#cWKCA
zg6o>`spps2413MGSHWR*^^r#<YlE}c^QnH$-$8&Xz9Y`T=<|t3Qib<FaO;WJFiQaZ
zFPLR|1;DJ1?z_Rd0xDpf;rma2Z%5~w at fuL6Ri}YigMtk|F{)gY3F)McK9BQEM}(o6
z74>KzzM+-N2MXz^tB1_rg|2X?t;57s$j9r4?qXR=S8#u|yr9ly!_S!d{u8VQN+e$1
ztD|5V0Ln#gNn{6Tg_6HbJY~>HH5)z3xbcIL$+ at -|pf0Mc*%cYG1ZCro7uMgpe7OD8
za;@f-C9_df)U0m1ebvB8lHCETtZ;Zzl*KB!0qym={<P2j{fO&lJ8odNfg-cSXnd8C
z-JJ^}znX6j?32Q)ZoRgRou(x}rJwvt?pAC6 at NxBVh?11+&kbU)BH<5COy)~;fvP25
z+C*i+Q|TR17u{Olya0GOH~`#A{mI=(kuNpYW*=9(<r_N*wpm+?mKt^}OHJ)&G=W$0
z0Ih at S*IlwgT|9%YP4b`IO*C{25?3LcU|&J(AB4`iCjRr%E7yazR>dzB!EahsxyE^n
z+!L~z!;3`b*tBy*JM$xT*tN$k5XWuPvv?ChThzse#Bx32`0RV$QP26=SD%#KwR<M0
znQKVoUx+N7VhnY(J-QIW$(5u!^9Pcy%Be>kEk#vq-K>>VzqZ`NoNuHj2`=io{IZ>^
z?>5yF$%Eswzb#0yO+IZ1cBV}FAZoxI&4#5~T|}}pTPeTWZQC(XY0C(r1YjJ5<r>CW
zk1HX at F~O&M>m2^J;@0kn+cJSmkM(d{qG7naua at K+D649!SW-00ZTiRL>4?;f1aNbY
zw}y-4<{${!(4|qPnoydT#6ETz`t4C`Z6^S7o7j%hLK!SWXxU=9;+Di{@QIcnV$qwW
zA!!W=$Y1YrXf at TPCtTFg`#Q_w8u-lZH+<p+YvWXF`z}UIka|Ii?;(hQ{x2eV5f-)i
zLw}(76jCm`{6dG4H5}UttYz~Ys56kNVqfF6Ns|?N8O?as>XSTnwSG%hVVZn)wfKkO
zrUT~%a%z+Vx(-wd!I`Y8l!yoQrz<O~&S}RhV*c$Xg&3}KgmCC_GacyyihSzgQ)K_B
z#xmSX4dFOQ*AFpkI)ObiD(!tcEZl2IyHgujKFupqNN7=CQqW>=WTf+oz<WmxILjns
z)&`d{3)th7j5sKX25X~T+;RRXS?pU428gL=w<Ne<8#%hCK2#x8KgJ=AZ+eV(>a4Ex
zPAN`jlp!6SZ9;IIVg-&qnq2rN_MP0HMt`K!$<3spOMceHr0%kqEq9quJ-18<OR0JY
z5m)Gg3uydGEWXFRAc?0klj-tWofl0b`G?^B|5bztl!pod%tv-!B!;{w)QMi;ZN;Nh
z0yCcCcdGtd3t)cZA8u&d;>Z+N3GA6QSqnFMaGlkDKH^Cxlj&yq=ci$TZ2-o#@!CD1
zvH>|iwV;pz>jeE1_$KrZ0m>az at flCSSV|(~H at lAP!ifVQG8CDQ86K*;mCM}n;;p>+
zhSi+bgNOrJ*WKIBwWqyo5XJnuCDZ*d^q()8d+XE{p+HAa7MDnsi|2pq2iyH1{H_=>
z1xaGY`$16+*ep2JZjRtr2}pUJNwEKGTw-#Cdw at Fd7!(Hrl<+?P at Ny_7fTagE1~FRQ
z%{MsYb#lvs{OJdov5x?;te8CB$Fq=^N1C4uzqAT*9e2544H17jZv at 1>io6_&WHP^~
z{$W9{(>rrM7RPlPvLw=4UxfhsQHA-(yqfH#WcZ)3S&wQy98z5Cjy@`9*NGV6I2pQs
z#gFoQ4zL*Lf2bTOCMZdxUDaY=T^9&djj>g7PB!Clq_#7trlLS#5Njv39G1Ph<4@^o
zDF at t^Q|^}FTOf*Sz3|(TYXQ#R&^W-XrVqay!DDd>_UFZ(R?H4tBUxigRa_GK7$-e@
zWb74qUi=JS0la<{cCFPGm;Z;HYs8I$?5~JPS6h-cLz~qPRFI8D$$yJ?@xIlJON$mw
zVI&!?`cGWLno&`Gkc`)&#-~CK%iP8;mIla||3zNx*7shkbmb9lkukXTlhKDJyMFjN
zg&19zMw&!_!3$>U at lc2JZrv@M5<>sC6d(B`vTN2KCF=rgj=9P|ebdQR%@3x+vO2|2
zG>wHhRE3%oSP at iO55qIxplJcQVi*2DV4(l%C;1yu_J4Ct`~OWk>Hp-d3}%D6ulu(C
zG?)Z-Sx8+gxnyipUtoO{H~jzcddX7NL$A))#8VfRn0)>SAqFM?*1=(h9F)S)rTJa3
zv3$O9DBeZD;M1~1BL at 6r&fl7s=2w?M)?NGZTKoD(<nv$A0g%uF%D3oir6w at g`{yMJ
zNtM|VFD1oYHx8ZM at g2XwoUf%_H&xYm9kEEBFMm$)UC at 8{56TMn$;*mC$#!5GwHjqd
zZBCNk>7><P?QjgbS3hDNRbif~%>z9wXWJEnHxK_v!SuQRyPjjh^3Pqw+>>YvW$+6F
z1dT%Pf0tx6oepOy5Tzj-F*Z`E<5$&P at AN3|ud)Awh@<QksHlK&>7a(Z!c!d4<tZ+&
zsYwYOs6k}qB9x%&*Ni}~#-o*x5rGHoxFfb6FaD at 7%wk at piMdZTBr($5<m=6S1^vZG
zM;tqNr<i|0o;ruZ%P-Lw)?-a&34Of#LK3mH+0}8~5Ax_R!8XKPv at Kii(G%B|o+HE~
z7yDm<DOY~@xs%{V(a!rR4$WmdDluc7Pf~waneX{6y*NI2l*T<*F=qdsv+rZfBUYr)
zTfV1BO5 at Ql_~;7{a}yl;fzB|@<s61yQxhT%=+H;e_E5>vt@>H0^|?WeRX*nA&0nnw
z-A$^X>6chWV6bE5!ZBC|T$44!)BA at V9Za?V5i?-5FZAO#CN>Y~0hv+Jg{HJoU<0xZ
zfdj at M|1|ruso+T{3u2xaS$C27FCj_y9EG+tSo<`C`Y8qWtToI$6#GYUdvy6x{?Ywr
zi6XA84PoKFORsO+MfG>v1&HOoHl$Ci?4 at kQ+z$eD8}c9Rn`?Gd>QlW5er!{$8No~Z
z(n at 2Dlus{Hm6+>kh`gxRSL#{JK1}FdHi0a|Aih7uXJq}FrVc0uB(diiFlP$r^FgSC
zT;>JfI*(op9!!?YF at SqWG;gizUU^j`ZFVu&|8yNL{`3m96jOp-u_T_u)3nqC`pE6K
zuG2-Lea@!BZL=dmUdEv4S}l>_(!vB$=EUapf$P#2jV0 at EkPH}i0|xGo_<?yqPcPA1
z)Qb(yU{;$cw0tc8AzXu<g1YKWrE%!BDCV5j2WFNMdcI=<nUqWTp|d-<WNtO1NoW8*
z>uvV9K<RAFDWL69>X*|;9$_I?rjw7{#mxp={(awGtJ+?in82<Nys5Vnvn3K`q^<9b
zcUWkB##Nhd7hats+F_(aW+$%8G53dKpYsAdZ{)sD8jlM9pT;L(zfPg`Jt|8l*WPeD
z!Y}Jfq>g=nqWHjN9teoPK_5%>C9%q$FRY89O)d#v-*+cocOPxA at Bc(rXUWX9+?QV_
zeiqGW^b+XBC^8i7B`z_^kcuyj9uo|(%HImYAGw+S-uolakg|H8(7 at WwHJrlqka(GQ
z=ZLhQiG(UEITr^|wU#S^O$6KK?H^>NXExa5l8>Ai)7}MyA+EHSV(*vRwvE!)5}izG
zas&Zdn52;g+7~5~hqwc9*7lo20ApJ&N#e}EpRT92^{~2aNW?^e?Qpgs<+`zjX!!?G
z`$o at JpIo>?kG(@E5{lO~wBnm|)1dl51v3+zTi>m_84~ILJGr|e$<1vSruRquQ`sr$
z&MT*r%K_1e3i|9a_}16cUBW at kzIkrqK?FUua*&#o>Sg2bU7$$>(iVXN+xuGhm28pr
z(q*W}#Nf}k^3plR`{lkME)+Ud=Cz(0cSBDBGNP<#)8B&B?m@}*=thSaL&TIE?;9y(
z`Gieow)tf>p!Dgm?&l9wM?FQP!3h29yNZ%kwmmyb%wVEj#C@`vEX%gdgI!&r8AJx3
z*IY+B)^$9c7+NF;(LdpgK_O~(?<_JdV$$6fw_S0&1WlgYR5XxYkH9v*Mg8ji1ul$i
zi2K3o6JVMX7Vn at 7P<aB*VDlZdG>*Qv3rD$IJQt#s5(azF_=~i)$9U4$(plHV!yEq8
z?c~^PyM50KOtTGtMy=+U&)br<b>QN)iQRqbL3Y9<x`~|4wlz#@G{@I?Z2yqG=4qs;
zDo<uz4BIAH)N3}vG^hkULp&%TaVWZdLfX$CJo&OG`6eCMggKcwheYA^1KM*y>k+Gc
z6voOH9u&q*T4&uzZJ2nO!<un^LpArelq;<XUAuN>*F{(kkk at WGp~23}9CM#8byxt3
zdBCx8`3_i6$8na_`0GnDKDy(h*U#7iWq`CrXtiHd%a5F>Agr#4eT31=r&TaV^-^9c
zxu+o7&1r{fXU?p*#0Z7yi20<~#|LxoJaV`SlU at X*ry3>YY#07+llZ#$q|}Jeun~Rg
zV?T8?@+Kv%@bW7oza7H|KpQl_WLo}<D9)NI2umt*Ugu?;%W_55))|*)uO~?1!<#=H
zIQ{Nt-e2=awPxhW at XIuDck1F64(|IyUg{;q2m1L{*dQ9n3neRKKs9##b>}~$t+x3!
zxzpxkS`M*;{8CJ989Cr5-Y-DnfiW>YvLD_{wsl$+eK~jeI<fXusxM at n^tYC|Maq;N
zBO)WsG6O4vi_qVKUd=l6`603I+$TSwsm5PR6*5#<PC!#Mr>L96ulj}v$<&prfA=hM
zX8?k32`e+=bo)kE)C(+QZ0%8=W`K7^u3`s->+AX1l#F}^S~Xk`9q~Vza+}Ky=$ZYv
zkhzL0pOfMpi)bRx#N{o+3!=ecowvhIdh#jF4a?+2)r1?ARP5Gp*d0X1^7|H*H6|YP
zx_k6F$2TLm2UpF(-GwqmlN(r1?hPVn at 6s|GZjQF&VdXz;=+=0KV^g(y5w)lk?8KP!
z`l6!D+qTu`yneOBNY=6H*N*!u*$NtUuXmzp48WGmy#wX!uQ25J3A663DVh7QX4g3Y
zsWkH|IksZS8gL~&0T0MCDsr at VKKsb}<&8D$^$QMSeVQ at BM0bW}O at 3<A)WiCjxi2+E
zRUI$C$UDl}jc9LaXzO6^s_jK$&;R1vTBfM)DpQgeY;2t-tca~l&dH>uLN)eqdtcPN
zj52)l%4r%Xqq##HUY}ZI)PGkso!`Nv85X(_eP_Okhf_{-bX?MyFktNi&44ZKp`=L3
z-g5gtt)-(~8^_4A$rxxz+GUYj!#T_B)g^TvYTQ?>HCf7!0?PhUTs&pII1Nn)O)M_m
zTWAkWY(TR3p;x_83DC}~IrM<uSx at OzSrvv#2byppc{Y#puORg^hZ6Ma_T)&i#_RMS
z*tqe!3AV!4jl|<TZCqGcjaph;IXbzIAkp^Ead2cR;gWUTZm at eis4E=xT&PZWIG;YF
zamS$~P3)?fZnyQ5`bS1ZYj&AcpNK|`xxX7EUh1vsk}Jqqm(h`44#TK0*puI5T3n0^
z1b-><<k#b7Ga2aj*-K$LRT=%>#s756f9gKtRN31r+m!kp;eUynnt`e9k8j)5#<gij
zih~)+EZHU0MY)FU0OgCY6#O_Zdi56jA$M3P?eAKmTCJJah+a<npw*J4>bAC;okNd@
zasMSns)d;-RdrkpssQyIOKGaK35gKMZ`F(TMdEKQ<S0aAL=4<4la at uX-QOf}pkbUx
zZF7U)KrZ+#|NE>=O%lg4xNbzDOX2I-b8PpaE>HeW*0-7utUPVT9jCQHKKt`enQx7y
zF^GGXUAOM7n4MpQk}@ow>XmZd_;Iw<o4`EH-IucRr5bvZ5x42|D4Ep}L#G|o0*Cs!
zK)e|weZoYHYOxucqDh~?s_igyK5EioRD3#O9<itP3<kab38*iz$bdGWD)}%)tcnD)
z>5BW2WH07yGI8n~1p5-YS2WrPEp*b0+#@7Z1c0YhL9Vh0(&gwV^<#`NWn(&~x at uy@
z<!op$O1w-M{PHh49!#MXsp)Hit<t#uFDU#gi!4D0p1Y5Y+ai|PORr>MoAQQ-dZ)-G
z3i3(J_qD*n1>?KMQ)L+HhJW80qJF`l6xxN>2YkE|SD1sEh-8x$$Vs#{TIjLoLtqfv
z=G($x|E)`)v=xE}cS~+R^7S;Vaep*AgKb=QDkV at iKym^fPjox_Fk?1h*@%I?KGnWx
z?BhoGHayn|s<CXf+um(ON(AA^gLX~%kCPwYd9-zF2VP;L7*tEW!=81n^lhZ+v5Gj5
zlAw@#*AQS}O;^<x14%pT>jHKW-{n{#nasS at 6>C?ZH*)`=i(zRzlwrR4vTKbosHJ+g
zsiFccwz=2X!**}hi(-%{KzsJvJg|d^;PChG`cer}=M^Ev>M%R2jk&|~ksj}}bG_!)
zMiSvSO;<w~_3?9(tbaADb0nyPaCw~s!5R71tb(y>Q!?+&sjyU=jysDxW^-|>$tzhw
znJ;3$@QiZ(P%b8|K_eZo=e?$&ekJ|hWt^o|Ax0_qbxGrT5qPssvxZ;W at -z41KgPy5
zyz2kBMa at n0eCD-3e5at`w*m=KE*Wpu0Gp at Ymi~|AcWfR6N7$C^z5-mrl@=MoUzH2E
z2&+#_F<GX~7f5o at 2%+ at XRsk+KE@;xtEumWp9l3RoSs6rm_iH~b_j}E^HS`kH{Y7s0
zXE5S at ba(a|45W=ND+vb}cyEQ(DWkzS>;~ulx(hjNtRej<<CNoNhq8ixfaY)XY4}+G
z3DM~8Xcb0B;QVgdpe?4yupXpxark5`dT8u*p&7p&ZVRlG)PO!>V|`E<1@;HVZd}Pb
zZ-_?&*mwT4)DSoeOD_>UGQFFRnlFU`n}?HxYA4LqjjMw~_<qhF`tCEeZf~h8p{BPh
zkA2qQ)%*Lu5NA_I&<_mgtDDykOFOuQ!*NE#%_nTH8U0XS4a4oZU^mxUjaeo9smTT!
zU+Gz5_F0R7AEb!*MeQ}a(#z;~(N^D^pPM@?JzI3qUT)?n(eEn6pbcMnqQDsRrnb{b
zI47po&gkb{^OXXC&p~_7coxq~f7YDLW9_CrIP0xi+wY(<`bkyVTV5jWLEnl&8>mCo
zraNPrPnc2*`|7SV(Z_-Hz>Hv<HB;|;`W^oGK5xt=^52FA30j~ck7USi`NAUdy!WdE
zKV+xAg_qw-ih7#FO#AFD4tSu8I1&^$x>az)8WLc<uy<6oaR)d2!jbm1{~-M8$mPqe
zkl+ooILq!&O)sq~w8x_gv)YLt$t0~&kF(jz7;)Sg-TL}?m~2Trpw!-Y6#G+n!P`Hr
zLoYy-bx}1^w!ih(u1d^mRv<orrrcfKO-Oi8NT!7T;dkN69LU-`;0xT0T?PbZDwBG<
zCEkD*a3~G2FGLeXNpfr1D||vo>$ig)i*Idg<i83rBiVF!tf-qc&0ab8ILQ)+&{#e}
z`|^K0*-{Rxv?x at nPv<7`|2>Yss3x4oV09ZL60M`1w$1{Ai9o{fZ+tQ->IFKdO16+m
zOk(F}=*ep>TNfKsm7cTb2M?@CJF0o<sh%woUOM8TJ>&{se|DJmijyFg31{hv_MkWP
zsVLpMw=PtDdyIVo$2e73ij5iYhsHpj+Q$$0*9gB?gJ(4%kB?m!Tu at 13*!vv}=({3U
zXIQgP3~9IDrJ2tq9v0)(t>%Uk5a31uIN#uwG#pwo>q?xRkpM0gJk19t%omNvtJ&u$
z4o79+%``yIbG)|qzH&5dMK&St8mcZPd0q)kzuPy?9}qd%9P=VP9HVNAuAaS!Mqh3w
z986UkwI__7Cm1ycTpvwPzmvyaI|&$ps|D}5PNRau=Cql19wXnIi at h9Y>sP*%)ka-M
zZnZ{NgMhD!p<T)4>N*SH(xPJ2G+udvDD_qP5N{;+7G;0B_tsoT{;%fml$uIxV~Qxt
z4)&byvl&AU#mv=@A>7X+zEl<DW~uHtJ)RqTD;k at V7r-~y=&nAg!e($4 at KwQ<9Fvnm
z3%_ifJ#p3~`|61OmhUuyNx_$U$Lna+h*6yuu7HVKuRjtR3>sPxJ-L}RYfGsp6yjLf
zD+IJ82|JFsf?wt2zssUIoX{l$AvTgBPnLa4^P%^0zPrD0K>Omna@#FOm{W63bOM^d
zA#3V8$y4RlRwi%Cj=gA-HW=+n2Voi*AA9%yL7_{w!>1MA4!#o$PJv474`M5viY+gc
z5OvXW>;iJO1O^$QHI039Y9^FZL_5PfWJ at GC?0YGBX;eB5yi$sYq=+;k$;x$%!5_ at S
z7t+Vo{f at WllsYMFWSr3N)umxZR!mm^g5JgZnHkYq!ORgccd4USa^s8Q$x>2Z%JPKY
z6yTi*+Zanz5C5La3o~#T#uOW8VWc7e+L>n)sPa_%oo`<JxQ)FS4EE5Bo3YczD`^5=
z5~f)xuSW8Vsp~do=Od$o2C|w%5vgyEan2~NhWofb$Kd<Jmnfp0S}2Cu2jzvunA+8h
z&H%DHkA0(3qA(7lc7`M+p{pS662dUMxz?VZtpfCH13DS=9xz7Ykm^1FjQ3^qy>2ti
zG{+DyG!IwiOr|fL>b<5!FG4#Y56L7kQ+h|`vls#}<Gwa#soEP+!BxghRED_uuf(o*
z<u-^X^15K9<Lm`v5pNnm=*L}hoRA*RI3{cA0Q~LUfOPg(aVwU!>74fhn-wqK(zh(+
zj$v-57mVHvDTvVwn7rq%t4zSv_m&5hN?^fe1UtRuTyP7xqG>y|Wc-1iZA|5u&V%ne
zzLNu~X6}}06KUn^ydi7;-{1n at CS3=~6ns~;Z-+0EG5EckQ~;r8_WVM<k-Iy-*Lzb6
zkydSBMC3o%EZl->_9ED8IJ$WS5p1zDinjy#EhN8S21z0hX at LiT+?|niMxC%=m)*fJ
z^1JLrAJH-_j?<QJYXew_ybWMc{nMbAfOQt!N&Sl^gPVkQ)2YjC8&8T-NuK*9`W=9$
zzthf?kbbkDLHK8F!!}0^gprp^-A66G(!xi~pqwF3qYuF+Rj-{IVi=lT at fLggy8Rfl
zK9ovguuF{Uuid+rg4ZmL7snF(U<neWG%<6RyB>eBb-!=?>DoGa^p))*ATP5j-a|z~
z7!MoL<b~sPcRrCEXz}XM!EFJobgu6gDbcJ1@;T8S$vMH2ii>qOI(zbM8ncdZ-1CFZ
z!1lz42QkN&q`5w+hXD+%IGLo=cxr&Vrn3aqeTP)1&se?Yd<pdS19wOwAl#02PMgD)
z6}E4+2eiH#c;&tvSG2V>s|uwt8skXoel-4LgFZFRW)9_V^m>%%rMMVu+hvwVIt=n*
zIf23Nh31}L^8>$qrGSJc4~pv{EC&aCp9pZ!9j5EmWT1Pqu6-MI&ys=B_MCyW4D)`U
z`l}qBvrRrtcadUbq|qJCokkeIZK?`x*lt(a7y?CALnB0H&-f(K_Z{m|3nr5#T`>$x
zeLPJq=7(j|%H$wFb+C_$-!(h>{F7YtEi~iRdD`;xZb!6T17r2kl%3<eBj$8&u?sU-
zrVssm!R_aFpm|A*BhAFbWE+lke<xB18l6L~_)J=j#5H6P at qHAR{#EFhAx8DqyV?Cj
z^3rouxf1AX(kgA??2LM3gK}h}5`9!BZF8V$U^%u0d~A(W4bb9MLUOO4D_Kz%okK<j
zJwYb2AP)i)aGMSqV|s at +uLkTYybpSu25P-Z>1fuc8$y?7c at C5q_YaW{!1Q#5x5>>N
zg)-6&$2gHI&9_VC9M*F7F0+V-JI at Y`z+uo6%%a*#PkkC}uBC8RYF-VUwok(7bUx6^
zsfb$C_Iv?uK(BHUm-M6`9GE>Iby&0jE?kvtp>$8`ip!7!dvS$fK7!{8YmO2dvj#m|
zdr9_=6f+1|s9ns at zE-NvM=q{yMRx%n5}lxrVPRo+O+e3|m<@ag<GyKlgfvSA{c$n?
za$PvSXNNZ_gQWg>fgf<|XJ<9UAfDzcmaE-8zworH<GiyC6=+Z)&k7RD=cExw{GDJ3
zvfQ7HXDP4w0?cr^Ik#ltmDZ9oRC>7974vAnIR&~qhelx{0aGOf^g5=SVT#f43hN3=
z6LNdU_t-j;q2a;)+OL7P=F_d-rGUj&f}s}$=D6q4`lUGZK0FN}A?}Ap`Gl8|o$bzD
z5>~fETQI)ogFxDiX!Z>wojC{XBgzLbt9b at KbeGJ2htMj(*~jSelKw$YV0rPW3N#q7
zCd)g#Wbk#Z(KxE`)QlMhILF?9Sc9w=ptDLt;MpUgzK|0f>81nz*)vp3Z+<DVeakcd
z at TwZK$+Obkit-fSSh8T8KZZ)7D!!efmRZ}7O_x!%Cs&1zgkcHLNQ{?{I6RdJ)PUA{
zLz9Cf!|X3LC)puh0ghaGM$04ipS^J!PTyKwF48&y<8-fI^wSd#vbk=ByOOELM+AO8
zM~Jhd-ny$p0u0_~)0g{!h_hLvCc)}r?b5lQ2|&qUY^mkX_g4=5^JYI{suT4bn2Uj6
zx3Grq15=+;C$|9bu>!TqKx7 at Z(u{e7Bx6<9x#YjoGcYXmd}gMbtq*O_S~?Wy7)2~D
z-0w(>v8d6$x?Be<goYmGw^g`lBN7Pwyr{KF*Z at nxNb?IIw-Il-M2*zC-$ouj5flFj
zc<${RCu!u;N+r$I??qrj90>y$d=AMlTTqF%g+^~tF~9c at UaX$-Ic^=+X^oX$IMz31
zvYLXP%gM<_ at q)5beyqyLQ4s*!?uQb{6Lku?&Xa+WOQK?8>=-m)E>|l>wa3#0JNFT?
z)@x9i0p?xlaH|IyjIq^spn(752<$YiWt!%YX*H!UoYFUdO`I-PA~xM)qNBBxi;H0^
zz_gey%u(~=Lq=nat)PcW6M&@SPuSwwW=mlf$#7HOWV%vdev$y_0TWZEJT>U|uQx7C
znGu0-^riJJP>Ht^%jd)9Lc_5^`y*Zbxq_9#fbrbHy$ipQ(-H(GD~nl?RO)A8Lg}JZ
z*AbS@$fe`qIm_N(7t8%`7n@)Kp_f0aTqpcRBsJm4CcxORR;m<*E-6()AgUyY)TI>v
ztp!j at 04`%{J_p?Fx&AH&a209$uh+Exxlmds<Aq72{R}}lTiX?A>39RioZPvNlvRWa
zo99(A-$a2GderqiDl?=%^ZGB5u44FTnD0hg?5H2>)21wpSevPr8y>h`KFa00xC9T%
z+NFtXh{`}!U6duBsUXGQ`Rz<G at cb6Sc>R6=^3f`7Z*M<r9+Q&l6BaMlCdZZpoa}0+
zq4 at s56C9<)k)E0)GB~owRTv?&r+E-ug3U-*6!q>C7A506 at p$Odyx2~9>+lcHg#~UH
zfEnjQ@({lkFIFD{C2lAD!rAHJJ6p=3K&4{1<g}0yBHKSEdD9haVs=QWJK4YL`%;EL
z225<2j$76g^DQN6ZB$2Bbk0K}#!#dFw2SH at 34@IQR&~J9FYv%qAOE$IQ3TewX^Y#e
z5l`<`OqUsYRiqg>-2VNhH4X_4GJTh6iGtCVQ+crmEt>4)jgU>LgDJ~12pBbj-e$kP
z<prqf5#=+<<03o(d4%5$T{llls=a1pjRMJ7<U!@mVJ$8uw%6`l1Ibaky{6PME!&Z)
zGEb5}qLxGKq}0Yyc!Z!WRQKehr*cXTFyS74wEnEh4(gLpdd^b at Y|HC#FDfd^8kh;>
z at Cg`+fx^0I%`L>S-^hu?)?o8 at 6x7Md|N5VZK_9}xzLVqoS5_3;r4lcEeRppej2AM}
zqi|`?ELul6aNMURy-|i^pk`bZdeXP*n7O8-`bGS~YayH+CnoqvNN#`3{wsy^?p(}O
zvaldy;KOGDmiW&>ikZU1N?g at BG&h-Qe{_%Br=)1IdK%kj8xrWmr2a{;A18zfRAlFI
zx4qi6_8wk=Lxz;@O{T?Y1BX{?g1Bn0 at u})|T1Mm05 at T{A+@}H^E!7!p;nPyLbKweg
zmcB#;gsJTJU1_89dtimUGY%HL^A{&LEv^&6I-{y;CKHh5ho82D>1yJ&njEVw?z75D
z3?x9)h>bVI6#L$n5Q4{&lVQ|#n at PiFY;`dFfz3Eb_!D8uG3jP;E!j5(*!7>0b1&XJ
z-VG=0+xmjIi=_K5uR7 at -(p1<^%v3}OQjlP%V~>fjY;_?4XB3m at vzX9^=#IV)g-2LW
zAciP!yF1?lfqjX>GqVI<Vr8$RPK)-ogz=YjOcRu3L_ at SrrDl#*zY)5jDobLD?AExe
z1_#-Q0;CYRmgk8(ofp1}p%CkWV8dpdM(e$4FIAf{r*og?<^%Dz5IYsk_pqGSvKjSM
z5t_D^fLuycM(fU<uEyQQ0f_w+g9xB(@v|ocHD6uW0WpkvuL;H7#{1J+unnj@^WBT-
zlg>Xo@)S=+9n~R48dFa%L?Dg_W3DKksVmGCvRQ#T#1lE=ad373fXoy4pEtwWju>QP
zg&6a})w>d{l4vG|Qr3qOx0FF-z*x*-SdqpzuoyXiPOe&@-0w|&&y7$<gfc=Oc*yI}
z#AzxlKa3?})Ie7czANh&_g8nLaCjmoydirVTSjQU8nI8$Y*bC`!Blz{%Vq3^g+2HQ
zngB^50&PvDFbzc at v2hK_{U)e+#;dnlhb+?5b=Es=YK^=+7qaL@%V)f#g+HB)DpKtz
zgY>k`=|6qhN=|6uk)LMsqSsd+pV(MasIa_zo+WOrrc`U+RO~ZqWHD0^oKDg53Az_4
zklijF-L0$464Hd9(NExSv-}i{*LeHLpCFo$(RDenKAi0*ww6e#)2&q@`xyQQu{>M(
zttU95A;hnWxcR%&)tosH%JXd4;k2fFpl>(zYoV+9JL7oV9g;+2L2KT;nra&r6rQ at X
zDs>e1X;*hNcF>~4`bzkg+~{&r8tPn7Ikn{^X3Cn%SJRDevP`A$;<@h=6(iK-<D8Zo
zQ~NvUy*jDsnwaEYfwf{W at q@^X&XuiFiKAOyMamwtk>2iJ^mf(0)a6aByv4qb>a at wH
zU66fmcPZhq%NQt{xty~d$f*vl#{~YF8U5?Y-o9J3;h&$c{|F>na`6^tOAMGA^)yBx
z7DWUDG2K2nDMsv^bk1EIH7R~f(x01=115g_@<sGdn?B<L_ep~DIK7U|Ux3{C=@*ms
zO;DNGB?PS0p9@;uvsq7IP?=}%!%81Xd#L=miMc&$SReGJd2qz%!MDxy#1=97vmp}F
ztlR3`M{M4AGlSV$>O^SW;^!!MNDY{bLWj_kmA%=dIj=)IP6jw+#BeIU#?nmXPB>h?
z at KYp)j>AeI-D>vy57bh0h8}Nx>ATZqIo8+{o}W2ZU9M&Y0e|T&<CKCuqh?8eBLV7I
ze at eT=A34Sm at H`~7IDTRA5LTFBbTZgcw`vEkiW3TW6%OORA7{J&B%qKG%+<a1guYu^
za}ZP5J=L?Zs+&V9J>I?@-FvmBwX5(Iqc<CU;j6pNtXFxYQI(dW?v?lup%zp~d+I#m
zRc1eS-sE>a052|>`IW4SpJH*ALSnLoUzb&R+IRshR1D(Jb}T?$r?C9E=*_}X!2R<*
zVBMK*(+hv>dAsWfm_y0l-dr~fMI6%rxS{UNbtH%7d#(4Vu>m#Pk at SsslD~8B&StAU
zj#42F(c{{hKJ%!Ewc-Fyp%Gh9ji?2cbbRE{9&Q;|)^xNMzW at 2<#-gng&|u!%lKEyX
z*Oyyf_{L+V9y=tTj!SdZ`B3 at 0z4G4Ww%~pHTcOq{ZbdU#im4P8yt+)tv%tT6Up2z~
zBSA{jH`zM(OC3%Hr{0aQ_`qFb!D@%G;%S_+w{t(8;kvYnz^6wHhZOGBioR#V6?6nE
zijm0#?j?6K(7g^)!~xwv-$v;Lz1cOMx)0J<udh0Z5BQ!b0~fMR!Z%1 at UZl+PY3a#!
z%u0OCPB8q%SDNc0Ava;6c9Yl~BfzUak|&Jke*~E=Ng1#+`ldeS)<5;bhN1c~=_=_a
z`n<{JytqV<Xh(9#>vQMM;hxNxN&VCF%I!MjCc?AS1Uh}Q*$RLbbySS=a3g3GXWyAv
zXlZHl)w{xdM}(v-5TU6Et}_W?p+V?!Auoj1{ot*BO?054b93>F(guYD(_gy`TGiY2
zn2o95q at JMe-;_3W?+Ev^tp;UsbENOHLak}z1Kl6_vlK9cggBK(210nXaQzY6M}qfS
zJa!Ie4P~q=P}!PAL?C#SJ#mE1m++g2li`hisU6p3kkdiNov}x`4!TkwnKr8y-pG3y
ziI`Nz7U_EASb7ar)fo)nNT)k;kR`>GnLTBdWchqANOdUcuqi&2pBB5t$qlp)$MYwu
zdL at GApTxJt3?u1sTM(5DpPc;hO^iLre<V3go`VucxwZ%g?lzB<FGR8PXWP6N)T0Mo
zBxARb?ARNkF7Ce_k#xAXP;aaRs&TkpOpYlDWU11xWb+`y`PR{~Lr=tv+K%@Lq+za1
z$^lSdqK30~p%)`*XJTEYdBau!kXuKa0Z0y!yXtH#4V;^{$^yHs{1I%WZ^bfrmq|A9
zIL}?-Qx*yatTNKbLgrq4)nNZs(%4R~^ffK)Hbb|IWMbTKwt!eVA)#dMM|q&Wyz%&v
z+Z?hWfm)IohF^HZRXfTdPOdmlg%Y>dO#B7j+^h&!HFYN3-<+3`v~J%W(Bl0vVsAlz
z2Y79(eAu)28SVx1TT|P=f!_5nrdGCyGv`Zjhi%t^%4(#R!fzF&VvFyV&_q2%%7yT}
zq*;tU8vao5J#v}z6#f-4XYvu*?*1)aUCSzK^w6fb5WB_a?z+s5K4hR<{@hC<u|7|K
z+SwR|V-DnGj~ts<T8EF+{4d%3AMCAJ=GEn}VfV>ANs9Na5)*P|+ItA6x1v3@`4MC9
zu(n~_Z1P|+#8(^wY*ReXnZx8#Js0nW5ibf4I%?&WMsx5h at b}&HtH!DS92I4|qm(FO
za&mG_J^-&kG>_zFyA=6`NJ7KfxfLHmJv+gNvu`qMjC7m at d~Y{8!%QY^yq0|P1X@^c
zF7(oFd35PKZq!)kZWEOs<dJ`Eb58k`hSwSvV+ak4S+3O26Og70-B&!XR37MHEtbUn
zDQ#84#UGa+%{w*ZpxuKYKbHCF90Y50N-MQJH%~MrFd%-U^O)aO(@71VB>aORrI~1=
z1mhU7j5)_Ru<(aZ>BBdeBh84#&IRQ&2v%5|+_rdRv@`0d<z$K5xjAVrBFis8WESbw
z`hnuCZ`V>Cba6#f4wAe|Y$U}hbPL5nzZgELcIVwAVy%ntqs&<ABe1mgyHdUFl_tco
z-Y2P*a#ylh1(?z_qCnY2UAa>}SWKwjDRJ)g%Fl3Ij3HJuB&$2r&>Y0#HP0nTI&$b2
zh^_4HKg=p~p8>Q0{5~6Au|(N at l?X5MON&SS6<{y&yH8MWp!bTbN7~LMXDZPlTjOoL
z9%7D?vFct*r4c4{W<$<>`+@~t|GTjI#=|z;Hw1X?3;rC=#pi;y3F<x(Hoh~WPleg#
zMcu5JKXlHZCAHpN`3Jc5_1<oeN8)kpK3Q{*@CI9geX|Zz2@&HQS?FAFc%Es2<R=?e
zsCZw3WozsnA~2usc5XYYvR6z9H-k<=vo_6OMiNK*7P9wI{vDo?Jst^FED-NTf{KVc
zeg!I+i-7999lz7pQTRj)ydM7$k&&LpS?ZWd%rBVbGi7}*`tipKVUZH4O;MLUqGt+E
zJ}vCN22uAA2s{9>I0gCZ`mP63dfg4W(;o%W_fqM6TtRS;GC=h}PSeAoSs*At$b*w|
zh6_nG2`<r^WS9xDV|U5AvP8w1%qP2S{jRJF<>rJM3i(F<HpNZyf07tALW_THHSi1k
z+^i-<th#9CX5W!D|9&5;b;WmD#%T5lpw}wPj45&iQrsAE$U=T2k#DvogGdTN-|8Te
zK#$YNd*^G#l9vE|!h)rak?d(}(Q0GVpFDO6$YcNeZV)Q;0>*xRe2{m(qSI`j^dM0=
z at 42?bvue*zvs3BT3r9L3f^4^fh<gNel2#LQZsc-YH9FUipc}c8VU3)hRY>FPe%(_1
zTxBz$Ym>yJQ#IXrLWP>KPtJm2G4|hPE{d1 at DrMcq;DBBpFQ at Er4L4U(c=4Gn7jZhn
zX at FpW`%0F&9i at ImcDNyWKPtkj>xU(GCVm-=?k%a$UEG0l(dhRg at V;F%^t^uXg5MkJ
zFqwoDuKHmEEo$AHyfmK4XFI(P?*#xG0T5stiWYptjK(LORSbQ3*|y+ht0Xy<rw6V}
zE5n6rBmhCtTBokQEdazSjSkR9_s*mdo#bPKb@%F33O2F$n|ak<-|i1r#HO2VlucQQ
zGMzl`u)F%(YW;`n`1_?O$PMTkR`&?Dl$CxAl97|E-3Fo|jh(WbtMh(RGegl6p^iUM
zQu8|NFM3Qq+|l}f{o;B(xnLAd<VY2RG~G=yl?tJ~6Y^rCv&nAY&zC}w?00TmNF96B
z<Z+rSU4~Scb3tQKDl_e1!sUVxRO-KPzc(&ZFZunMaKE*>&JfHKVl4y-?UAHf5{V#c
zNP$@zyVB~4ay=DOrZWc;C`gskZA)JLiPMoisf<Fvk0x)EaqQ}Z4k-lCkAZG^xf9pH
z?E7C_ZC-IUqaZ*VY+*-HHnFGI72-&%+*WN|w}ClT2nMm^HmpCUiyu=JKE59mzW<e^
zyYNYqij`it-f at Bz9Ll5;tSbJkAXH;8HfpW!>VK}J-k3Oj+iwkO7>TSVpy|xq+($8=
z2jB)|FoQ$aMa6=K$XP(SvVa%%Gr+bho#tj+59g0=7DhT*px7*9?Gy-#&t;@$>FzXG
zPl{?S1Drd^l0tFW at S8}KdJy+1uR$^4eR^0%{++r at Vb@xTF(>j)Mty?;M3J>qeIc^?
zO%r at Cu8*VOgM&Wt58dV+pP!#@K3Q)Oh=6Q>@nw(2)%^?u96T(UBR(|<pEq&ve(UwN
zA)aI3%#|MFI#%Fd`taa=PJt8Z^Py-Z7fAt4y7h_RaYj6I$E{;u+5#q|iU3($7w<Fp
zID1yfva_}ZZhJQIV7N3hEva!rmvZpPZp$PYh_F4t&c@<$`;>F&s~m(nNq1aUfKE;w
zG=io0ELbG5Un`-*NifHL>w$g3<!e^4hS?-ZE?JtfN)zkC3unVn+bE5hPGj+{immD|
zNUXdWE>z2+BzJ;^FGJW9VZjkukuocxA3l*4=*GowuPI3a=<wgbVVY}J1~W<Yb3U|N
zD6PP$Y;sPe0i=prMgdEvxeI2}b$Ye>#}ztUoJ8ga*;&P1Dz~|sl+DNGPEF!KBSHP&
zb^`*>-^+<9$ltckx>|zzkf4m=AuCSmqCj1s$*uNJP!T%PCXPT}6XQhe?hxJ;QYVCC
zyGP_(FOhFdHyRK3yhML@>`k4E364Cgr)U|!eSVJnLJ-xkaOSc_krb7_^HlpVoll<+
zQeM~KfU+jIslj+(gY<^K+5jv7w at GVKYd-#@H*i3hj+s=lXqLJK?EYgf)hOg{_>61_
zWq at G=)&2eO`)!?``D0lPot7faRyzD25o5d`Q4<yaTX)|X7R9!-+XF~Yq98fT7L<(S
zFk~<hl$^ts3`0(m28j|?BnXmJK*>30HbF8XAPgCX%#gznZv*?B?|R(#$M@?z&+Q*P
zJ<W8lnqIYPt+(o}TCq-}AS8P@@sh#Atbds>6V0oR_0GDngsUHv^IkjGW^S?DSRzoE
z8*R<BgjF~{B{qkjuxpk_aJa5x)X{RMD*8nYZL9_ at yX2$SgqT%^q$wLs>J~nh8j at Ts
zGqI<Xl$DA2KKh4d>pM`rhCFKq?V at P*sEH#eV*nevp0soZ;i>xNSoSXiqTu{k#7f(8
zTRCS+Y6DuSXOV_ss>jD>b?h^*cvtsvK)<mFq-`|#tYoH=(>84%>=z%q2_aYrgmLIs
z6KZo4xTop9Z~qGaTBP9jZJhexloM&_%Dn&k!K7BrL23GN$|mAD82vquScZ=DldbjO
zK^?}dW41P5`Fg^1bjh;kLx#@g#Ykh{u{6~WPG}Yvra)a9U}chHIyAt$RQ=tsJ<Wq@
zD-0RuF1uEL2osr$0^f88^OB5|D~_4n*cQhL<x#LLg5SPkC5=*2;BRy*^1bmXQ{XES
zc<D{kg{FB*H<Hia<}wnJN1>nj0*AamxAJ#!Vl-+8r^AqE<}vkZG{6hpdKEMKgkAEe
z<lr+~4;Fp1;W%;pq-zyuD1!2~ydDMdBLUjvMvZHM<Qyt<<3FO2#~?s8{^3uIVSeCF
zQ?Ahv9lmnh$Ps$I6Uzpg){_O;gz^D2tA!rE!+vLe{1Wwu-8}3vNU?Wyk(NmOYFvQ?
z>{F2INUBkp>r^QnHeCHzE13HbSmI)_0F#we^`Dq|eEwOIw5wQ;&BW1tenQ{!)?a;T
zp-JP9b1CwQc#OtYJLOqoyQv@@Wt9)-wOY_y(%5jf27STvCqBTEMoRYU&OVAy%fohF
zLlT`~W-U6V+Ss<~v=bSYqAp4SnX68Jsnyq;zIzJQ?Ft-0{aFkX{Bu73cDkui0FSsw
zaIN21sa7ym>lr8X9V5}mlfOpyA;y!wm at U>x#p(FMHYmuFW~MFI_-)R|3QO)7KjWSb
zf5c5HcBC)<S%=pNoeyFQV3H5Yx9R66sOD01(0Dn8w97}eA3TrzF<S{rAfln|3jJA_
z*K at 30_LXS9J)@dvr`@8S+djKx7OiuRKL5UX2%D-X&*_=1hpk9HTzAy-b$Bp=*3deL
zM1Y=NfnR5(asohuX_`yiskG9>x7c*|XTQ-269JiI<}IOjlBJ87&HRMq7!tRJo}^PU
zv60c0uYMYI)WQlLtg_QUlqvz*r%i^Z-V@~&h~c&S==%Q)mZsD$PG0~^JIhYndyak@
z*ArTK0^y_djQ!Vkl_Q?EgDKI02065J+H0v3Mz~hqN>NVww*UoaA_3LK=C45xLg6Mb
zd_XHC{2|#p{|FNiOZS&2hCawe<QLA8 at aOMB{z7+jn$BnN=6teiaWoK)iuQ2CoeuW(
zZb)#;r*!Dt6LB!W@!cpPK#UQmasB*(W4<`NLY<EfRKWC37pIO*O6I((>oq7|=Yeo{
zH+5{TTo{9=0(Fv|bKJHL#$2d>T~8<}0KG~+F at ukHLYzSt0#d!&`ucs86bVKmMV_~$
zZX!l4Z5m#UklvKKGG at fvELvdLzQzjBenN!ODDihBid!~$hd;A~{qm969UpfjZjMaf
zGsZyXRXi!|uVKWhVI;4eIzL0*@w3pSDz0w$v7Kx=%$wTy{K5W3JW4k^<^@NTA^CU?
z%p$WK*%5Irv1pQ5^gA7b@~@pwv(Ss)N>WRZ>;cP5w8zn!k#yw92fv5at-J>dSHp at 6
za&xh7DNhX2FY{q+8HN}`uX(7^#bK6J_xX+O9>PW|sBz$v&1&!wP9v{z^5N9s|JNY1
zMS!^UYr_QUHoZLVyzGtcUfiKKJ{g^ucV8NY7J7>ogiT^Kx-e#mQ(GR$?sjG+!*GFH
zq;+g<4m at 7E1yq3v!D86($6b9;$p<SHb at xsll4lb24So3%X_`huND^X at 5cc|0ex^gL
z&cv*+3}QGglT}LzCqFm&L%9z0FX={h_i~RzfB3R1i9Du<0zEbLI%NrtfTbl-FeTy3
zZRtCY{S}ZuU7ML^3)Ns7{19WdtmmT1kXhkCi%!--Yp%`^1{EALukQWaz9=tr9g9ZS
z1v+!t_8Pj&p6LriwU<zftV0xH4^B<0P4oz4^T(it@&M&R`#51WrE+oJn5KlJjpWqf
zAq=ILg$D##f1IE*F1C7c6g($baCVYia2)&(iW8ZFk-M_}HQuQ at b0l8qw9k)awaEci
z^!(==l}S!R(Xj#BXAXiZu__F=Wc-oZHz3m|q+s=Md)RTc**Db(O$D$%6hr8vq&V5C
zAr*-7Tq`oXZ;=S{72zhSQ^Dy2Q`aj~82n=3`K%EC<^1jxOa8DtHoLDMI-T5X?vr>L
zZx|~w(-Pb&C1K~l at v-9O{9ve7o)A at e*Kt1{Q(96RhlhTp1;X at Lqvd5jKOV5N+-mp^
z7*q{5+Ro5%=&nt66ItPvZ&&9zFC+#!cs6^ge4Z)!k<<1L-6aAvTC at kFA)k52gQ!Q>
zRiobJAcli|^waZ+<We-D{x8f3SWma{+Rz>SJ$4}TXLWUW?a)+q%Gxlga<yZx8{=>c
zX%mg8t=_Tub7HkzO+wLn!?DunBxQnVI62Yu(z|=_BC>Pm0N4$_3&#hMjZ2U0T}`eO
zmIrUKc68Jk@@W|JvAqp$$grVtn_P?WL3G4P{rZoDJ2sz+N?aEZy{|jQa^Gflxr*J;
zNd%d%l$j4Q)mZfCrfa!bEY#1zT&uWM5E9X>dBrg+sj+;Ed;HwWPBK65>7d<^(C2a@
zej|e&(cE+IojJX!ij?|0h$-aB*nuzVCFofC6`Yi7^u&k*`tC&4gKQ~l_sB4%D?*~|
zzYQ4Cr!??_XlM}=bnX2*VcFJ at z-50{R~_9g6-ywjDI`!*ZdW%Jwu?v|FouGT?a<#E
zX-oXCAfSJQR}@tXgTiu>5pUK#>1w)&Lww}sTzU{{fv3bVnUUQfHuCvv at Dw%i72#JM
zIW+QipEZejjcD at +p^}}XnB?g!v(e7Mt6xye+Q|=bX at t57c1vD7uE8}K;e-??G}2X^
zJ={*|0xRJUdwT;+SZmTPns+eSWE!oi$92T)jw|#$OLXfQzgJ=^@sj*;4Esj)V(ip0
zKQ+0}7xE#?<}5tuw^o7*uCu{P_inz)l3}BNtHwnH$g1Sz>mb+F)G3CIP$n+ga4n
z^N(f0FlhL`_{wtW`qZNqu$8L_s26>$XXba}L}G`QEHa>XuViPG8@}Vx<5%=6>IZ#b
zAZJg_<fkCM2Ds`8%Wm0-p2xX~6&%G#`*CgwETNnLmN=hzFG>a`e#6a$agit0E<b}a
zb(i)L{mA3&8RiJt%IZXW*@0=doqYlXIe&}vv`*LR<J;PaiRU#RWi%>i(CXN5J#I<)
zc7d+-)pDY#XN*5|0AV}?PigI`%u^H3x+({Uo8?{9*X2V-*jG}Sz- at -YUhfS}yJ<xz
z=#LJIe;^LV9Qod9hgkn2?pto2Ce|5HyIgpq<hw!(tRQ8d4U^&m#B{Ywpnj^V)3iK-
zCPa&?k>FF at Ncd=DvvZqckSTY&MBrF*<P6JBEo2bYe18b(bM5s-s4zF6e;OOYp`-^J
zw6ewn9!?hQ?1AV^c^$XkwcUG~N>v at Ru86}|@MTVpYLDBb#ar}_;!{_wna}zg9>m?f
zit+)-gE!>u8QKa1#JMZo7np81?-J9s`aj{_w6kQ&nPLV2>WPPP(&}N)Pz}q-RoIJ3
z!Ge(^I|_f0O9&J16&Oj49m&NhPCZ362%#vlvb#(rU)>uaOqT-T+n}jdxwyqe!Ses`
zav->X?f^z6EOij>tT(-ujs(GyLVM^hXvwDYfB;{O at m1~iPVgLvl|XNP2}!BM(xbB$
z=o5IyVCMlRx74)G_6GSZOR&XzRWsrXfS`9GoN^70;7CokL8b?qBL(_nKh}8y336u~
z5t|nwItwsF2Q2e+Olc{3)Z?fPcN1h$9;`j`@uA$VGp^)0f|==&9wyp`{~PV(;wyh}
zxc>R6FNX%HZw<jn_iDA%b2aMT=7?MEKGfA<pq{E*=4-zOnE2Rgj)^BO4_5Q4+RH(#
z`IVi1S<5LmH7a3xLY4N@*DK$MGm=(JiIexGLGIK}7teztFZK;g9rx}MM<Js3>J)fz
z|4*G`%8<{Nt7tb4At^Bjq=+SR at 4dxn(~h|W?i`%IVUoZ~TR6^b`80}SVi4Cg_P0?s
zegX5b5|=+t;2E!m**bqethLiEsJ83722YA|*7Q5o@$5<L^xa>Lra1^-aMj^iUPP$v
z%;|6xRGXAIyWRMQ83B at J>S}Qw*P+^Pc^d at Ud9*$JEAx_-$&;1(&qX`@SZJCGPnvA8
zcEBoMv&PS0%|XQ3_`nW{oU$Lepwf{tJ+7M~z;{THwbY{mnJo0?)7HT>z!kwL#MRjC
zBs#&D&<i5I4(^4x#OB$-d;sL%V=M(4+;$lD40(0gX_|*EKJ71XmJ9f2;o%Ow&-3~o
z at GOvNXj+b5s3rB9qX7awVJI->FzCpzI1 at Gc#zgtdy%kk(&lnoyqy$h7ub+>16dd``
zx$hYN%n9^KUlYs8iW1B*8z?|*anw^EDU7O6T-WyMRs-hp at u6nMSzg6ZD=b;ug!QLY
z&(~~-Wm*~UHcMlcjE-*8{=j5m%LIXwCicwWiM|>gnN2F8_fl}kQ*5~lu$YinZG`e0
z+$q<oTd9zsptKk6P0E+lcI-*qu;@9GAFSr+j34Rec4zg^>DbBmCQ at _Fw-5EJdrc<>
z=r=e-j=7WJwzjID{nS_+CD^_V5<SQjoF7M+e0$2-O0>YYdDoXmtNGK(eQPr;W9X69
za6aw}-bdydjipWAU at +DD=EAxw1-%rH16frROM}JFW?78y>D=)(@i at 3)*9}I}tf*ZK
zl*83&PoS_q1^lm~wnAS#XO~R%!W*=jyH-xWFDNMYC at A2iHx|;m;CzbJ8}%OdPcK;f
zl=uvAgpP4)Q#+Pt*2lVKxE?o90>f)IPz=ZV)aOnUIhc*+W%$Sk>hgo>Hq`uJ0IyXu
zPx7n8f+x?rbemg)Pzr`SF~-76&CVQ4PS at R_FQ25?3lM$&k|LIaKRz0&t06Q~cI>S7
zh}AK)e50A)JT(W~0FhGBv!c<kj&7_x6Sl8DGj0{Iag{{m8}a9L-P7Td0ryHNk0 at 41
zq!ASRN8=(0s0YDo9Jq^g;N`R^d>;atZiR;V`DoN5K==kEZls77&{TW|0sR{(u0SQR
zuDXpX4G_!+{J{TNZctA<5;S)hss?<+t!oVUnq#(U;;wbtZ$zP-OE^Nlk&OL0^o5;p
z+|x-0CCYUq&U;&N6q};-Xu!9`KkM^**s=uU)^#h+%bL1R>K9I*Lk}OC at r-f+xq1!P
zOPuiS+Jjbwms-PbJrQJZX2FeM9{(CePuKD^-0Pc;!zrO?y$A)69Zr<{?b&Cmlu*0t
zNq{jm(R7WQ=af9SQ4bhzd8^DOYCEEsHOF-g-qVY)TMZhs6B4=5Ihwxr!KWXs49Nd@
z%9A8xdx_=Fl91baDJ6Pf$&ml>01Hq-zIYBfJW)RXF?<bvv~5}Fh!aNKU%NymEmKrK
z`a1Q=+4RWij4fL2V)&l$Hz>w0<bUzMhbhI$FseatH^iSQOA5-CWvPk7+eU{|F4<@=
zMu?v!<aL{>bKp^qf+uIW>oLF+DaM1J#pjfrkeO>*xH}%D)K15iRb`Fs@@6UkR>ti8
zeyD;vyUq1 at 3XB8~ZG0TN+t_1Gg`)t?sHx5d5#4*0R0DnY3En=QRfclzjV;!!P4Y5F
zb7vV6oL0*&<Z^~oa5)nrnbu at 9pQO8{GDJD#A}*LgALHvN+3w{uuZz at vf>a-2v+|x4
z%+s1EPoiB^8cEH=Y~(y{&4(D%TlT6fyTy7RNA`|#UQi@{gYDrV(m&Usvrhx1CcCHB
zB6uW=72Y0nlgh~U-yn%oX;&Xe%B6l<VE`8X@>dp?qjfX6hd$blkPF7ie&yy4e~6UE
zYfDtM)&R5(eA98a>HWYYJ4IT>&G4*#Yx+znPa{5g_kn2UU2k;S%^pPz<MFQZd|l{A
z;kLAxsTNg7Y^1F6lfT1G>9|Gaa<is-6+}RIKN!Ws9w2Thyz#h)fvbqD1JuE)<;K`{
zg}m_=+p3;ciIK4Yrr>}y at 4{|dxsk+Edt$&;^z|SsLFqBm3x5g8NS6^^@>5;j{^Zq=
z at IfVK*Y?_kV%_mSdE-pdMx(mkd`i5<820CG*Qx42RAwk*n~6jdKEtNa*SF!Rg;n^<
zTPmE+g;#&2TdlHlZ9HNQ*RG}#XU>O;D{)DlH#k6f6sMc<uhJP$M6Th(_41NC?Vc at r
z7Dxdbc}YaM5r16@=RK7FvI}<T9C6CsEN>gGGqfMS at IQ@Yn_V(vjZ`H`QjA~_*sb>Y
zt#L)2Jqk`9jd4PfwY$BG)_D|<>MBR!IPcwU6t#VvldB?2+}kGAYLJEh5c}I2UhY^Y
zu~NPo=vYG{<5!7WhGIweZxK|B-Z+Hgn;2`1#fSK}bjnI&*NYs~TOUzofKgnk{MZeu
zA+yDv3fI$JU6rU0*~(>+qP^peWMNTmrOdQ3kTh#bn<%f*#FJOK3N))IU0mQ>p}{2L
z30UrdUv*L_4|cvd)?i`;dH%@|U24EYrX8h03JB)@0k`_W)$;ghpdNc>$-*$5Gnz4~
z>Zy^M$BW4VoIx^!8eO7WaT<ZsgqaTpoI&!gwVM~YzRD4jG%2}h+n3d`Oo8wD&d!`D
z%FDT3uY#kh;kvJD&8R1$)X)`yl1$iW2dDap%lAAZZuOlz(XcP>i7Zt_=S3*-949~`
z0p`~W^ZyO<4A0ZUCwZ>DW_qvuMv&6;?H#<gEKPT at bKYG<EhIhz#r#b!)rcdvHyL-o
zSD%6rtiii)UFADL0~N-iv*jDd{P69zAxuT(GW_QH#$a!58QdTcwQvAgE2ux7s_iKo
zH9H at C3L?q0L~i8m`?o~4S98hs5Ke^V6TAfmw)F)TR-#5UIt68W<BUopACh!}ORMuZ
znp_a|#m at p>*cGkcX-9M9OZGjAGkehG)APF9V39hd#O5EyYqsZG9C(hxO$qilIdLi}
z8H=r027UhN`KcJkxn^_9BApyd`~7#bOuW{_7IC9 at mbZQ%@-z_Pz`Ud-?kUQR_pihR
zU262iTHmD<@xT0v%a-lmTV2)Z#Y5+2LX-G`?`xyO7-h-a2Ql&9EO2L`|5)Mvo5=nv
zB#jXGn;ZQr0>3}}A#`bW`XAz1e^Y>e^>F|19$u1XouWjte;k at M`rcmhlAtRdq(MqD
zfbrW}WK>f?1zR-`em@}v+}xr+h!_LrvA=qU`J?CWOGNOg!60>mBEzEolx3SS<$Lw3
zP)qvXK{x_XCB?|LYUw8fV^?29PtGj&-#^Fg`;m_Ow4Nc56m1^N<B)c@)r)!@#bfjY
z8x9gXIY#V0(y&@Ilz at C3+JAgvd{fF*poOn{=M$FH1!*e~ql=)QP~TEU3YXLo8|1;6
z=`aK*a?{`s@&VnlQVi>j{`ar~SNusBNd`t||8Yjto)~TT1Koi4DUv_Z7#C6^K|?}$
zOdY7o`vBfQG|z8DwQL6Z6Z}z@<iLudu%2K)Qy^jQ^*hX>dcVJ(JCHP*-so?uV%Gy_
znf<&KU(Tf6=qpO=`dTYviA%~Di9oVRrmqxE00Y7*2j&OBhdi;!T0U_W=8q-6Ym?13
zF|kmh%KT*{k%hA5&EN~rowVxSztzJBU;!+*cQJ at E^Fix9K^F@#294n>d_eYs8Ep~v
z`+$Frm8SVV^G1Zp4M at 6YCBp(!%3x}c2b$lIz~uU0bU49-Nt}uJU|oVCIv$XW{v!DI
zSeFt5hH1rds3HjldqY9$C>0ak5wVO^35J|wgs*YeQ{Q`I17vSlC0AW}F9;x9WK3z*
zOm7{00O1GbYJri)hh#ZYaxT2TkKjZsc(#euT at +Z{3%?-xMA;Xl-wM|BrK+0fRG*Xt
zSP61rw#;Twa|Op9V{+lZ(XvwCO<sqD!z%M#<>X5L_)VR4<`OOLzFj7>DqqRN8nk+u
zd*T&Vdep=r|CVLvTtQB*5C1pi`fm)-|HbGRb%#t}l#G%*+loGhwFNbw`#=26d$h;}
z)cT!6&yYrEW>Y<ts)v$1e`nQz#^_Ex$o};PD_R}Hut6 at 7gkrA&aCkxK-D;({d?Ldi
ze<wnK{x{P0_V!A@^RxOSX^?Nw_r{q5 at ZB5I0xv-`2k#bhAl#j~u+G?+uJS!Vn^wNH
zH)1pgW-PgHOtxwn`IK!efHZ;u=lSt#@J0 at -6L5=Cl6GFBi^l%`lYBgK at q<7b`u&sJ
zAl>wjMZSv^h^ylx?PbE$<%f^X5fDaD;>%+|<SJ<hjL?IGGg^>v2FiDNxJ2>(&;6q9
zl)%k at -IM(1C1v^Yme5|_%fx}Jdlo7Ge{80j=R1FEQxgO>Q5_TwJzCPQyEqF7!2E1g
zy}?I%(JjGOZ`1(SDsgr$TC#0shUv0X1&>-7&ia?Yt~LU9XAU&!Ail`ZTDY(WU>Dt(
znVtqhLP9`w8BWB8`yIA0 at X!)&?IY~xrl*akdRW2lEaG0h(rRL`(LI at n6Lzxn$*rxe
z;eruEF9Q48Eo|^Qs2!JL1pZ45a0B*%`lS92E6hglYwJM>EwH^8)mNQ35VZL*$n>%g
zmva9tiu{e%%YP5(T%}mZQ8b5>hh6Hx$C9gbl~Arg3Qn>s9kBq}%ohq_fXl7RcBMnT
z*Dpo=NYOYjLA=r6jA>toCeNSpAex!@)LBD?Qec?vo%uF7cED^&8)l~Buz`XQq9$9m
zVr<XyVpt!~AY$%wNnSoel>JJ>Qf#Q2D-5M`hGcSvnvq?3+kFM~&WgSZc$3y;{V(p1
z+dNKnSCT1;sc8swT)xSrVL0V;?1nzGki5SzS>pm;@i`xUUmkxcY4WWrMeQqE+w>{b
z<<zg+hem}<Te2QFoDPxe=CR{OL#FZajjU!m_rwHjKCa6ac^#f*Jg#*4CUcG=Nui~i
zwivE(SpNP;t<M2gBi^I{_sn<qsn&@WuS%~2F4Uw%W8EiKi!sB?W?VF{-nB$~ikyA=
zko8OtQS{>3={(A-@&(e>+v8n2E}&OX|El6c4j2&V(sEd at d&KDB4PPy2c-iH&J3XW|
zCFk-EBHV;Cl0Tch0}Z3fb)RYo?$R=hUBz~A0v0>X^u5ke&yEQvogIceab|Ev95aTR
z^#-;^?N;ZxV8X30xaK<938A&_%#!=``G)lvi^&0bHdU@{`}5>n2GxNZME3+FQFD6n
zTr;c{(Gc3%WALn|&I^EZ=+z|}aALzRx1P4}+qZaJz;L!1a at i$c$glc%aWsZlEBtN)
znEz_-ffLdmE|lc;l12;pW15|C(({~7cza`m!CcCXLb)hPs9>&5ub|87uY%cWEZnKu
zmzt}$#zi1-(%J*-Go8hN7Vq@|SFlHF-R(t|tDSuWC8}J}w`v*A_an;pur_Mn;`oi^
zHw3un8^uUZ3(#VCII$8ba0?~u*SfOB(V6tqOn)h^38`yn%6J^V8G}%PvsT1s;`nu)
zkU+%{5IDOcz!eN1+Kj$bgS?i@%&R34ckfNehn#o|X}z4F;aIJ$-jIWN)|BZZP#3f&
z|1v4+A5hYdyS<I7OAT?bpA`R)cfXcv<F*GpCV<AWOt;c^5v$Rl)^OauzX}fsoveO_
zZ66*6^m}qMymEI#i1sQ9fZ2`*oqOYr>;;C3DY7ZkhfBnY1Sz$SW2$SL!+l$MkK-Md
z#Uz_ZKym%RpV)RVK!d-zAKiVjF@>gz63VypTFnGNg0<;k`=!XkSL1T`rLYLJIeGIA
ztQP%3q;7w#NA}$T;GM&VJYZ?opaLeV9B<{tsbO1H$qMI@=hxnXRECV`f$HuH(AGt3
zuHJ)<d(h<#3((Gh$_|^^*2_^Go2W`Ds0lspb<&&B)9Py6>0~dMJMv=ajqJ3^MytW2
zH at h~vLVUaz?agnWC`WCMu4Ag>oJ^d(fAu)NKA?%}4&3zs(7$zdWh`9(rTK*R^+7oW
zQ`+=8ZZ4!+pa`Dqe{ld2<{PPUNC`9{OkX}{?@rW$=4)<e9j=|3vMx)5I{zgfoV+d}
z2NxI8ykRqM2iB?H$bg|8y$$__m&3?aGfKB%glIj at Y@6PQLz(x{*3jrF28}gY7~NEx
zJ92lj0gX21TI(t%{lLM`Bz7orq38?~qBU5ri69p_7=IhGC6T!3LYtZ7fS|AWqYy(*
z#UZ=vzz%55$MbUMHhuJAWeyrpkxGxB9Z08S^q0EfSkOR>IJzq>l+yw!1Lewun+xm(
zv&oj^U+8?;7(#ERa6Lyr$;8 at J>SH9Yc{o(o&Q<vBa_Uz<Pd|F_u4Y5G&jpL|a^P6M
zywt*howY+*{WmI2b^E<ImCg=uu^AksEOa3YC?EtZh;CMexx*Afq25FVrMi}7`P1gS
z>KiOXWO}W908A9^gTrl9Q&sL64w(i=JEgrrO5P%BLd;`hOvCfMk=4V=!p*43&W<K5
zxnsb4>Il{6xT?ueXUOe$S{%|B#Yaovs}4Q<b8{4ey>YhmeiHNbrAz`K3-V$SAaXE2
zjaloPu?-MYeW}}%=Eb(t06cKC%(UYQ=6q_Ms;W=eJvNkGKf;2EK6HW7F~75#oawRg
ze4urI7S+3#V`)$Y6_Vf2E#I3*^<<oaS@|Kt5C^ACLS0ZFH4i)k>|~2rQ%`MCcnw2Z
z&{m<A^@@guU9xF`lFurUzu0Q-&=}TsVNvnstr%9}^%5TC6!E4Qy11$Ka%JUSa|sKE
zFtd(gQgP31m+Wts!v8%5F;^2Cma1MYbN*%bU6^Vu)34Si|C(NwWIP6BuGTOAve*AS
zHxB3Nbrf4{9mbS6jscsILX(YodKLQ<-WQW<)W2uY|C!7|YbiM$-*93kl5LL|LD)A$
z1_T872&ICrH|6%#)V3t^V33T#?}V3-h{!1P4P2?EL1 at wg(;lpKbFsSMS33BQ$KO^`
zqot*t21Pks`V`$ev<jYqnTN)Qis0Jo at zt2ST%r9}mS;uh1X?-aP7{`bqyTt4lvkF^
Jmoa|%e*hJg%a{NF
literal 0
HcmV?d00001
diff --git a/documentation/toaster-manual/figures/set-variable.png b/documentation/toaster-manual/figures/set-variable.png
new file mode 100644
index 0000000000000000000000000000000000000000..d36b52754e22c7779ccc2a58ae4a513f03d7ba85
GIT binary patch
literal 111430
zcmd?Qhg(zG+CCh_G9tyX3<v_20R*H-ktU#`p!D9GBE3p)Avg{&h=9@}AOu8OXd+E&
zP=wF}1PDDq=mA22B#@Bgw{_lgzB%uE{)3NeU1VK5D|@f~to5{e-A}xsz7_`?FB=F1
z;&}Y%fiVbl0_d{t{Bjcb at F_x%f<RY5k00DK4Sl~kON%(an#p|5h^E_+<IEZ&KE$O-
zxHr2$nf7i7nwpK`Ylyfuxm`bKJNuO2vlaX@>-fxB_IyRTr1QwrvEQ%0J1+8-<<uWv
zd2AeC{&Mm)>Xg+f&u2Z1NC=Pn%^qI<NX- at pOpt@(xZ6sjtL8Q8&TE&{lztRy8Y0YW
zF{;=PU57C&{J~|3jCFOQ2ptXCCEWf-HRl6*iw4wU<`UNXPg2Egp!XfNZ@}z9^g*!%
zhhb8MP!e+&+3c<){z&j{cwtr5&~kvcZzJAeoAV=tTKwM{LXc{3JetdcIXO<bvX3Zz
zbFqA%({78ke&m!}L1Hokn8|->>M)XPHp{`4eP*5 at Q}6J$j?smO|8BFe^gFC?!goB-
zGc)hsdqhReF=P*2i;-w?@S!apMLM#@S^0#iw-y%oHr)9{S6 at T^w`c4L8u)iUy+uRm
zrnl%8X+xr at yN%<BnclkA`$&X2o!kHQd6p}y%$JkQqWk7wW?0I}EH?w`@yHLuB~e5y
z;w`?aexn+4n0%^|d5V63R;T~(28rrJKD`yw at q~kub7N&7dpEpwRC#nDTR~n?@djFs
zn_spVmkGSc9`h?+9nao=s<4P2)p*-C-7|m;dh_ANtN&>NquPH$G&D5WPQDC2FzgOV
zuc*D>fEdBqRWVjqS1+=kl$VqH=%@G|<JImZ3o2c#(koM1t{Wmrg!KC6<8;z|!<C&t
z2YEk4`QH`@H4BmB9h;bVckD$pf2c&m%8Ie8<Z{+z8soqpgP5zEVX(f4?&|8gkf<3T
zz<dDeK4dzQ5u(%Q*=Aq#1eGz9a?1|EgD0c5D$TJZKAG!pA96gn_Uk}@zuOc6Gn!`b
z)$q~VM<4U}c at j09vx;0?z5(yS7IPo?FRGrLlsL^YpUgNc2Cf7vRj6OSeUUvzPDx1!
zp<a^dXIWEIb0WtuCO5iI^~o94d}zSYf7vUDP-?Pf!K(+?nnDP3pT|ws6t^kXTMVb_
zciXeg#gmhhX=kO;!DljAx(^*9>At;V-;H at Aw@6OJyIXzAQHyD~J=U*zjQukXZ}9;(
zq#Ve>^Ij(~#&=_n%NGMv-8TcT>~Zzgg_Wt%I;%FS7*xE!dQFJYM20=LRLHs(lM18G
zbWD at D9jJWtNp3_DDr!MIDg76a9i&cvnetMjBVn9=fMV)Es+WHSlM@`$J@?Fi+!BvM
z>?=@b#=UtjU9#I{v|!;w=j$h4{U2?Bv?A*=0Lg97G}dh6@{I9=IVv)GCc|!Wc>f+*
z(3y%;^dqTQ2J|9GIbHqikOQ5hur$?TmK=$v$qYQ|T4wC@;)A2fQPY=z-5#T7BGqD9
ztezMbrBC{ff|T+p_)1t8yJv;(LJ=dbYEb&&p}9ZkV7(%Wz9VAr at eV`8y$`b8haK8(
zJvB~m?*bI2Q!r7}B+8!feE9$Fc_w`fvbfPS-QYVt-EF!)ttW`_hf3`q_Sr%5>jdc7
zHn7ctpCUfose1WDG+%2deRUgx*3J#>AuSC$Oy*CFdA25ut1BvcsWbYRhw8L21Hz;$
zGindoux??XS~l2c$IH)eV%PC2cq<#*AjrhPc!PWS6E!b##+gxlnNQRihj9(~LvH)g
z$z+tL<9x1*i;K+o+Qh^+p?2o3AX{7q(6TZ!t1<lSv8KBPkUA)hOwk#e*v}{`Djth!
z(=bq_y;q~fR87_Vf>j5*bUI9w*_ElP{U77TByDFiptsv5C#?V#Cs8QV&}`u-*n#Zf
zsu#YeJ~BUf6 at DM{LroJHG#c$<5=6qP-YNGNkP=g{pP^8((#u at 2F}I|wa)I^ohje?L
z3{>~t^B2vwj8(bG!QBxK5Na6Se+DtL+x_9ViV^cLfmscsl`$i_7<3g88}2CPXiZph
zK<}zf<LO65&Wv at UOho2+LT>LDU1^?C7?|kk?>z at sk680$i at lEz_Y?h>Il18>B&G at q
zgg^TIDKoP)1=>?Qf`Q@>8#5fXaWP3D5>y9m&?D8*I#JB&6x+rW@{%)P@$6N0i}<tZ
zqJ~`5)$ZK+FyJsJj9ICmHZTuj=<ksXlKR%Az}3MJMPY0d<gP>Lfp3LXlud*9*<U<@
zgUzQA6y}dD$ptJLuzY<HEse+SqUA`dL`On`1HI^e{u>;Xd<W8Qj}cGQyM#oH(sLL`
zUdaabV6ElY{M}vuW-;*)cT8n(8a5ruClib)ST|E-G<G4f=u*xtfP?zq4HgED&kmex
z2{T#nvn+CVDgW*iFOE-vGziqq5HC=VNNY^MAOrj0`5kh+lhq@@sQoYvVoRqR#lRpF
z6E$yo7xstFx6wKv=2y;|0v1w=NntKxVHD>do&{KSz`{*@orJbgE8cTt9PPkxed^`$
zJ)*Nmwb-brNhxMS9&3gGs7Q)3JQ+a7HRpy&;;CIC!kYxan}-l)3MrbC=CU7*c~{AC
z(tHUd!t^=vh|`CumhG*gY=Vd_N!w*_o@}DmzY_*wn8O;^pn6>F{W8C!fSjR)W<uW$
z-=XhpIrDvBR!cnN3_ofS32q8oe$~{}G&(j`C{Bb`0c*D#ut<#A?X|c-$3l?ma)Bmx
z&~wOzlqTx7*b#{Izx)A{*2vrk4T;WcbG5Toq}yXXFq&%+QI`3sT;`KmQsf5%$sp&W
zqwsZYnD93~8enrU%%Z~E*}g&c>-8NquDL3CfK<GbuveDOI7~{S<>XaV%GTWxtuqP;
zO2K=4#axK=y2?qK@%<)htO6S^ZfSJ%TL_4;XTYt>h=V%R2&!YBi>^}JxVc2s0R?oi
z+b&HFAw3$9S2Ygs?xaM>)gL6uHDt}oh-F>Wr`mb>=m%6!z;jvkmz$|s>;;d}_)p%=
ze`rvbW>0Qa-h at 8kF;BPf at ZHMZ*nn9go-doUNty|D*&3#o^+6-(1#^;iO-sWM6iJlx
zbOF2Feew6?0P0?iYKDQ{eneoYZ#R{&^XDCCliY<sYqjzy11MGG8y;eNSuC<a0!N$x
z&op1dqgF$g=aR*3M3MjFuA8dFe+7lN+9L at VlxaKxBiIyfPl)of*Kl7LdkryMRX at 19
zdgtYdiiV*r5eNpdh;mK`uFk0!t1!OR!|cUx<$k}_6XgE<8pswOAhM>KyBDxgX$wpE
zc78X|uJ<4l3D2XdP6{|QTW`BAjKR}DevOzWS2*A)9VQue_>q~aNR#GZbwNZwrEg=q
zt;z4&$z#FY<Zdke$|{-JJmM_{Ssk>q+pzwHmus}mbchGd+P=?l at D1;aYB at aUd5@>{
zk_nxzGEuU4|G4Q>KZFma7-Cb%ko-PMtC>*2qQv24j6#9qQ1RU>Zvwyzj)rP5gEmKL
z&*TL^!>^9gxOl;qx!*h7jEC|CJ^5IW+ynk7%xTo~^wse5a23yF- at 3ASoM4Msi2VzP
z^ej|J502O!P;C`!RJhH~;@C at e^>Oz-I+Us}KB;JtoYp5 at o|)aFUR)(L?R2;gAvtTr
z8o8=sLmmQFA-3{#+%j1CDUS?q__!C7+nP>LBltxImsRwo%IMS-Q<A<lCNa+?SrpN~
zWYKMqJIgJDFUqI6ux1^VcHtPjO&zh4OmtY^`e)cy6~uhoeILZb7PGk{N({JhLHkgN
zL^RsMZm0Au8 at q2kjF>dM at iB8axwdn8B%>I0;Zs{?TF}RGDeuF5>rzr2a<F^ZzjUME
zt8<0aWdRdh>NIJo&kk at oI=oopW9 at Y+%$MOIly9rBSFc`;zG5;Cxo9;o$m8>l9;oD-
z0tCaS-ySwrF5OyimZzasYj(n07zz at uC)QaXReg8jhf3lNaL`W1<2#RN?vsOQ&aN&l
z`%s7Q2bBXhq(%fov$rR^%^odRw?$wMH%)eNw+X|1t%3D{9k$dZ!Zr^wb<u&B4X6hq
z!Xh<;pq8l+yGq2XWLnQ|Io$!@>{Er0htXwl<jvfUqNeQwIexjCBq<DIAmkA5&NBaP
z7pDv<zb%nAQK+D9^}anW?vBTVO=gqVp-;{xukPe{VvVnxh4qk8BZY&c*DrSNOFrxJ
z8HALS6!ghv2GTXr{o8aUYr1>Q#|>+F#q$o3Jd21vu5La~{9tFQ@~1N6*lHWqwj+wg
zCno*jJ>9XkmvHq+zv1$x-q`*cH4Ey&g_g*jCQkEbp{xUjqOInaM at f!kg*Wj!9B2BP
zv5!wDR_v8nwJimR^&S3Z{ghecdpEbOnN90j at Wf<b(6=XtdHSZ8;2up)OY~-I0wjK!
zHs{YRXA(dm&b44*;VntUmy;jtsH>`E*9wYYJ~F at Gl7mJtQ2V95(t#hPzIaqsjj1vC
zz+wN01DLkXSuWZj9(L<g)pP11-%6IS5=T)Fq|`i4L`!0RlPBp(-BBY}3j{UpuMq|%
zthI`IYZ+eC230_gVivz at Ez6Bs+c3Q1%A7<hR8DP4dLPbqKI~hXhAh7Oef3Ia5(KaU
z(|gPe`_~Zj$$<UZJGn7ETmq<v@=X<w#a)}G$9B4e1{5pQL(L-2!NP(OWp}4S!?82`
zOx;>73oxEWMdTh`@?vdeC at 4w1FFhw>vS_`(gk6UFs#4$azXlSGu?PapzE*eHq<ITj
zMiKC{#SHEI1#Xy?NRG70{}Hu6NLC|Pk at u?h6;H9Orwf2wtXC2o4vSj*Cl0<iG1Wu8
z;#z04T-667*gcKFmpZbZ^CuS*wNPaD5y2FQ*In0SHQ%_iWFp0(#^sXP<<T(0o1^?U
z!bob+hF>~+$I!ZpxtmI8+hF)}g<Nyy(8nXjV~$W1-ZAECN2uBLx9+o~@UftcPwcon
z$?(?Q(3UKAExEaXeyYWbmjfGoS*ADSL<yb0iKmrCYFvN&*EJUL?<G^tcJ&dTsvmOG
zVlU(jggDF?ZGC9(lpq|ntgNgCd7u`hR}w3U&N<97ldH44A0Y?_f#t?R!*SBda!CGU
zfc9JhNrqj+JH%zvJ{48aziPS|8PHb}dJmaAHYF<&vIRC%y*?gx?#nRTZn-&dHx?D8
zKR at WcC8nM?clSZVTot;Kd%8U6R3%(Y6!iYmrt$2Y9T8_zYGGr5uloq{JL;MYmA;Jl
z*j#CLUAAu;+o#F^`)-Ne0Lj7UMnmoKgOM#VZQE$FllBRpl3<HM^7t5F4^s|yduNrS
zh)LJp{&k-+=tikjwrd;ChX!Ag3Fb$qxqEypHj79l2W?gFkq_VavtR$!bMpH#dAT`g
z^QhwEt%E>@WrY}ysc6{fS!EreS-$t3fsFOvQuZ@$>wX=s-v+lMI`@f(tS8nen3G8L
zM0=*E%|9cmB6l$!_KmJYzNCe$fVJBnI*1^@ggzk*ncl?BRqY~-S~r5~Ov7lu3wR~s
z=~H6f*ryVRidtiDh2o1m)CVdJ-X=kwh(EsO9eZ(Ae)HyV{byy46UTszuZi-!qTXB7
z1o<c&q*#vW)!7d<tBbNRKgV^gp{$(h&2gd}R8{k&SUY&UbZd(~wc=me1iqUe0j)!n
zkMh>^6{a8|Wy!t<$d`S6R8oQZxF=Mr+?zeb17cOm at 2|#~7H&p5O5gCc$q~TTcTSzM
z5ikqeqGi2XGdwJqt|0kNR&GthY~{#zBO_njz2YR4^f(;!t~7<Uy-t}Kk+d~PpG3}<
z57u)(Grin%Fe!5`{>HgSY at kH39Kpv?M at jrLys<VG;BkUhc&b_%&+=3q#f+3>lRT?z
zS8R7GX??S&DF*48j1&<#5x7!lr|h at eb)Wfy4=zz<dvLVTobPlhcp4T22p<0o_1Cqx
zo3K<&4I3M1FHGZ6<&v}7(ONnGYkD7o4{#p|`gxg|nK5}=0XAd1KKKu$A87)R8U)c~
z7ImOi6UibDCtH?%+bYU1RGFj*H#f`c1x{p$h{Lg?RzXHU*Xrn)!c<=*ei#`TGH<U9
zIBU!8S=3~o7ZB!7JB()%&Xl~NH>PnvD at xrNoMe@G&6dOemz!k$PR!ft#xRcesy92N
z1A~Xy&TC4x-RzjS?)%KX+U=TNlGts9((sNUPdg_dBUROcKf8RV>ag*hiz_ZZK&~hZ
z0u^J|K>Auji38uISaRbb?#|y^Dp+IlUr`fAT1YdGe*ZA(rkmALBGxf9hi<rddcV_k
z-E8g1 at WEcdt%tbyU^U-I*H`f}ZR;(eN9B^a>Y0b1r|gj2t)Ujw(2Ff?rG0$|ob5Mh
zZc8n_92%!k?BcwQE- at 9pff8!Ty0Xiw`$XYW_Ho$;>!y1P2N28#`i-aq)&@{;t;Hv4
z?peDe{<lv|OFhM^x37;k(FMf6?7kM43Ai5B=ozzNqc2i{dDGle at F)+%_8QI!U*31;
zS9Kd`DZ4YCy*Fc7K~eWaICFwzQB!iJ)dbdor2sV!SWPmfJaakp;WedW?J+vNWt;+I
z>*#?gizjpn(H<6=+mO;_mk&-9^ek5(+6nmZdn*-ofycejyHm1R)eYWsp>4$QIj-AW
z at Ww)`Q)P<_;ixZw(kt7;Ya77iz=YPV at xIldgLwfno>(~fvMD;wLjEj-!v^Oy+;-4p
z?Q>wU&r`KTbRbaviS#g+%@=n^+uGC)=~2kLVgZljy#_!>MDZqa4@;x1<d)l729{vq
z_C1T`3q9lqpcE9Id~rzCnxWDfI*%dlY(2NjT{CIy6SA0`-aYY>jkDp0!b at TbJoxIr
zeNHvAS at JjQ$^Px#iI*Kyuy-%MET3+jm?&Azo$)#GdfWWO%X at Y+uwMwa{@$Wy=yaWN
zvaO^lai692pjiZ$tX?@-9ew}2pl5Sm;YKn+lxNe-?9Ks=^n#nz{7S1Luj=!|Hb=t_
zZjayU=~O(qUdIzV{^FHLo$8!cCz{lB%Q<n9K$)f~VHn$ZybWNOoChJWxj-q~_~1F*
zTVyVMb$C(}FFVq9o_l|LFLtKbM|81P4WZ at JF_hcovL(yjn2h}-NFlXc?I<zaE7iQD
znSK$JWNTXZq`PFQI0IcgHu42UWhZJTUwiv#<f8ROk2^uu5~PU5)I6UX=ZNbSY#JA}
zDvP`jK%DShRua9BAN9dE#wF*Dtea at zV1=A(<GLHJpAz?}*rnR)bb<Mr2+H(=C2Gtb
zxvJ0_W(y$?VK$vZj#eS=gfn&F>*<<wgLE4kfx~+GL{)CMu=5=>I*PuCfYeB%cK~?G
zq`($6c4Uu27?wHEv9eR-9LT7v8uJs7|HGzP?5>>sB&Eklh+}9XW?K!mT`3zX%$@T&
zN)h&eH<w-b1g1Rwk+)A_qYToSlybm})~+6M??0H-r&S{kMy_vcH)aJuD##8z>vf9d
znIl9o;Pq%1vh7-qyu7Tn#M#YSC(8h}eJidvWrEG0e2C{PDg8F&X(93~tElp}S&tv0
zpn9M9 at V;_HC~R(z3S2FsmV^An7@>I-J#okPi4xmV=h7P{B?^u>4j1orenqps8d$+1
z%&z7{<zI6;o7y_Fk!3x1Ca^OZas?d%>Ov5taGQu20;pv%Kmb{XYsTFpl<NkV^OG*h
zyyo6_?|zLia^VD_k<edSc$<agxf4Wx%SJ!5C}8g}+{&B|22Ctky|Z(t4~BQ>D><Yd
zYqzP8>Xv5bCmqNuK%4ACQngmnNZcK58TJ4?HZXv~N7B{CAoCJywpQy3Yonk~_q7Zh
z(nR{$^$iRfex%pK&#fAY?<e6M6z$(WM0yV6)!fx3H?A_cJvtZmMvmS;tyUU{qm~DF
z5oo-Lf>KTf3Bp1HsF*<i2Kml5DY>e~#&;_#PED2$LLE0SjSEZONai2qC75?B7ZW<=
zsvh%K$UNIr7DXT;i1l>yHRe;=o0S#c9&a8Ga#mKt!)2wXbm!Sk4omziQdtyA4IGJa
zn5TW6;%8oj(7C at v{WCsYP7=AyDbB+_#o~DN;xFu_WFx5UG?$ydizYHRuxELy=zPO5
zwxk9mYkL40l`No$@H?N#hg|Y+++Ui;1g)%Z`8Vc{*4 at 2}i#HrtHV&eF`r}>|d=dYc
zYiJWRLi$ruU&yEBS3_K?WTS22#=Bo8SsXj at vjC`K<Y1C%D+$ewqGYIM<jb0e9){Yv
zYJ(>D9O{R04baxz#q<7+^=05t+p6>;--v!*gY`b%93s9Gh=C#bCbF`!qE4s=DwSGJ
zm@{aK at GH_j9_<;#i1UFB9=6hAjq*)qxofAT_ZM1k;(@aTkxF=Rqjs!OaYT_Qntgqr
zMI*NPAw^9U(C8GTs|TE-hYx6hs70}k=B4|}g+0qU14HSPwB)!G+<hcVRsaRov$z<4
zuy20ECff{KLK!nW!{?*}clO_`;9!pl^<U7!HP3Qy)Z|t%^*o6ux!Gd&#|{#2G5q_k
z10c2)6ydl2xov;Ux6oGRy)A?qQ`Jr1v_FA69THCOFcA0wAuA-ILI5ysz^1`{iqH_@
zr%r33t3rB64On_U{n{>#m0D^fX>mkjmmRZcfEXYRa;@tWmX}Sbk9kg8O68e^+~-8f
ze&8GMxzvn>V&&xda?nS%rm`$B&Fz_yM9<l#P)6;XqTwYj|8hsEP<+~^jx1KKVw<l)
zez_sZ%*$tvb1RYvlD?J8hn$spy}H~8HfT_%o5F<0wx%gdVZO<AE!YCFg8Td?H98Yq
zCgFXpigGGr3KtM*k=<-UGRLDWz at 9X2zrkIK^ATtJ`zJ1)_edw++oM8EZG2i!WB65y
zoRCTDod*oJFN&Yn?)0j$4oP$<mZ-RlWLvJqk^x_p6#CnVXdsR}%LP(ZTb=LS%dm;9
zHfTt}cmjz1^wL`;bXCXW8h*-n8=Sm-b)eH21+8NUw!{GHCt)YhN{S5IcDh(KmC(V7
zZ{3P)QI6$CY^S;!D<8##?@#T2qh7CRnz6iEu=v->MI_$M_ioMGzjOn%2|&u{wmIze
z`#PPGA&(|J!dQ;f<EolpiETv%LxZ=b3SD7|4s3?RENWG&dxeVgw9(@cTe+0|D(~@|
zxcM9|ZnD90P563ZNRZR0sa%Kpv+_}*EuP8Zu=U{|4pyp``JKIeZq8oMz+lyGon`*f
zQI}wHldZohIi(AnL#^&B^d1xR{OE)Lw4z>}>Xe?5R`T(qX<@Q8bijw^oh>Xi-V5Lc
zJ^0k(`UjOF_Cqg3Y^RK8^V{1`1O9o;F82+VU~oy}iu6a;=?cEYKkr`!JUQT36LZ3>
zC80WXP_4k{%mV*Lu|U}i##hc7YI(=oR<e;gp%faOEyf3aO>KNWw3#0i)q>5c`?5T2
z>^W0dNVEb=nn5D%XbsJ^%j-3w)Ak1fh$s9LZD(y)YShm|grl~%wgxVNG_RG)f-s9m
z1jRSV)tp!1K~W=DI!Z91^-NeY#Qr&AIbA8zI`+xhLE;--NCTW5h{HI<XAnDKGBSK7
zH|0L+6x-|@Z`pg^&U at 0$&z!n}-}7)9xqUt#CbGP`gwi>aD(WI%^~NWt0Y6bz7anY}
zSd(L8fmZMHdGqRle?Q2!lsYNJP>Jf<Hn+n!Kf!KK$>|}_%U$NgQy?W6b;i<ZdXEFx
z>IViwLeO4_F$tISsF6wyO1Ez1PpP-Swc1GZnE4&xyu}r9AlMqzB7_UjZ^6I`NApN3
zUaPG_3PM+*YJfGmh_gF$qY&mw1GV?I_~_9lHv%r0wr$w)R-q<Iv~kszUiF~R*LV0a
z&jw~sGe)_l|76YfC at rf?*JNe1INZtC!_CO7&PGZ>p!SdVZ3oXY6Gdgli!-RTd>*E1
z#U at a~B(C~c`*m{YZsX(oonK|y4pia2w-N at zAg*j6j!RvVq=RcRdNBQGkuwqoNn01g
z?_ at xZUg|J7+w(e<i<_{o5vN5?#K*%zU}@N!a-edIp+EC#RW9lrh!e8=xwR_i4{^`d
zxFChFi2Nvi-Q&?K<trE7QWo9i1?F6_X1x;;+Nos+;eBT0*WG&ptsz&KJE(~e?H6t<
z2)7!+s*Hz7@%K(A9nE&}69NsSqx?|CY1Owp2`Dy at LvzaK7A!3($hIm;#CzJcb$f<p
z>fqpOfg3LH at Vb*f*Eim{V?I@{5rsHn3 at v6R)Z7x4`<PIi7361-K1<Va^{HCKdlvvW
z#5no(ROs5j4`U(A4bXQi?*u^9NHrR236?6zbv)M8<|&wh^*h>~!TUn{0Ig`LH!mb+
zMqC#pG)Se>z0K0$aJZ=%$wrkjgNCb47UxxI8GNx7^K>(@E7eg~3pT?ft4Ufsu9(UW
z>0J&tZv8s{Vd&<sARp#zV;YvL!2;=emb1i(dAqUR5|^EuJH9-1uF=+ at Ox+zE{N|uJ
zKvWi_LWXuPPgRO+-LhE67^oLxRq3_*;c8<Hz(193KRPW;Pc7i(&oR9seF1WWd-&D4
zjn>f6VDaK^yBb*^sXoo#o~|x<YV^%>e?1Q~`CJoP-$lR-)k`r4EQz2`8;@W*Lr%zl
zaRK_f(|E<%(-myTw*u<MSJMn1<bVG&rSwx#W!=PdD5Fy|M=hc^yiJu=nqK3z0`hx8
z8y_<ocTI^1myg1Yz*iki(eX9P)Be&p*U2AIW?JMQOK at A(!P>6 at u)uDTl6W+25<)i^
zXHnu%<YD*l_wX3T9VSU#FxUa$!_R6EQF?N+!31V%b!tJJ9-5C7d45h`C|7o}K&-=X
zdMgj7?Ay|86HEK^Xu-X1^Y$~IQ$f`b-M8-+SL7AA&2-Z9F^e?;-xfag|3y;$V=v`C
z<5rmJs+l07v1 at qSD5fKU^)Biy+ogy>v9d$UJM1OKm{H?FRJ2;C8v3SE!yS_+F&!r1
z$g7~u-HTC-stqEn#fvGf`NXWUFEukMWGGA7`|{}Bn?VgB@?BE+%WNtqqt|gd$L&Sb
z?LxtSs(~$HpSYn^>`zd!I;WF57CsFkET0ITDFzMEa)VxGrDBS=yifS%)-vQ*|I%U@
z7<dxqEXI7h<P;R7M4wy1<@qCo9GEeenUxr^C7-sEr0Zdkr+r2cu^a=)3q1!^6fTsb
zxDD_#BN7|8h*BQD!6NjiyFsy6J6g|z?CW0o!ARDnZbPjfiL;9C{4g#WD{xw(;-k@(
zYm$|djkaysj at -|(R~xR_8A8IP%d<HrX(-<uZ1Y^(lVn<j8Xn@|6LkR3jUcsrAnLSS
z{OkfY=U?xo9h8&)Zw5ye<g|eeRM|BP!%)SgrJ{OzdXwrR$Kbll6shCUFCRa#_Ac#f
zd)@G{$?ogIZSN2uh8s3W-40jDYufd14QEsyMIrPveBbst53rTvPm3*;*7!<(F5Cbg
z(iv&q26}oDUJ#waN*X;YD{Ewbzjn&Ae7 at 5A_h+Y~HHfPr0-q&MN0mnOZ=)b|4)5oU
zrk at eloliO%%;JDRZf$A)wd!`JfdRb53qdW?s)aP`R7xPmBqFBIhc9Do{lV at Hu}2zH
zh=D?Hd2Zvb_l$t2kYXrm6<z0v`E3ByA9!@0W#0Nd6K#>aOv)@S#iiKGvCCuM4XQ<{
zfc9@(z8!=gZTtB6yen`DUX)UKqnTV3wERxt+5l=ml$TUi`pt062K)mh*?YT_c9F_Y
zoKUy8yk3J$eHS^rbO~eHFlOTfb=cbrc-8r#i9RQQukpHq0QsrfGqXQeI4b$_0AQzJ
zZB88mMexLio3c_)p7C&$pZg at Rv?Zndb>OtT8P8PEQBw!GIB13+u??QeGLHy%Gar8R
zz@@kT<o at R;C!!a2-q_2q^S7#bS4o|Vce~9yHWT at vm~1HuR=hlJiv9Ic*RK(G&O`Ce
zJW^}*8cYS7+;rlmsGiF4=)-MPen6aT3-R}3YWSG8H6q+a?;YRf0TK(!!Rn$BTz(5G
zAlWUIfc~b^M`ljRF6esLm+}Zob(!eu at S?&%jP;kLpep?k?9jlrtg at j`B7WEO*@6mt
z2qJ$wTOnwBi&YeP&3X3mSF>ku5w)7YDz(kF%IsOejmA*a_H}_6AFHbc#7(}9mT)_T
zCe(MS1l5uknWPB%39wVs(cGC6$Lk`Nh$tXwP8=RQAa2;#zD5&!e*<MjC4((0p!z{;
zD_dnArFGl2kvsjWG}<Lqa-)-nBEwn?LJqR~5^lCSr}ivycJ><6Yu6$2SB?<NK68O^
z8w=k#)77}DUTJo-mhnQrXT}4>dHNU{8bm|;v@*)&b#`ZVUVk&OgUhft;^)R2&tR6r
z&{+~K%(Y8)h%l3!V(cfMbN=6Jo?s!9YSXSXFW6QMxE at 6&P_{(cV1qcKo4^0atvA|t
zZYwFdLs20HaoPa>P;;#P0f>9kw^}M)qSVLYigXbamp at -=q4owDpbt4H3<}%&ns7Y}
za0>0~s^kGhNj>VtcN?QPV$i0iU at uRGo&lFN^h&cWbp!>es_%o6zTyq6 at S<QVjTh09
zqn0f5t)V-=@hDfE1JDtRcuvG at QGF^YyuWT|Hs(cjC}=|Mlb=S4L^6IrmU}E{MUQ@@
z1EfwWL1P39gAUxdb3fwfrSctU(9t~VM-nz6DA_|0G#<DOWNp3sz1f1 at Dj8u2<t;3r
z{$Y0n at JYSI#|HXHStXF|)*fL_M9PMVfDw!0h*OvkHef=xG<iLEqQ8w^x&)Fg?>3DC
zcP<R)KF)OU0KGey+lfWzG=<gJXi<<=-~18z)98e%H at aM)iuilYf$+Vi%8+_Xg{;?*
z3~gJ|Ql<Cs7_gV}mxXAu2Q*BV%*klJ1(L%MdwXPGK%D{hfUN#8Qem#H4KLot5C3F+
zdHfx9e^da7X at Zg@?W0QeI4;HJn>4&+Gq4KTp+Acx`m?&0&#zRdA-*k$0@@`8sk`36
zqZ>5NCu5H{1~ev3L>?puHt!CdA01#v)oq{MR2yDZWR=Fgde=}ZCE+z0aPViWuIKAn
zk&WfbN8pw=Cq;?<8PGBTy{D7Ka?o;z(TQ&cH;rdC2DuVn8_LR*cd=<`j`20^e%&L7
zjl%W=r~&1f;Sr_~#lsPw27QvA+c>+pSM1m{5c}WOOy9s$x}|e1VCvqp#7}#Fx#~U%
zFh|d!MHgJh+B&98eklAS-MN~?Gf)O^?CV#m%3CC*ICoFOqIER!b&U?U#aM25m~g>(
zl)oj`ILV?n$~I7~lXV%cDoXQl2!MVYesm;d5 at HPEG5=k;tj(nKMR;d!!3I~?vse>s
zz_nqkFl){ta at ePb8Vdlqr06Nyeylmwb=7=r?J(-$^(Qd{r*o8f5TgydUn1Wc<tV?W
zrn8vQk~T6R!E^`c-$c2G*6Tpl?|dp+$h<w{mmk)@$-aKOvKd#X at 98pc*#H;B*86GM
zLv_+QwzB>@6~`FfGoPn~7HAd~%d4t>=tA24Nd5~SGe7Lys-{n!gW4vm<s%y;%0qP4
zeaDo%>=tP~ZRZ;6$0mLTQGTwe+6`Y)x{To%Wgi<THtD at ld|#pJ7OS~*SpHQ39^viZ
zkG{;c$Xq}i57!kb6Es*a{rLGFOy9ERYBSa!2|?%)xNZtSDtANgkj;`Olb&3a1wn1v
z%Jcvzy3TfAapvP^9dPSxxKqPb+<fB<Y;4g%q;6HUiiCA}B)Bd6j3+Kg#p{HfxwI?T
zB{OGZ?CTPWwB6zH8d6l!e8&S^XPS;?ziYy<DK=>v at j`tC6K9;XU7l&K;#1X=P1ko8
zz8`;QvD~w(6sGEFvU at t^V6tsme}o{Tnrjb0<*K=!?h2hZhFiaW6#|Z;Pq&=I*{w4y
z0>FJ+2nEKINE!FTzmz^w*)(E_<!U?op2|Gt?Fw*l!Ir1scU6dzN8e2+F4rB4>9tsH
zRC&^RNYe~jZ-s8A&dvI17QFbhozrmag{uSe5o;=%t^c^(t#FIgxjCs0>Cw>1rsJX1
zjG)tN`RBPuAt8oseh*p)A{G(NABWfTTwIRvw$7G9#VU46km`Ie4)emwp2BVHUq!Sm
zlRsjq4Rh#et>lfh;R5Buxzqf*xhFz*%D)YFcd0NI{#vPVklqU9ue-L;iB~8HNcmWD
zY48*Muct(vPuGp`pQm>EU-y56p)sx!3IJdg)_D!cIIjZm)I_<vlnP(A#Z5*b{Ov^K
zQHq^sWc=2<g-_prbVG>NxZ-8H_eyk$B7WhOTU3<(UdoEoIP^S9bM^PmMKs}h%F4yW
zKQa5E685lC%iL35z>pdjG7gc3OILJ#`gUiLsBa at Hp6#1C-nK`(82@;$+6vF};3>KK
z at wUpjoYbek;w>!=41ZS>CfNAURDYmb=V~$%A6#RLd71 at F=+P~gx;#A7av>ga%l~)b
zPM7OMqLso~;}#Lw%SM4db5lMyK0f-r=<x6z*xvU~3O<p{_$PG;F+&vgaU4dY3*zJB
z{}B6?e29a#3p3T8YrMXD#nFMx%YJg1PjI}wJ-Vx?oX_cZRMeR+gqHLz at xdl^)x{+}
zU0uNG$avFO;gc&PWIFc`W~Q22<-)@Ai0pWxP<^UpTu`b1U0g>8uYf>?R9oVYFfKVV
z&s!2oe&3p1yO|an7YA at TpH)q>T>+2tfN|qEClhkpqyAXk&6f{ghuhOVJ&#HI``rYJ
ziU93<wJs;ff)**`>KaH~YfFRFhBWQ2FLp1YL=sRCd`*7~eR9S$&_1QS3}9WlJQIev
zoYs;P5&bPe^xUgQKrl4$@ZxTqoQkK|xojwabfqrhYoac~OwY!9*q?y~09Ul0zWoI7
zHD48h2kX=*UFy?CVEwrp017s#|E4evOTchx3u4ZzPnQ-o%nbu<o|IFTUUhSHO4s at A
zo-}NBRswtJvg6nX?!~Vek`Gs0aD6fIvVlf4u at Q%IpPX%q=jPLbpfIdaa{r_fsTkG%
z>Xdh)D@~r8>-o1LQG<Y|nudkSA}$x=A94 at e_&h=l59`v!$6Rj7R|Qc19^|!iXv4_<
zN%&KT1mV>W<m_+s$RkYMxAA at 4Yr4qXXvP<VfYu)GG;qs8GUQ0*o&%oOj>mNlWpLD4
zyQ4zTsw$b029EWH-L#qUqU)J7F780Jn{(Tm6&#TN;Ft!OUIT4zZ;u1~*e)azSWh43
zo!hrFelV+mzcfQh at ZnOXSNt+s>XyDe=HTE9|A^3d>MtEBnCv^b@$o8C6d`C^ZL#XI
z at zm0)P}e*6nfN!-L at Y&8U>E`J$m+3xgef{7F6q2MV{#alyHVP&MZ*v-Q?PZKua}qZ
z?CdPD`9j=hfsO~DFSl0_rIRf#cl$lZZL={?7plHqhAE7w`wB}m|LVXL2ae~<zW2C6
zL|sM*Bc6d?x&;N}*<U{(HIZ`4w<~*kN?)UL-n|>$*(nhg{!Kl^#YNKzhfC;^SN8A*
z9_2N>n`&axB<p9;(Q$njSv*$sTBy_<&KxV*|8u(XU^C0ITM)vUX?jC=pwq=9L$Cka
zu0a>pO_=_w)73n)ruty%vUp<h1E-X0<j<*$H&0WZ4nNXnzCE~Ew3PWU{?fzLc*NNw
zb8FZ;vu8rg1lMa9tyjEst9znyJnnqCQC>b3VCkx=kx9YuzGrq??jyd^U~TzS)l*|i
z=WO4Sz*FSUGZCElNamMs6b&X9mH1DpIjR7*1R5&U)Y95gmo?j!IW(nG{Z-Y`yXVh`
z>~~2CqNN<xKfRPICM{3R0Sk0es<jB&MtMhW2{$iDO~ubKHQ7N4TR%9o3KwOf_fN7_
z+~;L1S~Qf^Z<~2DX at VOEJtm?kX8)?dIKdN7A`y=6uBtb_`^<oD at R4Q(88w`j!yiK^
zYssXkw++7~I^oHLqH<q9H%kDMGNX-@!F?4|WRkXXJ*SSAechM at W*)pa7*BE<Acq$f
z7Y7|IV`@owNY$%eJ2-fK>>^$rcD`r`8IUCM{@`18e~s^^bH^FcP_mO+ja#q<gKmS8
z)eA5R{q%tzr}xlleEGxM1H$!N_;dYk-)$TAAa+U2li_qU6W|VA&&r0O%QZgPyD?Y1
z`rFbD+t!%()EWOg+E?mI{qnuOtW4+n_3KG27K_zy- at Z+Q<zzVc0K)3-{!6t?`WC+O
z4e^;Z6VL$FY$+vO+bTwLQ`2VOUp4&9`^WAMG8gd>ldA at nJ}+a+nE*Y+CMS{t1~avo
zMP1i at i|$Yi)R`As!HcT&yudg$#=#%-_h0j`f?f8^Ik=K<TwrteinPr}9C0KjCKs1S
z;Oh|vR at nLZH@4Xg8 at jZxpx~h5o3sN|2z+&;uH1=Era;O=uuQ*)G?XjTXP-3dOGov8
zFJ4m1`>!<r9C1~UZ5d#0>zTTY#y3H)lai)nnHeg%F;+3>gAW?!=px73zf(k&`I$?g
zpG15J+8EX{Mf$-a)&dB_Q_YCrVJFDv!#--<2>%ojhIn*HAF!bV+*&ap5eLX%KbX3Q
z7zfOjN{C5@&hhB at rVwAlA7~^FLd%5bhTmSU_QoD+CBA;`!tV(%dI(_6e-|<sl^Ml@
zc6!src`skCWi7oguG+56_2pHoc at y*N*L!x2{z9%lxo9B2R+NwjSWF0{`~D`tvRhuQ
z<JH~0jo7dA^?3U98jk#fFS$0?dXJ7i at 2pJvsznZc`8BVNIf2+n?-D+7jHPvECzi2{
z?K94uo{q5N@}>Fo63($W7BQ0B4(l1)!^X3%AqL#alK7mA at rO98QqZR%I${Lrd7b|s
zF!#T84y#B%_0k*^N~Z>ewc4vh^YZe3X4+~CRb58|if6w at 9S=Vo+s5Ka8&neh#Hr}_
zOfDeRK4&m!x-PDZo!7S5y$#e1w5p~`ft4uRt-O4E7RW+<{t|Fc+j0m%US3*C+i-}`
zKs+ZHb>NXeH9+R>j4P~cxOycc4V##pj9<rYp=A+e!*i^0#$7lHZHzo at MXy}R;{;%W
zxi-Fpu02|ZR9W-t)GIRLH(EqNV%+~>)x#JHF3cBq at 1oIYfRa2Ge_mvCa<Wt<WZTWn
z?a|AZFN3e7AB6e&NiPF+B>`g|Rq7b>NZHU<l{qtHd&bDswOIeXV*c>35dirYKf9hO
z1^|qI?h&I at m_P=4;^o&(7RPWQ{UU%Qxw{w6pI0X!^?%AknBkPi%zcDC-N3-0Z*|Yz
z&(CmmFbAzdXen4(aq-~a$O)MnZVXtJ1FA(}C|4AyKlrHT1R%^#EaV=GV<pE&3+l-L
z4!1%~!??=3|MG(C2um8*@p7wZ6B84%p7am*^}}<yQVF|ZcUsx(0D`Y}a)=V1Pf!r^
z{rjK7!oo{?hf5UNo-#MvX at I7l0C;+RKAS|A6?ppGlRk-m94-E1S2)~2V5`>G-Bo_s
zKaAWxj3lFg$Ay{g2FR$YV{qbjF+RSHIGcFJd08f~<0^rpJYYMxFs)ec{+p2g>O;x?
zE{#5VvgCeprU~fLMTj#8=)8!@ZoJvr>G~|Z&DPd`DK+?6e88>2j6wu}{#7Uxe+p{+
zbC3DM9M-5%6 at mXg=VIp5Er$`-S?0^gBL#_&6XK08$El!7GWow$m;4K@#xyhaRDsOs
z-(@*JI&ekLRQIgEOA3qtwrFEVw{=m~KT4GVRljH-e_84+KIZ;afH8jKGH0Kho;Oge
zqWx!d&pk(fo_DtK7mfep7j@)x(Hfnlu=shYUl|Xt{py{SlVkS#IisR0(yiyj|8oK!
zbTN})sK600Y+!KE!vx@|Z*G>4ylh|6zLWVMLrW4()|Kr2cN73tHc()oS8b^~>^55Y
z{bkRKEB{|<)eqCe*N`IHx>PRpTY~$K0;{Lh at 9cWcD4uxvACr7o;j6S9+GB+UMqC65
zTkIbD&#z}4(sL=^SumKzhY`V#{~@#uM%hxolo04Yufo50q^6Wp9RFkJE9)pBozox|
zpneYcyTE<y?vGCpDDSUdLC5~?K70*2`*-ig)8o;9_wN3B9d!Kf?kgUaD}VP4zyI<-
zH;TTd3Hs&lix+MkyZd+V|Hrqium|xZ_R0->6XUh3TLAT~_~{3X{}gX at qSx55_PJP@
z^t7~_`Py{_<;L<H0~`CC=PMmM{FICF;gNV%xxWRdRmKC_wtWhEXI`i>7Wu at nF81`&
z!20_(CTn|1OU{;ur>{kXe_dUlivDq~AHQg)``}JR6Q_)3KhRWNzS1i~S=;kAv}F<7
zoI!Jh)}L!0O%n#)6csgkY?Tvh;n{wdv-2|OcDi%az%27$1H^#=M)A$*gcIMJx+C?W
z at ItIDAzuQh-TUznP^TCFv36rKjC^USdp_W(0!z9oWa9eHo)-FK^f3<A`K#vnzju;h
z|M*qVOzGUs(#L*ZEcCYdCpFsnIU)tGe0r*j1bzA%fk65Ey{GVJK^dhY?`Vgrdg)dg
z?ZUoE=?}mg?!HEe5yinD2X5Y+tu`488rZnh{p)p2WKe#cnYXw1nXxH2dG2`xUrq%F
z{N{AE8(p45VmGNcM#KmvSv%^!nlw_o+_zNeK6HW*y3L>Z%@ktL%<C~Dreov!*uAt@
zY}Uig#{@!E%;+p0tT(Sy-b|hMtIEQ|xf5NrCiTbUY9;4HPE<Oi#70a9cDI at oKF;@F
z3Gi^H7zECg)z|Lj*VUP|Hs&JEtv=N(qN+ at rLaPz{Q&v_LMHy#!cbp&1qz-P8>wjzH
zcfn>fWslC~u95zTO>pYH{!@xvX&ihYZKFCfsB(G10~O97WwojXlA*C;TC27=ev}}W
z>sTE8Y${lzs(&FkeYu*UvBf$LZ>b2AaL8DlO^Q>=-m}Jj3(uDSbWSO+Lrv6k&D0=4
zrK;L=ysq#04NkmN1wLJ_QaGe2;Dc_CJJL^{Y+zuwl36+!(rfoM;FexK-Aus4OuJ?C
z6D;5&^f>E}N%=7++gb8HE|{<G{El;OSCe;T|I2?&KgcC3(v|GyTC}Xw$M%asa7k%h
zY2K&8+9uUL{djoIRoZ5^7r0(3gbj*T6Rj1qNedgXUm+2^+{`oz(bN=F>DaV-%<PHK
z7*yx)IZ7 at _WvESSJiYci?$O^iqn+;RbSiqc^y at -%&u<RoOQtnWchejI+5>*jTx`?&
zzPyU<;!MqEvpBTp`8R7db3fRoV&IdQafF|K#R{WG9b_95aO+mAP#gr<`mO`VpPjt&
zw}@YJ2!OO(Ih;B1k2yfJ8v7_~c<%-;zp`mTj at 7oDt@Uh1xCQ1;M+v`*|4i-gU=@|#
z- at x26i+)~2p}}EB#^r at UeKX8x$yCnu<I|Jx!^n1OyHg^C at IXvS(NvD?GmlGuNj{+`
zph^elHwdsu)^;-`ZlQ;#tOLjv0c&sI;yL!R=38DH>CfP;`PS*_K4z|s>w`%->Hf{L
zK!eX%m5$qDTTlO->+Sa(f*{TYjN(briuj!y8)k(X(MFSgS0(!6;SFP9Ia at tYhm~In
zdO7QQ+n5 at o#pI^TUq_O%()cuAQ{+ at mJ#*%8$K4)VR4gku)yrWmRT;c&9+2T!oF5W@
zPd^F#xuD1lS1Jlu&VJ8YJ(5NKW87E03NSozoa=^qb-@{CWeQ)YG?6NhU)|uthhrJb
zDT}dZO6d=g5kcMVWUux7Q39)}>3~WOnKgvvN9i?aKB{4XwcXM8rPG=bH^Lk}{r>QC
z_iO086&~!MFyY(%$!|A8 at E<N&k9_jD>>4D|W)$-~N3FTapD{q)gI_j|a&=tE9*s9i
z)%cVeb`;iKZy=V<@4G#0wJIlGVJv#dq!RS0);g!-Qt%S*CM at z;yO|1i&A!F#?Kfea
zZD%-H0;r8Vfi0uCI#EB3+85?5hQ-mu*Kly*VWx78o;_QzOIw1+?&b}ow1?KzX88$K
z&U+T_K{hKQiYHXuS at N6=zo3- at Q$O4NhR+BQJ)MVBdz|$)^ZAw5q_6hc-D&cmK!#6C
z-Gq80Yx|fA_bF?B7o+WxK7WiG`iYA}rsT)DbC!C?qkjkjbfF?q5JVnTDi<O0N9)&Y
z2bWNXuJZerH1QT+a(`S?aJi$Tzvl2W$<7>;dU(1>LptL(P_RJn9s7{7j!mg-G^6L&
z38m*Pvi?-(!u1axWrLBYJ$u<(Z?ZT7^f25M<|%Ut0Hp}FfmF%<UYDxRud)D&l#Cu4
z?r6C3LE8WN@#tH1xnGLZqbhBxC|cug**|A>hv#-A=$*G}&OM1kpQ6D!6V>?W at 3%JL
zZ%u+%<m^LqAb=#iuM2_pOMT)@?xuRWR_-k4=;H=%q4j%ZFWcQ;Yci*axPrdCT3w9E
z>c?747<MO!_NiH7LDEI%wWK`JCj7*vk5tB_{DkDs2Xe&%8(4W@)A}8YVx9))0?N2d
z>3L462~XYHN&ZG!aLc-;J&U917AGx#ay at He3B2ZKwX1zH+L@zO3APca6asvk0d51H
zN?~swQ|8vIGj+*Tova<rZv1G80-oxb+e~faX9&eb_aFc1H5`S!HbFx~;gdpQlapR2
z?uX6E*S}Ft`|^8JB$4M|TmbnhKS at Lz|I4(N`h`0>5)^jn)n;6!8)z*sJ|Kli*3jVs
z)okw7O{ps-Z^3gC23cn5s;qubR<H)VRd^9pVQe&H=1%pi>AyGq*Xn%M_A_xZ4rEJX
z;}1FU1U1<R8SLHsXT?+D;bYV2g53M?8Vg*bB#ZqXXvlOgMWaQ&>G+p&QJuT4~<
zpJSI#Mtjykc29#W at V0?X$0rUskr^fH=!1h$>q0^g=@*cb^7C48p&cDA76|dNV|qQu
z59zkQbnZAA&FU?0<)SHsjlry*o!>Mi7;pP$dvzR-9>mW+FOiMlx>sx{HXX7d at dTD;
z3Rl37)$50R)T8CL37z=yOn<>?U at Pa)n%|JZRD&{Kc8u!8VU$6(mw$+KI(K8pKz(t$
z<L6qIrv?22s)@TgJRfb%rKGB0pDtl-858iyG<CVMI%Ra)wxCzLVP^Y*8T at lm&{emo
zyDWKovv0(g2R^HxvYyR^Sy)4Hm93ngXA2u7`uIbT)216cEolTTAe8y?8?eCDcC7)!
z>$LMa+QBZT?Q;m)kyn=k`~BmIuOg9-pF0<@g2ge>wAM(9;LquZyZ;P0#xIZLYm}Oq
zm{jCA4?>TGEdn4OiwpQbPKYv6wphJwZsj%VaptZ17su{CY=s9-2o`RSzYdvC<g8VW
zid!5kno-!g;nqTQES11*y{(zKTu`goaagXd^>a=zr)H1Ur}YfDECqu$UH^pQDvZe<
zgx<3dmaKF5wXs9ph4ItUeA)$K8e9AHG3Ta_0k%O&Ar2B|K_=PMI568uFz+_O$RrUx
zG2)`>{SjoC(lB{-=x3;vI2GQ)OF1F0Hd9q!#EZNXawf#k{*U(xO*hQ+0-C7+Mt$c_
z`P`WSc)#Kq34z+eQ at T1FAdDk(Da6ZS-8OA>dg&-jY}TrPJjZhQ$2|@TrQ~bQGEFvn
zL_>A8nH`#z=BDLb$H@;ja$deF0lq)~jYItx=1<vK+EC0uYjWtvDSx!;_1QB&5E7;x
zS at PuaHZD#iZ)Y%ClAY#ocE-*JbM4N at qsv+$yQ=kN{*slJkg?vt{CYHp^$6ZDDLd&|
zz2cFM)Hn5?H#J9r&x6cw+ZtBVZiL!gZbL~_`Io7KS@|SEX&*YaI29_oWi8?E0qjP5
zpZ{QS)F=Xf1_;YR6oaeC;7(NM#q}yv33_HTAL7kckxJNm<Yd3 at T7I$eKK(o^+}HN<
z at pJzp>n8JCpnhLXqd~ENvVm;ome|RuoVJ$|I$I@!M|3a!kiYDZfRvZ;W{EiGqCvCS
znN-;a13k}M(&0V+lj|RLs?ZBXJXU0_xm&|xTd at 1dTd#5xMCqiGrg?_g*f at -ITP#UI
z+A0{tlQ~*ntXx|`%&0tZEqpIs=TFGrdXR5+21J7 at vchWv<ATkb%rG;;gq?F8EDi{3
z&c>QZq)nuavrnDvS_mij11o%RpC05Kb1M3hYxCp57Zw at b-(e+l^}=QuN|2CjvqE^e
zyD?$s^9p_W)|_zWD|pS}8(gBiwzjtEN~MWGeYIjac3o4z%Di at whFn)U_#FFGJV?@I
zv+7=Y;~(uKGGle*CHV+rHh4{;zDkH9p{A)YGVIwiV{G!NDD^PkyELX>{LarbAX>iG
zgJr(U(Ic|GZ14<_CU~29dX`z+Ob6!ISah^qWcz*_gjTreYfwBjJ+&z?Efv_SB7HMp
z(u6Uhkbz=XHR+(YHocL{J)>%$c*-JNI*c<chHPLHwBmRZVfDN$MDirKV`Hl^ufF~u
z+{Surd`^_mevslCsi|jj4`zVF;dm*BOM54rB}va-p+HNY9exUPT<h(rXv^n)M at elo
zJ-M}1sWlUbYYncyOUUjwTJ&jDf3L5FS8LqQK(w7T26Q$iEbmx*9`Ei!WvfdZpXbk;
zfV_?$kG|2*`Wuk5EVF^cm+fHU**_H%w0j@)*SE8vqS2(LL6X4lKZoBn2S&f1Eckrt
z2FR=X94N#5wtHx6+~1k%8&;MpY^m>9EUiDJq>O~7mwYTQy}{bP()&FJqGM)l4d-`O
zF$0&}+fx01?7d}FRo at yfy!NI$rMpAA8vy}HDM31<Te>@x5-BAWluqgHmX1w_NOw2f
zrT=rzJ@?}s<G$mL_Z{#0vTMbh^NIO9zb7`_u9)E8`vo>(|G&&hw(Ev#14CT at 1q^{`
zK(Y>N3~}H;3;O>%_5kp|jcBwX5 at JTIpL@G)kJG!ky1vAJZhz%{wJb4u`A{1*Q0ae_
z#yY1JpaGY&s&(xX`VX4IU+yGWJeb0<3${@CCnJpax!PnnI|xJ~1h!r$4%GVJ7qn<k
z6;X;!HM3AtL00^-uX_?HyuYgkoc*M?_bv>X1J30}^v9*k&I+!3CcU#LKoT;U8kT9p
z!NL705&#h`UXt%j at 8?Fr<{c<Nimp~OI1HEWM|NtU3F{6P0k=!xt~R^dDo&<zIPu4b
zdcHIMT at e)?`o7zAR}3HMQ{*L~2lQ?3Z#3?Y1hik>eZmGDoQ4E)r^ObsPgpIWAcSGe
z=j!Upg!``ek`thEgby4ne%#kRHj at JC+QrTkmK%`tH2u#<S^akX8o&p9K?c`{i6o}<
zUuT2zh`oI6 at i<8-=3?EfN(i2UPYsm>E=i%1P)U5NW@)y<@;^YyD-sA*;4KD(3KY_+
zr67Xme|*KjbMR%wUmB1HBB3Q7U!MQPtc?A at m%3$a02j!X+$FbCgAW96pkoBS90<S%
zf{z^aM$*NHPyqliP5AHIu9#LtvU~TqmO9cDFu1KdNG4SHYIAdxc_<Mg(OOGb@(T$T
z at H<K>-m>!M)?7AuFWTnbxw|^)URrF>zZiSRb-%M^f4(W^Z>flxlX<$;tt#tU5ugjZ
zVVt_ at x4-{gpM=r)aCPbDeLo(lD{)~n{{Ys&xGF9OSlmn3DUZ0?KFZaeCAbj{e(W|v
z(w0phna5xx7<)bvdax)b4O*LZl>eC&J3r6Y2r{@NhwAH%Q=Jzwji9lX+r#yuve3U!
zIxUrvETzTs*GGP_^{L;u;Ucq}Q at MHU1$<umJPC6bni2j}De_V at bB{_96yA=^dh*qY
z*fx5n<sBC!8y|y*KdF#4H%Xbm_`LQX7|)6>eLsG?x!=XPI^UlASv;3ort{eRSVPx;
z`|R=_4;WV3ihGps at wlDr`MepEDPjDWsI;`@r(T-9(<E5we9XRt>Nec3g0b1Xpz+nl
zLu2prBL3`8_=8)9u>E&Ibh^O^vF*cs6r^UPWSsmJv}o at bgTm-3;F0N`qP&nVNiJ{Q
zd at hl%XM=(g8lQBSw<GZ6+pEi|l+ at _^q4QCT-p1#d^8yFPl>3X7L^JZFtsJ%Wi$m}q
zA|oTW=(qs7>{<*sNyNZw8D>!t7hA%Pc8F;|ujvaM7k;drxjjLbqAF~ATQ<758^xU4
zY;sFk)Bp!-R{}TkqR6Dh8T>hsAJodDl_3Xu4t#B*hy94uTqCGEb7Y^QQ~Yo;en{s#
zthd1HS6aZ8FE5`A25pM#vT$=d5JP}WIri%Y#VxTCoIr9`Y~W{1->OBgXai-*+UX&g
zqbk7kNRiHVve4p;<Rds?(R(c={d%3>Hp_<wJh<Jd7%B)csqs;%$zr6Rnx}_EL#S|?
z?TG+x;Ab8@<q7hSV!yi<Wt0<4PScET#<=X%k>_LMT(og23TqpqqPm$f at sz;(I-wt-
z9_xV{w7bII5oGy|Oi1RYWX;m2C%2gCT#a1BoS34fnOc+8v(9W(_pQ~N{oLZ*9IFYe
zr(O`M^0;Jvk>S|QC2g+(j4z4&qC^8&t>Rv|2vlEcRWT9d;E?IoeZ&OYQZ4Z;*Ucn6
zx^U3KoF~51eJaC73q5)fL2l`YFo_c$>=~%T6u4|OD?>#r*C;wvx2}e4a{L6KN?7QH
zlOtLkWgi~c$G&i%vYo0H;w)z{9jp#+;1`+Oyud-*%Z3po2RDy-O}hDTlH*Q|MH8!a
z{mw_TbU^s=?4X^sOR7=OXADkNy={ovylRaMalsk+q{QMQl!3B->XIT<=IPKi7x}<N
zn5DzICRB30{(L6cxyBJefRe4q at 2uYnP&~j$Pm-SIS#%IhlFMcnb6&H{LW0Y2IDaiM
zzu8{p{>?`8{Q>J~_ at Skg$W^`%v8sUku~#j*TY%f at qbA%dq+!F^KCGYJ<@neGBl=GE
zc&&$-YV$rdBO&#IA5ivIa$<?kcKjvOxA;d^66D4Y<wh&tEgQMMfm^7rb8c*i!(G6`
z!NJMMgcXPt*I5|X&Y#*?^98CuXt2OZ(s<9OD*;>W^^d-RE{|DiVjcC5cL<vgg9Z;?
zkAut^YiMzIr&SM|!Ry`iBNQtO0YABcr|-yon?!#1z7h>9d5Np{RnQ@}?l&hB3RTPj
zrpVG%Z0vX#miiWBa~TF;WF~{zF^pNVGKV*WTz#O`<rE01#DC>0-VhWtW-dhbx+nRW
z#&;YG3V4 at g!5JPh6h1NTkcOz;Ueu=pXkRusGvKKXR&%6d#YD1|_>|3to1?yq2^FJV
z9Xq6vZ;B06jcDt<ML5zl)Zp5?SXpdwd&+E*&SW}V5gq67;+ef;ExBb<!H6ktLM$Mv
z5Y7|;TeL;8$tu_v2e at sEuAl7$MdIv=QgnT<DK6Rn6=bV=FhM8mztEMsKtP?@wXndl
z)Le%OX&cYS|A}cQ-)_jz5|>w6E`09e;7j3V at 8X%7Xe57NHeM0McfA?Ux*kU*`Xe21
za&UbmzKPyIY5(QB$b9nhvTko%-^V*L#S!fbPZ3>N0Zz_B_;d$POn|IwEZg7zN%O$w
zyuJ=@<!TM?(*5ZNq(_#BFw38cf{%3Rtroc#9!`$hBq%;(VM~l at Tg~+M51GU$a7b!*
zEkm<p4X@!2!}Y_wIRAcJhz<9?mF>YeiSTP5FNg+rtjsCg$IP+Np4U_YJ^<*q&8t
zp&c*$TeKIX3*6O`Y0&r36R(t5-wXxsl53;x0KKO~l#MPVLj_E`8I5&5n?2S7YufvK
zfgvGqzs1eMV%gT~)b~Sk%5|Q~qxGh<=f~eFCEY~RcZJ~HHcNa4oG>zjA3J<wTv@`j
zHlf4!u(z)_n?>0$_)nE at zGYcnLVzNP67rK-Em2iKUT&-%D2F$#lh@&+MbMR<@Wz0)
z at zg_%x#=RJL}o|m*LMx{pQF<>aLlQBjD_%B at 0a_KQ=XTQIIM74PeqgctVi0HX9~j~
z_-S at P#6vfT0c0_J4Sx|9mlmJL5VdtM9L@^6Ljnv}b&W0z863^!#;m0q8u+nHf!y`W
zkpWu1#>ONU#<5ZrB*Ttz2(N}LR$xfEIDikKW(4%pPW#$NQK3N1#=?%6?}3Um3fWW*
zlSbe=@RCG`$<OHXsET_ at e-s7tigLJ<EQWH<m5f)bBOdYkX&wn6?4&_q|Go~tJY%Yu
zwLmn^L|Jd%U^ajh(LnvNTJWO6LT?;?=VQ6v&f&7edzxI|vJE%oHu53F8icuG(aZ5o
zOFoUI3Bl#~=B#a;Z4VRO2ZIkSMf9GSm`+1>at0CnuBxkd&qa0`1j=n^*g+MZUHc4o
zFxGBVp!G+{@1QfwMpy3W_1Qh2O4e>z&;uW0U<y)%afNTu!yT$*R(Eik0HSJ{+LMny
zj%OR)q0#sq^w|*<dfSJ#!~0>~rq6OgZ`pyg#N#0OtT7ut(C|{fdoEjW8#vOs;TumK
zpUYrAY%-f4->mgdhPG8GZ!gy>Q0Wwl6)|%HPe0 at OqT8GHQ}&LBSK03O)rpcE{zC1L
zLkE(^q&HponLWJ+zm`I-T<JvK?nHZ`EULQW at ctA@EH6I;UZNUURMP&8{j!G>NP~(L
zNVqx1T@}g$iWm#@bBx>Kt>y1(jLn|Sb)3MHKDLk#Duh3_p_1Emb}#dzHwMD}Bai~E
zf!kS074clZg}Ch)ztDuT-%BqPAr>lnRT8YWJ8bKA$TSAD??yxtZ9y|?VEK3(F_7oR
zjb-YHw~@Lx-GWV#nN$Cx>}^3-ylgNiVP+1#1a9^Yd|SzMV>GRl6X$*xsj?$(UoUz3
z{gmeTkFGx`V(2A3jD+5)JBg$~KXh%{r!K=BM0SKNj^e!tEE_G4<6j?KVq(3Do_j7M
zBXdR|kB~eSII at Z<&yjnHgS!7>_pv#)<9jT8`t$rgN)HuN)T0;?50i?sXYZ#A<M563
zwE|vA{nSMUCO*TFIVoHgC|DSFnpUhxE=ZisELa}b5j5|DlIW?`QLUH+3L*(`&{_>K
zMl>_pY`UC6^q)<BluCc!7qozue(OuHDQ+|%6i2xEV5{QSyoN;iz~2;p*kagS-&(wK
z&~V1_#t+zv7eAflDbU??J{Um<1~r^8B+VyBpJp<|KqdF9=B1%+P4QkgPV{?NUp?Nu
zHqa|6wVyV=T&0B%#1z<>vsf|)1mUbL$`+>6FC|Fg1}|GRMFFx53Epo-uE3QhA+XWX
z8cGj#VQBXIS?|I5D>*Mbg$VGbSceZh;016tIW`tj+MBf$fls&5)^YLBw)BGClgW7=
zT9c<SBQyaw-tIe1_`vW=!G(lW5)RNa%|9uAb^iegW=Gm^tJYf7LLR!#`BGO=!@qex
zY@}q+raG?p%l)*lg%MFz6sQFAcba>KKT2Z&mdX6sOK5Fuamf0ZF9IT7k40naqY$b9
zsx&~=27KTPu8^?`u06Ywb#hX4IWB(w at V-HNx^8rb<@y*MSFG4suZ22iJTRMtsNRM2
zYl?_hma at 5_iRnqa_d-rT%A2l^fM+MI(Z+Az;-;_>=sZn1KI_-`IW#u~IQj0en;yd-
z#Ko96IbjPpEVO-Om1ttRYzV~Xj#U*8?%kJSI7Pke=>es+>|*S_BVMP6?Bs5#cgpE-
zJhqHzx^F0$K(x^03}<GR<8}Y*txx&yRJDN2%#7ZTwwPa!C>#biTfNp0bN5@@n7*)m
zC)d506^f2og!@9deL~WvnvmehD}-tO-j?MQRYNs%rv<hW>mT%Vo!B#JY@{2Xr_A|w
zn3IO17GwSxwN1J{pn73RD>^1dN@?pc_kOEi!(e{8wuVcXKb%y+;nzkCX`PEDQKOK(
zkBvv$nmaXf<dumNwzSYl<QciDsp}r(DFGTqbj+{S-<?f95LAh%_v$wTk+^`YAtIMw
z-{EMnEy`)-b-+lvGu!qJ!{ujgRA3F|*?n_8ID-w#JRDzQFI%{_h-KoY0CT;Ym>0cA
z=SHub4vP4GdV8$CUg#p6TYI>Jnw>(<&sEDxR_Z}Ov#b~&888A(l!xewYrvfrMaB#T
zp1<};;FL!N!mbz(IE at R_s*-93zu)7!aVl%WH#VR9=3uF1eWte9t<}}VG&jVKZUv3~
z@&hMKMB?mIlhzXc%J$gn$?E#06?|iBVMd^9dfH_vEkQbww}E3oBMd9MLCt-i-P)}h
zY5KDnLZJEzF)V%ldm8kqGINZrETKZX)>q)==Zl7KD97R+=B*yz*}}nXWV^{^QTOdh
zl^s`fW&P#(G-BY1cf^C8Q${>&_SQ<YFgB3v$o4^1g0AG!)7 at 1S1IVimVE9<}dH{c=
zzRA)c6Iy)ToSf?f8hhdqqCd2SOKaz2g-^pBVxGkfg^ct{M-o;4!|~rMgl(HPmd9_{
zze$jk?HGC-;!|LpF+e4`;JiqVF1>m&7wb@>x`ScF&oWx_OWND1&$AZU^KR;$L<?HP
zc?I)tmA;;j_=<3x4omQQ&N`8tV$>TDL?Q586qp$h_Nnkp8$JFg#R5s~VDs?0aafm%
zjCF>?5cE|SR$|g at 1kGHP_pe>#tdqxM^>Y$5Ky`&|SF&Xo$1o1QC88un1e&4`2<;vx
zf9K!SOKIpNZGU4$==g?C6=A(B-I!}w*6xun8s~AS0|7KHJ_j#vFDVAJxA1z)db8Cp
zR~&1uNR5~Z`I*b009d!=-t?C#WAZHvI8AewsC`&~%i(jM=2{*=Y3<-Ky}ka`_jJL_
z*^xS74vB;cG2fe%C+W8iq}G5ZJyNj3dXv9)=1GwfWEc&Q at MzbztC+@zYa6Fq|FW4)
z3bXUq_xbV8R+Zn`Up_O{r#mhh7q at EYSE>lherRFrQ&wD{FwJ-7_&UeH^Ui0hnI=MJ
zu?ShZ>l$;r3C_g?{I1R-sdT<M`O#=aG*16Ir#P?!veJjXBm8P<g at MZ502vQ0bkxU|
zI4jQ1SY_$AG>VEu#fyNpzOGA7&L6?H4%b*@Ck^l9z(CO^ft1NvY^j;>nZl((t>8Ca
z%c1HZf?bx4#N{z4<O?@97r{)o*Dg2WWX3zJBjYy|Zi`@ML)RU(zRzzp0Z9BDe@>}l
z?fUWBU7v97dJFPTw#{XjHA3Lq<#aI%KnJ$bp{$BeF at h<+U2b`3^kA4|={Hx+T-GcU
zg5<-A2_#T6OV*aI1+nV7;(f68V)1KagO8Jlb})xaI(SmdtW0n at IjZd?8 at M+YYZ*Sx
zwHdcopsd??w5UhD<_>xwI9g(BfKw0c{cA@@Gv-4v)%>IUAOR3%P{{v+CCyz%6`?E*
zoUL{bW+<Q6ePF=$%D{08%5azYq<7y`Z*^O`SXW?(H(F+9<-=Xjk~z at yF@#ug$$8yS
zo08kG$Iz3o&9>M9;kS4lB7L2(XOb8{!P1!DE0Ooy$=H0)ez8^`COOI83hiGTLF$+T
zC>6eFDu_fgwWrreK#cF+Dc`qL?;qL7ZtbI4pZh%dHGWzo3Ks@#Gc_5{sBo6oaKr<E
zV_ at ex0`Ycg&G4#b(n%Gi<7u+^3e~O8N_?Cev{yX~2Z-!K(0NKgw-z64uZ8bJfVIm?
zyZ(Sl9M)Lh+FBo!bzy1GX>(`S5(8PWm8p?FvS)enjP5JC{)@Gg-Eqw&7b8bA%08^E
zw}vAacV`klPJ?L!nYY6X;`cTfDFN at L?)BK at fMof}Ql1nZ^Qnd)wri1SdpipOXRFG!
z99DMamy8IZ3c#m(OTd(Db0~FDU&P{g?0I8 at kIhfYmmcI=I|;`Iof)z`K|^<Hnt>L6
z{QHmAinJKZ)dv(sJ_A_5e*Ugb#~Z3gENt5YH)TrU(f#p9?H(mxto=oW^3>tiikuR_
zB%-Qi^=^Ij?AXC5yli%0pu2qsrocv3kcwz*{V3}_NnnHR$V#peX&;5La&s$_xJ_E`
z8~F#7F6`lr(p8VKm~F9pkDB$R54RmmfPTEdlg~abkd+`_Q*KgVct<XcMAU4~ED^&}
zoHBK)%8~#smF=S`>BAoTjQzNLpRMiq?EnMC%@^gaK-^EH`xYhk8lq2;V&A$oj<E+^
zxC~k8T5Eh>aN{ys+rIi(N;#tcx;IrP-vG3~WTrTpxYHz{qpNK{qdT46tazWf<^gcC
zYRV&-O8I48zW$3$tn^Kz6gf@}nMEd2N|@5oveMRa_yo3D{G)y0?6XwLU&%4t(syk_
zGO9k at Pn6+Cw+wGR#y&}cOFXVHId70{#4o$zKXN+xdUGuWp~5`dln7+FVyPexI~$~J
zNwft^K+vcfnZwm)e$S(94+o?JqmOS at J)%!4>GQC at ZJu%`S`Q8`B{gkVr=8^UI~oEy
zcf?~ge6(cZ`iz&apXQZCC*Fu?7631;%hb{mznt%*0a0EUut>bk2mP<W(Fp5N|D*TC
zf)T7b&rIFlUl4jkM at B_Jh=Vt{94tahAt|4GD#z6i&lRH+e at SnBW|%0;KrZ_M25Tf1
zUUFZRLj~5oFMpBw2biN|={s9b3;e`Dvvj&>^h$5u5}dBCnmVx}bSZVS#se!iDi?-c
z47-l3<s6Jl*LZLYujU+XOrEy*I3rpPSk<0gd!;i^5<bbF;1&?hiPirZX&t)uJoEew
z^T^HE8%#rKc@~ph+b-Ar4|#S*$D~HLE5IN0=ESp==P#jF+<bXBey17C!Z`(=H;n}i
zGF>c-ENcSDOb~?&x51SU2bT0rFQLy$#Jm&=U}BbnLtM4*_k(qrfS=^u$vzyt^`&ny
z_T?+o-CwqNnaN`)D59uG!?iu~i at us$Jiq-ouh#co)cd9Naw*vbiv%HBa3Ynu^{F#d
z(wwAxeEOJi#JJ*&hFx`j$%i at 2*DrbR%;-69X5f%`N!qk6K0t91Z8fhupwd+TcklT&
zx%^cDA#mV4dhYhZ0s1y at Hmk<@e1reN-I7%M&~9y7)rh6 at -?;#9kc$S|sK{1UYcmJn
z1DEXw;kwl8&b3s0P&2Y1#`ck3ubi%WD3IzbYH~`;BuCZ46Hp6P!0u?{0o6EAlLg<Z
zch=V_FH_(8-0X|=3$wYLxSn>v4XMJCeekj_U(iB*1nP1)Ks|deyytCkrV*Gj?UokA
zR87L(Vs({<4v?Q9f0J<~%oe at BoK0{(_oG+hO#PJ~%{zbr^!D_)@(BsO8>>+3j3KPr
z=RpOq(4=Es403F(@>CVlysbur-h*KrrTMJ<-CtrpCmQWO+zkRbqiSF(r<$n<YJV(4
zVsOvxNkia3q=>n9#n_Es*}5$y0gz0>U at o@?v4}!gGpmKvQ(ElB#V3y7%^h#w$X^>$
zM#q?r at x_7NaflHEzr$Pfq5y;2thC=BFtu0!%}iz39>?=CZEHtgLgVZEO)hK6caG!Q
zbii2(4uJR#^h)uU?}awKjjqeloKT(ih1(*h!cI$RP>e;RRU1-Rez<H~Bk9T&5xa_9
zU=yrMD3N{R+SD0~MlN0yW}}$r7XNWTq+(EpsJO;HSv|CJDmO)<hWiI93+3fcu|Ute
zW2tU(xiTVIdIRJa_w(~z1A}j0el3O}zUf4R6|)_tv!)u;u_K{5z+9J{w|}zA<ltBd
z1asOft3lh=^lL}?z7=$)U`P<YlZ_`paFfYUYn`zmbiKC{g>s54YO#vYR93m;^H7&v
z6UND|-~Nm(M;o;LHH)76o#l}E{^KINjD(*%pJk#6^#JcIJ&cB3?~nZi{cvM$b%bi?
zo`<h8&}p4$-7$W)v)9b{J4PxN53tGFmwKDk{q|-+zMxfl_DCpTabO|7p&R7xO2V9r
zgU}pDd%&s=?TC>5rz|gI#p7f-UIWKZ61JPb4`H^(XtRemgtS5Yx81BuH at oYX+!nov
zfboiS_b=VvB2dXcpmCvL{}E=g!KqW<*Q`#i5c(0s?1H<t-ae4SDi7Bke*#+qoPyYu
zAvD~5vE#VEOok#W2ODra%6NOf_W3dwU^MT5SuG;H^$uTc1q~d){ZepWV%Jcc|Ldm;
ziB|%O{riMmr^1e#^HR2ejX)_7h#+L8ky{1Ykfw>Fip=}D)U)K?Y%_5!nnn_m?l66G
znam%rzPa~q!U5X9-4L<R5~^T7bbi=!+hnordwhY9^*GdrWysCG?AkPdcd7zjqEJTl
z`w{$$%^<1Or17oSFA5-EYMSSiRWW&CKDW>|-X7tAp8ChpX*gej3Iy|(*;A2S!OL^Z
zZ)`ERb?56G<FW0J*F63xeRAJH0nk2*YO2x`{@qFVXp%5;Dxb06hZCrY^9VN1t-jV_
z)O#FV72NL)1HI5lo6#5Wf%R!LR{J*YwCA^?4VQ0WGq>ygBcDEJXa`J}w(@fz34kVc
z90Mchd*&kI$dXc7VGQgxVPIhXI{vLQ=EQhu80&3d-lcVLHU#%3Zy6KAu>1FKTJ&XN
zwX&~DIT=4j^2@~hxWg<jtj{g?t;(bzU*0}EhtW9LO6jOACDl*5<D139(c4oMj9$!#
zRNOXP*oLfVA~vj5Ee8~sjDKi|UB2A0y-f`qKlJ(9QW|Ys38D<5*VvVnE)Bq#X?^q?
zQT1t_Y$ZP}aU(lA<AX{a6(eHiO%E&0%tHGL{hsW>?>_9`T0}&FpZ14q{Sn~ASZ_sG
zVg2xdyE;iO_uAWV->Sb~YtI(FgwGo2mC$aP(`L3S3B!J2oq79F7ARerproA*(8x`g
znM0?}Hh2+83l!iE>pN$8mv^(2{CRV+CiQ2h;M<~uwyjni2SdJqiIoox3Z50)dcDhT
zCZPzeqF$j3FZ*}rC&|q!bT}o_B*X+#9?fOM{C(}}tm at 2MIpn}yB8FM$_t-!a)M0($
zaC8L=8^O=%_gkNn(#8#gX>zk>7wzV_y`CqqicHvsINh3$oQ)hc$L}G9=-e!5+uXE@
z;cZL{Y+)@Nv8-*^AVKao8~Gfjc|*B-t;J$&U)kBnVssP#cm6xnX5RveLwBJ8Z&^dQ
zhRsX2_;V%~P(*K8w1rxwkpTanvuAJm`8XutZh)6Q%k>g)ZSRHOa^Ct54LmbuUVdG#
z!UDK<zdt)Hf`c~<bv0SYlL*J2y0<;xgR<VvD8tF`D?+}glJwUK*Ha?|3Q1($4x$Pl
z$h{qglc`N;IOPPsnbn`uyxnOhD5`1z-&_$Y{8>HC+yrDG>V>)CW*GVV=WYgV_dkZO
z=T@?oLK7Mtj!%=k`Eo{g+-5DAGPtvqKD+y*S7!Ejq|OUCURZNqFwDK|w at tkCC0_)|
zDp$his=w6cp)D{P-<aU|nLfi3kKCv%!!C^&co4q7?b;}a&@29Reu$TrcmD|+RIq9>
z-Wm|&4M~!v?BWuODn;wB<i^`p?_+d}z9}(;G<&L3lvp;cajMa4X#-aT1aNIeWqKSm
zf-c=de2}92hp(MMJlYFn*K&X6!MLN05IAwdfLFi!!Fs4(+qgpKLo)1p&YBm3bx8Qv
z_CZE(jQvSfE*z0F9+}>5-~$-p`g<g;f){e+IE#9n at GKnA<EPSm!j|!DrdZLk79pBg
z<*&K(yykYwhFx_#L at Yj_O9j&kY!4X&eZZfHA9xHL<-!0u8ew+CKy=^_&JKc1=-|68
z`_BJ*NYH-*YIJ{;Crvgt=YK+le})ed0ueD#=B&o#zwX=yK4Xa=9Uun&Y)9aF5fcHp
zWAot<DllU6_h1R>Tn(f`&RayM$^OU%h|1p2Mm^qgxIB4O0Z;vVkrr26Z^-`s{)7V}
zj#@tvK#}vXEA+6Ll=MD;@!tb3{6vNP>GS9I;bF`?DBhS}5M%{s2MueuTKM>}O1#UW
z{3NI4--FN+dWOAn?78A32!@beKP4#I*?qhUh;TYs?$x26emtKQe7IZY(OF)Sh<~Is
z0p$Og9XP+ve~$<p))Xf=*?%8=f1-{5I at B=C{y%hyNIU at MWWYlqU=?n;j-vrsuNRr^
ziQ7u@@2NZLcf(1l;aAkxzmud2TwFA0^1c4p?QLu0;XxQA38bZ^p+o-RsmOc=5J^Rc
zhaw|}M9R=a%H~9Nn?9Y^1OF`sKVBZb-55Ja^2>ND#ed(qEhYvdw9}+(&6y4tg<!X&
z$Wt`dNf1QyViX>|{|MlpquH4e#N%?tG_ag?ir2uu!!Z930r*yBplv!&-FG0EQEusA
zZpOd)1sn_~@TLO&{eK8Ig^C#XH2E1A|Ne(Dvvu2n58d2M{~@y`D-rNR2N4v!zaj!|
zfe3Jt1cP7x!xU;Ipir3-<NuqrX$qg91FxTknEq!t)xi*|DD#*9a}cloPYt4w1^D at f
z3R$W at ssD|FnDfJ?;(b2kzCPADTVY_gk;PhDxp41PQ|WoDhB)ot1wLa1WwV<*-v$*R
z{29afS!rF%PmCl at cT~bo`kQ1Xjz{XLIBaxXRGqYWdZWqZbH=gRf}1(fxk2mg*}PU1
z%eCkejaf^!*oU5l<t*8mtH{69P>TVj-;`L>4Ixl at 9VxKErXydqPsGueTB6+gCyE{X
zA!lk@>e%==jg||KaKs{_{ZFj9hV*#6-2`>wa|6DrB7&q7Q7tL+EWS0M9QB9oUs7bh
zH~o84dxSuSPfBb at 8`1Dj>C3r<d#p6Is}b#|=1O(XHlS?^{(1je*ew{StiW}yCInJP
zP0x3RNj==xk at z<d?z!m0g{MfWv}_w~)R;#!=s^|sj~1f*OUgoVz|N|BGME$%4b4W#
zo<CZ5$f{5P6F8MSK#7D8LAGJ>4^;~eo72H~rdM54#83Vpss;TQxwB8W{xDSG4qTfo
z&x!VVg870K7cvmXO|HR-4&K3yoL~U?n9A3XW5Ge7sbvMnJz|K8Vl1;0DS$IlzR8#)
zak6x+4;kmG+0fI^|H{wsDi}v|^Pxg+x3P1W`1p3^90BJYnHbw3vNQa>xM#CN-J;>u
zoj*KneD;W(c~*4}LSWL>!CE}koj6C6gTR8}_7d$v(5Jt=s)GEV>2c=h$eNseZaTkT
zkhaQqlr%G=1#4W#UK+)1JRkti(5rc~zkbERz&P*8K>@#?c^MbJLEVL>U$#sx*Jb_O
zC1*@%XUvqM+eA%&!7`-28s)q at R{$oE-5daY7P9xP3K+$5aiIl^ZvDn)W&*u6;KCQK
zsXveKM^ER5L-(zjW|BMM?eD=Sf4Hep+qvzzP+K!*K9B($sCe6%nZfOl>VCC9IKCN<
zD9uHzRwW_X8M8~yq`b^0j%l#0K*PcJ$vh#!nlC3-M#yA4_p*2B?ULd=oJjJU9zX-)
z?iYLSiS`}kq=VEN7!pv<F^0CXoV2Y!Dg9-6N7la*uH^^J=sX4RIVTe-pYkR(v=}Yq
zVtKw#B9kGBNDK?cwFjm!L!vQ&l|4u15)7MaW9mE&Oe`RTlk^M}E-Bk3hhA`*5}i~T
z at RV{bW=<-LvT17W_|Cu&Pl?V{oeFs#XOd0$c!k}UyECpwB+VGZ8&c84;pmkK;{-9}
z@(7BOsqbC%W-Uu5fupNszaEMA;cpL`3m!)U)BjQ{U-PfpC<Lu23b!OyT6iuKeq?K<
zbD|;QR82vE7dZemoJCzEwp#5)j?kf at Z_d7)i1ul@!*5Nnk81D(bk*oKUm)-KvrnhN
z*_|O&IY*^mqG6n5gOnAY+O2FK<ZFiujMr~eoU&hBiV;3OD4+s7;#Gtqs_{R(E6HDj
z<4Od|q04?jhZp5GR#_}-kbe{+3%JRFLZw9sq$+WK-cfTbjOf?I((n`8i3(-Sz-wtb
zB|x`>=lEH|W at YavXIt5xpBHXXRa=`=UH!!1gsJ}5S0y;zIgzoYah*CpjX7!!|0)u4
z*eLpLBA#IuA(}>~6(73!*=me4K!k+d`?B&FfAV7Nu0?lCpr!Su$HLX!?Q3&=TXQvf
z3SW{-Ax~@Tu8Z`SXwo4sn9WDHJk)aoA;=dpDCnu*$mwB7EH7AxP3(ukngdNLkGbYf
zH7{O+mV9xShvTFGgNB%J1jEY3&5FUN;QFa8QRVfpzJInIgeC;Yig*pbQO7Y2a&MG@
zXYjEA3H)<uH9LeH<Zcy-MAPPa(0^>}RKTp;xy8ssOW`)>Svwe!=+U2JpaOX=H`o7)
z59QMeDIbNw%qRk1@;fDBr6jvhwo3-|JeJ)!9(@jn_PBTMYuo7=cn^260~npZcLq?j
zXwjq*_Z`|~h&6%`LLT@(>waziIClAJnWpTCPC*M#!{&{h@!aSF%I+3CgKP;==E)Pg
zlnbvP#Gz@|A{ubRrFT at tAdbK^GG_uY4r}qr*<O^r6rcMTP~tC8OULksg4t_DJ7AT^
z8G`@3iJU=N%Tj$+<Z99uN`#~ux<Q&++4WL}y`X<8_!BvyzE2*-%O`~;`<$Zla~IFY
z{Q6 at X6gjZ-gD;xdv`8Ue_~Gq_^eD?fM)~Hph*~q|iCTQD>ybK2-x4^SOi)!*GcXmL
zJUn)15Eq6J;<Ryu6Bt%#J3w^@w?Z+HrM at _s)hKSfYL*re9mlu9L)M<R7~RDrzgzVj
zthzu5=1Ay=cM0mo!18%TP at G|9ZLKvwJ-!gE=J)_-%KPi!2snxynWKgne{b<Ao3c{w
z at pjd<Z^#Hh$imCX$(c=cB3Rsu_?IAQfzf2M$yAJGFr0n79p~UXEs=)?ZOqEjM<()o
zkZOsAqjViwZCq!v^T^1ztz6?cWh57;sJ=LA71_(T)$2*V(Zwexcb}|o9&PFoF1BF=
zp7Ne-|AuSpVb=>1;m*vpsah+2B^ybLd)B#Y*cLh!&CqFG0HzAepB}z25u_=Zcwg`i
z#XyILiwnWFvAsUZVdmqAg{xTQxOi*3u=fyxfV$Az<tNBMjBEglg5RsRy5XLp(AJSC
zgn9U%`#sAr6UfR~R`svHlWhl~p&AmBw6UeBIFvj>9F=SOzjVcWnFLum&5N?Rx~QfN
zej|*bhEM&TX8hLqZhxcrt_AIsk(W<k$KV-ASjq)7+6;nt+>eo=rcRz6I#KEVl3MvK
z+dpy+I#4 at 6Z+Ye@Z1rfL`W3>ykKUiHEc`BphmIJ&S;LB>-1=Fb#o6==q(Fmfy at En}
z-nlLs$I2)r?3yuZ*BbtuiY3qHmiJ&MWs8suBM6m$C<c|neQ7kx($_neNe>!is<rBk
zX6<ERo6+vxJ&{hJ9Fo%$LiatB<@hy<w>=TJM|OPy&N=<X>OXTfg&5Pf`bY?qDm?1@
znel|@z7@!({;P?E8+OnDv&O3s(T>BxdO>w5?#)kh>c1$&lj61w)TZGVI*;z at eLef%
zc?jno4|_3+KbR2XrOold(Qe(FU<TB!hjdoQVu|Fc!MI{BheeJn+ at 56WK;Ow at 8|iEu
zf8{>E>L3$8a5J$Ii>(&oc&LYk+0JeE#&aS%u>Gpt{Jz`bVNKB-3&<XF{OYvbMW(}@
z at osq^$1!BK73Tlj*vg!o(kQi)FfK%%4);^QUQfhwozq&kV)T+xhoi{e)sYJDP6iru
z&gN_Kxz~|H=vXBJ?=T~)J%T_0Opcuz at m~;$yPOA^&*hidpy-2>J$aA}nSf*ckwh_R
z19O`mhwoK_IVO0;tNHs at 3J2P6LKgPJQCJ-HoM)nu)Vrcf)|HB|7T!3B_U}pQ1|uIp
z$5r!lxpBE#sQ+R`0v3SQYbZORQ{78iR^a{-@};0HoLm;7c1``#YeFza_Ik>U7wU<T
z+v`4icCR1b!h;UDc=Qf!7f5F%A&2Wm!wf}>!M!l<ruYdKz<RTYX80+Fe~MZCyrlDb
zqV^v<KlaNGv~AR-OmrU>Q{8mLK?;2z95~YwsmUEAvq#?|n3X|tmxdYPQ0P>K+Z5)0
z6eqNc(h~5 at We-bS#*E{*x8}|bNkmjlQ0{wt1bLK?jm|YkDj#Zq%d>#R26m1bT$DRs
z)=ihU2n*xQEdf4A;A+-1R(iqihhpqyV1Ax?FVp4;jzyE(I%u_*EO&(sjahNJyV2Yy
z4UY0P0>ws>d3%M9NcV-Knu}~+=2waMh%@@<Jc!1SrrqXIOmYEF>0;S)aO6_A^BKv3
zR2M?>NzS=YX%utr_IKHkSANp8sd{r<yrP<8e1LN90=X%K3R=0^SK`e(3CnpH<!+yR
z(}bePrQ-51Iq_;2|EF^OzE!whg6^y0!)Rz*cxg5*ag+oraVL3f_5JM3Wb{QTHM(1J
zE8>dUA2DC)_q}v(CB=KiqnnC)s99V>z$yp*>jjS;YZ(Cfp{8!jrPjF>1RV2z=Jstu
z3-byz87j1FT~77OpE2<8Q0QnNcL}(~=Vd0!^0eSD<vR(%C71%D at 91QxW7tyUQlY*s
zNEKE1ymJS`{m(M-ndT0D7HoQiKL0jhP1nhBTp;W{8f8oqWGR$2*bKvRP|UeYTm!Ry
zJzJNfjC{F5*Ip>S&UmYL7x{hS#LfM<kzWK%nK|Z6l;ozTVe2~jPIgg(LSuRh{rE0l
zlugG*kp{Od;)L(PdM2*iw}tI8mE_>QAE)0s4liYqtH5Z&+4r&pU-Dsh;-~=04IMyx
zM;bx+&&u<k6Y6rXN2-MIZQZP6Teef(aepQ;&UB(JCC#?veO?J}JrL;{<|>lX5LjaE
z=dMJxKutQQLin75mhd3M-OvM<C%Ym!z|n_l^eA!G;0Y(Wr5ggCg=hD#W2Og1o&usf
zmF_bnfs7A}mhkX?Xhh^YQW`<b9T at v~5n2E29$VO2q(Do6S!378-V54=xxK4_jKB|?
zhN?95vcEt4jLjr;23I>h0j}h at 8UN#n(8qqkmV<$CYmgz^)16dEBVRl-yl6=A>)&%r
zfJ!;U2}3!Zz)=rIm46EUkSHtZ&^ptRBG7zAPnVyCu at 8UbNUok1fXTcWy{czFlOj*`
z6$OBM2M;YJ+~IRqpFO1y!%wE*=v&=okxIR23gG$j`F%#$656#$L$%A!v&Axgz;2I2
zn2+<<o`AlQa^vd`HMlm!5DdcTkeXLl=yMEpw-~WnQYq1^ktG`@A>Etk(%(Db+AiLG
zS&)+z=}JAxg_4HZ%qk0=cvEz4u)Df3PrZA1mlM6hjahoq!L&FDL%qmYMQ+OhtFj)g
z9{Rd&REXG^t!9=Z4xqk?mKcIhf#RPYSwSVO2<I3WR(5tWX40TFKfgMd=9n2&DG|VE
zqTzQOpYo5H^*w(MC_f06tF<t22;=wQT1Pcy{TAw7>G`o%NDep7K_O?e#aXTrvVwqB
z<JQ~#?Sm3t?s~Y37sU9D90nd^rw}aWK!Fw`jtKC-QIgOSWJZoWXz5DA5fFc{kQE@;
zp#*k1#dBa}IqH3v?M{*yl2f~(HQ)K*Ipj4`k}iC!v03L1bc+kI0A*#Onpxwt)Q&`5
zJR<U%?4s(UDp;<6t at lz6Vqor#oo9UioA*^?q2U*5elLlQB%{>kcjniDUeC2KSzCY2
z-xM}NbPGauossC_deH)Xqbdl)R}mN;liuh;E_rBZpLPaX4Q(qjc;4%9>Kv*Xu^mwe
z7am6XX|DpD2fUuK(Yg3&4xO88piRRxk~(SG4Q(6ny at VDIUGH;}7V8lSAb%&F%X at z&
z{1 at m@vo2%@(7m*$wwr2#8}|>)R`i&`YJ4-W#E~-mB+ieatmraE8xL@|mg}>Y`tcUp
z_EOSNb at X$9!H^rcF at J?ZR*V*J9$fBt%k&}+J?<TR at 7riqXW2La*I16eT}+Zt4<Cpx
z6;j{>ckrNY at eZiy)nh)5zrh6SUS->3^v};3+!UP0`1yG|Mc+IR(6((iFw$fEL7h}N
zXiQ at 3hgZxm5F9T^^Nd4wNEY%6j6~$((P)HgXej4e3~8>Q%c8-DVGQjPkx+zJx8f;>
z(_YMB$mJ%{tdX+c_)U{4VU*}BYY74}3!bP>8hK9~0<e!g;SD#LbWxQ;*ysV#fl7BB
zK&Rkv$)0FqI%h%{Axk3Ccob>gDP{F0W=J3IA6$mz&-Nqp7AvdY1SYY}fz26qw_`ye
zVJCBxf;MhJpgrv(@I7*6<iy)Iz#w`9!KD`!z*F;O&bqx#syk?ac->3VyWU>c{6LXc
zDQApuu7`YasKg#B?K2vBv3v9`J5p1jZQao&WCRqR^I3B*3>nI7q5Fn)&r%gEcFX+^
z-C|vIpwaF|P4PQ?V6aF2mDjr4YV1_cjf$1t1}QuK%Ov%f at +7dY$B}MKnf5YwY6dEq
zz}%C|qk(13Z)DHbV)TD=&s}Ak`e|<ioNIg(G1{g{WI*zDF*ya0&Aoh&Gh)Kc_hixQ
z^S><IDMEnZqmJfuHfX)7#)Sy2F0;4PB`%tKh<xr+l^96#)7R}e)w!4{xE&a-i_%$8
z1wF_~{mXg6qx^j|3lGF(>Dnag+NRRgR~M=6_IH)O`u;#Z%7WCq&CInKRU_+<-il%s
zh(Ez#GZrCPeObT#3&gu|-erD~7S9WH7zMr6-QwEI)eBC*cP(1Lory!Hd_(#5Q at 4;f
z!JAX}%&Ex=xHiy7wvduV&-;<AI~NH04A{uom6D^=1t`iq?aaI>W3joVYpRQ`Sj5FB
zmfX|<H;!SqrQ=|6k$n8vw}@nm)6 at ZR+aAalwoO^q<3+Tk)oc-7Qmxi at UX#DpV0KP^
z2f!Khh9zilS%i1O(DH}_ws4g|->B$dkcL<50Z)gAf=unTQ+RhnS<1G$rZ}-vktIH#
zFx?2|J3UnI0i2f&6Ic86dAWYGyI@}2By8!{0>=pKVpy`K%?l{W9BW0?P$nNmIG(}0
zS}()Md=FO32oufnjtvh{q4hb?1Skd8h|SzuN0$F+RUR01en$t_#)1l<#k^#Fb&e5Z
zWqsIjl-Ou&Wmfe}Dr(HNGn%r~fUQS^g%lMb at O-P5&A6`eWuUo~nXQCxm^*hryvhDk
z+_Oo6uge?V!R@;4L(;Qum@!b^oN5^S;fLe<^#k8D6w}ECL*71XtAnn at TB&yBQR7qe
z1Qd*n=N;V&XNx%Q5cYL1RN)eY+`)nN*SpwF{(0?I?R$xP;7ZCujDwu2ahLrTkZdi3
zmgx;7K2>1zDtZ3Pc>Bfz*Cs;~l*nX!7o=ynsbX{(a2RB!J-OeMwt%rx=}0crJN#=v
zfI{!zxd66u at Yz2??Bjv*L%lWNC{7~c2V^B5Kk~kuK)Wn0wxug&S>zn%yO$LFY+bk?
z-~Y4Dcx{Op4)|YZiNRHk>L2)NRZ$L3ZSwFLkH>4N?OC!50&bk2Xh$STYQB!(eAmsG
zDt_z!gqj|hT&Vnjdps!PzwAGH*gf8o?|_+I`r=cg``0FwoN-W{gHUGC3t4RJI63Th
zT{v;Q)QKO}-uyc9SuCGTKe}0P5?(~^QA88qmV!5|#pBN-^go2Aqd8pBPH{4FheR$%
zA>?83r(tMl at Cy<)(J#Z&UY`3|R<`e7nzV0+&Tq;+Z#W<t(IqA<X!GEp`gPgfyb?OZ
zkkMPe5<Wutbl>CsKLV))8VxMZw1nA=Z7s1BTac4|aqPknzIAKz-)XQgOX5$+%i_(<
z#h9_C%W!AND#+W!;!)*J$meMw2APp;yOIQ-q<;7~J+DabGM6B$(Bf|FM+%1}P+pfJ
zE6hey!y$j at Sh_0<6lN`|D%j5}Q++0g|2UGOf&w}l@*C+AK90<h);K2DOC7f~GF)Mr
z3NoGou_fhSYV?HUgfnDy6AyUIokqr+Ba!!drd)En6CEs#&;8x}n5yOG4|JdY7uH=U
z3}~`^R<hYCUsDu2xZ*QUk|Vol2{aR7j|kSgl8*3a6U*@tn&ZO|_xb4~X6R#6`(HS?
zCo8nghK(A(FD<ob8Ubq>7kzqZ`hS7JSDeAcScqF)GUI5ub4Cfc^M|zV8g;B&a^NWL
z=1u%qD*aziuV6)?P6}pvZ}UBL&Vcj~rvCo`hW=j at _`e6_|6d-&b1kGmpH+jsgK!*<
z6Mw4msOGC}B-!FQmj7lA9ss?LYr#=gRW(lEukLbE<M%y<4&!D8Xtc&7o1GNiHFyz`
z?sy4s+9ewuQp)N0r0ZJf^d_Csl{X6Jim1-;WV$q|-#Z~K)Oq*S-<BlI%qUV-<cYls
zILz!X3WwG4S7(c;%qO>s at K3_-V@=M_ojvND(#piTJX^<_&%Olw1iLB+byxVGot?Ga
zdC2jHYR#20yDV!(kCblu#x)Y{!fH68`*ZZ;{uA68tI#w8h>Rk%P?8ZH*YdI)I-fp@
zitdj1Jg#=$5`7405#D}AgVWO`$*)gx85%E7S6<8g86)F{0ehNE!0A@}AZ|f2>q7XQ
zm}qmR*vKazLLbrzA~K?`^IbR_P9e{GVMHXk@|wn{)ty at lmvWp;5pnlx6m%C=y<l~W
z2pG)X2zsX9>Tgik4vC(5bq at LBLE|HFpK#)J!TBA9g7WF1MH~;-n-LE`?2uajo{9Kf
zq9%WGI6tvjTTD#Tu9|QeUj!H*WYbg!1z4|Py%Zm{B$DZY<?-H&#V*PaO~}<#z)1=h
z!mRh?I+4Sqki#xN;A5#Y{wde^bL3@%7SVYg?3>e84O}o2O%iVWkyucD9+IDjMTO0g
zzi<^*ga at qR2VoDbGBD#|X-Hwf{{iD0;<pbf!VcKtYN1T;v0qUtWYyP(b{!OxAYYuF
zedz`NcJK|VsctA!v1xf8k{DcE1xEmXeeKg$3*UqMOGakwbRAhKk78%wYLrnjQG)fo
zb!5StRiHc%tFjS=t|Q8Zhy at H<Ppu(R-0*JVQNL&Y_B-H0j3TkLzJa4TMS+GhKvkmS
zWHy`x*f|i(kagN_A>)pvrmA&(P{}$tRTcOp*GK{87rgV#_>}si-C`mc&oDqgz?cEL
zIf<W}Yj-5eoto18iKwPyVG6<J5nDDd{pAwBc&)ldxlnUo-zJ}M&wdnW`nPh1QCAXY
zWEgN>>Y1D(D%MT#LW>+`_Ai=JoxQMCn#E1A{s}_kG-rUu_nDIXvqja+=Dpp1{PAtx
z at ocb>sgu^NKe{U7ck3F=M at 0i*X2Psnb|Fs0V#v1PLn)R<6h*No0hdFPR8f1ct<L8L
zb_2^<#w;Hy5f-+lr^+GZpV~^t!<+YPXI(Da><*-jvbYUqqr=KSxPWUnW5(b4R9kg~
zug*obYa33InG@~j@>p{&2H at jewaHUNOZ#2CwJ?@QX-gIt)70AbHOXg~0K?+0;X^ZH
zSW4Y8<N27nU_AMdz!A3ip&7F#xt{3UIT7$Gy0QqukkDVglh&~E<Tu<JKW|@|$J{q#
zb}JsjD?2<poVMB5Mn?<kZZz3KWomp?aZ=V$ZvRhds8!YG$UV-~K%`FA2-d?HUq}X>
z^uGf6H()mq!09#S6+?1oD(rG)S*KT)D&23nDBy9kNWJfT&_a^j at A8O|x$E|}xwUg)
zB7_u+a<Dy7{M*D-o1YzH&3aoo)&%MNr$!Eg)0>I&rg9E-UVwM)qO;fY<cjNH`NObD
zjd*9~v&dvZ0CS<OuMgQ_xg~~FfWp{*L=Yfrdc<@1<TJ{1<grjc7eaB0A)0)s2X+Em
zsqt- at 7jQ81rcL)4LK@`w4ue*XSM9do6e9 at yb}B<sg<ZN{UaQ-WD2jf7Yuj9fhgPa%
z&kAsd?3WOGX=Xp!J*EW}iE;PSPid3bB^3q4Lqp0|`LIx13<G3n;EGJboo)&b^v#0R
ztB%^9SLhg6X8A==&IdMAi*?8x<jgeiQq$7L at -r(bl!u0_9BiaCik>(Rc`3)RZSC#J
zSXzpt^4f2C^g at u!`E7&SH(q at jvZ&%Wm+rZ_K<V^BFB`T9X_++-y?DMI6N2ylN<S6b
ziTKvBaP40qb(Pms2!VPN0^g3dlBNBW4OB}Vad#098Qqf#%0hJBv8>L!i7tPFDZL|a
z%YF=d2FxHua6}qAA+?WEj9cTVjlA*aWQtQj`yJ*7dY;dU^VH?Pt7AXUYC2ek+bir9
zm#UHkt~?bb3<N&Aq~q=x_}xLHB+T;!utZ(W);I3}r<LPm2UI7P&jHHxA6Tn!UMx31
zAM&%9Z`n;2AmMrp{j!S4q`s(!o){p882BUs14t|XGQ2lrT*yj_?mkCz4KZGLCwsj)
zt=8%-URM3&9OK-|iXzw at x1!NV+{i4zU54_DNZBmgmZ9UMzUmQX!M^o@(dc5Qre)4e
z=2V`D$OlZbR~T3Nkx&2=8zT%mCGQ?_fyV}U3zIHxD(fHRC*v4Zhz2AaySed1itmak
zDKAO4-ksimHwd}xb($&;HKIVaxpIH9bWfCtF%UGq!qasD`*u{QN;;0Q@|^eG8}&jN
z8q8ic>w$xNge-h?M8B&S6l{V?JgB9ffK~YU5>XFW=+w+o_D<jk8E1VaQ(V7N*Q8q4
zq}d(gGP5LqRcCq1c6|30YcZ_!*HUG=L12=xqbUa0BOV{G&#yR>H8p-?4LRV#U?_9M
z8v_=eRbUT8dP`bIkCa>4LJsc{jO at TBzx!~m->aZAf6?0MU2W8SvHx1)qkjZ%s^bdd
zRq(St_>d#;9Lfv*fcMRB%Lpw29p+h}9EacDG>>={jN$W=LGoi4cs?83SV`s0qNdHq
zDOK$9emd81a~WYp6TY2t at eo?m*&3;t_*^MUO{1~H`>QlvV8W+p7RR5*0si7*<?`oX
zS;-0 at X*C-!X3>wO0{=IlM3Ze40<JCIJG#(OZU?MSd^znuiM(o1)#M30Tag4P*s0 at j
zKa9fr3?9RGoYHP>Z at 2f|vEw?&341GxC^)`uY+1_mjrM|nMoo%-z%IW at OymJ(!(MD1
zn5^`u>MTx>rD?!nC0A+$x-6&Zuww(>ALI{AyPj5i34CrV^o>Pvq;o8hycdqV0h~;)
zzc=XpxW0gfetY`}-H`hRxGby>*f!QXVq+23P@%pk?#sD$7(twDQAC9l_<?=NA_ki>
zMSP<z-$A}4^8=HXmd<Aa0~#S<i6HPyFTj1EtdzvWAd<)^uf3R*IA5&HgijAgE*{|8
zB#W`gJ1F@*{9`pWAolu+%miR4x0*TDBv6T3K_jO457TKb7IFegRPp$KO#7~j^4i*n
z&=29Ca25O|l2kxgR$89!1HKFhxeAFUil?aL@%FyMc7<uj;<!yXB%OZKkXrIO%TnB)
z`@+hFKwTilpQjEDP5kuO;BBBR5|+4e{;hQA#Wfl8GZ%eB^Lh6CUPd?4QmZn?Nb75&
zoSLX{OFkF@!hUJ at i*p{SS=btKn*uW#AZsj62PAf_rk7_oe`jVyx9bQtcFK4Q*OqL8
z45S+j at GcX0x<nA6qU{LHG2S)Qb{#4B16xP()XNXC7T%oyPHMSvD;Ne|;*q_WcpG;k
z9_3b5cnyA>F>iXs7iwGKeF~LamLUYYvWzZ_bJ*iTfk?B$*4K-BW-}@Mttz0CIGCIM
zBG4uOx!6d)1l*%c<6I_nt$#*qWQn4HfzB>fgNY#2$-)8=GY6(E^<?MuUl*Syd*{_U
z7<_gU)|!VH!-W(659Z!Fs;a;H8r^g^NViBxN_U4M-QAti-QA!9N{Z6b-6^1ScZ*0I
zLYhOo8}<1<&+qr%aqoNYc<&w8vHx%|;GDhpr{-L9uC at G*psmh|7&bCn+?|ia!3wdS
zmXZycdm+sSIi8Igw at d21YXYEC7&6eEsUUVri;%&w9#0jD9&(^EyodM^F1fdwHt@|V
zOwi9=KSQ7qN0cwv at Xw5<DG~Xjy$=KIEurNq+*nQdaIT>OUGa~WtImolW*t%Uj7lq(
z6vW~TFN)XmUb!nEm^^N4$mT at wLJ4kT=izF(Ux0WFF&}EyI{n?FONf7)FKju0Q(Zmu
zp4y1MN7 at eU`@!$U$^*qIdI)vItXw5mtVs2Sj&`kfEJ1DYE`%1CK7k!`kjR^#>*1YF
z?7Pl92ZL_AT$uOxP(g~G;?CUyDtS_UXyR|u85N-M+nS^i3u<QO&tPf5X!#x0hQtaP
zSTG?Ge*FT96W5C+s(mg%@Fl_ug%dN9?1rCxPd7reH86zbw}=S3p%wo>Gb{aX<v1}9
zVxVuji+xvpyXP+TSjOkFw+?Y4SUEm|+N%HI=2G#8F}5Z>ternjaEDGw=JM)@8r6I(
zhw#^z<g)w+^A#*%1LEM1#2>^`%uFBT(<e_UV%Dkz<FpBC!@mGWpDrCV(<AM%6<etP
zo-iFWzl8$9ASs#{m_f3;(@6nV?aT)`IV*wxbOeFJuRk0t(Xk7vk?VD5`vXnN*o4fk
zUWLP~<beU0ZRJrucR$a0+J9yxi!Abl-k(jP-fc~w`xr^N=cKLV^!3l2!G8Re_Y;yO
zS at 9H<_{eq_ey|g~FdnXpNgP!gbjaulw`yq~MPJqF^(9wbTxkKtzb1#1*Q3XYTC+Id
zP7?)x%$AmUdAX3{Q|>u3`eE@{)wP at t)GsYY&xUcI at LX((EJ<I0{Zd|TwmCiGXr>T7
zQ-(NzjE}x&UIXiOF<SDZBl7P6G|qU1+%!_qs at roIErT@DG<u;+G0gJ^1!y`9%P4>i
zA at u&5IZlcuA=v3b!CaeM=hoLq^fVDk6{C67OS$mrLezJy$CH=vyX*XTRb!;o2HoAK
z)<7o$BaD$3>x*?5QegFj4#UdQoWT1<i<|03np-~;93#=Ajl^Hj`$4)gD?T3u+db$l
z#SP?`DS$rGQ*sYlx$K at -z8Ovi9IR2kJvsMvKC99au7@_^t1B+0NDN^i3SS;%lXlpE
zgY7_(AV=1=%5YH`F}Uk1f21y6d0r1DNWQKzb_^<BiMzDn4g0gAerkOJ)$b0Ed6n6%
zE=^r2rnlV_y|7>zo6E)2)0%X@=s??=&0D=iIVspnP*)H1YenLCo01U79^1 at APZ5E8
zBxE23{@kbqZvvVZWppt76~-8Ulv4g9YQ?qG)h*W#O6J`1;pk%J0DvL<bxmUfEe*>P
zj-xVicXG$iUmXZQWz4+`^jwr8OV=MKI(XbzI-}XB*k%x&Z{G3<-a%}LMh^s3X4l`s
zi4|kH^~-qXv)AzYmSY`2z8%KOIXQqIo**i;oE-8MZO|(@Wd*HK^H^!s_gKi|x@%z(
zjGidTXdncA1yhAN`6e4;>Ov<S(f<zd*Wx?iD1`iQbx~S1K(uvV8VsW<oxd6F%{OyI
zN|Hmyo_s#UV!syRjzekqUQ-tBj_k$Sww~ft9gFEJ(PBfk_WE+fAko#gGB>wBCdfou
zxk6V1I3q8<Cwtv5zHND0HC4ZQLll(s(!A#zCcVgwC1OV#S149Tav`oKbI;jQD7aMG
zeahd(WZ)+$7E+@=?*WuO?Ik)d6_9p8F;_=q7HZ%k$Tqy*BagXL2l557Yz^5b?HBQA
zg!Bzn?_L)B510blFP|KQPVT?~$l|;*kwXtqTT4q+CTpd8 at 4|w{SrNTwX*zmjg!NR9
zel6bIEfOCC2&c-dXM8E_AAw+${JcAaQgIR1MbRMpJB5hNV8U8iOCvhgzo<@$ijyo*
zG>`pw4J;m!GmYcDVAg%P(JJJA4yAJwn(JJpU at n1Kt7)kLEhOEp!)FqurM3V=+hH$d
zpxb5*<?`izGilE9=~`*VU}H<FuTqnPn#@yHxt!Oc_gj at nMl1SVY_5i2m7!xTPj%01
z>&FSo=AvwXU&nAlLZ;bUGtEbBE|rZz9Sjb)uZWE>*fs at ai6offgV=%&BbG07B~kb-
z*_+z}cOM42;|C}-*++hzLfBR(d<i<%&f*{3S at LRar>>HMt^AC+Yvj@&zrw%%8rJti
zv$lcfqv2hX|6Cb`7CR8fH%>!&KQEeL{H%^vJJ)~Z18Bd*(B|7!q}dQDUv{zR5zQA!
zUB^lEQv7>NGiicu_)fa`IH(J2a4myEj{#W@*wtPRmh<C8RO`yy{Q-eRIS<rIJN@^D
ze!Pz*@WDnd-5qDX>j~TS+ at iou!C*qO(`*uUO^(rxH*ropgzCp?uM=2vinnBbnQx=t
z7hDME0b|baYoZDEcIAY9fwd0{RGO+f6!c77Zoamz&)N{VE at xdwn&oM~w4`W@<*>1J
z7Kkt7FE+XpN)wDpKD)2+^z3lR^jtZ*LYnq{R)}TFEG8sdjJ6_cqr4H2B&eP37P at 8H
zqGP(aXxw1KQ2VXND}&udqHzVBg$s-jnK+~LxmvRYOa)iw=#-Z_Z|nu~UNX at z##=_P
ztppr~5 at T8oe0VJA@ltIS>j=(%WQcoK9~1R7b}t;pSd@`)CPYMBj9sNtUoG~z7d%Xe
z-~`6;V->XfC2 at S_ui0Vd190Nl*e~ojulHfaim at Z*v8j+nqPWF|WvP&1yZKwZLkQrr
zU^C5%3!!{wKUTQ{pkH9`%IV?#0*lYwAb%qj7**?N0B`Nl-WV&)+S_d4s8gMo6aj*r
zkdv(~?&D1!Esu76UqyHvcrf$9-kNidELi8I<t#RDxgAVy9+FeSu}<c at Qe%(uD5C_c
zYfFst_J)(i7n*j5Z%0w(*eYnfSt?i<MQRXr=DU%ugP(M?Xm&4eao?;L)!Td8Djc8z
zMzhefy{Dz={>pt-qqUNvE6pmQ%ubsfA~TE4s@(>YXCK2!`ugjL1N$AzOgx(6zD`bF
z at Apt19afLVz~lm23=Y0+cw^GPbj9c+ma*XvgNVJEObuZ|<OQ!9KymZYWvZ&r+)tE`
z=FB@~)Zg)`E^&VvY%Q`%Q6t0VwW(oWNEC18^bK>~6&x?J{VKqACehjp^!?@W7mh_N
z9f6dY)XQ!ba7JvfouN878{A7GAXdv!%CJ0*@`8S9$1<Wy)Q}FZ)_tb9?G9h<1>Fz9
z0lrno{8Alvo2aZG at +e_g+|RM{skqC?<8g-Uc at M_rg(ed)KW8%65&w8Cj2T&7u&2}N
zS&FKW%yFSG0_sd$Nx_=~aRDI}nofpZVZ#yifhLkA>%zD2-xbN*>k}NLyDp?pcx}&S
zW)qdQjQlFkt3ew%J#K!mC)Gag8hSMFI4l!(DS4^$d`bd8WKBwU7cs~IXeu(&dq(#1
z9P(8A#U(W|>nERj*q2CI*qP${m6Ew_D at UXF*S9?Nfb1IP$lE5Azc~u=1>pR!Kp56U
zD~l*WFenfmtVY*y$ep&8;1-^=t{a;Q<*1tvsV>Xa*T}8awdToCuGg at 4;8pgoj1l##
z3b`77q{~uvP)Jy7(P8lg`B=B?Nl6B3Nk+^$>zDS59~T}k9Jt0+!M`Xia^xAeeUG`S
ztj?v!V(-Ajpk-lS%)+I9+ZO*sw=BXVryXex>FENr^tw&qgl_<qq_5#z|FG3c4~m#S
z4P}mnSu at rJey+SqY||e=uu_JfA`=P;N`kl;WW5j7!^Xz78wdyI2PKVoV%5-`QyN$O
z$q_QF(0J<>Zv|B+>C at BIj@Ru+Y>RlXtj6Nr)ldFT0K+GeM1V+!s=Y+Z at N}L?sner=
zM-i#hJP|!M_0EN$q{FK-C1O7VqmmowNVdP=a*Lkc=faX(av*{V*^Gz}2D<=I#@dqD
zzy!0kl$1YH6Yd}eelRED$iV~0rFAawQw5QWIQET<sBJM7d{_7>X2oue-DUr~z&~)2
z>sp2fsAb6y{`HLs^WIz6NH^n4hE;51$8x341{AimKB0$lbW_zE`MO%kE)Xfm1UUo^
zOhh#uD at F=JU|EtstYpx7(L;wE^+UrSF&C|>H6T#1BIj;T)(BDixwZHQ1{iDFA2?KA
zoBmK(Omni!uA{#s;k at CN0QmL{Us}3m-T-#V9#iL%elQ7~2S3*G`#*0Rp#z=*)*q2O
zs5;3<V3cv(?T|dsRbO1k(|u{GL<@OpKYyac(hF`wnRhFaqUyq@^0{RN>q`y=ALcuS
z?}_gIqKCVhLs+p#c5Gh&<)F3rbMT{pt8}aoDyk2Zi+ax!Yzkpxd1`=Zvepows{$b`
zOH$0otTkk%KvbpnTpC>*JM##-oVwN7(&T at DNfyj3@*>a*5B}K=?H{f8HvGYZtcDKM
z`Cn(YBmbg9aR5rxC7yjoa4$Fhb}EH|ljsr1&YD+HA6y?}%32;C7=n~#uZ#vr@)TZ{
zM0q3li;B7KYfFq3*FomjKdl>bM(gmw5?{8 at cc!X;Vf*JPMEbzwi0Wd0av+8pxttyK
z3cl6n(vmgsu|o}(5yo+D!=YgzeN-kRWKdQJ+pkUD- at T-rGPhsggq`wC0y|Sq^ZX8j
zGup<iZ*?v{(gzs$XAI~cEa(c5J%F7sgeok~qFJ>p1T3GaS`6#nfXAnf@>Uh+izy0$
z%@{?9QeJ$cQqWqxQG(FGM0``WMaLxi{U3B{z50+5F%KeF<y8 at XHmT==D17NYAv=LU
zP=|@U&CYbM=1J3O!e1zx|B&hN=V7`CDS#PNnvHSnr4T at zXz^s7 at -K;*0>u*W%|iJB
zDLRx2-d_ at Mou+>1A!}j%q*BeN%&E8!rT4&p5OAL8FlQ{x{-dqL<Nto9e^V`$hs2p`
z#(xweE~W=|%Jc8U8JRC*h(Q-=@==CNYgkp%WKE4B-(4Umi*r%}dcEJ at A`NKP8+qlP
zew at -IFWx6PaKaEbGW_*#J at BI`GF+#_<Bs%T+9dGm3O<fI-sWX}d$FW=Jt)}cdN^cn
z{7Vg|qgCB|y=%g?ES?)2;v36?yA9~C6vBT6GH6H$Bnbh>fD0f&3^7t9Fsgb%qI6oq
zt|bBME;E>xibiK%UU2c!l>x3lCstXPg-ZiPHqqSK*!B=+LtaNu at 6w|n?&>fymyON)
zKOUXK4aV5}j)E*0eI+Y3m#E`uktoB)ShBa at nVivxUh&#MA?IbZ$l&3$nfIredg?)L
zztdt7sFQy0(=OthK*}h-u`4LlH7c+rDyLO6 at -$-QZh>jV>z*gT- at zbom1m=hxb at c#
z>bL4RsHfIZUu2%h$0Hs?;Z#{&ESegvAIG~^gK{gaky_yMnv`RDOYZ4y-|?DaRoX(^
zGWa~~5&M5IMfF*(ArDd2QE%QYp at JV>56)CR7rW(OFK-6DTk}Ta{I+^@UXJVxeze=W
z9FDBv(|bcT%XFEBCEfbUw##~t{%~~d<NifK{o}{1tZs_}Sa0n9sSD5?^xbn&Mvu~e
zhIn<+YwM>FF4iYPilKkr4~@?=@ST6FljWPz`Q^JyvB7D<tnql at 1zedXUI~rlif(_$
z&x=;?`XHr^6Q4PrSo<yCo1HL<_HfH1k9~?2evZV at V05xzn^ymGkpouNJ^9eOHG4)^
zt(N;u0{a17=>5~AuC5b{0lQK!I`F`i!_3ity79V(9~^(O8&iyGW?KLD7X5h+k<ih@
zip|-F&tk?j((dx5FRVL)Oi9`=zy}2iOc-qV9c at bc309m9zcQzw^fTzxyFL>gvKjQj
zE3BpZWo(WT*i;|Fdv?TnZA|I{!NEj)=4I86*>sL93aKU4>5jHT*j!0GaFj^3c-%1-
zG9gKycJwv8^-&6<WpdebK9AZHjEiHVzB&YE3~|2xfAYz!4<p!sHyUrWG><(P7BOaE
ziTPG?zHs=TFD%=+E--iPKYBlmND}|#n=8V at gsza^v*seb{4R%x#P<2)ynUX{&8;t2
z1_r|m3 at 4;#e9k@^Xw!<GmKR$|%PCb&t+29Gq4&)l at h$-<37uT5S{c?{B-UIOt-RS?
z;{N={EW&^vRF?o8h*-ulC;Au#E>aAx_bfvJS)t%ss2hitW$=+qfOInPy)`$%%Ye*a
zGoeH%3&ejoHS8k6eC^U1fwYeMh6`MduS>1DNf*v+QIOz>Z}x_nzUvZ$|BD-Sk|=-s
zs_0^6*qudRc*bFGEZqIp2d`{8(i#5Q<<_vQF1xom&IL)<u|d~fAnV$J2)}XIzjv7!
zYIMMYAtuJMG`y at NY+oNGCo^l-D%av at Pfz0$-lQ}9BWERz=FuYeR`P+hwJBOR%NcU6
z^P9cfmJp{A%XQ at MRZO$Tid3Nu?S@?+#1Q)_>^BdliTPmBv{lRpY~j9Hk{jix9`B7>
z*3Ab6qhk`o<j$l)G0NCxN9{Q8F#Y&KXGK~=wGu~&MsHq~UpQly86k<V*>RF?DcmrA
zV$leI{3LI^UMFw$P|q>pYmaJbkp~~k>#*F0u{<wt+V(>+Q$0-XmZ8p<tr{J^zC#lg
zr#)l2!|g~;FNh?Io3NK9hSuh!%;ojBasHd_X>Pwlu9t(=vMv9_%EpU`Kz(gzhQ{!=
zHW%`)kU?34Al?$M><kxkN8ai1altw=^G5L2JPXUq45mYB;7wIP1t2TdJKq$^M>MeJ
zXMvX!XLa;r8uv+}h4Y#{aSZcEKhJsO?iHb`C_LT+yIXcxF`R^BSSFtqT`Go+ve6U1
z8*hq8rR`Uj`?xEDEm0>IzWrYcaz3DweaJk|yt`>Rrfc=}AYL7 at t|7aBvsznQqw~5_
zWf3F*ScuPv4x1V#SGTT0D42g7K^2Weje32LrTtRMBphm$SyPXn3nfbSJs<K+(q0T$
zUnl!#Q_gE6Z3fu=6*Ig&_6<ja at g@XTrb2l+J`BeQ*4sC4w;=Ih53G${eOm*L{PKP8
z&o8_<lfan>Crg!>m$xS4N0Jc4gLVLSd#fAhGT_)SX3sNjZEq(ZbXG4AtgGYXdEkPX
zAoggR_x<&+%_r~eN-t;SV7!Yje4$Wpt~bG(o6w|;<?ZbXwv8jL#7d28OeAoj37H5C
zH)?i24MsO?)2_;bxtw&hE4a`&&JaUPP=>Ma at 91oBwD*9{FZCVcp<UWLVsr=!#G0Mx
zEljLwqLp&WU$;lM)ey<n{MVsWUiSJ#IroaRqg`F<+7Myq9nIaAq{E|y^+j$5pT;fZ
zrLHPHJ2?xjBV8&ua2Ug51lR#LvUfe-hj9<~pmSNG#o_))imAB+&t at K_p1yNDNnf2g
zXcEasNIBGhYU1IIAuBSiw2iUcv#c8kSf4uhJ+k`2l%Dl;BW-g5hQt%v?m5Y2rvi1L
zYsqD4x&0h;`b!{X_LnZ@=x1 at w`Xg~U(#TbVr|Sp5Nba1~p%KO0O<)9~t;YWP8<QpF
zn^*gskg>!D$0 at 48#mkDsv-<Kk&a+ at akPi{Z#|M`qtZ5wHKDs&nmp!ST9nAmb;716m
z&dY1Aw#^J!WWhOHF0t`l{>oJH6zll9@#-2~k@@+xp%1PIw8s7G;Z2$J$E>H<CS-Q}
zEJuQwWjpIx9<ay3qw;-*p1XYlE6+OUYlA##7d}vTyeqbo4 at h)_6VuUDF=Qg4C-zL8
zS0u2=xIL)_jzE6b=M=NhSy!>mvKjzZBBOgA&ivF`y`$e`5Qg!Ar<M3OP>6Vdu^hx_
z&SdX6&XwH2rF+s%YrhL6;Q2(d0<E$3o?W-wo72SiGh#lwC2c)Bqn(;2q#XJ8(YDY6
zvZ^!e%6VH8JGH)DT9hpXgcqgZ5j$g8IyOHq7>XR3lywyb&tz)CH6^(b>=smKG)obt
z@#~3^tbeW>fY76~`20*-C1Y+uecaY&(4tfWp}IuOp?1ucoB4Kj!6C2YqHNlBx63?`
z8$=_dF<ZQK<5Kb(Rdr=~&GS;FHUfS<M5G8?C2=g%Lae&?qy=!|BHH6CM$?B5 at B5@u
z3BcW)VR5-WZZGS?-m|aaVtyP<`2UOkxR at e10WJjfm^}3DuQhP6ZIm_m(!_rLl4wBS
z>U at n;p|7VMSOn*vWeQ>^3ZOc>*>;cb=2(dJ?E?%l`R85afe6sqTwc6}-)o1%Zu>uw
z+wc5m5WfGVV%F*p`Oo(MPQs4=orJCMUq0#o0!#i*!Y=rawe{fL0-^C=TLK94egoG3
zCpYmaZDCb+ZsoHnn3zgBE%4^YCgJiQB0}R644&0XCA8c%F;X5FrFtG0a_L!%JJ&0A
zHP!8|f_m<ss_h!@;Z}Qmu53Y=t}6~kkY$+Y@@5dn%Ee#igOSbT7x^l0K3~XxAyX~p
zn%KdgFokg#oaTu!B`J18wW*qOEt4<%o*X5Ojf#MSDw`xnn7eSwm~~JAdipGsdt`W<
zSI6%C6rqa1TR)OxYxob!$jRDd#rif%{-Bxg(#IB6OKpMZt at _@cpxK)j(M59S{y44(
zZjtqzj^~Hf2{mE*Ou^QCamsul+CtHO`Gs))x(pTHLAU$$?#L2uNqh(7m(U-?AD{OS
zPMUFM{|&Y)9H*}<0)K;Ma3j^?3D6!;%QgxFVL0XXE*x|N+59Nu9n7o_t=>l>kUSB>
ziw99PCZz&$HjVJ&_X<Juy6nqkG`k0ec$w5wL-9J<?vnc`STJI7*Uh6Dg9K9I5XftP
zgfF^*J#f%*J;hIS1koG~5cfhhM3f*Rw}Uw(@yncLQ7G<mP`N?SXk&lu&9$QcF_n%g
zj2tq*r;nC0sTHG@?V_$(^hQvZ^+uO{;E`3Cpw}mM_&=H63r^s`eSUk~OaTap7<S2w
zo}D%k3j>*5XOtws53~m;qGnj#VP%K5I`W3&{x%ltleVa1JlHxC&G&O~7E`ww%8%~l
zB&8QU4(&fMdoqs+HfNki2^%6*^S`Gv3Y}6BVbcD*a0@)?%hkPp+zC1E-h-s}L&TY#
zUNgUc*WR^ro}PWt2_f!*yp!WyBSWL5NTmJ=iAd;jLkPblTB3mHG~kTzuOIuYpLwkv
z_d7d&hQ8!0JbRAr9{NSO*^*qT0qcV?c0f*{l^>myKv&76!_~@2%VVH8ckr?SRmL=`
zzx#;D-&L~q9kRB;y8}f3$=JC$M_WP)-Xm-85qwxyQ|Q<GlRt at cd1-UXV5t5OJ_rWq
znET}H at c8NGLM;xk($NyaD}sNv>a_X5Q=Tqwr&^{S_dy%h!O?wvEO?m~TRNB20<$)%
zw0%5?b+&gnx<2%)U?t7{=0}fCCd-St#)c5B)f`zNC{VHEU%B*juu-(Zw6z}u-n0!f
z at ph#bF_#vFiJLSle0AOVUnKRR&j9>Pxi_^}4yk|=Rz<UlJ_fbc=nz)}qY&3<oNKr;
z$Jqz$GhIt+59oLCI~$R2rx@#g_dX_!ggh&0TmpGCyRJQ3F5RSGbq+>lPwyIOQ}e$m
zyDnF`ASSatZmzjKWuII~JD99fA0xV`ox%W?lVSJW`)7AzJ)tVkJ2zdrwoa*3_OE6%
z2_|Jac_S5oPBVK)d$EbM+td@!IBa$!O%F=FKS6F1Vo9(X42X00tk6L4(WS(u8E3cE
zB+Un_<Cml#MoR^D3|e3^L@{6EOX;DXjk)}84?+$^qz>)L>?U6&tmWFhL+M)VgF1Nv
zS^zv}F0Zzq at +Ip}rBYHhMOHIQmJ4 at xi6I^i&3d+ZZmv{&+ztqdTs8+aBv at bEnUp*F
zz1|#XU5T^-89?hVi>q)X15msCK{bl^6%LI1Ov5o0*02Hggk~~=Rp#ng-I-CI5{#4k
zUB=CxC{CoRWfAWme{k4&t(LR%NRk=6NTh|h8K^ip{6j_GONgXNvZhHY;wQ7cP>u(K
zT+6KiQl`)GUz~HI#owh{N$$Qt=@?GYSF5zf1YDN^b}Q!abDF~UmO%4O)R)bLi`~^s
z?7B7-H8a*hK|eF<UN!zHM0=RIk_tDg%Vp4yS at E%!tMtA;t{>oeRI}{+=*60Z@!z<P
z8Q3pKG8jGJPJ?(=AA22n=}QW;WNHJ>Ef<`uH9~B-1uek5owkPja?_<QTIOT0j9Q=X
zCNWtilVmF00~w)BlJsbCHRz(JcJO{Bj&)|(QJG*_6D;#FI{Z7x@`yj#=^BAFjVNc8
z3swy3dv+1G{i-9st#Cf&XeAk)jI!L=OcGka+fn}0-`ZsNgbXvV<}Ngp39Q)DMnVSo
z;9y=gccs0b4fLeNMeCZ!0}2G?jh0nvsflZ*m#A?7s%Yv-Ts>hKHP<5nghqW<@Zv+D
zr{Vuv4ezxU;3Zgv!Vxcg7h(f2rBFjX`Gl#>*t**}Ty)Ze>}-)+${ehNZ32x129uXr
zC+|YC8Prd3jayI)>gqp{-L%y(3l5gi?zBs4y^)Qr_r0^QN~@ZOJ!(++ewbdqtRwC^
zdvE$TEToR^09;O<>?O^_fE!tQV*^H00XgQcnKFTTP1I%Lp#PcXD7>W}%($FPM#s!#
zk>qasIBxr4+TQH~(BD6R(KeV`Xs<S*1Qu3XqD8}N^V=%O+d{QOTSI3Pc6|vF*f#EF
z5Lb9oSy%f=bGBabXvx-mXg$h}1w((>t#X7Z*Pn$6L$cV%$i+D*>kv(UY_+u$q2>$G
ztSItr$>J=ai(8EbczZ;;hxNX<K+I($l3<uBrV2^M_YgdpApx4#&U_xK^t at _WPxR<%
z^2iU8;)1Uz+#bU*TEZ=WkO8m|)1^zEE&{2qey<|gRl%>+S_onU+?xFh4l$_l(P>il
z=jA!lBp(0dg(%FC3)Wb=H;Dp6tTxoE=d_c*jQ<6GpyOaP3aRj05&_C#f|WBBC}-%M
zIKxZ%)f5|Zu3`X#o at w#<O-|X`z0sr>Eu(udYhA at LXXJXgJhqE6MZ6-b!dngYwu`Jl
zZHE>XAjwZAlGVQsvL`=*M9)omuZ#U>F5C#isWJBTQJzXaoOAIIDfGruNopd>&$WP`
z;)-uS7v7=5wpP(hN%Z1IO;3D)fk~sdjK<B4>BC(c`7D+jud5(YhRquyW(WSdV`MuP
zm+^d=jKt7kc>kt2`+WTFf+~!OlBZ1#|BFQyfD6g%z*#9#!T(hx?!dNGR9=++2XoYC
z!@dCK+?n#Q+0bTi|E6^J8+J{XS7!PKeT}vhP9n8gFkagu<mQk7qZJ~qyuXp^kO)EG
z4Z+Z3SDDW3%M(dCVQPcxrP}u1hH%T8Xc;p-Jy^eXQ~02SW1$1m!@0ii91fO-UC3w6
zNZ$Jtz`}A%^hb~^Qm#fW+2<9{-keF3-R<Hq4PqVjRSEs5Ck2HC>$>-iM@`7GVp6}5
zvdxFUriNOfaALf at Jj&IX`+HJ(h+ul|&!+CAToPY6R7GCD07^d*@T$Ps<@ZOa{Xla7
zi3sVEqOc{kmY0^gT_*OL0mj0;%A>%Ds>BClb!mv`Tu(QC^VvuY+=AR?rc7r#vj<HZ
ziD}lV!G}UDz*nL%t7qVDJFA@`hHmfT(F<<*pxslM+?>G>4?2vBs?$bZR*lMZNY2&;
z5!lVl-Uzr<_Gvw7{G+pt%MrH&&OKznH)Wm|3nrvs$ZznuKlSn%BSb9Tv-~Z4OKSve
z&TipR#KF3wLf;KHi<sY5jfFYoXWD>Qii?A6SHj;;LM7YU={j4MT2c(gR at KBnb?&R3
z_d~dfuO?#nEkT)*EMao1p7?_pNB*@FCtWt19tO)I-V*r91Ka851Ter9<u?zyodGYo
zk%9{L+QTf4?JiE26c^vV!7;^PVgcL^y_D{$X at ot{0T at QYs`?!_-MfQ$U8{A78*<dj
zMmDTiOS at b4;j-+Q?m~w&leIy~KGz`~1D^stiD%s|mQO0cmaAW}@nPq56|86`7`rE!
z$oLl*W`ek|VdmJ9Ds+}@56PTik?(jL+-nhroa}smIN+zQgS+*01iHH!xl_DVa}B&C
znwOU7&IK>0I|Bv+;YNW at 7#L^qH|+JS4vB|iA%^*IHs({py2y33FSh-qYlr+qI$bHB
zBs56|R<!q7Z!yf*h;q83^Bou at u|2BJWdZFdcgxEw73-dAc<ncUn6!FM({`*4{n3jo
zV2r#^qSY0(To&!><wE|!idWa0RK>cdG$F#i2mHd~QXz)^P0qtpg)s6luIDF5=mlde
z&(>B{1yB=f8XV~R@@^w-h+uLBtM|}5+jYErf1*)QZ_G0S`!{-WauK)7w}|n^GqGNd
z&J4}B)?YmsD_=1TbW0xG{;uUFRf~mT1TZ|cuGdY4dqx5(W at VPV%xWaob-D{(6c0fx
z1Zf9TJ2mOje3p(fO at e`vnTQ4Jy!;Z7B^EjIj@$Co)}MNil<cr$)&*;p7E_Ysc~l(w
zI9&+qEi#p46kNEK*S*)JJPpuYFvZXS(dlJgZ9WN8J}y(8LATIiq}@RNq}-w=W}Sg1
zaz=4V*o%DdnjyTwsNngei;%C1P`6Mnn+E`QGjqK?`3Os2Ezj22Vt1OP-;^wlHdXvx
z|DPkkv_6^q)=TW at vtQs*Nd4gl$B$Qb^w9G+i+EB2PVb2R%!KiFo at P)zID`BDE0OyH
z{b?R}>Hi{|yh~pwdK)vaeKJ58Q#3UtELxnZiY%+fE=o->i5!0g9!%IT at nO`Hkdf9;
zeAdWg%?`^ljMT-cb0k at FWIt$!Oa;7`$!2S*@~Q_#B at U`T(9yRC6db0Lzm?NKvrfAu
zsb=n25Q9cj!Y<P(k3*&c>2iW(v8hf|2NTs_T`<VwhGK_N*)CJAJ%UH35ba)PPYK7}
z5P=C<lVB&4Vb<{LZf{6VxQ0UMk&k32=j0I!9+ at 5?;QhS6wkmaE&VENJg7{|`Pffw8
z*jN>j17gkRpa1iFE7gLqU+M)o5N_%weMh0z8sDh$(356N3mRn<!(Ng*OtCC(!iJ}|
z4zo)k3ZZID=2T at wp)L%nI-UIDbX5cjSe<w;az80~+sV^CmY{%KSO?7Ve9}h_S?g8v
zFd41A2+Q^!yJYSQ`h!jkKZE;)odp at HxwCc2&A%T%CQ2{p=^M`58JVT0V$O&vRsN5W
z5<wC2>%2kTN{PpIZm|#YOqO5~%|1T%kgzoK3~MJnvNM8OeVUp$A$(Wt4XfJPlpj&Z
zTFB+n%n#dadEhdx&)A7#bI%p+vgJPWOEGlVYW%PEy%WI$2=TE4Z<1OYgS7gcdT<6h
zIaoK+jLJ<V%hx}e(HKHa2{H<xlW9MWUt<xn>%FFSQg{A7NepS~bZEu#4br%6-+$}f
zdOiOvh4*m%tr%ipda2o&Ax_7QGS|vUUopYbs?YH{{@xWRGy%2<rq3dr8KR8Y!>onE
zQ}_*3<*_H5g5?#TdgEw~1cuviU=~t!?j%YKMPs{4*J|LfiU*0>klw=p6K0Bhp&JPX
z_VUtYpq2beAG5fKGGtBiSz0JV%)l0|Ga9Vl_+uCFaIc!wBM5iHt&$@GdEp0V_-MD4
z>cH&xiDIA(iE-2U7`}_!%hIS&sfq(R1TXmwG6zeZHYY-AzR<=vdq@`*c+pgS+5)rv
zP`%CK?DAnJit&HFz3WwY7M=sq#VPhuhc=*v<0x$zJJiRUDoW|%Q=hA|f_Gtialghf
zSJTf&*z)n-$rTZd2E4w|6RlPGGuJ2D++fz0pSprLln)=2L`W}QU2Zaiy4W3iL-YxK
zwKKeBQn~v<#Re~^!XzK&4y<m at g02)HKNEz*tjq{7o}i>C+*<%DHUS0DK#_i{qpP+D
zc>%Oh2#GXl_WI&L?zGy!5B1(ELxq7isIMAN{a1uUMEh<G%~l(tio!iqSwT5 at jZFSr
zG$&RJ8~#T0e)Ar(DmX$O5r!(^$h(m*uGarJ%%Hm*CiiiIICh9On+LQ-tx1w*jFsl+
z?mqX=;L*d-e#q24g;bS;qp$r at wom?L!n&5PSdK*Aj4A8xWT0yoFOMbhrnOaH9#c1C
zV-nL3Y`2RB6Y^MWcrD~&ud#{p(Y=ZL1L<$bm>RwQBkk?{Sy`fj$teMsMEk>L%tOMx
zY;i}UWUwwz{!GvDnxhGXpq*YY#7<z(P5PkF%uue2QH35~3D{yCfRlBNcb>#tr?2l9
zD)=fz8tK;$xLNpwRP6KSt#iliP0sho$Y5}aF^C&Zfg^~WMy;*_SBb9Z%1v`fM8N&j
zHb2>&<!yMR8YuTe1%Njb*Wx55+9T`MY1qfMU8+_x+KQ``j?6mGgxPG7d>d(foIlZQ
z;I5&bg?U57*K=arwC#9x=e(Eg539B6oQOZy-y19M-=!q_P$9EE_Q9l6K|^VThdGF<
zFEnV;6k{?V@)`&y@{q*tQzmg<w&tDffNwO2*@Nz$WiBkTQh&##YV2O%ExP{j1T+Ke
z$Tsuw+3dkrgI<Aj2JP}Xc^fYTlZ!je6kY3`*gZ~^oM9sLnXIb|ta0g^o<Lp6&JL*Q
zX0hJiRD|+0RzRIp;q#-x^w!2GBZ at s%V$z(|u+R1zZO7<j{Rfh%7N6QdV##bQ{r1&u
zD^KWQ=Y#apBj|PZ6Wwq;=XO({ykSJC2S>Z}HX^Uh&JNCr^j`LqXXTPPv8GAjeb(OR
z<nmiG!1hA|7Q*6`>>}QX%{~e}bwOmvf~_G6P9h+Fl$+6HQ*(6<D;7(FyUuaxXJ|H~
z&rs+4d5RRUjSSL;>r7G;8{;x7e{&>x)Vtpy%pm40Teaxn|F-r~z4ynKLlp*hSTQvZ
zE%`)oY`^-hcOLJZis*q;Nb{&6J>V7z>2ETKvN3V6?X2GOfC&(OyfmouRp}YxImM>F
z{Q~agSwv9#w!aJN??ZW9<QSYv#cWof#~`v$^C*o}ei=~Ktn>msu$^2Jq#CVwppX*o
z&QSds$&Y5`S}3t62b6l;C?ZE$*V}4h`2qvc8b)HB;|P^GR`PS_Rg;Gw9Upup!*sh-
z+N~mZ6G at e8D!jVT0h9YE-Fq{XHrI3rP8``iEgUrApuoak5am%j{4nfw`PoMSD^?d&
zxr)`XYBl6_67jkP at s&SJ?l5}i3Q$ROV(a at WAG+C~ON~@jc{1K}b(zjHIYPKt7pR+a
z4JRh&-Mg6w84}>wk65c60Z!@8aU&wAkrmNbG*zUhXglX!NnE#emkN=Z;L<ESg?ETf
z_pt7VsMkh8*=CaWtkCvPnS`io3<tpLr{9+!*H7+F<PZ}^<*n;Z^IJ(v7jV~F&lRNu
z at 3wPBx^V_fZ56_q2h&?JLur$~T*W_muh2H5d0deU`zysBJ}ArC$?OVdg)g;#$pdZ}
z)ZR4l2t^3jk)z}sTQ7rR&iw3F5reLGT0-cfthqwuJ{9Jvz_&@P+SEYuJjNn<Xqi_h
ze;Qf>x&$fIWo6nX{m|?uK$tE&q;NZgjYx)uE>C;jqW+z(l+-HkDEZ6%t6GCa06WM7
zTb3j`-9tNal?yuF3O`4OjC{C`Zw6WP7aUm`4A-xRGW|HqU+NOCffLMjLH~T+1D3`^
zff3c+Sov!?8l3<wZ=@Ej6yRAW68Y5*i{0Boy29e+ivE}TK&h5T9W4p_LvXDH_mq8s
zt*r$)ccsR=pFG&3Ha7`AKh<r?G9Kd)iRE-97#bls9t2lYFv8MXC|u_-fy2F6|G4zy
zL(L>mSJIMwX8Ia||6g?hoZ){YZ$Iy(HG=X0Zv^BOmye+SM_2aW4*Ru>=x>TY#T|W{
z<@K!;1>VH)Pe!+%yO{98TUqxf?G%GKIJ%dq5?ow}4X=*Efvzptg&$$dF+|fHqtVW`
zY-r}g{`*+Kw5ckZE&@!*AO=_lMEP-y)C(!5T}VI!Q+HjzBu}jqWsf3GHkgjdU-^Z+
zI)ixbOtLT6?&2ts^RI^{yX^sv?0HRE>ZF4{lFb2J7tZhlmnAVoQPHMc1m9q0-0Pv%
zvzCSGwVwIrVh4h){Ja3C?b=ncf*2Ri=%Zvu5Z_~%J2C67Z2iMYl&i9xAd7(Va1Sjw
zN{#E8sM9V at VYzBSYp2vdJteW>dzm9WPmzMIqR>LHS2&i`PS)GsMYMtQK;4d8PB>>)
z({7+JPxo>MRZp>vK(O%4M`GYGQwQ^>nG>KbIlw69jFen)mRPez^_m_P=xNCw$T+>o
z{A^D)hfCo%!3Lfy*3C!(?0 at Z2*RTFXLagUC;bIoV<U!7%_hqKO{!K$Z6N6KU@)?gM
z+csziSvxN{>%^3PFahQ at 7w3W(=mwm&LN385^FO(@{b<u{G_8oF>5V)PP~=YvNJ#W@
zTj%g8d~*_Jpe1k<$A-7YyJylRVz^X at jG7w)hQg_kSIDvIi$2}Vv>`%#puI4;VYyVD
zIrUB&1d^%PEQH6_H6*m>&@+g%5irMU`m!?nrTvo#ePQ{aoX5b at RT38H;KSQt9xtcf
zKM=0WU#%g6YdNZD_?JOTSoFceXTVq;H(ZB%=WL59iee6m+VjZpI-lvwZb<>y at FEX6
zneGGjsQ2|#4K+gzDX6=H0SdlnZ*dm_g4!D?h at M9^BJhDx5zQ3mgW7%dX)JJi^Bd@$
zgby;AT_bi%p#WlVb03|lxo!#`N;Z;mQ;sj}`$e^nnvSuCP4!DVOV=J!5CJ7oiQepw
z_6{26P=K;^yR=8&-R})1sU7MqxkSCfa;AyI<~vuBo?U)vI%Fq?V8Igq^~nhv(c*!Y
z(zy710y1QCX9m^Il)Uz%2c9((fC&h4PQiD at TQ>v6%ZLk1F+1t)qPa>LO<K=weY=Up
zjkFj)WZ~{jVjYA2M_pe=obWszNd<H}&cP)!mGAQ0wTli8jE({Yhl$(Wj#jFt2tlTm
zYyi4onTejlROmA&BL3U95_NG_;_>#;kHe1mJ&vHo at K~RMUnR_1%LYd}!=m-k_4D?F
zDh8J;Sf-LkQK%t=(SD%Q&Ot+hnjAs_OXG#DL`a1Jy6_HNbS*V(SGRC$x8}b3p*#d)
z2p-ce;2L^rw{)bS?wDaq7OP5pQ2tr^{u;eMSLe&a#?0Itf>0b?b5B3`*B19vmP-{T
z_cK>*e)llq#g5r+?t{GyC_)JHFF#l(@@eujF<WhJbUL!<%#9CQMG!xtDuhk?h3r#1
zX at +3sspBMq^DNwO*~KRm+W~X)=QJr$A6u0jD)~4}Ur`EeM#nM#4aND{n?*`-l at 4zH
z9|tXtTE6 at rcqy?+3Lhg)a at RhkxjDG2zfr*{c at sKXjF7u?)&*nS%hE|OLflc*#18L?
zpQ0;P#5q$y66=w6^l0PGpkom4t7r>{wdOIJ at DVh!*YonHSL!<DpOZJyx)!uR?h#M7
zV*&0C#SyAiU_dJD#o<@t(F2wwTY@(+(r;c6$nCDIPIi31_`0H3s;*oNUQ<+%+L=rK
zWF|U%!PVQiNG<O89X#}%lMkc7_iCd*fpWsozXnJn%)0LfNa177%5NXl$NAjkwMhP^
zd$kpRCDpYgJ1wdwc?*WY?Y&rhS*d?R#HSBcib2J7&H1$pj>D*k6L!-wX6|2ty0HD<
zoqGQ-s;mF^N%>!Y`*_j+K8g4L>?TAUp1Xfen^h^3hdW4CHembMY8ZZ+38k4XWdMJg
z7GbQ9sNU8ra_Z0Z-%N#?X{=_Zrg<HT2GYB4&bQUH(rTfz+pkPbVe#;A^jo~T at 0tcI
zKF`+?izHkQ(+#%FZg)&nd^vVDrlkAs)Q7`UM<DVFMt*OZsxq at 98qeeeO4BHyH&H%&
zB9mh^Sbf$oV4=RnRGvL|B}kKYa^3Q+k+>n?qPU`3JI!K1Mvy+K!sFWU)?vr?K0Q1!
zr*k;pee$Awvoy*BQZXN?ONx_mr|^>Mm&S_qiA#Hlu+a!D1&ZE5tU;Fa@<a}bAGcmT
zg!UixJde`y61G!96>I&;tLsynHpPwagf>%lXz7{hoxQ!UUZ%|^$J=yGywfZ7@`92*
zQOfT7`gOBlTWRCFI*DBt553~XMt*Fg*8zIMp2^hoR`cC~fMfPSgu2nztONAoNb_aK
zHeUg&LHE>G#YO_z=c&}ftv0o<Ty|;7^@YrCZhxr~xcIBwN1(jSl(P}n*0_gw;c7I+
zeE;O(|LfBZRAH6l>Ws#`DM7DFG2I)NutL9kXLDgS(I`EfS?hTCJN%O;PpYg at f#D8<
z6kTmX5&rO4Lbi>icdvbnl#H9og=vN5+<RI!)2djtUO|^^GKKs}USC7IU(>(3{{B2u
zewBCO#^)7z^(j!LSn1`0s#UJf)qdMMO*c^Bl$Fkx-%)dt(X{%Hn;|ND22>JWYsG+(
z?E+gdO?CBxQ5~!7tk&S+2-y5_snYo{-PQup4pSkkT5kwg#7ft<bhfr~ZzF`_v`mTg
z!&+}I{1elL>$HOxgM8c^!O_v|)rsm4KD>-)j#>N((b1a&sU?lYqpF$TL?mkFr9RI0
z${d*T9+k3feA*E{-f<sL6-VoPQU at rb?I`BWo!n}u0osS~uIr4SOBBl3$}}=Fgc81T
zuD)NG7Y16-4K9RdpVT>ng*7eD2RBoX+pm-*Bs&_464&3pb%0z&n4$t5{h=9!wMR}&
zXm#M%jZ4|l7ABt9FwY9!j)x9jGMhI!PCETdN0E|Jva^Qk1n;`rr0mI)?uC7Rort`W
zMvI{-!RRl;5ocF)C(QhI8S9fq)EUDYGsC5P1Tzu^^RkOc7Q}<ale+13+P(3w7wWE7
zfN$x=o(S&wP~VU9peZ+`#LcRL<$262gJiARF}52ziW$N)x=y_7XB$MRg9w?R<%}Mi
z-yOA3F{?XzfN at E`To<-;HxDd=FRyG)JaG*-q_~}Aq~F_pBm5>m3$C-J0603;Vl=PO
zS!yj|a}Wu at DNT9gWqaEkVk(ZNnHb3J<Tsn*U7vH8!4K%aP~3$vX%me2mMYS2VlKbx
z2`A?N^>i4C?vv89fAtEW at zIRn12TK3nq1T0zwe%U$G8+wbjV0A+MCvQ=VRhmqh9B~
z!V2t{ZqA-kReWmjCTpN9H~EqGNI$Fns&k=ZWWVj}<C22a{4-n%A+M;CDHK2{Pnma=
zthEBc2G1y0dm7A9<W<&h{1k3WuV`Jf;RE(%di^>*Gqd;j=y5sQ8OTjU>FW+Zvl_Dd
zFTP?{_e2GhbS;7Nnd7HV!B?=g!&cXk(-K-YEqMKFnTSH})+EOOXe>es`WkYzT9mLy
zUmMus)bVuhmOuW>bS6c4c4zeFf6VK*A20y=iZb0)fcKQxvxYEX4?5zWTF_U?JTC+`
z6r|{AjM6L(*R+G1RkZWHFfb_p*zV>oCU!~i?Z+Ll_{uAD`DL-E?s+x+M#Qs9wt;sv
zde5>sF$v$bMhuUjcWyqnFR8ZS0U<75bjZ>KbWuXGE<o at 0&fOnurMnPJXN$+;O`wLC
zb!1QebyL^q%ZLf>FSxe*!dD$D7<;U&Gj+sqXVRP3s{WlOkMZyt*^O4zfJPs^#rva6
z!ubOtFa{&O at toP|eY?Bfmye`{3Wxvh>2b;oDyDp|Zs1L;(hUopnF7%4u10Ly)rx9$
z2NZ0m4KFKn%sSe$U^@?-P*W?cp|f;^9kS<WWm&OJG)!-0i_~KpKaF<F3$wEry(RFo
z3RB0?Z}cG`G{q5)YKd~!h&WxwpzVz at XpAd0x}E0ZxO^cl2>(6I=8?(A`mtr-BQM-N
z;XyZtp79Do>Zhu_LP8WhTT>c0XHs+c*^KEebNtv__^gGhQ8^R$0Rr(3Er3$-o-d$i
zdK{p+ck!JL|0#h`iMsNT!9-3+^fkz{rFY>I at c1ZNf~KY`;wF>nE11P0SDN|9!mQ+n
zh(T?uqyKn~e}2Vq0_OByZ#&D}pVYloV5mlS_x*yL&bn84e$E<Ce!AGVTv2DyzWS+7
zjMWd5KqENMx-NSXlk{C{X2YqHO%cNqpH-O8f_<+m!&C-1#i}PdW!7abJ{kG<t-TGG
zwJv(`pnouF)~GG`(^r_)SiLKE0Ez--KQ;xEs=ZFtaaG$^B&pd}ubXi7hh2Y7s4{h-
zupj3B^~?L?1YhvHWXp!4<Kf|@zh@;i%PX?ToV-vR(i$GUKnl{$K%I)0eyI?_;?L)5
z0plVmeVAgdqe)e<GSPot>rTx5 at 58I`nHz{JdEzW8W^D6pbTLbpE8YjFeIDhVy5mvk
zV7zu3mMO##?&K`zg)WZEKcp>LOzpW(HJF2Ov!a-#$@-WwAM&&7N9wNkaUz~rY$_zz
zE$<hcFxo_SbE`P6KY<}P at wW}i6|>Z(EL<77dL>uan&hOUq`F2K%ZKV`7asj;5es8|
zHIs^J8ZZ5o<Bm01MxV}9aWoWLuRe8}Zt>@ew^?mq!q{AGIfVYJJq-?y at IwNhQJyOP
z7hIC_w|QbJ0j=%m?dAI`v)hK>SpCWVqc+;d|8++l32vaBiEm8|*iyw_eNXv)qLJI*
z%pgO7-xfKNFF>UxHt0)B2K{1nFtv8rYK&lwichLG_;h=>svME(O!004;kDXgi!OEX
zdFe7tSrWR;=lXl9PrV<T;)F?vhjrsTo<Jz#@qbYWefkzxg?OrR90NiM8r)Fp>URzq
zA%|_Z3i&EUMFst6a(!mVkrK$Vd2()jmTB!e{pN*LKU;Ybs+4PP!`cJWZgWo#->mFp
z=>1n)+HJb<pNOAN at oyvxy6eO^zK2jDW5W|p-~x;oX;eQuP>!U~3R*OzmY3~9IN{~}
zEWBqhs_2E_0gl~05hqqHY=pW7rE>y&h$LrA0Q at AkU5CDjS`J-U=EC7fE;3N`sRwRl
zPrMm1N_;!PA1^F-<}Sg^B*4kX>7ErDe6>1!zS<a#RCC*vQ+KeI+>QOG at TfK0Z}7|=
z17pm(UlpNVf}BW~&WT{DO5%9J?Md{*zJ#bD!nfUP{8zcE%Md<=4>o!v&Z%#6hqswB
zi$Ct#x!3xc$Kd8URq84o4yV7Q+~+g@*K8{&+;mc>Vw2>!!5$Qbw-kkoiPl01)&p2p
z+d4|<C&wI(!W3R at hK*TSJXuFxZAU&rN0(+v9^|pv7YAFb7NXYMW%rK4B~K at pbDex}
zNEa0#-C)fvmeF?-oznLA0|xZJd4&)0pO<Nb7!-mRol;LRiMzJ5Zp at oeLj8UB9mY0K
zcq9bYug{fQ{iQ#HR9ou2<Fbf%QsDc<1v&s9o_At_OE_#;Jo7OLOrfaC?m63!$jPm+
zLDD+-?5n61CC}dKFz?x_OB~ovT~^GFevGt9l)_1rw82nip-3K}4m)xd670krHkMAP
zScs=sh}Nzw0d4odp{_upsGwYT#&&GOXy8R2Z at trH0xK_)96I}k%I)2k5gj7SU}Idx
z`3jkFOa|f+^u}GZtY7%XAA=<!^fX?Q!mN_<zyOI=O;s?@jn4H(Ryia({dBy4iT^Qi
zE?9wD(NAP^?ayiL=iqMD`PV~b)z6;=7K>;h;#`QP`*^LYNWUR1%>Hbc0=>Z3%CnAo
z+P3I9?n0^vKUh@*JMjy4EO^P_C=pba8o-Icgz#dDK{8;hvu=Nivy({*7*#Kij{PjO
z&^e~)+u%nEf~a<%VmLM`n3(g?i+{t={lVNx at KPsa?C#gcF~l*}PEq6HS_YGTPcJhB
zfN7(>OTO3_u2a)LU$Ey;kz&h-JU?IOw!uOOv9c;1vQncAO9=ZXGYj(2o`XC0TnYFo
z&G&r|QQwxH%oTJi*$kR0z!(dBpRsC|9*-~|3fhC$Pa%5NO->7_{~x)PD0~IMCS5+s
zFJ<HD+Dxj9!`^2FXig*_q^xG^gjQvq4gUbfGRGl2k48arhzpLtjG@$_7EXYbr_j*4
zKD!S5m<-cYmixO>_x{nH$yBacm*rPz(cJi^*Y?7*>Fu6oU~_aq;qlfTaz&|L)G=0S
z^LGyO%ZH<c!!W?FSNENOvUja@%eIk+2XO`q5V$CHm$0*tMZlF~Klg{ho|A*=W-~zx
zN-)OFNmEuKP1yTk!3W4OS4G^H&)5#nz9=(n;T(Hd#Swr>1DqiZnc3E7WPB4S0YjXC
ze;2mI2So&&xKBQ*iwi_VKy$Jk+z!WW5JuskR|j|0YpN$^L?_-p-C|fS1!;?jLB2$>
zlx8TE>i9UZVQYt1h~Rudo!>wFDe=ohhLY{%vowK9;>vdA90q?DYvZ!6`^x$$z4Bgb
z4>4D&uV?DZ7D<}NRe0FfwZ!2-(81gpV$kreOCXSLFd at +nkuBKj`WMDJ2bJ@`gZJMI
zL4MN{)Purp1dr&%AgoUz5rz&^wz#(8jX1qJaNu1kou~-H2QBdaxK4!!zb)n~wh#qY
zYkQPUq6A8 at oRyP+E0rZBaA3nc1Y<mRhsJWx+VUh@^R0R%6kKK^9jnjUWdLiD-Y;BF
zlHcuJ=NQPj^X^M_SFqfAgujFVBX*m|osjd+y_2r(lkUAlli?raSx(i6L0QW9zzZVI
zVRbIw)~hiO#I-Cz&!jr2zxU=>#Q5LiWKH>yqKHv+iw87Q*9WI;ap}?Ha_2e>QK3nO
z*fM`4$aK8C5xG32D#8=^mzf9A<Uh<j^Jf3e%u~0RJZjzmV2d%XNAjmnN)$VKZ6|KU
z`QM}VO{jy9NeCRcGdIKJP7+F2ncub3*gEX<A%6Kbq6RB1oauUvcg;p;)*-ToyXKfX
zkAbm_J=?Om9sSd!Z0dG6huIyv9Z$Te{-Ph742|ZA=F1v%2wbNJ^~^1=lHIG)H?i7x
zf|aWOvlS at tPctp4UeH%SqW+N(XpUc_UnT`!0Jg;k&kTfzREF0RcA7`sTv&|-=o%(H
z=<0gbalsYTwkdoY8Fe}*2_R3!;RVI(MBBEv_-SDcWGYUs`eH(V3c{O at no;YlEbEmg
zHJ%XhNzO6C;>T|_Ifl`w#Cd0?9 at kNft%uE8Ex3-82T!?L$1LuJE)pRL!?Vye%g2JP
zq1u-3B3$dh9Vs`Wa&QUBX;pR0u<SZCo30a$VYbxETHu!V_1CqLjq8zn|G%BofQOaU
zNm2(?V($$dO)7bEv%t)BKO<1_*UVrm$m+B+lxQ{{N;t8m&UxN~&nxjisQb#WD7&xU
z8$m$@F&=3|AHV=4B?lObE@^3$Zls1D6a}S00cnvEhEP&s7(%*ZKypBup=*GtbHnre
z&$-UW^X0tnJJ)bA#J%@gYp=cHx7Xe~&0INU0bTr_#@9IEVb{v}zpoA_jD at r$=W9?V
z3 at mz${nhuExtv>EkN66a*9*UN2`e&XFG+<gu7}kGydZuL=LZX59YUS{!bvmmzV|){
z&wy}kNT1u-ilVq_|F{3*%-~9?zl}KH(dcl2`YevgE#dO-^BEWi->QqT9xZ#xpYJgZ
zZ*YV!9FtgA_C!krayFtWXizI}U*=6%P<?xm0$c_vIqr|~pB1}w*1)?R`7iK)U<+;^
zb(uX}*OdswN9GqdZr5US{hS-OIrL`_r>dY|B9VJ at tP;}!+mCeMsN(fm*?@>?CHnd$
z*yzk*^d07pMBOX~p#Cn1>?!BJRbIcR{?m3eMkOz{vWU&Tw(#=w5brpTef$OGoD11g
z32fxw2ZzLy!rNigYjg3`@P}u=jM$IBsdr^#z`e_0S&rD&*7bb7iS1+OY{P{QB*>wW
z#Wngw2G=_&=wK9I?h=D$fiu*K{$J~t2Zn~^&y5O<PuWsBKd&0qL4BA}hiJ3eL*jjj
zGgVs?pWjEz*5*KAlu>4BujgPZcWf;Li0v~Ot<>)#1iq0 at 9<6VIQh9BTx>)=zdtA~;
zF(aTp*=o5aM%s{r55=6+`FuI4^J$*j-irt8d`Na5za_TN69O$tp4iY-?yhlZW_(y$
zP3ideV#F*95FvW at B6N&f_%^iWl7czIMc`TB7a0-R at Uzvg5jMFQUm~aQ1LwYP?eATr
z|H`*NZ~-u18SLiAO at sDN`YvtVQq}_b-1paJb;~X+gWyIDfm$!Qr(kI^->q at 7%gfrg
zPalNY at _p!xQ49PBuKQ|Z19r)Y`+oLe!1p&O4peYPz=M;oa9o)u5Oh2P?!SFNTIuGK
z4YLM^)Jh^S{>=sR#a&d>Y;Ad)n6N7qINGSb=Iy?`nZq`X*~2AN!*&WHA+X!HpRxf~
z(!A|rGjj++Yo#;2Wf}H;^#M1cV2;)dBob at U6eihb%_MYAAAA%u3fp*cldcU#)HTY*
zZ^GZragZ;xag-e{BiI7{_A0&l;Km_y`tX5tVw<)rVdAVrV9D8_D%POnjMvRDc@&9J
zA~2w3xeXtFf94f46uXC=!nz)k#+|U3k5jVb4P~4RnZPJPBJNzIU;f`aT&}D;gD^`G
zL7ELkW{840H*NQNg6&XR0jq8lQ4Q>=Mju~6YlBeG+OVSDE)KGIWj*|D#(I7vEnDa{
z39;I!qBe376w|cYM7G)tOrMarCf&0uu*1E{I!lv!@TbAE=_i9a>kBq9uYM#%+ZCsJ
z{)$QMmbahw`}|3Jr!Nn#Y!wgih_ at DnOunmR;bt`a`{_M2-*>7HXUE5Gt6u#Yrx!-m
zg^{uRI~KUgrP#rc<}Z82<!P+qB7M83&!2$Z_2qSxt-}I}&=?&i&T-hdk(c2Ru$dzt
z+NVp{D%K;7l8en`2=dcE$a&Kw@#6(ExD>g!!AyEUzfGYAhl`bXzGh3DfUfZ3>F;2g
z<MGG-n??bqc;gINqF!7c0%bfp=VCH-=z=TX$$*Y(6tIqyyreysG<@rE6|#p=vLtQL
zI9VPWyp7n2-a~WTSV at DDrEde%1D*H`?DUMBcky~2))&`DR^o*^tW2574C>Ee*`mv*
zF#Q^&uluc>>=c)Qlh=$TqZkmC>WS1Z#3E57KO}AxHIN72GJ94*n%Ea~j`W51PoM=V
zs_|MRJl1TvF*wiHA>Vycw|*|Kd8xK<Z){cEckTGfMq^Je7ZA8(R75yh8kbJUhOU%p
z+^}7+As3pFW^>3 at 6McIv7W#oK?z#j7M5J#Roy)ZjMNd3p^IvM!kINR24RGC&iQqJC
zaL4HqN=N}k7~`Q%@;cdt-S_wpcq-cO9mXRcB-D1HGaz8wX)Cmiv_$VkG+dD(>K73l
zZv&*gi!ur1h-i+@)y9KZF1ul}K63xjXmnvH=G at XYbXQDl+B=&QICIK%>e}OT4aj#k
z&_OgW`ErO5)ME<W**CIpJcv9-ilojJ%P!wg7C7gNhZ2HObvR;_{DlN!R3ZQ;J&ZO}
z9#on7HVw)aMMglIw{Q-mMNaZ=NySbVozkE_Dh)1<p^lE`LJp(JJCGvdqsJ(JUoJbd
z%``9i7r!8b3ZweXHoI^7Fh?F5gRz18aAKAoX>GH72O3aF-Bw1i^-lKC)n5Q{?5Ge|
zkESLo`0)UX<QDqa4Bb_d2vGo~x1EWFn~jR?84n&bV~$jU$!odJ{tGMH!EG+mgI55G
zQx?^|Zc)y-D@~7*b6+|=Y0<cWI9$=5T0U2{W*S%ogNt1QI5i!Q+$YhU<O2udyh~tS
z-<nf^s5EWH3pOC{??2`;{?Xu>_fAT2xS~9y3;jO9NW%|vEP|^eeXO?e#nx~t`4Ti>
z6+0OlcG_{c!+i3Q5>7CE<<QDy6 at NZsUx1|Pf`qG}j-523Q6w>caKFw?VA>BnVn~d_
zXQ|9YX^;^<k#r$QU!0I1lC>=&gKOHA`MLiqqvfvB at yE)v63 at 9!XS)T=9lT5s)x%Sk
zVyHk}mBlRg26$EAv<5Q+?f5SQ(f7JWRTh(EpL6>8e``yrJ>E;_XuC1#e>we$fT^v_
z^PQT&UH2lwTJf}<|20Bdo at X1{0({$;(fdM<zwVa^_3b~yUE-z_+v}~k6PK-lKp0lL
zb;@-2dZeBY+O&y(>-?Wu0K#$fEUq4jEa}su4m|W1J|8q~;U@)<a3#cD at f+%A8|cL@
zakH-=wtS3bHb5<0ES5cnZ`v+k$XT*K%Zm1$G-j<c{WSJ^*C6!Q9?%4x@^te&zcWA}
zChG-`4|l=|kx<f_%RVCT`=^8EG2rJdjX at -9hQk68lfJ?>zIt4{R*xB0-hPcD9E`5F
z^Ecqi-Ew%zMFGXKhhtE?g;kCPrQ_8qcu73j+lZH(pA!$Q&FM=s3DC<hJ5%SjP`rb?
z1nT8nW2{GA9;{@Nj&rKXPl6i={JuSi%0tx@#iIx|Me|tF)fo(QxU=sKcS9Ry8A-4)
zJnF*OFXV}PdJ=Q8V*`CWkJ*DZp}x0PG>(@`NWG{;)Zv{X<A5(cjibkX at QKlb=}})Y
zl<;J0%qgJU^RM(JwNR-uH%}REc*!ULBu5jIU;?oHF_+Q(F_hzS8GNjt^3HEM3!DQ|
zl(n^3HvZ0v4_uo=^u}^gPVaU at Mm&t5%ApI-`hzJ7RS86`P7WDys0#1~=FP&T+-|HC
zq1Kk&;m|8Z<Svs1vV%$n^%CjNNBnl*emFFw_By;mY+8EmlOIijRCM~&=?cd4LHZfz
zM6SX8^f$>pn;x4f=67aYP+FuVT$9>Ed5q)gDuy7BA{0UK8XMw`g{T3`YcYsMB71F(
zCf;~+^u`LpLP at G$!=W*vjaahRwYtPJa>H&nhbsU<=)?Gb`;VF7^V&W$6B=ECoSF3N
z75Cj-3Y5VAc{lHLZgZe^=UE0dWOCJ2f0NHMs at 8Y&VA at g=k&RprzBx!#Le(4$XHfk1
zW-_+W<&Y$a%97{n^<*degKgThmjVeh`O}7nj=24mjSMdK6 at Aoa0_m6E&sFLsBzU^(
z;fwkD!0iX`Jzg_X8`9T at wxN!Y_1?Eu-sP=#AkK=q;dE)O*OBCgk5M=R;Jr{hP4s|7
ze2UAq&=9vLMYPiE;qo at L+d_}mhC-L{;-pyGe+N$SO*kU}U*6u;MG|KNki-|?yEghb
zmZuOGt+!hus$~7Yz~I}@Tu_~=KlPEJ86~UhTZg*H-EeC6TRZFYo7l9R-s%Eav1~s?
ze=b2d8frwE4(tvFXil{vE(mBh=VSWc6P at beIg7@hg%n%1zlYWrot)O#(!8>L*CFG-
zw*zDF{}}P5CxE3OLqrz~fb7ZbTqx~aNEw$rQWPyJ?X2=$s_7j#keT{vh3#2*qTwKp
zHJrF at e)?Qo<Y`xlVu171`7`DQqb^RV9@)-jyjVl`-PBRL0^`bIKMP{d(7Ha&=TqVc
z&o2Ya5ohOi&NWQ%BqD0u at gZP$&Mx<PJW3dV=v45RC3d^z at vWE?&Z%nCk%~nJ0xa-H
z$yZM^7c;+tp1C1<>XU|MLLdG^F*{HKZo?iz+8ZqFw7I>s82JNue=p0gfK+*6NA8Qd
zU<QsCE1R_0INHa?2V0RTJc;+Gz-!j5U9=(8dDqK0op2+bo4rn=!Mo!!3O|Tjwq_|<
zoJXyXN|m!H+H|5{a8L-zu3(hnP}*r_uwN-wC00>gk)?0%C6K;?T!ug4a9$R=a_awG
zDf|T}wvKj}jt?eWm?JpWy-9>4Zu+3cZt0RdEGSb?$nB_>vkjbM;w5;M_eIzOOkF<f
z=za2%gZKiQQX9mfhJjBgDr#}D at lT4>^gxkA<B!pT8ckHDz4x at y_=m~VDj7-mzPyPz
zmLqiZXIb?o#)3FLx!*PFl0go58%lk={83@|*3lBHufO;7$I}7Y@;wpv=SM(YZqJtx
zx>1(`V}9&ND`_p(ox&Ac$w77=n;25qC`1_YBmCDZTaz|z9gesg)N2dej*{1s=pa#*
zPA0sGp2VnY#&>BF&=bkyzYe{>K{yh1`OSvpe=|pWEL~3!3~fq+JNS}6dLl)yQ9!*3
zts at eYC!=)p1E?RrE}fa-0+ibfYc=(%jUx%_$rppBbBhzZ3Zg6~BeK>jp+hCG?=w>2
zbn7*pXulsBPSZRHe`FD-Qc6_`!ni(j{dZ2)M2#kY*9CDgp9&b0^3EKlFH3|pvPZfz
zrATEwwA5D*As?OkYHvE4AX at qEn?Uc|>a6<##{3AvHnJUp%cV at N8q=vZMvpX|cTup{
z?<##`0_(d9z%~NbPy*k at Q}Ju&ekv&w)N#_F(#x7oNX|;@#&`9YGyLH_*D!X-_#tp}
zbfm&<p<XspAoheefbiu%U4>Q$n`$q(8F>1!{m!KvA6dupm_d$Ye2qZ*9go^lxq($%
zqpIR)Fg;Kccb-Z>{>V=wwsUYe9d$(@s)n6018ESEtf`Tr=q{eblt!8Q$3SX093gVW
z)dVZh8)$giT|GTGkvXj|19Q!j$7)^h=;`_gto>da0fjpikUQrZ*8Ozj at 59ecC!P7i
zwelQd#A+|@vRZR}tZvTG1WBB8J?~cSZ?b<(H}&(1$g1a*<2X3qG$P^Mgwv5S=KHsG
z#<$fLWEtNDEX?CU*@xBxWOVb-s`isRmvqSi0XFA at 6sW0ptdqyL2VSQ}R&o%Fr$!oM
zv+S!2Cwi5(*A*3J+m>j8W<xlBK~Jb|h^D59X?)L2)zI={qrE!It-6pECpKKHerEg-
z=g=%i;rPwBx)57cl~AKTALW5C)<ZI8Fhq-i)3hXi$*0EMX(y^tf_1+m<d)5)po^Fz
zg at 4I){FhvfOYX?Ueb at 6F`xA3PV#7Ud1`DfczYT(n)}wX#6RoIU_tS at rmRGwD#cV}+
z;0+BHuvHd)*s~O_Lmw+ANZ|Hi<G0ek`zzcG#7Ay#3f8$J`5Za`@692+VRdN%VqL)E
z at y%`e6HZ)TUHNAwNjq6jKdUMn1Md15k at y<iD)M{MDA}>k6{sPlDS-rpd=xsC+*^+o
zpBQ(mtbjkJk^Wt`o`IX27-zY$e0ca=VY<F at Wb;rZDA=k+YI>W~@~CDU>EzSaHn<(@
z<%@fRqnv)`@oo!LBGM1ml=0~?=(e9vzxTIzURXQ|iCEf5pXMf=>Utp8zY1sy^|agA
z?oBRC0`4kN_a at 6mIS*>`BaACO9Gpmaj}hmN3sKb-<{vhHyK=q{5SjBOMtObR-U4;f
z#W)4BF&;VLcFFp2+S0NfdM8?Pf%uM|#bGuA^(U?9CUBK}!acyqaXOBPl0ZHGbYs1j
zm)8Tf8_UDG^(v5&MpFF&4p)JK-`sqAjl++cWn<0O#^xJwjQwfv>~@-hNLS$Kd-zE!
zK^$k#+zh at VLKE~EmzIu_xX_xJ&QZUDKV`>U^4~E%{pq3Bzm|*Y<Uv5`5oqpTp8Ge`
z;%dQN1#mbV#=GH#psCf`=H|73LiLA#*Bt;qk;tO7v^4P>u1pd7%n%4<e0n-?ii|sL
z2sms+9su6n-rodJ1TFB7ZYH?MP_}b(e9fLF>uYPvT>_}#*;^BJr}i_512uXB;D(-Y
zc5!iVa0qWa9Ee<BclyI|+LmI(CilNt5b%@f-zXG#2%Zgj$^sBX^`GbkI4=+U!w7IS
z;$J at va54SM4xlLbZ(sn#nE&gyft!v0jT>xW_RmYC#*a at -p*J?t59m!-YsCXpPJ|M4
z?F#T(<>hbeH?%!sDk>_fhB!O<Bi#Z4{)k?+l`wQ|8hDmwZIWQu`9Mt<dw+i_sn6(s
zg`v~_*E`#672wB-`xR0FavJavY=WvbT3#he+%xDnt<rFP%*F{Z<(xmYVmFY#R3G|C
zKhjVx*C5VLci0wo9XWgmk=YJR3>4G%LSz<Lb(HfIpi@>a)rqiQBfG3c>mjlp&DR7w
z8|~Z6<=Pc!ArMxOyg&{Cuc|%Q{o;-3G-d>SMTMX1D(2K4PJ^MEtCB}|Ic at WM_I!Wc
z;4MWB^xAycV|Q6vA7qX2#a^q5V3BI4oM24+_#;cUeO+aZsGiZ9fwKB0Pwj&7xtNts
z)fP+&R5 at 8AT?nHu%0b5Ezj1^eK-3WH=^mBZ={*(kX0E6fdH9Nj`mwkec>8AWv$#BY
zp|TlNa595T2!7$%|1gCaYqlY<-E*ppfwoi+XX3sWIdbj&rOR_YzAL*4vtTbnZg{~<
z3k!MC-maIM6*Cd_^yjA?Ic at 8EB|3+-<;j#vrV3*-u-tVeH_Kd$rjg$UB}T$lN$=V*
zmJ2X>{rGN)5vxyK3%5B_bSuA0xJ63#yyQBx(k<n??w(Zbm*Stt?5Qrba<6ZMC#QM$
z6OSm`A))leukLSi_hG7g7>SQPYBGLeA9ahcomjmli&8n2eP6YlNiMd8@!;wSs23{Y
zZ9V>YPP{mZs4*Y7t1uP)w4sPNr(JJyqAU&ckpPYH)sGUN;@SDn?(1}&y&|ap at lL)`
zPfs`P#W$v3bW^*15jaj2oiuqSiZb+u4p2URFiiVX%l$S9nTutZcp^t>o;wJ^Gm5UN
zS&!$a$+<r-5vy<eWZ1kwIn&W6M%!%5W0t`ubmPG%wY+$BEA%qF?3YkhK74LtO^wQU
zBCMKP1MM%r;-Op}CbP at fcDysdwIwqq6UW6~<2OD5zojHK9w2=FEj{Y5^QTcBKf{S)
zJheb`0aC)j&lC77x#)B*SjR6QBDcyMncjtzHeE)4t_{KNp*L}&d-B>8f>JyCM~AqA
z(S2k6=1g7}F0~#&l~D&Vs*6AqG>ZxbBo|Czu}LAbg9{z;^LzMJ2xVlsBOtv#_Vv{e
zz5CJEeBZ7S!9mGHNozM~zInpTd^PqyG{pA>K>N2{@fYQy{PeOJiYVNkVCrmDL7v&B
zy$e3tkS-9{6Pw+<-p<z`y3U?PxPGeEfzMA==(Ev{<R10=Dm|n4of@>DV1-P+czSgL
zPiLQX?3m}sn(7bci)YMv^wW&q_|;=;3Kj>IbB2`jz;}fCfgu;r8mWc<HQ@!Zwv=4!
zaJguF8%QTP#u*#E^8ioy=5>M(#c at Y{AhGsEZ`abxi1r-LX&GoE#{v{`&zO4 at u5=+2
z<FeNyEAlb_810#tw}3N=zm#6xHTh=uZJDnu)eu=PRnZ~O6kp8S5ife_m9@<VOR%Ya
zr4zoa!x|)vrO<vz#k~(Ub<`tE=(|lJ7~j!F>vc~|P1`y at Te*8@?wclxVH#o8m!rI2
zQ|UO7Fc+0 at At(<z at z$bB=ic>CNk05#BF3wqmuVaP at 9j)lE9EFV*i+99e94nX>+nO$
zUMbegB2{(<(nl8mU<y(xm3;H_=$D#j`2Vrj{C}OQ0Ht~UK<w1Yx1k?*RG>0O)$hvM
zXmi5U)Lgz_Nou^U<kkdR$_ZP~2bTM~!|ROt6!T{zOpj_dT<`X!tno>+0wVEpE=`cv
zqvsQWKKWivOG>&fuRO|`weD)Gj2>*k=N_Jvp8P9EkEstV+vfH{#nqv$YhZPx(7~)R
z`huiYnL+&DkSo!X>4lD4{O#qUAi=QW5esXecp6oLN4yfD99;;69h9)2OtdZHsf=~l
z!anE*xA#_!8Jix}L2pCOE?N2we$h=%mR$Dcw0n?hsAumLGL#ZTC9*Q9K2LOSJjYt%
zVd7JY{fO!70lM|ku;bNz-;cAYb%pvnI(=$?o8%9~-|1le%@d*$?!FrJ6=P at UIRPin
z9!e2k*G`tv-DwnxN7zovDFk~l(U+kJWOZon%M5QQ(o}=8Pn#23 at 1@s6@;>+HS;h9|
zP_8v9(?(--(fVkeT}3KAgZ<}$<t7{1^VIs)Yy4yVR3(gxWU7qOX={TiMd|_+o~ti@
z at rb3ZSj@@i{-MrR1S0rfI5FH-Q7_ZO?wg2T1&TgSQ+RhqA>*<i at zOfKvZ#COvy;{u
zp`%3Ziv!J?nn1H!j&^K at w*95 at VWB(I(X*(b{t8|ZTvGC}q<&<Q=usMCqx<R%II-+p
z at OGBF^w!{ZOwe}8$pKXSA50H7s^9o#CDBiH at Rh%G_ez|6-Mzhdt=e$wMs+5Obs)c>
z)kU<cm*E3I at 9XB^ZcS`X138$~reE(Yuh*m1D){Ng8|I)pAx8wd~2`!($jh~Dys
zImcWv`}Vt-M-rqd{4q=gnu5sH{p_pp70N1*S0fXZm&f7$hsg9X=`)zBIocoWehNcZ
zT9b!pkdx at F-#rgo=VI%9l!zyDJ}CS>Kr=&-Pd`Vg5G4}Bin~;|iLVKM-5WR-d+cSj
z?nPMM%Vlhcn#?>GmDOneQz8l}##!C`n$70Rtn0wX`|jOt(xYf|*905L at J6D>zU_Mb
zMscyd=YFvs2;OugVwPhLPE&G528zoK+;at{?K~fQcpwmA1Ksgp at qpkH{R8Us{ww1e
z*X;;4w5rPeHoqa*sWLT0-vEhine+N2OdBuNEFN&@luE)f7`hotn=05f$0+?1u+7Au
z{)(z09NSVKHWGjgSkD)W#_aW+K9KMTpc1s2KR~bSaVt%KLCB-E@^#|u^oE!B%9o4$
z(}#3rBr0`y^0gcaplmHSAZsw4lBc~Br3>=(GTgu=-%7)xsB>9mrheJ=Q(7&;x;*ig
zy4cloo6KtyUf%T`o>B#on?nT!R*;M7f#;_mPMK~=Pd}5XEz+yy-BiWk6a#8`^#^T#
zYiH at jN(M%~X1p=vFlv>=9j}~Q5LwAU5J{a1xAEQVG%1Q`3uX0Hr8<d0gDyq`H0EIw
z_c{etJq>edn`2 at -zdhsQ$xu6j=7q2J=sc`V#z92}I~l`y7~C5BLJBHbWolVkRJX<s
z>sDr#3X^+(F5kZtl(t>5BTCoj;iRB9LJr{hsGS+3e|v#!{7qCxnVF}uZPZ;?;2bW#
zvjA*6 at gQ2%?K)lWHgeorIbTcL3&}K{5nH+EVsliFtkjZMM%Rc+R>tT{NthK)=*w)9
zH$C`E9?P;CBfd-{<QtkP1NJ(ylnAWR87|A)v%Kl7C(_?S{tcY@{AXN`>6>!o^stR7
zD!&knf^;6JgH_4=&4QmqjfTq5@=@L89M!FDUWKZz(;MA#wLCd=%<`I1<u?KKug3M`
zl5-Ub_J3&!M|`qB at X%QkRi5271nYD#dFWLQcF3|0A?UgN{cSb%vLaRQw8s_fz24G8
zxb?A4sx}7fz-E7Jl2B6&%an}I{DXKQS}TMI=E&f!2>Aq?!1_AeJ`=cgxJ+0&cS5iK
zCK%D at Mg;4OJGKRGcoJ#!R*ru-{^su#+zB&c!+I$T(+)-JI~&<GKdXG%X6D^b(~Iq)
zZWypUNJl3d+pRdzCo40Dg!LR&`>_v2yIb4bt!B5PeNt^GaPT`&Mxa>{;n`{zRJqXC
z+BKT{WHPDVr4Lo5^FtDD?3%9C9XV!gDF1 at wlCbk9X&Ue2(TYi)CTFvL2y!?kjKP*5
z;wL1|P at gDt3%%AoQHJ`B-uQU2Pr{JKXcIJ+y`@NS{W&x9Jvc+ULyB-j;hLPll}`x0
ziriv^AYeEZJ3ro;N8oObBz1EL_^iLk<7#e4aJZ*t3tmo6%bbkz+4- at 0&xVPoqObDN
z2PoxtLD;lN0A@~5s-j%dH@#d+2vg#eW0kF%=A#n-f59zNi`+pcq`3}&6H#^hiPqxV
zXG?u|RpO;$F%iR66ZXRerQLBCj*JgYYqo_aow+$Vt?Xq at T4=0m7VfK5Z~JJq{7wq&
zGM=a$6pk4D11yepo}=h5J`~wkjxXSe at 0|Rm2a=s5vhmE($c}lXb8<Ih1%K&`x#t0Q
zL>N`WXMx}JK_hM$;%{SuQQC(ftRehW!nIQ)G7ZK7LH9_iNVy+9jC4V>eyg-k<fXFw
zGr7vNbhFT!h~$e|W^Jlnf)~1+zRY^wUg|bnEk}SusP(RO*b!w_f>Z^%BPh+k>xh38
zxSP?}7WFvuo4o2<h>{I|@^SB8fFFAfWA~0<5yjT<VO#eppmHb#I`YqMT8b>#Pg;+<
zSvpmjg at w62Lw7H}l9`~zG>h9Zs3%cKXkjWv+3uxMeC8i+vK>Vn)e;$2=j6(}%=~`y
zxA3Fr<PrcF!hm^2d9C!%*5t<6p9~KzK)M;nPSxPm{iEbQ5W*UG`84ytdGAzd!7I{@
ztXHuJbEeMcl at C@CwoE+tzv;7!u=6*wyIB7)=eT4ytlKK6<4AvJ6G$~=#O5c6STfy1
z<FiCe{N^7pILF*lTGx{LP4$aTY)CP`!nS7S`-)5F_P8~WK8q*SQ_eKONLNmKoM{6y
zWb;l5Mds>)KXE$ZpFfPc%FovBz7+pOV~qxBcD<n>2O6!Cw)9ar&h&DXHH_j0t7p78
zEnEzfRJ@*_4)$z^UR#-~-Tz9i3%S+hm7}R&eHOB=Jonst at b;~3^@~AW0T_%6P={Ly
zC^9xcqYn~=Zp9p)x-sa9r_ye^X~m?xz`H6{EFUL5syVb{p;I%=!cnB$8uMa)cv*@?
ziN&YbcYW28^Aab*x0Z3O)#2<?g(c)k<byczHH7o==2Vw%ZKE9#V5%Aj0Y_lzF2QiL
z*VV~KCSG_Bch*|>?tJrH*nUD`_q;Drz7gL0QVscNi_n~I-x2}OsF+SdjcQZQ2xD+c
z6yGh<uL2sFvxkr7GWCilbx8-s>9u~oiT}|1;o- at QUH>dRnBY4V;&zWSLVHg0TY27e
zv^a~0PWvx5{q=Ttrv>d+OY4m6M|omnKRMa%CGBs_XPfF9G;bvyw=$vVw@?AwwIU`H
z at IG@DbQt&01KoVlVfF|v$<98iHq)W7x4*U(yX?K at oL6*qA$Kz7 at CS}oj8qM=+8I70
z?G;7k5&m<(a4gD$!L5c8b0yw3yfi`o0Dy--KnUdXA9=C97%rH^GZZFqj&?rnS<K|?
zYd4nC^^&>h+S=$teyEuBdGzI(OkjC3lo8`5uH02Q!`|n&J`K#vrZw_nY}Ru6jsoBu
zH!waA%GO|!|8Rc(gmWt~Mebmf#a0vUIEk5AUL7eyC0=5bmQqyZn);n^@Dd#7m80-1
zbGFr^*_8TI+@=BhkH|jpKa24VXic%pzIffUCV(#Fi6k<L=iS~Oo;p#q+$vr*Y0)l=
z3*jsvt)_)?Ik7<vEhpyDsb7a*U&%a%C4WLNJ}IEjl!p`XsvdWYWcWa=KSh2R&w|m#
zf(T28yNM5UPvzj`S-_j}zcHY5O5uMo<m56AQ;_<N8QRz=_QIvFw9Ia&)N`H?_VCSR
z5L0T2pR)gEZy;P0X1||XL+P@!ZTn3fk>gb>Bf6H(>9Q)#xesxwFud>S+nkTVNs%z+
zhE8;KGe5x?x7vc+N8K9<VnDOD2Np&}dITG7++<;wuv$`XzCALh9<u9$$k9U-O%E%z
z_Vw$z%(O at k9ZnnB!>C0P*N*zG5du#Et-b)4xg{398W_7B-cBF3Ii1Fe<B%Dd?%HGk
z6ReY$3aIXh?;Lntn1o--{}`Z;vg1Y0Fg3S-vyP at r=M`BX%j(*PCfXW}b!;=M1h>Be
zVH-uGuu921&G)I$BCowCJ_Xiy;6}Dm?$Pu6tDSs5%@8u5{c^P+EH|_I`ak&OE+g}X
zU2k9STmMYj)Xoiwld|@0gfSRbiCmNARti0yYd+c%m)XE#8J|8pp{D_HlK4GEe7f|+
z6pXu&*7s79e<7ppbYSnYK1Jx<Mi}$wIZ9psU@&)iu^?_6o+t!~%U0)Ryph;B`ler8
z(s>6r2iei-QloBFe*j!E8WIvVN(u{gn}|J3)T+1b<XeajqiR_+KTZNy`GM5HkQONZ
zk-J;KXk}CTigGFEtjNcndx<F#j<*qpu+?5}B|nYP+nFweFXXHLsReL)QcE35qHYt|
z-~Xr(OY<``SpO*W)D#>0f+?RCQ>SY5oN+*DDy;vRSel+xylxgWIm{|S#$XRpj`;XJ
z0nriu>xW}bmNWA5HFEY5V0+hS{Tzp<we_YNb%V30_&)4K|HbmKl`Y(Upylh*A(~B5
zqji4&+jbt60O-f4_JwJKR>pwOy09d8RF+K9yVsks2i!_+<Cv*<RzCdH#xy;rISk(-
zY;*QRq&LAl=O@?g#_nkAf3cbIUktqoA6ee%Fd;*PUUicltrJWqU)jOO*1i~|8oiW0
zA4D1dX6(a}{S#{@*7cd)%tAq1vBh+>=kY2I&*D3zDU!zfO^2`GIbVSe-`$T=M!<uJ
zLaFozhD?BV<6393eMPc8x?r_vdXmU4<0q9g3qv8+ZTjY=1DOaLAELO|oeR~Y3}C+=
zo1f6v-~%GCT}>6bifyPYelt4<t~4f~xjnve9xU;Y*V8T;3ujC0U3kNdyeCRs%;E#R
zyQrM&mcIfldm=vK&iHD%NV5v+eiCt?j<CW$jkPg+0QyUVvVxaeDD9Sn5aj9`fJt0A
zIe>B|yhQvZ=BVm;>%&1bS3p(C2C>}+m$AB)N?to51T43Ft<w6#sNmD>GE9W+mXR>P
zpGqOITU=-Rv`d$zfNGP_#h}uNryjERnCR^322#8Ay7SRkgmzcx5(qme6&EJKF3Z#T
znv7KzrO&C$Xy-nQvoa7?Q%TUJ#Rz#D0^K?_JHGL*31*p}%p at oU&30g%2MQ->jy1K_
zitA>FKVTfNrcfVT!r2vkKInv`AbkZeYo{zhyc9z?iZPD8eZunlqlw3mwasFH&p=BZ
zWqfNHwTOraAVP|pUcNdvc_;(d-n>wbc45f1cv18BDE8ba?U^q&)Q<!Mv%`Awch#-W
zMoG>(x8=XYSJY9uvN5-nG2FpH$(I_m7de&VqHt9&ZNT$$;bw?eD0rz~CH&Np0Dsd2
zHCWB4iA^dl at VLp7N>1>RiPGzSJPFsa?2_tcCbjoP#Lt@@`I`MuaaEWStYel}-Y0cC
zH|pu{jB7*iiv<BnUal^IKtw&OU`iKn22O!rq&_s&QG=yidG^)HW3?#pIQb`{Jsob7
zA8kbWQ5Rh$x?F#!Pye*!2Xb|*h&cKKU!*H--9R_A{i0K0Z{H3ip`5%oYYa at fMWd?7
z4^E^7beu@*gWkQG^Y1ftq at +^rFKmAI8^`YmClDgN=MraX*d5#)3%G1HBsAjJ=944y
z9ju36ndr7<*dUTSt<`0uVLw(B!`N!g at 9jL3(gw=a31g$-d<yAQ4c+HAfd at KZDdpK`
zQoaXmN!$(C at xaQwqV^3GXjjq1NEg#S_$duRD&ZhV%u<}J_b7ktVSI1CGxclxM}TUM
zFppkxY!Bb0;Jj7gGUQO+p5cxVpV9i;wgr1qsd=7eYM{QkcTb at dSu81kS)u+L2+Ro2
z8{hXXnSMqm0)?T*9*d?fFa_jx4wo)2ul-W*7O8f}-I!MRNf at IK($*BTRu#xgmpD9r
zwWc-WsvWa`f0}q|mb|S%voy%u!G398f|4$@Y(kr$7%5G6E{e_OCQji%5rdo at 9hvi-
zGBcrT!W4|$aB3fecn?*b=75ScXKtQy^<TWwvlS*yM;+xmRa}FtKlcRpX-<J<&u`Vs
z$+K35ZgRk(_G2vMS;<7a6AX=|_ec<lmfozGI%OVUJP*b;)t*@H9NH(XYl;iQ%RQkD
znI_t|7Y`lti)VSKI-c#n6kC)nEr4l2%ZBcD3J%(5jPRevMTb|wj9nt}5n{d#Qg*9t
zpD^Z?6&pf~3S)i}607GRC^?PQBi>Cc8)l~}Td&I;N53KCAJ3_Z9NacWy9I8Eq?kl5
zZPVeMt`COLa^{4%HziRQ-F%sg27TO#P_LdKU2Mj>!XXjHGNd_84WH&`nJZK%rcPy6
zVPQQGJvF_*8CnA#*ZXDShb2=;p?Y_cg2 at 8i6Zy>QnUYZ9p^yj<!;n~?9*V8!838rL
zU?I-8Xfb-Tr4OgnOI!o<z4LvVc}@bxQIKV?;f=iqal9f{-+mi<%s-QBepWDi0QXoG
zrhQT|{iZ>DmB)dpz at yJ_M&5p&j=6fgX)G9NuP2{d at Kc;HrY9c~s}JkfT&&=ykR8dZ
z0N0z{#F-Gs=*0o76nJC~__BEnP+fL&f{U3HNI)%mD|ksZISE|gDwGm<L*I2y5ug at b
zNSpOnNK5RJy#!mQC#Qk4N7UJdM-qG$%_3c%p)8k7d}deVf4p+7;~HE0IruGW&*5TF
zn<2bB2iAPZ7#Y-k3I_p%t&<GzH#(KJ`I(S$J#WYQT?Zy%;dsG6`}U2mJdFk-{S}<e
z(2os6UcB9$c3{+2PGXOoELI*Ho(#EFp+0YDBjk9`DjWSu;RkEnys~IZJxSpC*HoTL
zLI!g5I&epX9H=$buOXWn73307iZ5V1<!+`M?A1C#9Ic3u+=3Tdf|!ig2D=Zth&A<$
zxsIc_bOwk$bS at CtgG9J1YNCus<A)r&x{n at xf3}%MREOl!au)ed(?_)!s`U29Lp+A_
zQyyLBv-MrrR_p<lhIEK4;RbGChsMWswo)R4d at 7kwr(Ycf)k9#nHO0m<tRT5M>B|zU
zM}ac+j}mh|9hV0>2tA!n8v?lJwUc~JKfWApT<|Q~hY_RL^AgkwJ--3ovy4mv24WGP
zR*|1YAapr&PwdKMsyEGXf9%EG2)xt{M<-(4G_FSAoS~4-j#I7i<_5d`Ay4%EnJuQj
zt`1)wBgM at a%e`X7`Kt3C))fzUx0!Py)F;*1v<~@E#_Nt{KpTai!`Q{>Z4C6YHjJyo
ziPr+my3>+a1LFY+4)S#Jhai29-3{o892-)efLh|xf5GN(0ZYt}ZdGy7xM1C^rx_Bf
z*|whuuqG+5sn=Qb_*;(7a96YQdU^fXbARy0kNx<Tu<oGw##5)9-s^xy^ndC=>g+&j
zh1lY?LLzibbKan`s~8MkVm*0<wMITXa+x0v-eRb8-~0p~(UaTD1}LaE(+5pm>t%EN
zYmiiRFnRk{xcuT<=6BaV(n0 at S@ee;q=G77NE(Nn11lB_#!P2A<D5W4)0AbQl)?<F|
z%W%n(6;pLmkHpvGPSz0N_>HfW>V(>l36~)Ib+nwk6Yl8E{oxeWfPF`JHMjzpkHOk`
zH at P1z&SBPW{!<6Rf8hj&nNt(q88Gol3xWFan~f^Qg^+e;9CON+`GiGc4d9L2D_Xn<
z%j(>`&5CDhFJ-9JeoA;@IUI&Js+vQEfB!9g#MKA^80)iKN5V~z0Vkz=dn&{NDULHA
zPQ6f2_*;;Vm;HMfy!fSnE9zOxp^fI1X(k=VT~^_`o at tqN1B#q|x)|qz%WKE1CSsF_
z1uLeI!FORbz0a}+6gR%)84j4eOfBLoTN4XmTzl at At!wAG;L8~)526Uk!XdYs+w<MW
zYl*!z=i6t~r>oucH+3 at Xr(}jBv50?5Y2JbB4VMd+@)D2LS at Sg&sk`im7!OvxpPKE%
z?SBog^^BG~Pen+|-Y<JKl7kWnF-fZ4n+(Wy&#mctDpQi>@!i<xUZ|h1I87kb&OaY9
zs`oEr7eVhjb3JnY61CfLfMirwrr-F*J$aT(Z2R~C$>7;Z)n@&gYp}a{7=3s?-urAL
z?ZX7(skIHH1!pk-WexPC8)Tm)BvZ at paB*X=B{n^D?lAISXORb5=ARGcOR?AERkauI
zW$Bb!X4IPqoLYcH5Q0Db at ISBo;gszE;%xbphX0omlGk1K!}>j?I{D8F#A=pgBbUmp
zk`h=B%*RmAYV~4u?d%1ma8{^0jYtDg&nb68^@Mhhux|c@;l at DgDB|0?_tMXsr+wy~
zq`1Rh3_iVJYHaV6wSl`qa^X>*@)wemczM^&M%QTjU;~?xydpoVwD4;<1|oj~9 at _zX
zm5x2Nhu=>sEACYnSVky<0if+(AMEzTPG9VggiAql4rX=0a(;5aJ3xZOKd5xbf7&5f
z`$NUgnV0!Vh#iQGsF*LTuv_|IIwBWk%Biu at 9}kOK=m3ot_-c at Q3jXJ<iOzEaC0_%p
zSmYZF$!}K|B<)8LJlDa+43$zIPfzN&(IUPGQ?L?57m at w)$2YAGEhHL!SGddh)gDX!
zsB`|9W5HB7q*c3WN~dgW<YuYIn5Uzt{q-bn@(r~it%`wkpV1jbq?dN2wL)?Bz;}di
zi%zC_!BS+&gqDj0(S*-^qr<U1EF|m2Jf5esyg;bW%?<EiH`))&f4P;W53VH?{6nn4
zNuf+$$>YleH*`AJ9fG8ZeH-cBMA1DNh=m~2m?O_^pr(Lv at JAbKlB0KV3q^klpJr5w
znz-%Tr7}mdc5QMrD*Z*f;Ld8uY<GN;uq6{SItAUX+Fm}saagv(-O!Z|p$)ndp_<P;
zcGFT5V9Pf#@aQSGUmDLmtweG??ce&hSaZzqg=FovPAXJaJ_K^UfBo*Y^Utca<Raxw
z^lm}ebN|kCc9R8x?L1{<rY~AYOq9J$-S9xl_IfkkvDZ-$v~+KJ#KPRTB9ALNe6$S=
zDr#8vlf$Z&-gcvX=ctqY$eAyglx at OReRm&i at GYfZ49ZXCsR&uESh0z&O<ab7M_n{o
zXeYfX*bgbtyLFYfY_<QN at +lQCR!j`bGvt4-I9Aa5 at ek-inNq_<D()NeJ2Dk?Q$g~q
z)L)KD05$AZZKy6i>uKKQ_HI5#U}0?5=XRrNSp5 at 0i?O(DQ&Gm=R;*f at Wwv2&M&@TB
z$Sg*I(!6rG-?C!UKL*lOop;83WN=S>O#hxtlIU;N7Bh{kVz;@w299^fEfmy6B7Tf1
z!?t0k!S6#VF!fgrDRMnp-{Y@}<*teqyjxxR#x}ll6g-~ygZUh=?A59%nB&_GIh!T2
zsy=b})qvJ|Ob*6$<3X^EV*bYA5(iyvfj+|CBQ at WTRm$o58+<ffP*P|2&Y#cBK{gUN
zE`Z<rV0u0vT(2z>IX#b8K}a$wWyQ)j#$<a5iIUS!)Esa<15Tk29?fHpV8E((WUO9o
ztbXJ_kCRuXvtcW_{hCKVGUL at qk!2pGIaA}yglj6=B6u)|pFPJZuN-MEWr9jDyWAk{
zIYDQT^QJUuZ<4?56~*`8$p%JsTWS7XX?{Cv at 61Cmc6~Rl0g2wxU&sL|OXC&Hr#&B?
z<n+y&LKRP+3)5N^9zCzTJ0cnR(jQQbe~>cjPu!9PI~wpi5a&zk*6AL_&uV4`y06N-
zo3s7gvC#CKkrC*rW?X4OQo0_wYj{zZ3PJ=*>u~XuUt;xA?ggE65yXAcMN=8?3u&I`
zo}#RDqJL+N6(X4GSxat0OL|Z)E_!X<-Fy@`s0&s7zl1sRxcLGR-GbdZ4?HFscQDJ<
zS(|$*h{1AESLD`|&m1b6KB#OogSh6nl>Vz$m2jKgz3)a9mA7#4;0 at oMx(-(vjr7y_
zdH+u?)2Uw*1eZsRFK~)pXsn&1g)dD?G`lXDJhArsmaq0iYwj)+TK|@D+$!}$ft~c)
z$1;loe?unuuK}XAR3hubJPg4(oz=dU?h#7ad=IRb*e>ZPr#+zD+5@~3+!bs#ue0o8
zN{2p6`xPy<Om}@Vqqkwub9C8Yn^RNLdbdLN_(TA}b1>8}J{Oy0Gj>+wh)WHb)!UAK
zFz7L?yui0VX+B3+RnqBA8KVfKri&)Vp;yml+GhtMg!f5xIcH|Ni$Msg_H_r>V2<1M
zNHa4DH+%uZ;4CJ)=V0;(ymvZL61TTA^@*n_kZC1V-E(J62!ozC{o0qJIhFqQX`VKn
z_$z}wb@@{|tWONo%}EIh``~Er9 at kuR!=Be%KCxrLk7!lY$kOZ;xi&u{OCYtcT6ZX1
zeHT+-%-e`DZtL_h=V3Bl+%@`fJ<|6Th3j!ySsH{y47iu0H3Y?%k^dCKnsDNtQH3vW
zQ=iKFG8lkxrRR-%=bBbtMM=uNW%bcFzc<M}s*TY49PXX3s##(9-O<~6?qUf>>y`*>
zmlltXJ&zSJqllZ*+{5~1&2ZRJ-5rs{^k}!1WGOWfVeJym4qdC+eFb|e5qwi$uj at v~
z?VGvDbiAoW;z#v6_6L(6OT+`Y@^W5!$%<L;B&<<{!%tmP7wFlZPqz=5&$Pc{qYLR$
zd$c?GnyoEXglQQ+UG;Llx{*jXFYnyPdW at T?Z`$vJZN!EIHzw7WREzw4LdLtZ(U~or
zHUuPs7~!c5|Nq4{4cyykeKR2 at +H=8;=7Oi+4zEOvf(3T}5c2;LD*VI5|KRe~n?h0a
zX3JyK#a=L2Mb+l&7FeFDa4Ls79}v8`%5)%QUopN~n{`A#Rd3i+$%bQFDo^8%V#^=3
z%O5iHfBm8)OD`|)bFEP)Odw;WBMV>ShufHZ4zDR{c27UeV1u}Bg8nJU!3fOvK at YJZ
zGSS&CNQ?HJPU;=I$08i at H6+i>B=<%8-3rExF4Yb}WtCKiX_!EzC-gQ!EwUod*C)#T
zq&^3Tp*lgiU3I{f+`&avOV)3nge|j+MB1tbzULiil^qxx*gdi90xyX_Ss&+1dv*0|
zHskp7w72!48ucUL7VxRffp8h8LN!?<zf!-&vj5X&+?LI84!Bs*;XGW at B}faFiYld#
z$A1;h|8!FGq0H-2F|WiTNoOS at S5bTax=2VwL{4bMSK)WQOzY>o)T&j-$wr(xs>NJ>
zcOyaje81pRA5}(Pyg2JDruSUKqr6;WUw;k*gC5g05#;1F4JF1NHbGt(c<lwtINBuR
zoz0?~l7bw at WqhYFJg1@uYsf+1yy>@o8XsjPuK}~XVNvFA$w{6h?4w=btJ_k at G1DEz
zTV-)}wl~_ZTI&g}usq_^ibCxp6|f#Bwl`l3k+0R+AxN9k6UC(;uew!rkL)h88QSEL
zzkpHT0(_?m;EqxPh?n;=#NOaPr)3?c)tj2pQO*$e at 2|^D=!t*6^7Dt^-4#WRzeT7r
z)-?YKGZN`RsvevZ9vWDv2mObmZu%Rh&-r)#L5xU?hsI?NM#C}|cCN8)z;+3quF31@
zQQST32y}N`(va1<@6s+<T8dn*mPVI?3A5(Mb-6eAUL8?lLKCNqNjQ87bIgGn_>tX=
z%+p3~1_o>$qx4Qi!7p*@!4Z;h=B<av<T1Ytj;bH``*w+P$N{tdAY7!e?V~S|Ku7}<
zg=<h0h4||i0$;0NUA-F|9J12%HsZ!L=g;2XZ_hGZWmq)OX1Flo5h@*rc!SO?%ryHU
zjON#^+({a1?D!J?fz<mZ5ycgz^Ly6g_i-R_#tyr)GwHVhUZZ at R>bG_K1C6w=Y0S8(
z#&%D$pM><!Bss$MvkiVjgirP8@~K0DU)|vW?(lf|=7)2R6|UMeK{%BCY^(B>nB8mO
zVb>SwQ4oPW&nUe3$GthDD(63oJt;puu?g>QJP_Fy$}|N07l`M9%LLcTgB08~EXB3Q
zG`HSfeoQkaa~HT;szNwq6F0oi7KmplK~=xg!`{|XbMYnXc`Z(l;%@wzaM>)P2{N0_
zj(KMk1rP#mGu>cII$WH<%vs+$dq~n>fiI<M?2<;Q8d9hakFh0XU3D<}+ at s5gcVXnc
zHk4sBkgB at 1ip~}m-r9s)Ul2U)`PSQ*so*m=Z$aKEwh>nuoTqFvJr9e%{o%df=}(k)
zITpKeakF|U33yHe at SP7*dL8>RtVEHbesi&pFK7SE5MKP6<~AEQ#nx;O*Zu0}CWre~
zx9bDFOZ8qIqB8nMpVp&}Er1z)0 at 2W82J<J8H(Bmqj&IGozd7l)6^FU8u!1yD%(x7=
zu>GmVvtZKv!;QZ7%x>m+Pk<Fko80%B7pv}g6Me(*p<mx at _V^u={uVgnHn(*vx5R92
z-bg$3-l5;En~MQRpY-22^uUv!?<x`Ze%&LZ{dCnSWbt?{p_sknTBr~)F(&nL+4g0b
zw%6+(0~`@E_p>ydhTFI=%|x{^Mdxh=qv7h`>}A_Lq+5s6N{Dk$lxO+`Z$!@?H=@Ut
zWg~`1wHZ at P*c)Ma;6Hy3?ZM7kT&4~zZOt9(bdWAC%K(S**1X#@fXi}J0@~Q4cd=;X
zmMNnw-*ny2XjX$941+T}`v))at+n~UdnQbPDcn6KgW}LDteN!)S(Kt6D3^mN(OCQd
zc<%z#W(!Wvlfv6mK5}O7U+rvtf9Cn~UCAYmKlu1POe(yIu%>I(>EcUV|KmT@^LFjV
zENuwaqk^A>vjlA;+%`>K%+M?Kl(V({6(4<KogD4g$1iXxy_rmMwtXafe)g}hEzh>1
zo#`{|Io~&`p3`##_pj at 0G!x>4h~Fv at e@943{Us;YXA#SH!jDQQI7nP~qF%jv^*a1w
zCT;7Iw_m-c58|gxtK5ie>(Rt+MSD_s_{CJ0Ashc&<Iaqvt*#7)!wHmR%hUIPA3Jzc
zeV{W-%cDi>cPts1V1M1>|F-ObXWC=8E&W7H!{?kk)9Sugdx<TN+9mvZf$Jid`&X|Y
zcFNXK=ak~UjBlI@{&(>0rw?kC0b^R>*FCFrRbezlreC|aJamJLvCkHa54A<vYl<JC
z`MPCS10(u%KiWuf;2xdKs_Jv#Xn-HQLV(Km{&A6y_#N+u_WyM at tnh_|#;=%uj>ch~
z_EK7dgiL03RmKkX*vtI1U61;NGTVhM4PKA2H>VtY`QZ0g&o7VIaNb5o8g1>T85d~%
zo->;;_JsC}(j{9rUXzzM<w!1gG$ggfdGj-!xqX3mC9T|mIlc9Jil-zXxuD4-<ntxR
zyKz)KM;glpw`r#u9zKPj_hZiog;BKiw%PuElKn#qd&c~&9g0%71CNa&_!FkT?@8;5
z_QMic{ja|m$3E2FJ<<}r#tHSQfqwr|Aa%S!8^HS`3v%&wzryJ7uFY~<9KEu}x70j?
zCmcePfz$<Y6FJP6!YC{~1B*-XW)7kKI&?^bar;XOqhIn_j!l0{l)O(|HmdPXzc4f`
zBIKkC?1AU^$@Nk_)D;)>CX$;*L~VVk=T<J~@;n)=q0vOq2c4}6Ij2_D&*71IPngRf
zqyX~yh~LrV%0a>RP}$Y@$l~ux&4n|?$4i{s at i|YfxO4Je at IZuC+m^oSX}Rb@$DMM=
zKsVEf at +}={;-~eA#dBNF1Qfv!YnLrl?qxIa2=cK8Z__?{r2T%0QYVkAfJxwWzbA_p
z<Hf}HUoP5AtzyC-TPnxox#pgUazH5g1q6k+2%^k1GZ_XY(+oa`!``XX<2b%B97kZX
zqW84cxE5f#Kz9~zm%dFMpIlBy!MUQXx<~IGF73NrQ5kq}*Wm5v4?eWrY at X|q2WDxF
zh2;jpMzOO7k{aZRvT at mjIcX<dba}T%+ at G7joBDLU$XLp4M|UdVJ;8J(sbV*bhSFm9
z*yuX2MCp#~IfPm}aMoI~LPggo-)<ZSunJTU_F?Ovm6c<118Dd}9+|~i+8WAggsqR1
zR72|xt4ut%EP}~AqpG1-zJtoyz66|o2u?N2L>e2xc>CC<Wp#DhFV_F51-Qcb*i1z(
zjcfeUEN$-PFQ0nLxz2dVU;OntC4={y<nv!bb?LF;5}KcLSPIg9ydT7diyT?fE+U!~
z-`4Y|+eA`OEw@)MU+b;;Teyh#>-J(&Kqc!ZxeFD+KOoHn4zu{d#{xqNHWCVMrpbm(
z+6F)bW3!{Q9aqW(TIAIlhlr+1h=>V5BecxaFG@)X*F6&{D5%pOcBX8J0(hgzW6XU<
z^VkubsS}jl(i}F#Js-V4RZRx4<mJ4&zebi;phOOGZe_IU`*<ByN}%ztgyJXSY~6F#
zQ2j9?vHdFC#{5!)$^_Gg-$vpkk7nzjS&2`-`kaj|;W;Y-!3bTS_*>kFH7@%rB>Ckc
z at d`$4E%;ABnCQdzmnk_T`E>-ho;)Spg!q*Tv-|Wg7F>2n!QFbySi|>3(<9>PO}pC(
z1tx^ypNnTC><7R?aNUjjdORl{Pxd0{YC(BJ+Fy#vS6L+V-cWfPB%XBFJaTtWrvzd3
zwJSx3D&{^P at K@heZ8<6PPdN_?K9h7JK52a^u)js8{W$L{O|$Uzck`DBK0Iga#+cvD
zPRgMinje&_nj0`~?${Q5eg5%+kkS4vSWM4jL57#w25+^UsxDu at _e2vt&+}e+C_`qM
zyHQkWiLEA_?nc<GMyRV4gGUjQXd=ziq?lY>S(#p5zQi5gXXyFPujSpd<4J|OyTik6
z&?x;2`t3a3>h%AMv9}D0YwNZ^8z(?;3l0H-1xav+puydp;KAL4Hg3UPg1aZUTkzo0
zSdifE at HXU}@4NTDdR6ZSRo%_DC40^}#++j<-RPfoahWB1jA9e#_iptGrN`BFx{rr;
zH%(9iyJMrUJ0GEJRjlYsUpge+ytZ0I5L)FoO_0{dB`@L at R!3D6skfMhYk!-81{#N6
z7ecH5L`~bjvq*#5*=Roe+b?q;UhBHT-Uj2z{MYyb=05<vnqGv2LB>CS2Orn5;I~z@
z*A at K*Cl*O)XIf@{9-T8I2v;Oh8ic)5NhP%2S6!K9PM|E~Zvf00owU<>VQM5CMZyRu
z!>^O_R2p9lQoem%wH at X!ec`KhnT>tZpEEp2k!I2Kt)E6^GOLJ=RVElX(-FA_U68de
zYk?M-Ef&_H?8ZJkCb=O-g*d<H_o;@b^XgrlbaPyuaiq%29|rBrj at u@rB{kY?atmh|
zu11^*y69_|cFq?{HBY at H>S>`#eKA78I<m`(1(MmQY4lYAZ)$64vO()Jh4rEkUJA)m
z(N&bC;>3K0ae`jy-9qT;7k!apuyLBn-{w60yPnIsF?K?GziqHZ6fj!RqtHmcPj7Cy
zJoqT)oN?myz}j!tFzksRlhWAHfh+K^wzX%6L5LP2ksqO$f5Igj2271r88{LBq;rbV
z#{O8rib*H)A$~a9tf_ybY=LIE49uo=Nj|V0Hula(K0T;p-kNKT#mkJ at f3iydG9PiW
zla?4G1kX+5Ysy5j^_dd)rmHAfaj~E_j!r|;#dsBWe2-Z1W>FDZg^kc8>uhd!RQ3#0
zUgLvKZYGC{><9(_q*Q53zFW)D?Hu2QBW-VdrjZL5lsvt12P)9?yBN6kUazEY at 3x%f
zCRv?&I^-fO8GVA-G_z>ZtWWfQFH<}<)fDQlkqTCSTS%5j;cpzC at Eegw<9$|%TdFk+
zl7xnwLn$r at sx1?*PTmQ|-5J$@#i>SG1N$RIr?0ROx<=sAe#eCUEh9aM{enCv+wrwP
zlkCK8PL`;`&%sfpI7+x6bK}k=s|e)4x0HoJ5#>fEZG`^ui0zzm2JvjjEg3rCpA+mz
zzWpOZab!i@(tJ^y4s^=XgKievubI}!yBvR14&O-&asavyYAD;fEU}CWO at RtQP=P$+
z2adBk$AgG<T^<<uw>VPf^9b?gzXQ2&d`>f<SEw$sDTNL>x1CSECt?@a!ms4B;bDh@
zC88tvAL=`Nut6`Lh8yqiaLZyCDx*W&cL?@nkzu;|k9;JA8{xz#o}L7~K06mllTTNH
zk{=2s2q!k$PyWy*CPstEP_4k(#b|4QJ<9ks{-^4c9ifu1hi;=6X)NqFbym^+b}V6I
zIumolpNM?3ni~2l5xf%<r1O at i<xWBI!h?o;U+3xOG(0~RB?V2V#~&asJ`8 at 3d{_EV
zy7pp<wtd)(VZ5Ps0zcF;cK{Gj!LJEJz2w94Xh>FrwJxfRDBYY2Nk<xgd!lIY(-$w7
z2&!={{D)U%eSWAz@%c0bXwm_?r2jMBg8Z##0KR6=DfuU}9k&<@3PJX=@7IM#O>1Ok
zN2E%=|LK4|bUZw~BVM$)0azxz){UO985|wpbH>){+S;0u&8ZanYm@|ah6F^vDY{y>
zR5EqLR{@rAl*^A*7=HR8WLLJ=WGK+EtJDh>)ltUf30m_+;^cn6F@==bELl341<?Zv
z at 4hc$_>l?D&f2CkBUWm|Uq#Oq?Z1xfUi_?1sJ6Y;JoLk@=bNYFz#F}L{>IL&J_B&p
zbp0k9ULVHVnhj}(4=_&=uWO$IaPh{*#`Y4milZ(xftCG*24Dl}Ot<4TC()UO2Akuj
zAE!#xGLsRXLXao)1^0x$Ub|)lUwcOCd0)dFF1LIj>T7mA{*kl0)Z}vYJ5i50b9B{h
zxnTL==>*^`#b at -=Y5cC^`kKr8{(MI6GZMKTW!u9I{mAGjOR_Y79qs=<bSRPO_+Y6?
z?lU~O9xHH%F5m}&x>x_NgE0CsH?Qo4odY=|X`ek6a6~yVFcs%8fX6&J{u?<xg}0H<
zZOsBn^!Gi5>Cac%;1-68jwb#Bd?zJ+p0`gHYZnoCeVt)}@1CB2-QUwiUq4^;4{SSU
znvwmx4r9eeS?Z%rp=<@;$+$TC)B)JIfmaCz%M3?ycGdHV+oNb}Dc-WSf8JVpXRa9A
z2azr79~%2j)^O!W%{LWQ{LGkQNzX8Rm%Q>*&yb#r4b|5D1iHXm{@4gy6Ni;H+%>eI
z(D>1N at Ww0hO%&;Bhd+Yr$r;>cAWMORL%q9RZTH5t60fUm_&P$=(b+ZZP~k7o@&;^N
zjc5<ES6W&cx%Ta+GOD{tthA9-E!~9fASKvL`K|otF!H~hQHTZVnnW;bScsqL at Q)MO
zMtU;~8OvX?ULU8#D3T at Jv$1k;!DKyi2+vyOdSlSivfskPiQLf8P+xJu;`f7Pf2kL_
zO{hQAi>PkF?2xa$SQ>9MGiS-#=y7~5cy8Q!edS7YtzfoqspanQvYP$Yl^xGQm$O5+
zDWYXvvK79$An<yge(CZTa?R~U&*A9i?>g)Zl3d{YiNf7L*D>o{9oGw$n2}ZgNxG`@
zhNnULpM#dI3gYz$aBhm=8QlWsA{t<mtGl{7@?fN8Tw$Q6uVpRuJ{-Tu;S|OXLd->!
zdW1tohMt+rg{fU|VTm#nF-WS#QbSR`jME{^P`ctPujW9(2!tBRprZKo;6GWmU-qZO
zSZ*rGkE%JYKvH1eD~(}y>*1^eYJQ)OSMTfA<KD5s#pU5AaeQ(VPhQ3=+MSw+bv*Bj
zw056Je`mt|`##BljHFb5go2!o5cG at 4qa5@i{3|BR<7zM8I5J at G9vpZyk}S@>?gy_l
zYjP0(yqw5r33YmxxT%7}dKB!l`v4l-?-T&Enx~T;dL<X<oce-f3qz$ON8t<QyM5G6
z7TXIm()||kR3)KFZ}u00GHo-nVcQ}iZ!@ev+b|M*RxM|bloUCdnnMCrW!Ca|uHig5
zhpe}-&m%~-ks1dx-Lbx~z1arsI}<Xg`mM;4LV8!1wj at Ix=^{hFb8#)p<=jla_xN&M
zBcja5PmAok&mM`i{=F15%ikQfzJQ?db#)(M6nQ<A+07FV!NY at M!k)B&G#z|)fL|aN
zX-Aerba{bxwDMi8GCQKHsjtzi@{M;}#FmUgirUlb^=wQ2ZJsLh%Eyggb8)#&P)7<H
z^2l2hIo1Lg`6DF6SuHMj%l08Xh6;@dpN at A992oq6Q+ey@SD_4EB>c+9&j5pX-T&Bp
zwwa$<+9L7$opaVKDBWkG at V?#uo_#)8PM*|(y1VsWT!X-tA)szybn_dF&U~cnmp3k$
zP=}PD%~5M)g?&(8ROafh)YsZ<<&+@!5VD50j2s3NhDV)6mn&DlEn!yaTmq)oAbx%c
zrNXEqVC^<ubd2!ZzBeG>>q%o2ga*=;otig|9*u9N4ZuBNO_B=>Xh&x|MnwB>y!eiD
ztWdEqj#x7IxnwB_FD+qr=!5>xL^dFVvVA;4bg_o??(?|VQc at I7NPM5#t~jYnOlNYr
z*tT8ga(ZLnB_Pw*u+T>}UVbu<S5%}muQfBXBuUm=D+$6jR27<C2vC!_gqt{nc!9;O
z%=-+?QF_>e<tAvl at l8ibO4EH@ZEvAu6FVQNpyUxf#Yfq}N#rCUEJ4YIf1r*v-nAh}
zYT7xPLmeT0UnW}L*=L{M|BxnXXpKs;brJAp7E9PMR#pf6HJopekGJ#GjS)nGE28%}
zU@(1X^EcM{-;;IufgcqWwR(5^z$ovWRB^n}%a*VYEz-_2O*@zZdUxEMPLVikiN7;s
ztLwCRkNea!z;1c;A-&+p(`OgbQuF?5sM^fM_Lh-^h;;qx3M%q&88?vrpgpX<fn#@f
z{KaOg8sL6JX}W(<L&<~n>liY^YBfj&qeWmz_=iQx_xCsjo4kCR`p~M67r8LU9bEKE
zm8l{z7(CN>ef*ll&5xtIM6v)#YS|}`&ZVXpJZaXvFp3Ah?@Rm$wX8)8jVT+uJ=|y5
z@%CPc*Xs_{5QX{<<Fv!vS0Yd8jo~5r0l%wXji{Rr_GF=wLG^defhj?#=)aE6o)~aA
z{gFrfwCz;v>BD$bG5Q`Zx*&AJxrf|g+A1|S_?6HWDRPN;rG(x6`>dKvk>l|DPzU%K
zjG}r3xk_xql_fm4R}n+A3M5Y91>(YsVHCUq{N3pV5A!XjTZY!u9VwuzE9Q{?)8Yj2
zJ*q%K)J!r>AkT&<hZ<)p;PJ4c2)*(r4Tt_JBR?k6Be?N)g(ZVetLT7m<all1^&<bz
z5(<bH|LA6=I-Kk6uZ@!bYgB=`SV at ysT1EX}>=K4pRf}XBFHt8W at Eg*A0h-x+DOUxt
zUU#itoL~OjJ^F_Q&egtlhGrf|a- at EtYkd4cQ}fTKJ$0}7wQJ(q1q9BQFub#txxgD-
za?aa1;Lm2qnx49{p`JG)TRFJ#rI60E+CVn(O`zj?*S?aknw4~D;+_#^=+})VrV~<s
zJV~S at 4aCPeU_~qBwm_1D+J#vk=Kpwea>6G^9(mLOt>5^)_+Y~oZNEhs#0v~NxKA!~
zb!W0*?tEiFDUC5_-g{z;s2=c7OTCk(C0 at LJ6y<oJ_g^feJZc=)BT3iiY6=3k_&RFh
zC}XXiq~%C(ipQ3h9i4UIgcuX{m)vyOz36$0;o2n at Z>>nW<idRSAia}#1wd%`W-i$`
zm=jrng(DlhVY$9CVkFH=+RD+f&O>p3A)kj}gRXL4;I<kwgbg*<bdO)q8WlpbJi+hj
z$IKUJd&sVvc6~%WT3thABfu3%UrYq?J|oIFG&<RXx(JY2-7$fRrfq+AcLC8lPZs0Z
z2`IHO!f{H%>68^C=fS<bII<#{!G)R=;4j-RxJvuOk4bJ?)8eqWWSQ%AgxHaAF^!8o
zAToT;vQJF3I$krm-_vGn>zX3=vK*YaFlQ&PG0uLHLAkcN{vO0Kl0g!7ijF+fLEMZU
zD2IOA*g_o%@9OMXd$E_hZtC_0iyXA9E5(9(w0#r{z0#qe+R*?w>cb;W9vgeRlS1Ri
z)pVW#x5$0Iw7cf^I35Hl!pkU<cI23Jv_?iyHKN2vqN}9Hf+X3Jau#iyxkX at eXi1`W
z;wE*~$5Ew_b{7_BFDoko1lv9(2L2Q8C>YZ9sxW=zR7f!JuZ*%@J0EX``#Y2cSC*hp
zPH{PgS|?Ro*Tov{N+>s8;Vo31-;rl*=+G_*?Lzp(03bf}++o7$APN3x&h|NDKgr)t
z7a{z*hOk3axI<K(N0 at qDcHrOkF^iYF&V5OlpHsqK$g1&!b7+d|nIbVnF>+`|_K-sN
z*ANZxH{0~E%9}v=KZqq_l^vW2=r!B$j){m>L`QEUgjocrNbO2v1bpcTle{D+ at ny*+
zF-y%)2OU0t_l^is>W>W=!S&J!#mNjRe<>NO-*kAH1}tfu04rI|Kcag_CVci1PHc1`
zrwF-jV+It-AY`{Ve5rlR`<Ni&&Eyef(eg_B7VF0LoY?VywhJ1rJxXF@^<WhW6%B2s
z+`nr*kM4K`eQhrN1CjF2p4AR=61mnr#F|~8Qoqw2UksdJR0u$*_hQOdw^65yudpTk
z_!hnlA7S(nc%V{Bez~P;85I4M(bm)U^(PTr?B1_5mQ=8;8Y6z$6>Az-H06sCkDJDU
zD7zISO}w3}0q~d#W&eehQP?-0fJv5YM3&O+Fp;r1mgS8M`iw0|?9YOtP4>(w at e*%k
zBh_W0#91R?8n;?Kg9ac3-&l9phij)0W>DA{7Li@)U}5cFTi2Q5u|;+>8qy&BQ4E&A
zdsV#L!Em1x<>@$lru!<?#E>@%-Oa1eJRqCl1Dm at ffkzTA{l3&8ib$<AIHNp!%N^g5
zRU$UQOBpXDk&*jH%2LHE)RU|x#L03vm4qG#9Q+Y{jOf|iB>V`3u>hTFL;dYH9JesY
z#jE<WH79l{It)k^qu;cW5H!B*grnzssYTRTaV_d16sPfP1 at bY7D1T1E^U?q09rFpN
zW$>tKcwIK9fz|Qm1E-jE(^MvudQJ)b*q)taWzxBHe{tZ6IWh)(KGGCHLICH?c=q;y
zD at R2f669f{L(vIk at -<TD3BgyKmwX)8!T!m)!m%$MiEG>=#H=Yi^KvG8*@7Z=oj!}v
zd*0-t=d+f;e2AZ!mQN?GKhA|TWTn6a<g^qo;A2ncu7<D3c+3$fDq|_JAm~B at ie1JQ
zSjFoeBt2Q}rD-%E0PT$lHeptw+EG%?qM5=7_lEf8zhdrgPVAZGl9u$F*TF-F*kttR
zDo?mguY{{c74{eTm|88*2;O^i?51j*Wipg(-(ui)p|Y-i03}5=jRmAvTjU7XW`$gK
z8U7l$h^)jm(()fq{mswjk%XFV<z;hX at SBH5bIu5n<v=qz>XVAN4ezM;!d(Vg0Q$-I
z5C4H#nWG9IWko3F3xiNJ at s{;0OTx8vMY$aH#C6JI@$vEf%kll~5JCMW5XD*T#)n__
z?%P~N{RXSI*NFM(j at ZM#OD-5js8SynTnthN#J^ibpuY~t-7p^roz{rTiSWXoyZ1UH
zK87lvRfkTx#9C1467w1J|27~Tj#yKeBci^Y1K9=JaUqh6P>;J5%!to?3_vMM1v{>m
z(tE2JxOi-DujMWiQIrx{Cil=_pksH5wLt<Id*@FnvP^V!(TKNGDrMMMN;zxltQQ5r
z<#eAeFX8!;)<*q%;KcG#BqyQ~wBBNBg|E&#<P*ci<{75Y;dYYRn=V$$(s|xGP|Q0m
zf&>Fv)y4CdKD3!4vvm2A!n_wBI$%pDaW8^UVR?t+Kvh~teAcZfd2=X=!~c at tY4q>j
z-X)1}&(rTJe3{(sz!p}omTTJncB{N!UJGFc1|6z5A+~H(s0~>MEaETF8e~L3Q7soZ
zw-YaN%(kZSi8bGnKKkpyjYj<;%V^A-32Ph}*_kidrQ*b!7r)xx|G97qzq#!6+-M(*
zb(?g=$`ysJSm_#bddK78&(9#U2gQOqGqOM(U~BxM`bg4lNvb-iqhwr+RCU;h2<H-?
z`GB&1FeSu#bl`!!I|IJZNABqH113P!qy85}^P581@=F8+jL;+s`k9}s7GLs`rxgXB
zwV>ChEt67qMox6_HZ>s2xO8Vfk|@*4{g%p{x;%A>otcWs8~a9 at MJGnc&pCO!-<hmB
z04cKlpg%oDR<y(`{FdkgZl at p}$Re<&|1KjTL~p0hd2}fE(@E5^GAErFRWH5<kjv{e
z`_4bDqRoSWna1i#ccE`C=_q^OoM#?HXF{m^+i4wMnA2h{_h;9T!i9%>P%@ir&i;e|
z4~~KEadT!ZjwRIz=5gMZ_{-hA&IZwO#uTAMO8k4b3x>85;aF_xu0 at V?JMXXU_GxLB
z=BQiWTK{ZSo41rJUYM^F6rXqDdSe%je9wAg6it9j37w(odNCVIPKyf7I;v3S)6FBq
zj+|o?4VKxog(4GEi^<~D67eq+Gcqw!QVZCmNK7^*#~l(KcYdK2LsryM$9jC at B6iwZ
z?!&Y}+g>E+K$`DGc=XPPX)Gq}aXb2!XIE<gGQ3kW?0pl3?&M+RMIzOTZu)+(mn<{4
zU#eT7F062sPY7_2r+?!KfQ{+t=_z3Mk7h~%l9JNYadMw~ol6mYYs!%%-?1>UX|^-e
zhIDcD`japyjgDM>R00<`lep!X!KXcNR&al(fN!Ko5mRL|D at Ib8L^2I(`I0LUUA7}O
z8Fzc$iEz#>1$kon#~hkMq4gDJLrr9bj1|cxi8oFpkBxYxM+A4jewKn`_8_pr=C7{z
z7KqwZU{!ZUd#_Mm at 2#u25I^{JJKt_=od(SD?fq#&<);_1%W_s#I1;hnaWN9nzs^%*
zd{JdLO`VZ!JXol^Mp~7LbJ(b5n3q9picArO!A(Pu8H6jXt;qjgs#9SpOTRE%8}#Si
zS4<!Qt{umY=2S!7tfCw-h|NKHJ=0P9q8CmTH{W8e5>0XZv*tNiYPbfy*cdJ)Usy%O
zECu{EF6@>g`yqY2xndWByvsj)Pd$A%m^O9eDg#oUxiDO6a{YXO>?6D7SSK&rYMru-
z1^7IE(|?IFpQ~V>t6wJQC!(ilk4I=n&2Q<9brFDt0xFtrz945E9TSY4&?Wwu6Y?3O
zFF=Puyrcb5AD=EmElJlq<ht+AdOfSGuZ~-K_Gh+|hdBI>lu$Hi<6+8i7+(RKA{2^4
zCOM8x-5JkcNLPjxj|-{i1rq7uIqCXK;V%meAZncvmOsDE{bMOR2u27usjRRg|Mcq6
zE|<=x<dqjE1tL3AzOazVON7jjOA<8KmT}IMd8f0^RSJsd+0p%Y(Zti9r3KzAJ at MER
zsz3*&ZekW{0IQOs=d+h(y9;<Wf*OCcPQQld7*$C3nNXgZDjel3>Gy_%UKwL}@y+S-
z*JuqoNQLjR;#0QK!nWfN_2JTTA5+%DUFw(vAgZ>O1Tj1=UokEVgKAajswf{pc?P&_
zZEpZ}z_ay#a+8(n3`t1R{Ww^CEVyBCx-IVK*CO-fFMKr<dXua01#yMPq(#OyiaaRx
ze<nl41V`rQs$B_cNAB}Zh<FO-)0%tB$tmuJLgK<Oq`NwJt#MyXd~Gyz-%<oh`n17k
zvX);V=wR%6jjL7YtP~M^oIu!$0%VVzx~lRuH107TxCLQ35e-?O_Zn)romfkWFWI5V
zI%$<9{Y)sGQA)ZVMIe%zCDzF~pAD7wxy>udak9AK>?kC!l~-{mYmmL8M2oAZ&p&!i
zjeMG|1eQ%WHqT{N*$t)^@Gb<Y3jh{e1BF})v(_*s(kvy9$c4}N;no*h-(~-L_tJ`I
zR7b at x@BHJI)r~)D>4D?^-f+H)*ktPiIux^{2U7tZo|12znO4bB6w`oPU at C0;4PQNf
z6qO#>aoJFl4V|)R@*|_VB9PgSX2Jp(&Hqng+KYdUv{DyV1S|mL5IO8uBX8GiUEy*+
zc{}TvG6x<u*`mZ`6wN1zQ&1@{?%uvXD+4l at +2|OhjABM;b~g+fePib<O&{>>6$|xS
z$qn-ZuE6oeFuBQ@$|CWU64eo8IGxpy6N@&nQPCA^T%7y}XtGLt>K+*5;a*qvu0s0I
z7hnn$OCuc?zPHr+oF80UqjuV5QTG~_77^l4p#!Wb6g67No9iU%ZtVKByk`6GQ#vc=
z-Lr$@;V4Jg>BEU-p3E~G;RKj|YR_Qv7T**{4d={MC>!4|Qpnu<>jrP_gode;!`$EQ
zzbCLb`4C51AqHAx6_>f4#egH__NU!!Mb^S*mW0)1Veb+2;ap04*U~X!>{W`}><V#%
z$IUf9q&2~N59xD^PIGD`7(mEceKH6TJ<!ivRTKmz7tJIG1y->%IkSsi!;vA{mXgu(
z%hem+UMjtf+iBaNq~Uy9kq)eu!-|NKk;EqhA at G-7Zj#s#jvMTO6}ADrl?s+d1-MWV
z?T;%+<m46Tb1bpgs+I&~XW|+-BWLe^7}<?^`evA=s)Amcc#(7FPrY?Qx#v}s*_|p-
zWGYzN+bhY_!!oi<ST@`P7ncuwOU`#q2p`w*@h^<Vg;J>LCpz98M6g3?Fiq&CwPbJJ
z3p%e#0OM^ZTkLp?jvhjInLr8arF51md74X&eFjs(_tMzNG~w(x1!7LCK1EzPjon$c
z_Qw0%ZZ!uB6W4|qL8^Av*hwaIW===NiFw3Y->#L$9TIW8rba*AyX$=0o6NksVN*T~
zHW9e-YDt?Y`3l!QbvhgRd4htFaI4UO^mS4PoiafJ<*N(k%S3 at a<JKbS^|Gq>Wejh%
z)?aeySZ92}pDb56$u at Mv!YK9o at ig<T-I?+NxfWmUw+Ow_!wSt%ew6iz+NzxL(@9C3
z7X#KIA_GZ^2r0uYL=TyQa5I-Sx~5#likWh_h;(Qp*z|4}TAuAo24G)+L68WcLBR-G
z)jT7J&f^g`co-*w|Lv?$d%YaGj2>#*Ldw!fCMfUZL-cxZgb at Zk7_sx^V7mt&w=g~|
zV(ulcB6%cwkb$+{b>C%XA{tQxlSuu`S3eV(bG_4lEfWSJBJHoQxw6+5?UXq)GBxNj
zb at b`_5GHXUQT7N0+;CYe0%;jC#G}@srcl;Shsx|9mmXN+;2cDQMwvFYLzM9ug#BHl
z&2^GJU6!|8!g`6Su%cv0mV3qT&S5U_qsya8&RL%F6)*o1s?o%6bY%^+;5TGwzi!m%
zQ!83k=vA8pv{DOAAgD3b>pC=NP%Fk0qx8Mzq~K<f{7wZl-<#*3496a4%#0LLE7<S#
z#%VXH`dH~|kn*OS#7d|9OXVr`>ywZbR4cPkiLwNhS^v3_7uiqqm+v{{_m}wsvPpjb
zrDuTu_T!=a%kw^yy{-EH-0AP}CvX5J`1e$x5ls01=3kzF^z8U|csP at cShs;C8_2D#
zc8z$QF<99a4+f5wSQg!`3@&dw27T19t{8jEA)I2>!bFA#9!Gave$2@&&r|_RTc;DV
zmWbN;oQ>Qw-C*K?VaQIB10ij1N{O&9yZ(Axd at x5kS-yKqVnyO&c#Cp)%L;JQnP`7o
zrl=1k6-y?GNjcY>;)y#tuAp+(yy3v&_*o(rc43L3_Ol$KRxFuQ{-K+XZzQGAyFRV+
z-}CP%i)#4As$=>|1!ZP}8^be@$$Vc+$rD{7Wt?R1u5g%qk|RqKj-^zeH2yS9#Fknz
za at M7)wSks32yZf@{?9Y1S<IN8K0VX6GjRX>8CMyg#Na!@-!9DaMbnAZk4T&n=z9+o
zOL-)Sm<GN_06cuMj%ckaqBsyp)?6MKu%w3e<Bcb_Xhfe7;l%DSpM0|16egNxIY~rJ
zBq7oXqLkdejzJeP4i`{|xju3_O0BMb6N}hRdq)P3o?GxS`s^WIB%>z-MpAJ_cU`bk
z?t8_b3_b^JiE4lP5c+$oW&i6&j_cQ2N}d=%ypM<WJle*6>OZ`;iz#yMu#-j*$$iIm
zKVZas49yW_bN?3A+rPUtu2+pRwY at 5Syjr3`jBh~!KM?vQn=~P_pnr}3<w!q7U*lwz
z-W-=(jDYQ1du4EEB;p6D!12>iv5v1e7$I1O`WDQ$BtS(52xh^TVQ;3C at dtpr=8g=A
zuD4TC%$PomONVb=_uX%@1a9vTxR(bDiThLD)88>Y`a_#)qAMGb603~#R(a_WEHVcz
z><Y$HvCPoz85r;r%x-vqj&7)xYl3&iB)cP~%<@^Q%L<R+UiWJ(JVWL(bjHqC(xP9|
zUks7o<Rg8n?1gSX7G-Bf?g2ss02bCv{lU9=$;TN)Jq<=_dEZZwM%Sk>>Af_a_xXpa
zvFL|UnY~E74`#)IMI1rjK1M&hA$~j^%s_mNmQZZO>EmA>vrs`pVPBE&15%gvm~)T*
zgk$0oj_4~;dE#M=)1ookC>!SLg;l%^)ZEp0E4RR?ZP2OR3UoJG3Q5kS7Uyzg;JKGU
z)WQ at HLUlc(y73nX!gc=)p}+3?d84LGeBY`4>vrGX!+o<b+8AbO at R(_Q3diiCk at DAw
zJGJqYpI*|$r5BoY8+_`rzs#woCt5kO at 2LWw=8slotjMwtvC2<xXEn^<m(m$*JB>s7
zm2S@(jTobYD)oalL&0`lXFyKJL1JK<8NVN`w;C&qGene(-*Xb}$h#sA3|@Q9d*VKD
z7z$Oe+b*A%qWm3QhwZ*{8UXwTgdytR9Aj&B#S_Tza&IUaC{;N>-gqd0!dY13?27Xv
zydhtxVG$(DFp-})f!9mVoWPNx!8j-N at o@%HQOXOQSTgf_h7+0y+&?3oQWsMlJ_MQr
zK7{Ny_l%Cm9;23#yv3(pDEgabb2XG2UF~{1?{y7%iSS11VQ at bv&8Gg$c|yq6J!#Zy
zS;my3!kjo1p()=;A{jJ(+8GejP`mq+NFQ%?P>7L)&~(}VNS2_{%6++hW%T)01#%g9
zDAN?|J&Nm0aAZX0czVt#`7ZLO(W1s2R+V~OdI)kKc6}iMP=^%OnEmJ|P*&<ww$(w(
zJ;p|kSVSH4Fj}|k7;i{dy>m9^Abo6#<*mK{X!pjgwKRGAg2-&m#UmxHX0EnETk8wu
zLg2ala+i_R!1QSrKuR2t{!G2|oa56Wf!tgfg-gGR%_B!!!|Ef)?>a$pi at MaGOnEzb
zMq-sRv*uCB0D at QI@ql38etSv*H~r1o7 at JB2zAZbd!ZR|aji!8+O9gV3r+P6WCM0>+
z8hewEGva;fk#ZG{YZ$DJO_ at -M^CEV>M50GZ!1KIQ+%>$FJmi6H!kr#g at RJIVf{L at k
z<=^<gf$^R$H_%VSRf$`|DBaH-FXcd=gd>8M*gtff;<{EYAn^{yV_qRZ!r{6VK;)=t
zXXuTy{@- at +t-&{R(#pAqN?#}=h%5|Q_K~V)#RzKR!|P~rHYnHGnGw)&VB<u1rMnY;
zx>&q>oNHz{mFT)|_XUjD?RUpDC#O8~@RD^i3%!i|SB{c?<D<EYcL0u6WPXVZojxr}
zQlPqw^_%Tgu9oyx>AnCCLfEceDb(ALi;oj*DnAXgywl4^eYly at h20+kDF0}Jy0!a&
zwqy*!_xG$2BSDe$%X7x~TvahWDTjRf&VJ?)O-!Eh#ip&oVFM{sQ$cDU>2(NxCW%k<
z!(0)s?eV+A4yp2v-b?+i=5i5%t<RG#g5Mz`5`R1Yp9)4(#BqQ~r4Jqw*X4-%LmPsJ
zQ+k(?=@sw8N4*y5XHFA9r12%cNL~deg*wM}19e*N6?P0g{YBv9#_N{d`zu{&eS*4A
z71;Vo&KnV?Ml$=nnjgneIPY0c%FLw=QB?VZTv;Rn0>?4iq4U4u4mEn}#Q?ir)MCF(
zSX!vow5~bCIvyzvC!xn+VyXPaAY4%xMJXJtsUc5>i2?Q(O#|!xfDun5TX;`~k3;cF
z34%i*AE<8J1f`8JKwUz>suEaiuJPx`etA at Gk=K;A+a!5f<O>-<Ee<XDV|hPEv-*cA
zd-*{AL&=QKK()qobN%qHW4f_!tVEZeQr3%AC#U6!s&ZUL$y+Xuspg750mXyg8RWMb
zMtrUyOf3bey=V*uLzt8;nY<8H_QPPQ76hiIC(E?zf#geglYWc>B#`HD{yIaR5B`W7
zt!*H6t4tqxq%Tra1{$i)PF95JvUnx0@>7vqHgMP>$^fe&jc<VsT2dj;eXzZ2&&;vZ
znsf62D7t18f?j1dc#NV?C>SHRf!KZd*K_jylxar49Q4gTQa`A7as4sB at S60b{9qS{
z$SmnMM_f^tjy5cPrvCau^lSl}PsWe^h=p`J`WNG3cCsjfYPo;s52*kmI5C5f(#V%h
zlO6qfc;YGZi5gk2CyH^F0+xvN$JhY$4 at b4MqX@09^N7>=2Gk8C9e~xmyHox+{V0c~
zKCO%;A at Ue|4^_!)v$I^UTKwbZ56Q1vjuXul#R0_!gRR;Tm0`KY%}(C8Z5b+ROJ!PJ
zGV2JwZUV<W4BA<*CFMDA)*63#993IZ?(nJCshzrg#s;a~L_GCb|H$8b<=iU~i{wRG
zFIW#goxB23Eo9%4A{zifvU*j~h+jRU&C at wG`|H<BP7~MzXE5xKG)!S0ggN?tEI<xH
z^X3R=%R}WGvKR?>N~ErV^ib8?oa|-R at S>Y_zKHOe at QuClEY4-Av)@k;I=Azyo1{o~
z3ztPHZ$qjV1TaXF?$vol&4sA%r98i><%3|*w at Sao`$K_Qr8Hv6wAO!4b3=_C?mQW$
zHB6mweFDipyMH)=ZZwfBEszyD`>4pJ(l{PuRus>t at CGz}$u#20Allcvy{qWFtaWpz
z5gz39qt#~;dsdemmJ#=~!l}jSF|2miP}8y=9vfj5_m(asrv_>L*dWhu!7%AekAVP7
zCXT;Jw*``r2<&MUPAcfE?Q23gN at 9%^+yeBZy=CP!-z;+lPzM>S**sC9!=K{|M7fE`
zf8(BDi7 at v5l!#-iAO$s|fQr!0mom`$H2h;_PXJj+)KN!W!b>YW_5r6REcwugTVi6i
zc#`O}>+n-9a>E!u7tC7$tO|j1fYsMv8_|Sf=DGdoH$~WWX}X;s3 at MQnr5YiVg!`&|
zCdTOL6Vw`?*`g+p|A&SUcJilcZl;=0tCgNPIYQT~&QmXG1ZTzYcIPj%!L&Aveq$TA
zzyjwHxL+d}^CvNax(w`J1|_|ne2=6ShE*!-Pa{mWb7W|Yp$-I(1K8l88j?w9it5Ph
z-42&v=8e3hu4W6Om-{8Xg(-YLJxSLysP<IGGU2A6R|Ye{may&l5BIH%(;v{57yAlR
z(})W~LdVUqlcoqewHPgDcIezNP>B5}cxmtvR31hzBUVvZQe{@boh<H<KK5HWzT1(#
z2$oBo*&Hv5#Sk-1NnulFoVGXjXn1!15XL8?ni-9U7gJko$Ueny<Bq0l@{+v`A$8L!
z4wTdegZ-h|=4R(6_t~HQV^Ryis}~c05*4Wt-FEu)R!i$FpwA}IK7R|#>`r#vC2ch)
z2jeS|8ycI&ztT~jDMcr3EzVGBklEWcz6jJ6;Ng)Pq;OK~c>P at f2Xy)fkA9up7 at byC
zAgqMcxm8T{KvUA6sw?Kg5K8_lg7*4K7A`dn5#}|QRa=^Z+d%6YoO`~ebp`SxPAHkO
zN5%5xd+{ZFJ~(V7ePwOQZVk*Y@!}^cWTE;J?wUAUA1M|oUt_?=L^aV(@!-_^X$W8`
ze^XY+DEg|hUTE27NCv=aZ=57^D!n3qj`sz^477(Km9 at dK$G?q=4g~}QV#*RXRqJl9
zzk3hasnRyQ2l52w$+d!EDw+ax?g#ek&EzRv<MG4y9Q!4%s9JAl3p6TUa%D#8!%Mwg
zWE!XpzILxTU!b~l#N7Ykc1N4s&t1&(^0fM}W2m%a^HTr5IRWD3t;dAew0lUX@(BX~
zWd9o5CJ7>P6zG8Qpin5%RW}7}a+C%i-HFzZgRVXc>omgHK{z{osaA*>))tQ>M#U_9
z_Fg?0oy<Q+f~1ZS+{?g;OSc%FnPLqu+4B(e_<%~r<587{s9bcR=vzL%#Dik9J-sUz
zEz+rSrH-EpWVEO`p<6blHoh{OtotQ2DCoa_dSFkV>m4=>9qepm46k1X$~V$R+;=tZ
zrIdM~v5)SWywB0}0qWJS-~9tcPejq%Rk6?Lb3^&rF>X>|B}uhEg2~&6-#58FP-;*;
z!DTUfl20;JCQk+24uSua=3FyF;{{n{<y^pir at n$gPGKvRMxz$oI46_B{59A~^n`A=
z{^A|r<A2d at HB7S?Ur!j`o2!TBwanVlw!W~fH?9u4lR|g6lX$?V<8kRH&f#zIllXH{
zWczmyQa}pVK;qqSk?QeCtyzZK>ZX%>ke<0BRswgru`ga5`_CDO<fJf96dtV2(Rl=}
zrry#Ajm}$)&F7EeWwkCWJ%EntGXKAzJbLuy)A5Lsd61WPt1=nzL_Uvifg7N<y1iV1
zeuLK5J50ziW>Gix;}{3^u&o^qq%D1{LJiVgLDPeDuO1?g2jD?gw|mvD?p-LNuI_ji
z1)Af}CVzZ^IbCr767%23`g at z?SvB;7#o&f93$H*tn=glLTp}e?oq#g%S$4Op6 at u<+
z<K9XE%2<Dhz_ngX-AqsPek9RDUOn8sMYB7kkz{E-K6j`rB>7wC2jmSGp7Mt2tKy5d
z#YqSB6FxTgBzWkCE5pJ4ve3LfUkHl|8|XmZQ=Mvru<eI!eAuQ)oAwYFG_<EDFxSZj
zAoDdMY-?E6uFX9fx*c<$*;ugALgi-!|El2aP^%E!_u&N#3-(Uk0G*&MFq>lza^Vdk
zwW>bB^wJ69^yP7`x?35z2I`QSo^?3F{0M;itp4D6dFxO4@=6?J6ANz7-Lk2M_;~X5
zaG)Ko9<Ag9%eOUyIB`TptrwdEwK#0nHp{fGif8f2jm2M#b71519ddXTTMk9%q1MOv
z`)Q!XQie#4JZjZd-9>!<t_cmW at v&Ui)&#NuA<R7~qZ(96^+M6~$Li%J<uhkMnAzkc
zPHF`yIK_JErT)GrIbu_H)TmwVROf0##qmw5mRX&(iGthY?b^>)!iJ;smf)+41&>5@
z&{C;{g#Gl28t2`OrDwYCCg0+F8D5`ZbfDNZ5m86f&uY|rvcNqONzxgey&h$i2B1CK
z9b<a$L~U=W0ZH8QrNC at La;{)(I(-;TGfLQ;V^d*ce;|dVtx0OB^rmFh5`7(02q<k@
zgv5F%c%k7w<#`;hJ)cT-WbGn at Ike2YoRAx=Ysa|nRP#8ga&&ihx7;QhLeyPH%Q#_<
zN`Of*Bv3w5aQVLKs1E$jQy1mJ<CI7|`0|+Vv<MKWi6l9{EvyFH#yw~BeO*}s at ->s(
zjns=_C7sYIIsqgc6KBRLTEnbkC5z_dL0p(qR$5pYOoBeFUyNjY%qz;mj0{D_aQ?Q0
z+kO4}Hob`4%$Nfo3O50zq(33FR0Eoh<mZ`{@X$_e-!GpjM`I|>RPl6_g7U1$H at o?P
zta;wKnxeqgwiz9F7nd)<OS~0l5hIb-5E_-rKxfi%bYu&o_=SS7_U0!*w^-%O)V(8A
zsR=9INsHo+#(}Z!I2zj(icvwiLqr5ff`s$e^aSqKm<5do;)IYCf}h?Nmz!+9{eg6n
z at +inZ=uEv_ki9i<X4!9zyW9&YPV|eogH91+W`c{K%NVMUU*X?e8#Cm$>?K#1cJ3kF
zN?owsTBfqqxOqxBzQidWFHnCf*p9Y*vQy6Cz}qo6=^>{WFN^5QfqJ~?6>%ur+VggN
z^XO8kn;v?lEA?%yCdcvcfXmgv#$}_1^f8}+<b&rr$S27=cxF;y<wy*WXkxTJeua4x
z00M1#y~fBuA-oqtOGrQ at tS6*!OjkrIU4FIJtr{r*DHkB)<54Rp1g%)AF=NIm#}8ey
z=_U1A9`71#rC~xTg<_SH(n)Yxm=9<|d~*S$n<l+iRRC2D=B33U;kg=p)X3YWgHJ1m
z`EY051m%nWL21Nl|B~3uKBcoshE*-RH3KPz+P#bAuE$;!1!c7#bHmUv8JtwJ1Oj{E
z8y+weM70_rdBkC_CFg!}SlBrquZtD1Tyj!iIEk%F$rZhDF_H?ROip?di`}s7lictT
z76Z?Oa>YV-cjdE|9lM~@0FVAXnG{oid#s1o*_2!ruKm{tU8a>bno5}XPout<=p**G
zY$ag;vr$S+KKQ9^i2KJqztw9Eam`V!s)`Oht<vNl$KQ4)Vy)imBt6;58ImVUOi&~^
z!!436i|{OS74EmJ(`<Bdq?})B4}0VuR`i5gxofhicDM&@v^6nF)|AC+YiizAt5e&6
zNQWvN{5wFDYuQm+BBa>lMqt4i!~h#1tv>!^AlZe2K-vijde9RDR2iXcS$Z`IGdP+E
zTZi$fYhq5pb#K#QVvFa2f+Zo<Ed8HDnneVan!xBeCDeYaW*9I<+f-WpR8>?~qJDW7
z=z)`Y0uD)p*hnmvsfdCg at aDFLrVwu&nIzKB0|`W4oSkoQLgxI;NYEzSI`EW|frOjT
z`i#CRh{}OgPR2lz7Vq?ZFnNfn`1|cx*xbz9_QT?6O1Me%U2pBGChM1Z{Cer)Djz at 7
ziqB468!I-EsBZCR_WklMt30^V#f0MyQ#@7@&-lhL9XkD?kq$I{g&bj-Z!k<QR;jK3
z$}=?2`pJ1l4+#O>aV%EflX9UaP#%8Wp_#93cI*mz%LcM`XXrq;0_Y4zMrrRb?3dJU
z7;kh4#S)4&adoX?Tv8r16rNMoQ&}Ok^51g$g*Pr8R;9=F=lFi&!c~=!_2zk1;HD;V
z6@!hX=7*+P+w^26RM=z!i;Krt$)^X1J(+Tr_u?P&iLXz#zW0!CW`qfij=b*tNxlXz
zG~o1$lH0z^lI4|FfxLX)Lo;_p0o9rTY_~36EM>MpRE<Z=4!UgLPtRDSh!XEo>4l|A
zctxl&=b`uP2mKTipGEacjt6{-bkOJlz?y7}NS4ASyn?-JXcQ9#6irpy4gZQdq(ka@
zcD#40|B!Kr9DqLRIRX3y*wKPc;yjumUU_=Fia|XAZs<>YJ<oRJ^lMOD>L&g<5q?T+
zh`_XMqzrTxn=S^ZsTh2wiDMIhpZljXa^ue|J9j$c2(>JuA<ivUAV&&pJHVo6TMS&g
z|AxvgkRr5#MjsB)$3^^7f&UgB#F9fJf~__;Azx|8g-Nl4nURZ4H_14LQB)Xe-Fbk@
zyiGt4t$)xrwe_p)i!@nkyeUINi!f+$1xrA9*j+ta7{qY%jyR4me^if_`YG#yKMWjR
zAq`q=G^xiYefDmq(0{>|Df-qQjoiBmKZV!_E at Wg1sd-N%QDCNr#;W>enCA#+37r2V
zb<A=>@(Lya?6jd=jj1VZ`_RVs9#%Ori3$36m2BE7KABSn_}S|xT#IeT97G{0FJ(9n
zJ)J<?er#Bo;G7bhrc&621+8BdYo{RcQOWbx+j><o&7VWNI}s05!;(7o`z*ZaE;-%L
z^$%VS+{~RidFW?Nn0Rx at 4sS7_Nlus3ohc8-VWb5mygur_j;Pj2hHf6vGt++m(z1Ns
z{5kBK!F-}o0RSEy`UYO?J?S!QMYYA5Hmqf*LO at 2s-SUncOXld<`?#;;)}rLWl+dz%
zt0=42{P{41)wLA7wD31wv<Y_04S#{uwj^E2@?}gI$9K*ed at 4~k?7zrzn^KgAdos36
z)dmHUnN1)1L890nwDZc7Zt)`<vxu4${V6y8D6eZqn69|U&?}hkK!+E%N@&ZqZ$fPl
zg(Sf#*LR^1(HQU$vTwVgnMn_?nDB9^2zRB$1 at oy_xQD8<u7MA()f<qtI*eU5B6y0l
zi|J|+zf|0Q`Z~{>uT(xhMT;CH`=R}CcP*LE)qym(ys8ROqO7f6{e7J!<AuTC0&eo(
zxZp{A1ayWoxMvn4-cvMQWfD6F9Nw13y$h|e(KUT~HY|c~Uy_ at -CQ6O_Y0ATiFk^d^
z)cIYu1pzd8(^mC{{fCi48U=>^L?Op9NIGyf?%c*PX6h^0b2cUIk+Ed#YhIxQ7y!Rj
z1x<!NiXrt;-|%g>&qdjcj#IM}M at qD0o4!G)db-uqJUASF#hZ1TKrz#Q%sxlD6vfvR
z<-tiZ(QMB1=crK;pcYoAo}ViHax6D+imk&`H=e%8)YEF=HBm`2=x}IK^nFJob{9H}
z8p%flf6l!~kL^@pu9ez{tt@%|_*;)cb^YJ5|3?^Cj?o9sIs3^9vICQq3XCyC3d0Kd
znx!`PJxNvE9wUaC#v8T;LMZ|a&R^PLlOuIq%8iE$GbAE2B&J%0qQgUVM!@$W`h$e7
z>^@~1FQ3@;ie|DeH}?>L<Ls<=Pb2uhZ at AAAj31f^<gs2`hOtdnZa(9Ua-RPJ1Hgd%
z|H;->f6&&}Za?Lfrp9XaypF|V(p7Vmp~eDg at 592v<XVOSx!aQ|GX5L>1By4-^FKJ=
zSE~rkUbnack9Y5xbeqe!-ES}6KL6-`9!l}AhG!nI;L*e#r at TM69PUnrm|QOph}Sqb
zpM`QyaxY+aO}}eT)X`J^bLThDcL|8b1R5}hK^^x3(2O1LR<wCrC?Q@`T%XVA*?D_M
z4j7*l$^3nwe-G7d^$Y=4gZ8p`k9eKq2HXMo;ksxTs7QSFB7d*<bP#9cleWxryxUIt
z-=w7d{&R&nz?4Nt{Ris(BUpK|O8or)>CPF9XOsnezrOlAr-2UF7JtGDuYvCy>;K7g
z{v!_<V*vH4k9fIeMD at J0I$%a+x#V+wAQEzYVZfpZY~a>6|5hRTY-<=pzJM~5_W$0d
z4qBhL?^uX%-`RVgn6KCVgI>%d3c|kq?Sh<aLnTFbTo)kT;FCro$i3XNE~;?$K$9Es
z8$ykVmV2tmd!7paGy^D*cKs^=Leq6c%mo$5VF?`^go%poavcB_^9 at l)oq817?yiot
z!GO%_jkmI;|KnLb`W32e3X<<QE$aN|Jz_q;1{4eiSv%9Vh>K+yd1%T^!vFigsc`M+
zQ5Oql5O3Y9ruRfoh5YguQ+TqNc1L++qi{@>GuG=JJ0=5+83IxVJgqvoAb+gAhJ{8g
z#236CwNcKusGErd<m8!85!By-`zz23n8#kB5y6KN4A);>9Z0{Y%o!~KZ-*svx_SG3
z$}X{uQycrY7NF;pM-p~*C%*;;uW<n=TkoJ1eq@>7zt;wZdo3<WQ6Oc?@TRr6hTl6A
zdbnixi$ldeBj^8hx6j3(;DWwDhpWi?&~`0p5~GSGF^|WN-uEzak(brr*6lq74G=6d
zmvu!N)NF71;F*zdImiF)iv>hqFf;?MLmDrJC|6{L;d+txG3Mw2wJAdV<>89eha)}P
zn<qt<-2KK}%o|w2aXZ%w8d`39*YJ=wU!NNkagWcn3%9OSk_wa?DZ)@kf39qV5D$YL
zt^`CIug)!Q!bg3+Ty~8f`P>wg>>TBuK#uhuj)|629qtlWGVw8F-jzGsbYC40U%KAk
zcmOd|H(ir!*i1!R*X|*c8w3Hp&C7oV;uU-dNqeLowal5$kYg4AI$Z(_XviD}JCg4)
z^eCx7M~I&4k?vv<Z8t{RnlnMs<rQoyrccc&+yXEoi1dAYNN)i_*q{w*)TnS8AGcsr
zOE6v_LZC2fDUVWg^ltwa4d{X6@$jf=fvILU^ZpvL_W0t#W8J2%`4;Qp(`qZ^evbCx
z-lYvp`uM`<!A39P=6-2E at oK9jb0YP4Bejk0@j>QfVNNe&&Bf=!<;o`KcV?^9-mSyo
zV^>?#BPQ^7IcEbpn(?s<g)H&+=(WLk-<9(w_*@5PzSDZ_0WL-Qc(T=*c8Ae+TO*Kg
zQ at pmv^q9{Zgy7SySD at L><kKn8*1|smtcepGM*86W`|!;bhtG9^^hTI}=268%sV8J+
zxoOi)Z$0zq at S%Be^l{e1U*OZar@$lirOeS;LG8Z4D&+B6>h83_2YMOq3ePaj?betd
z0=|V0RP(rtvZ;0}s at Yl_MzeIdZt_Vj4a~n@?4Hw0E5A%0xpX-^nvv66%{+hj3L%>w
zY<pZ)yF1sr8xDQz<6j_<*LiZ&{CIFdf7hoMD)$Jd_c$kYckqA~=v40xferRKjtYcu
z97bG{d!IrFb7-2?P3*$Uj*K23nIM;S34Gl=+z$x>mP!J4?7Q?~M!u{avq*Mr>Ny=*
zy8V4?z1ZD_2kc+F7>w{6(#qXV+By_iM=CdXx%|Ti8dzy3_;s!3TV6-eg)1JSdd;gp
z%P$yPJ;15}OVtzQCct!%4d9j3Lne#QPKRCqEMR>M3!}BJ*L)Q4xV)ScOQ=AG_$XLU
z>qTQhCbiR$T at YIEj0rx6EL%|KQ|*pvQJgiuJ0s)5ddW<{>(&)b6ois$UX{$ekorQ>
z2JtfyO1G7*OAIGGk!?HsSEJOgJfj{}#e=^gK>^W0Td(6g^Y)5WhK9zE&Rog@$K~@a
zJbVZ5u?VbbZ*K2aFQz8_MMOjngP_R9;S^Xvzg$-DA#Il$kC>M{^l-kCiw}5QqO%Q3
zyE7#Wo<8 at lA6#$QAFlcY)}nmwUV9(Ls`#gu3mCGeO~JJLd>M_U$j3bg*~UPT-B;h)
z!?cTf;tf- at 5{h5?qENkK8&Pq>?)x-DaUfm;exsChF<7|~NfK>5Ar3B~`{8ll$lB_!
zeuH>i%kXK?Y7l)pp|zyZ*)d>0&l3{rLQDE{|8OOCC<@+&sGSf6<tj|L2)q39#=zmN
zk+&&cqPDkZd9d(;JN_&&cXdGgkcprJzBhboi8H8iO(&>K?Mn`c0S`gn%P3NIHN=mo
zAbaqeD0IkD&!<Gv89X#}wHnT!ukL>sUySA+`g|2KQRm;vJr;FaI at 1E#*cG-NUK!82
zn|tCNpJ99*qh{3T?2hwpHIX-MRb3W`_kDN8 at B*YG22#hbAA#sGB7sUGL~}>0!BjQi
zo%I}5AJtgN{45cr*=3nE_X^TPv0TK%f-Di0?#Sge$w1IikiGKJT%U7Xqmv5;`wT&6
z!b4 at mVAb0Ncjd7PO~)Y=c+zC9#ACO8vWyYKx3wWdi~@|1L~^~l!``Y-er6cZIiK+{
zRA92m>#M#b!3T(Gk%=JtnfS9wbHj-YalV^}pAQfmvK8cyN)Vz*C at c|Hf%kQG<uH^G
z;aEB6BtMgXyKU}Q*;ExHL5BOnaMnB+T~-7{#tzejZbtZ05C(m!i{n*F&lrS;OoYP_
zWYV;sP;bgSPfaF5C`<r)8^BJkf0$9UD4~-j44NgCP_~hae;DXC{`QF#Q=~zseVHpn
zg4Hh~;$`={QcOyUoXI{=^tN9iFPwT;xRmP7{R0na=PH}$rAI;O{Ovsh>qfzjvv&bm
z$(>4u!#z$|SWQxLa!jAku)YlBmGS-~H?qr3-Lgz3baOrj72$)dDlE4T8blM{vh~oI
z?7A)e6GZNe<@Ptc?~wZVX^Qx|_pG&e_7tbulmbzrj#LuI`>ckmgL=~Xah;(shU}O+
zzQOme?7tSdY8^9nIG at 73<HFJVaaXyt^bUq5*Z$8R|GeMd?<&7%814yVc5dEaENsRv
zuQfG!&%(3ER4LQzl0fQevok=pMOhRWJ8E!HspEL>SO*c<#PrX*T{T7sQd)ZMo8C!i
z^GJ^CLFGn8JSN%u2E~Got}-j?6y^A5j-ds$Dxfvu;ybr)oZ!E5IED96m41C8Tykm3
zXWyt|!odH%EkNq>?ISr|VlAw1VCKESw)m`eiThQ_WpKlZPq*g(L)%*b#nFB3gN;wn
zAq4l3-~@N~BtQs3gA?4{-3c1QH4q at UyF>8cfx$KC1a}$OChz<E_WOVT-P+o!-L5Hy
zf}Wo4d+t5wJkODP_^fL~J7j3RH*v!si3Rb>rYywJnQg6K<#fNtvEQniPoXa{UzP!j
zWs^&i=Rx2r`(N0d+E?arqHKET0WpxIbL_7#AoVB at P(@>)Zg|nGYNxK!5qvflaym`;
zLv^pwKPlz(0i%39v>_74QN`u(jQ+N92t4JgC28B98Iz9%>x92^k-FOD<tR2#RGVLV
z+izH}l2sx8`j8ORD*1tbwTdtCGKZb}twIMq#qiP+KmTbTGuJokCd4mnltD`WUo2;Z
zXaPrv^m026ij0OB{|bHho#SfTBaOQ;_7Qe|;ABl-AoOxyy1aqNkv*lzvy_<*s8;m+
zLZ~|OA&zeVBcQLqYdwQHb7 at JERnsR%T|g8RyI2*fmlxWy5@}jDpcwaThjx<d)~Sv0
zdsVGG-c}j`?PYOOK&@vd0DbGybmLH}Mb&IWbEaE%<AwFRvfdenmpTaP4(KZ9TyT9*
zr?F((!rhW>!xMSn_YkEHQNEy7o?cbEc9FUN^$5E*b;QB`-2=YFpn6`3A_l<a($So_
zZ!0hX8;IK>iHfSPA?uBN*z3a>TW*zJsNWzC-_2jGsCV)w<s0EvEZckMWlB8Jx>>IV
z1;nJWCCu&!OB-)2I8ek}kPptBMIJC5%FOhBR)XIwv6eR7T#P6FK&XgDl#a$m-`X5o
zsv+zs5=U&qEq-Fyg}!r`Lkn?!7{H0B!|!2L&&+ at EO3!vjjz(KPCGRtmAwkg99pMYq
z-;WknJ``dEAS%UkszCjrL`B+87#@7IpF;BovGL0|Q^#I)&f*1{^(fbA?F4y2QAx)w
zeMExa&!0PYADzchny7#&E9Ko=l@%l4xr~f?z+WMc(9>x1g_>}MYI}#KCD`zVsuix*
z(#cS_7&rk*;u)(dp}auJW+5{<Koo9Dh%5p0<vQBGo5b$e3ynLm{tdI?E<F8deR?&v
zJ0}%97#A2%sq4zNGG&a$2m6E#=uI7rjZ=x1H`XL4s7Ge7+1QJT8vz&Sb#_;dmYtQ)
zbh?4j*|H*!H|1g!4)xcVuZ%_Ok<b`eu9&Nc7Iudst%0fQ%K=`5{_<;s&Cv#uUdlM?
zL at Ts_0q$wLFo%V;-u3s4dkcCpT|c;WOUls=XDX(fA{1Jp%q9(65O0ez2hal+O{aAg
zEJ(Db;+{G;R=Tnd_$^eTDqs4w{klKXPq#7M0Iob2KjEK0(Qfp-AH&CV)<}b&Y(#aX
z$x-A=$X}@od}=x#Ye`6Zbnfgh^vG-Ud$^TtSF5oi644eFRd~Km>81Jp7i%1JQCav}
zO-$-JmKPbVjDLqva5t^4$(vUUc7Is;Tlj-s(bA-dxR$6hmMx*ul8ycP^^H0PIt7%=
zc^97Jp-4P_EJThCynhza=!Qg}?S3?f1Dpb at jG;Ppri2S_G0y7hn1KBhDX_zJ-D5`L
zL>EW6|Ih}7ouiEr=5c*gVWkh3E2BnPsZN_MDpMw2^g&9se&9|Yxv!^%<T10}8{>dG
z8l227pV{eljEZEq2WSo|B9*Ek3AAK(pIm&pX^<MLs?65xkJ(EzWLWMLi<NgDTOPRE
z2Q8*tR$?Ijr+zW}dTM at t@d`2fo?^fUeQt<Y>#fR9z*?x$;1Qrf9i=?*Td#L}#Otd6
zwJ+uYm(4RYBVMNb9B=(EYIQ`-Fey8+%CPv~<Ujaw>P<9aroIE!jJI|anhnf+ENqYS
zk<Pta959hKO_B!$*}@L@=zS4Qv!@AifQ7x4w7I)Dy)XGjQbJ%V`9~QjIFj07Lji1~
zOImMAv|b~9FWWT_3C|(#R(CH<bAms})}PD+U^a1=87~oCz=w#4VRRIUY^)$~#&2Ig
z#R!lq&$b;XNI2f!*(@AKY4_3k95kWcOh21i2``Nwm2MDD736jpq!I7dv}1jY(oViY
zfvagMaM8ey!^Vu#e&<n*nF?o``pNY9>d{b>iiMfPIl2=<)OW{0#Zc>&Bak%nMb#aP
zFO$Qq8%I+Mg~Oc&)<N!}a_DD$<uXAgsxD`l#UtKop%4F-Y2QK5B>%#hvJJg#9__+v
zEG2xUx2XJ7O!~=<Vp-!C-*@EGGW70-VOG7QQK7qn`u<?L7VwfEsUjqGs)7Vhl;y!U
zmNKNI?ij8n!$Hi>RbKMI%lA*Gb!mN_KR!+Xjfrh^og_q<J}3UxUlMyyj!w<`hfVjm
zAR)pHscBAg8|_k)NC~Ny3%MUVAVhiZ7o1`V0AzaROn9>|#YnRrY(C)u0&nRX#=^<s
zRTCAM$>XT&<86?$(MP{y1k}u`p8PVs3P+;B$4|#W50D{71&4X!9Gtm``nu#Ew-drr
zID9MAI<4sC657S9Ex>x<S)-^^xPA^ZOKYZ_jrfCng*}hPbVXyGcv?Bu=BRB4Oj2L&
z&`XRW4n9dn?D_GnRwkCLjBlpEbV)PP2WcDeC~VeA)iVA51vLh at k4Vrd7KlBg{Y#dU
zlZ8-QlvC7z!SV*Fq`1N)1D~(q+Hwb9y3YK_=2C^7Qi|E%Py3M_>TXvLPZt(PI6un+
znmg#0aHl at mXCaM_GuvTn!QKnU-jr6(SrM_YIN>x6>RY2NABr!n>V1N>8VqRyWGjW6
z4Z79`j8Db$n^c~#?hihxipW<Py{qY6eY_X)Nehdi;^C`zrrdhvlFu)1i`z1-&;#Ui
zk+MXJ?3vfJdzw?)GIr0fie>Rkbh<E{7&Z}<3Jz>caj at Sc%H$m<^i$a{d^Yty8`V;=
zYFyh<EQO^JS?|kn(7GeVh6P2uMNbxFgOPnVeVlZN4pm*h%Zv!6HzGz}s5;dE_&PQ7
z{)|EZ)8X&-g|sQZ8-w4!<-rV;JICe%9xvMY3YA*f9j&B&F*15LrB@&LzWKNbBOuua
z(5ex2J^gRW2Lehle?O4|AnVNy<W=0?u*#ehZzrIOsGv%<v`9#IHRWAkZp9*pdnde2
z9F8~Ow_op=_~Z=p<r36Ad`7IXQQ&m-edrjO-=0XRg?EnKJ$^yoSHoebNZ&VItmWO1
zcFnnkk4l>|?#d9?2+1p{7aK390<G(>DI!%w^EIOg#RqZLA<09;UdzVwoZ;T?>$9%b
z^6OXTgmGtZE$<2$Tz5NmBC+!=vwnJ-+)Vq^%>-*eJMTHXiHm=$<DIT2t+d*)R at X~y
zJlrT2mea_Vz=Krd7}*A at tYVYmsmu-&GM1Og<|>~y=pV=PBQfCsSb2a>=F^h6?j~VI
z at t$=a{q<}0M|;n4Bz$x2pB*)B`6|?d2|=Vcpght-h|)tR?B2R7Ph)iovORW(u_fIW
z?K at fPm6eSNMt?`QuzJ)X0qrmx!-qWnG<pJ*qkZLi;Wj#<CQzbr`c)PJ$tMP&>AURp
z=27w*zdVJ}LKbXiK5BM5C~PmqquY_nNSV%(VZWnGkStdOEI{Qvm0^YW40_)G(O>Tz
z9r2TY9>V1#zWXIBqJxa3`9d^awh001+V>o%QX)3rkllqxUo0>W3Do)38|}zms>yoX
zDeV%YNH~75#JRRo((_{gagiB*Y~gFSDh93Veae=&&Eb}gvpv$9rED9AtxtpnuDce9
zkDhl+I5_VuP{}_sK1>!8XJQN1;)w+DfDGHy;2tvn+;GaZr|_fntlYw8^Cwr&gpJ``
zNTeJIf+;)L8_c!&Qg={LCGg&>gph1TkISR=xBS6dy55&ZPanw&!p*?{f(M}?@Z3ex
zgo~7wjm^m1JX|&K{UW#0M0r(JaBl8XjoF9yCymL2`eh95Q@=?TBPJ0s at yhwN=fUz}
zMr?PtEMsKnL0rWBA@&k9oqvA=e++YiU;LkAljPpC{&QqIN8jtJe~vN1p8KKw=h&h!
zzITfLIb32nfhYg at j8HELaDO8JP6ap|<oHk2N^a{+A5Kq0jOd(xp0@<cn4o+eMSqu!
z=hT!UR(l3b5A8C+9LNKmPNHPpvHl!7#xWGeCZ-<~_9NeX!7m`DyuYDrtXEOPotDJV
zPJurMqM4z3ka}NEILnGFW<>1^K;j3ywpm^R!vBzWKkr at ri$~3672Posiecd$E47{0
ze6=0qZ%)t6mUrz~EjH`@p6%?0K#{v75jEP7SG1$k`(284lv33+hPpi-xZdLLzQ4lp
z!kja<?>w;iX6DWHbtSvCBFCEtz+o1N$=*tH<mt at Uuv74~cd%{;J!k=<6`%4bX~dsM
zcT&(x9=g*jtJ&9NgPp7$?V4+G&L+gJRSp_BEN&dFffzVX)Q at N0H_*Y6#wFYQc&$>t
z<FkoTz{!s$Y|#IRWA&{&$|^_HrWVz=UFI$OCT|hhJQGiARa+6YzjD0vYqp6hJT<3p
zd^^stVI8+>!EwDsGO~Zzwc)Aa&=!xOY~(E39qC!X1M&>zo_tvPb!Q0GX|H43nDC6Q
zjU!_T!NSEUW8qHswZTvr*%JRq7;${IH&X<PmiIw*HO|!-B^Ooc&#K(>!C3Ls!8iqi
z>-__p$yNn>4u`4}zeI+!(~)my9(17VW&L;lJgZcMvPnr)<IrVW0X#qW_ at EOHx9YGU
zpcx#rP7RURRD3kbH%gDH9fr~e1l%KYiCr=Y(tw$!mgnCe$ViFR>zH_upg>P}B&Qdq
zpFe>{p>qDImWD7q2KajBXhJAIgImoIa_`AO#)1sdfp=T>kD%G)oIsV=7V%Hu`NilH
zRGECuTAEQjT2zt1S<6&xVE4f8$A<{JcDSPyB=9c{^!u7@{rVmL&seuXZ*=u1+4wdx
zk0VeS#u!nBdQl?e9#2n4tX{~5a3$R{Gaf=wH6ZoTbOWYK<Iy)OpwYf=(P$nlKV^RX
zi_S)Vt$qa at Y)r|1BnjNZ-}oR(uK#nicD0JMYDE;@;NxwRBOH+*m&K@}>w4)plPYrd
znNVyFzcclE>#Pr8qMpxlY|#vRW}qD;VtsAg^kTlT36g4!V>CEv>cH5Qt2idgf)NmZ
zeavw~!3TTzmq4nz=U1MdLbslW<@MqK80aQYSN|o5sOr`6Gh;EfJGqJApP!(=noxE2
zxo4&jl)6rrW6LoxJ2<B)pJ}-VOIrM{pipP6V at X=%h at PLWFEr6N?X$5w%7_0uvPQ$R
zmZDRIaAko<!$-VxL%Y*`<;zWz$sT1!$(1|PXE7;V^|1vO0|EtV+Kl0CUp?<;aJB!{
zUEo^PvZzOss@|s6Zg6JXXb2feFMBhH3Q7qC<8TO~*aVoKrslYl!@`k<2%8Z|j7~s|
z&f72a4F1LAUJhHsZFnizPnyh4DZbf8!wEy#pi)`h^j57d#=7Y4T~$?EM6w-bHB&p1
z`t5%*p(!B&!sY5UqEGiHkS!h|BajqgzEOQY!-&&6Ggl$gvi+AQ7;8ceklj~k>wKC>
zy)Xp~7F$(?v2^cxMhT--a=|ZNW-86y`~PFu!O;O*Z&W^L&fj*8#+5f{oB{+K!P26N
zgW(GMR6yyMA~z8uz(Vbtp6`e1`7S)rt<Crr!^Z})6RZS5|ASn)&bQKu+kWjykJ9cm
zk{9=}=-fd4vUQzVLr=qtPg>4DmLWkW^Jb>dKasgbuC{9G at 4E8-XI*h*&f$(F;msFU
zZ-Eg~2RKqHjEN>iZV1}3Y57T2Gqn*vVoIke4<jHW>yqCo(vBgU16e|lm!BYAHVSHS
zgnDe0%qtNbxsnYX-kh5I#iy;NL>xSq<~4_Eu-h<jge!>`Vj=Zfnf)P>V2!&+w`Pr~
z93YT73b2K#n70m$ePJTNq|&jZF$#HnynRjrJdUzUq#llUxs^4QW^0MGS|tP|-rnHz
zB~qVfGrW*GF|Sg?dlkptxq)dkH#;1t#Q4?xC|TY5I<w!g`VLc5&yPo|G-ubY1Ds7R
zJh9+B^l3<X*1Y*1q)z9xV~l0r8;d=X*P3KGU(7{5$SZD*MoOa6`-ReODhm8uZ5)ha
z_kA%>ecHumh$ES31lJ3lSPS3X;I106sy(fDDtsGyd5NI>5h=FgnKSOREH5&{&X3D{
z>bY*t;uHIn8{4<eyy#Z1aB50>EhZvj%eejCj%{_0!`7_Ho{<B{ob|iNoq{MdAw;yx
zCvuqj`1hE#%m~K!r^p+#+``e=$A={S$}0d-RjJLsWyz#VTxP3#J6=X+l&tN<X3cA4
z@<!u|*KPRAydVKt{4NE~q)o0ThA&S0-io6~<N8&|*(>&HvR$UP!mq2pn)Dnpp#@C6
z{*6EjaI$R<dfAGJWO&%<yHJ$ivY~ad{eueaoT at EAwQUdQ*o*5+^OXSFGJpfx0Iv^q
zt8Cf^duJMw9#6U|Hv52j|2b{Zi&CU4>e at wF-5tGOusQEuruG&;m+RWm<s)N5Qw&W#
zh5A!1PH_WLlPk`2bX at 6|l3J#_!Gmi}r*)@KoGj;4Ii@;vI$Io8oJ-ln_+h)(HywUs
zZ3OGr&9ha6V)6~Z!IKdUM3Y)cNlgzq=w0-JGzj>HrXjLk`}@X$AjF{)?g}TgHP!#t
z&9TVFvX9A+!z3S?|H3YBY{MnH$^TK{^V>a1W$;A0PmoR~RGGo at c`cc_09A;~uvQs6
zjLGI?3n`08D)p%g`2yn=;SH*)T at 200;;*pbJwL at OJ`)d>98o#6WksH_<UP4dXGhr0
zCuYDIqh8w#)1d~l-BuQz(?CpY`;mDIa;ZCM=8|65>2<0{Wh$Oi^}=^-cPS<l5Uk9f
zbZva>h)NSGq$#FfKhYe)`t8kVUAjgj?iI{{m!UoN%ln+EU3tLNhXEU~Ke^(BzFGqr
zQ0JD;gAFY1FQ3RQi;bRMqE`$tK6_ipW9s at F>nB`2X=>!FmCll+nLo9`*#Of3OE+xT
z)KPhf^_%b)HjiN^U;W*gml-)v0FnNx76mlJnnO7mnG;9Qi<6OY2}~w`D>De&v;27I
zL#U&W`%)5kJ!Vf_-sH=>rzM0oJpg&KzDVg*g}Zry9)K;EiW)MJ>hJgt-A#c|KdbG5
zR5k54In(ubj;3o5kn2{N+7qJGZIwI70^~R at sb*EdPajR-Y%(MmI)_4guCV~_R44Pv
z!1CNrJB&;)09#WZ<=}QJJI%^Fd*(x~YCy?Uq`Q8NVhrzWCK42c$&mJHUs8I)w)3l(
zWb0Q|+HG2sgg{uFswu;N;C;mTJ-oL<4R}lHMI=6GONTmi9?0o>5!=eWYl#*B04+}Y
z!)BM;t^8h5un<<_LUn(>u5HwS^)`hb>wywYE!%s$;mi8hThy~4-+F}Hxfo+8wTDcB
zgND!TKRA_-goU*E&GgEiK8VyF;8dqKt{8ptCjm#0nI*l}+7vZ_>)`~)_Rq2z;#0SQ
z({p4_;DN7R3&`pM at 3?%NU)h1%`Bv=(ono1$Dw6>_<e85Orl`1qUrWRja}$>7QV1#(
ziMa)(V%g6Z!%g(Tk41ex#J`~ZX-{RymiFVN!224+EbW)e*6)#*-NY6Smqz3sUoi{>
zZT9mkS{j1E=tNrUlXusaKiHapRHS|t3QYyKS<%I+__7}1&KQ01XWne&Ay3?gm^tY_
zd^BI$A#@o`(u^6Xq^_{tP`#=)9U<aELwE)dwv5zb at y#<XW%kTEyGy+|o*yvN)`;Fo
zHS)Q<Ap9~E-07^IaR(Ar3j^eU;E%JazV<iqwJoa99i)IGkCG>- at tJSQ7Wj`-!_{oz
zoZX#GNx1nR#>DSHM&L4rJN8YIel%S|g7pDuybny%S`FCK^yibV;RWLEY$n?j4iP->
zu3re~ReHGyC->A^{Xy3C{O?k6&~_nu)#TbD<Sn`U6t>Qi(pk8VY@@eX`WL at _AA=%y
z&;)hMGh*V9M%Srf0jZe$PgQ&^@a1y#&=>c5g4|-mf3vitBX{n}`7Id`cCpF&=hw|N
z+GXa+;bVWXw5Ex8E;SL{OcXMZrx`!@`2mh}1pQ#6KWQ`^>8mGOi)e=XJX*cOP|H)@
zJHI9DITMRFTCz`z%A6qf^g{uIUX1;^{V8TR?wQh at QVA~ex+6ngecL7LZf_7{PPYP1
z^_vAypwLNkRTwQbD()v??tgLtwtOA=nS&csr}U!FO`)FdO*Uwn({*{uI=;a=881gP
zO2kWqPqbqf&AA?N1-;f>G3U)h$34e8`1W(NywWqGHC1+^bm*GZ*vU*CJ=yeX9rWsF
zF?L!>ds;yoW326YQ2kpQ=Ice6PUWLLqSt!e`LK0hq{QPVBe(-<?P at Dy6S`rtdC@$~
z(n7sWA=g?*Tl{)p&2|%2^d+blg#H7c{tHdQ1FEs#jWP0p-t|x-c7ok+BMPN>7 at 0_{
z3{TMWC+`a0h%}5339*9RipYYfvqY&CXCz+YT{9Q^%jf5qpgdS35xD)eTa}#~SKg8u
z^iYXbzw*ogw*tZQ<$L7r?-y>te*VMK1_YoF_vn8hzcIAqvt1o3>M_ZGao#L=Z+cMs
zrPl7TG5qW+7g1RikF=GFii$uBp2(aWI`qJQPb|DY5dcq=<xA}b`!;`knTuIC66t^Y
z!B%J(vE=SOa&_r{dujgd4HKAF^l-)|f%adVnND^Og4;*L at 1ix!^d;3N&-q+WH#7bD
z?y7Hf_b=UBZr at Vx!!Om<yYKr|ACHJ<o^sIs#h%&Dks$CDJO^+2x09fay**vxU~-^Z
zNtcK1vqYAQhQ;%{@i at HGo2ij7^?%{63mJHy>CWJNhUQsD$UHVn>RwwDdi)W>qx4_!
zHvgUl6*NZ;05h2a at +=ACbf1~uS|ToeTW;(3{b6wGbAiE4elha at K<Iz3DF=|?h97PW
zk#h%d`S~4hD0Pg)BNu6xiSJ!%_d1r{wa#7BW{Okba{r5*vsFRjbt{bp7hs{3mzUqj
zT*rl5?+8YgX~GdT`gf(9adV4!mpA`G?OQw`<QCeD1{{oyQ9y2E#-{d<QQDvh7n-=H
z7s8Tye>P*S^^P^u-`F at 9i6*__zd>xoCM06NP-{*NUsz~^JT5j%1~2PR9#r}GTKQgj
z`S<jJpe6;Nfmt7kQocsDf9;j;>!Ua_0(=+-)4$0L!iLsIsMoG}K^~-C$$w=jwfEu1
z#L>ckpz0UTx*7~+mgbSTy-|Fwv7vEi{>-)V9q#51HZUqZ5)}k15%IVugf%`n>OOOB
zBOmzavoEo-#D9;9hwFQ+RCF{P{f}e(!YTIR*xwGbuV(l?tGdkI@{6j!^`%I;9X`l@
z<DxHlgPN&dbK882K({HCRb)6WgSq8wR8faz61V2Nlh$dho7bHAt~eXCBCuHs{XU-b
zUxPL1|58KF!w`T_R#GUv^t#W4Ya<gJ!Bm#J7z{kWb_HHlhtivCyb7T^QH`8%1`z|V
zyPfkQ9~sTf!x4rNtF|+aNO0~>*r*;NxJe1`j=NB94#e4)3Pjg&WmQOk@#OydsJ?~(
z7BCtcTb}NtdaUasj%Laq>L3t#Z#LrAzzDhI`@D~1Wr!a|;o%ud$NOCU_cYX8(+l1G
z)3tGnM=OX&;Od+n(-Hlm-HEUuIy51w0AIh!)y~mTP`FH*+U$Me-qbI`!-s03FJ1n3
zC at P3(;YXCm?9pV11!c=PPOkTwmMISX7m)q&e}>_KFCc;5Ky<i}huxaTkYKXx5t6<6
zd}Zt$#C}J{G&ksd1sC({y^|P at GwgyhVkPrAlUFx|C!1B7zc<e>&oMUOoBQm<XaP}`
zG1ts{-Y`RFFfhoic`!dWCSd0QhLxpWI{^+yxAz25c2&pyB(FjbC^Kl|lV(`kgq0Z(
z-{|i7TsaULK#*urTW{mcYYZ}DSKOr}e1r{-eR8jfse3KUPLuBBBqHn&xIP!$-c;;6
z%0h0=+6*-67fTm6_7zGGpY3`hu6R)-gjB=9SoaZA?y+W3IydFhvE`#Rxq5+b3WLBa
zycMc~Zu_4rQ%YcF0ei7GcTiQlv3m4+(Qv8QbM4Z#@S)R3%Hwi6Yn3GfsX^zskE++$
z_OLG;Eu}OhOFa?|;X|4<RAGK0Lp7LB8J65FJI8O+{zSox-X05Pkmx0TR(IzALRUqp
zx!)$FvZbkS>7U{|T10~mJYR8cVYZj>RGpQh$m&>^uX9p6ntu*rQAFA{D&occqB92<
z>EA_{_l617iO1%2A(gj!hnHL8ZK0zm5{EOH<<_2h4KQ=A2lH1l%b%AJhGF_sux}HN
z2(SUb at p|m)*_8Kp_B)I_MAzMN`%&6 at X=3ci8UZcG!4v%zzov`eTSW#-gPL1Y;JG<-
z{!YA;pO2qEMul$rCboQn;h at yqLeNl6$hHMVCK!8l;?z6oS<QORRXA=}(o>QBgOfUv
zu6XLoZi_I0-!xtuyZvM<n+kYFj2e(@%Nx|J2>_-l8aoS71L5(K)7(D*lQV;r!uuQ+
zE@~elJ$M2YCfUj?-6`9L!PQ|s!6E*<HmAk!u at o2h%4bWxH`C*{)vpd)s<2E>Bs9?j
zKwrO-w6=#((Drg_BX#`0Lf2xw1SbslROH{#$z~cpaC<VLOxRUp)eDDR*B`SW9Tqh~
zZeVv<w5YeDF0T(#f at 9<_HlmbIKO7L;xSiNvlssisV2&F#&9HB;%UQd+y!- at ZJBhP*
z%w2(bG^gSXx*_|^b;T<m?stebFY0x+mzAwVQa#tVtPlIzuzBT6 at 31>ze_*kld9k62
zbT|VL$+dNu8^poCu2WGVw#j|m)+22O<I!)tmNTanazDJd2^a}!2RC0pH}G-mZmu==
z(!*mjHUlg|+}WwXv at ISISYueAe{ssDnmX?ttGkxL at r1HCC-AK*USVx9q+(<4As92>
z5ynu%2G$>q|HXSv4rJwOY`{s^)IVX{8f{m5j#0RLojn!^5z#f=942c*bm9o#u4vE!
ztol`@-n`UKB_2^z(@iZ;GwEz~i+oOX`mel7Cw+untfNMTYEH!b%kN?*15A-6)=6#n
zrR(<&*N$W!o$o!%Hd-YuB`QJkKy(nH_pF=ySh`@4y=0+2UdhY-wEw?MT+ljxeGLf@
z4<|$^c-adlzH29>J(yg|pi4bk;iesRSi at ISkB2Fso@{q$9;E7=J8a_JnQ378oi%xW
z`@}n}BUP!!9E!*lA1vs(o94K?&0NwAgc{JDcv1T|(3hRs^Y1S&rl(#gLLi5PLH&>1
zsPTTY5Ox#Z!0j10`41lah$o+Zky|cyWbL_B<`?em-xR!b^D at kxpKAXxWoB>L$+_Rr
z<i5lHBK1L;=I^^R);|*J20KX0B5La0`VzIOK1YPN4sg7S9fC{k^ZA6Ck<&AG#z*gf
z=hUG;Z^c^woTkF3CtXWzAYWwN!NjH>cj!N;amV`bZJ8DuQ2k1wq?det>(rPgt;gLR
zvC$a3GDPf(79iI>Tl*NLf}MJElcmff(a4zzQuM-S`xAN04<wrWRfT&_rMQOMAqN&W
zxafnneBwtmv8Hge=`^^!URj at SUp-Dakl-na@O`a~bOB~yu$Nb6Cn4>*xU at Y1nt94G
zH!rw-h~ErBE1v*ADVMF1nc91ImG7OQzmf6bhE?F8KKxD at M)RX=S^R_Q+q+|aP4M?a
z9@?&=EULnVv;|IB(_G4B3F$$}ZSIvP9V2(F8gulLK0eeSdNsaq^%M?meR$=vazWq&
z>gLA8rBRdJDRby5fynF&BUl+mKwD#Igx_s{I|Eb`z5Mgbe)G#eL=SuDsmiF9Bcb)2
zb)m59xWi;<{gJ)@h`r3wOAWM0_S>MAU$IXCpU{ui$g2bP2lMk#6N0vD83~^&^JZqS
zh8hD!;_CY!yJT|7U#_K!kZ-&4js^3j)l=I!`A}dHvguIIoS){mryw0ggb}bl#lmXS
zix}$;Dj$Y)asjJf%@ZV8!i7=%ruX)Kv*+%ue$pq at I-qDkX*gSKkHTys9XxBB6Y?ZP
zZeQFK_?0=wSN>jcuRX0%R|IXkPyqO8W4FQ2$(fcVejgv%vf=pG&+_%9#K6FCrRGYz
zqW1BX)tK<*<_NgG_46swY&^YzIa5$ky(_&_g&dY?33=F}YnS0A9I%L1r&3>FOWm*}
z;7ypx>Rvg_i1>SWXgL_Dt5=Bl;7IvIHfS<`Lc$AyUMM`z at J4tM4=&wdTzLyQ?5g at +
zm0Vyu3p4#;J&}e4E+Gyu3)C>dHHL;{$Q<7pHQ7sYINx42#MF<>Pi3Eqw7kDzj7In#
z&(9lebzr|-9SXGmXwL at +n4#WnSJmfgJ0E;c5hJ|N5z(BiL?rLSx`Ntt3=GUci$G7b
z*zF<^8r>QUzX?`vuv=6)b<X2LTAmHgFK_VsQA^6YJs~BklVI6C2?Lr5UcUPWA;%B7
z#B5h^Nx(H0fj-*WOj&dZIlPsPiGM*dojdE<Q~Wt)I=h*gDVtspBC`n-lS?LvTx*nZ
z==L;Y+OUV6D7~o!VozLeHNO64mCU0O>(MYJ%y8yJqsZlGA(3ZgYdfw`B2Cga5DmqY
zfN at hG_x%kaA9zxxAXL40-(He*`lxl^tYV2u at F4&EeE#1Igl;atk*t{FukBx(;V%fw
z57*W_QnilBEbD(+$AFS48R6fR^7Q28(_pj74F6?NaJ*A$lg+J;tt&lipK3vIuAWBu
z_kB22Aql)iha9risu6~Vi)S}U*5<54;m%)7w5{3KwSGccRv={e^{pgxxUL~Bzr-M;
zDaBsSEqqs6Hltfs1_v{WujlrE0vt8`;mRTHF`<;;l^-W7f?Y+A5lv<8oTD_E+oy27
zn-y-*rnIf{w_W12UT%>491rnd><*=Zg}dS_+blJux4gF|pr|at`0 at BlQG?12!OyJ(
zHmzKLlx7xuyIO0qx4U?!fNH9i5vV-wijpXlRp^Te5ek1)UVaKpyXPgBU1^QEsENhf
z+1TB9>Y-y6Fww_O+r2AZ)xvb$0QbB%krk%<qeW>34-6-Vl7FBH_x6&g&l?b{s$D-?
zAWmpMdBUuO<fpIY`dyO_HzbC+J70 at M)%I=knNiom=Idzl7n#lfW69Xs;`Ez5d at qCi
zUZ(SA2J-!7oM?2-;OXhqo0*&HX+?BAzv~Af^+9do;xfx41`?3KukA%Qu9>*Wsy>M)
z$92TU8!c-rb+jSv`TQH0Qe11VClfCwz$rZoyI75EuMx*^@bHM(^1q{!g7{pId~cBK
z+d1Hc9Fm$DhnoQc*GHq+(?_6qPWT}a_O~CG0^M~=?LE5MqJAw>h!G%Xo(;Y2?4v%6
zfkHC}&hdC4Jo8C|b^Ds`4u&&B?x#y_vWc7cXLz`nSM~EoyLUA;V0hLgulfYP)?M{=
zHq(!|9r1HX(s&co*syHqp>))KK6Fuu)-CO}e;qofEd9Q4`ju0-?q6-J2g0^tK{`NJ
zPfu2as*L10>E`O80QmaEPL(AI;qggbI_Uad$j!H7v3E>ca|*$cl8Dflzg~>X-QWMJ
zUPg3t(z7;x94B|Yxxi(^VmH{)f%N4)t}}Ps^@ypgo{i({)_u6Rv7aaD;v8%!J^XGT
zFVzc}4!Db@>N9^%zXG=&%?I}TfP(?e`hD+62E5xyYcF9x#HQd6<Eo9jR=;y`d=DY;
zV|N0-FZ~U|3o#;a_&4rHH^$$GjRjvAowKbuI=RgaR77`^qN;osEPDp<rION8uKx|b
z!UZ3`N7cBy@}~)Df9_EBq+Uqm2LIlo;Mj?Xi~Oj)W54({@2i=$5>@878(DlHT<j>8
zteDVpx1u2Wp@}bgD-inx7ti=2&i=^y{J~g2S=$tBkw6r3c}4Rh9}Q`F;-iK$=0OiA
z{O<8sYf8$iXPue{1}lQPphSHR(QXshc at 3~{2r9ayDJW!CF4e%iWk}50Sf-z?Wt4>U
zHI0Tl9_Ce12Iz3#`;wqHNe?3Tdv6jwSn|*QKFpWIdYN)-CG}MI at kfp#<QUiMHw91J
z>gp=0s?1-F at D^T!+nRiM`Lv>{#x%npaaH5FSl at ao2F`O(I~Nu{{`frUTvS9v#>pN-
zM at RVi7P;$_^D}5v_mGmzr~YrAqB&NaZMTLGy}i9XPMK-vlIJ_71~sp^``ilNYfjJ1
zcIv;ed-ASCk>{$*XYV)F+1c5_k!h!mwWEK$aPbHQHah9w;5x{_7l2ubF2khYfaEJ5
z?o6`$+1=ennr1mxhL3<3N2662p<?$$EH3K5=rav at H?>n|wHedKzh~g{rK#=Eeaf<C
zYP)*Mu;k)x at k*|Wt5)fokw&@9L!q_Xo{=6EpB4lHQR%B*+E&sFUjKi5DIpl6jMZW_
zyM4P?-kO(@bKzC9XaGO$_6IkH(meDjxsJzLWp25X77_msp(LdApB135-?O)8*Bvk-
zP}kI?bKsl{YlEx6{r-!u at bpanFUj0fL7Tdcz{S_t^mNMmC!?;!G54g{y!@{lvIM=f
zzoRfPfSEn^o%A{7IU{a)BueSAU)t2Me2z+SaWQDY?^ogDe<>Dj<n~Ozs|S(UNgWd)
zH8muz?4(tuvgcJZOnvS}eRWE`b4e)Mp)8L0 at t<^uS2!pV+0J|5#%O)(P68q#KM>dF
z_z+a+dzpiybp at Fm748TwzgW2(kb4m_fD7!xVT}fdj`P=<XUFz-c8{Tu<y*ux_&J$p
ziT^9DgmzD0Nl)<nSaZAq_g=fWUb>5Y|Na4$xyKD+- at g}6{3gId1XpR||AOa2I{<ku
zZd4H=At}C8kY$sl|GeUe9zJ#ll1FA2y*uK6ANjEm8#wUKAatld*PTXrVtVBrKyEC|
z{~mLKT;t9?O~(P!U+ahXl>huqCO_ss;}1@<|92 at L|EwqDzZ}&wC|gZvyA%)@u&xD>
zn0c8}_984;3ljD<-ASiX7_J3r9=ZNj-g*F4Rh at YKiMO=yDZVbmkO2!I>+C>7?dspz
z7ktL{epw3YoxkwWeAzb+pN+Jqvs35|gO>rcMr;przt(3jp9kIQIe1yErOT{y5xkv!
zeuVQvp-83JuQqq^alq|d|Hi65Vd8eIID8SE4JXP%g5dIYt&se<j+Lrhv8?7l2b*u{
z-S{q<`+i&SN$8M>Dau2(;4?_<{LqEeYq%_0^TZ!7yeqI(+tzcbnhm?Q&R9y&E={BD
z95Is{6zm{C0imes at A06*%=q?nY6S76M*^oq41*%J_54=v`ru8{j-~8K$dTlphJV}S
zt*$bBNf?}nao~iyPic8lBZeH_g>>G<W--J1W`^~XFs7WB_KJf52mbIo-*1Gm8y}4|
zjVH62=o|#J at qa1UMqisOjZAWm?FHmm7q-64uz~KHIeh7SUW8I2-Eltt$>+04ywQcp
zy5+vZl54dP1&Ox5xTsDn*Z8e|Z-gLUEIF{V=J{J@#0oL5Y>E9V>uDDxEo!HVwMU!M
zf=c_2#=WR*>14$9n^V)P|MgCPU at Jy`B2psdW+^CcgYN&t$*!^PJQ}PB3;l|FqS$Bf
z{qunIN%i2t=-7N at X=_2Hs(#mmuf<f+aZ2hOXGO**Lhm6v#pv~snx@`zW6wK%2TZ+^
zp{rA24ld$n$7<dra7+HV(b+;xFy<6};_|y}fj1&+tls8zn29M$`y-;BtI^rwy1EuD
z0xTUMAU%|pr*5N&q at pgMbjs{RiF|jQgMT`3Dud};CFa#^(}4p^R54fRnFjv`QQnx*
ziL^ByRT!IS6Y&qjM3wI8*st#&)U&7`nRbyllaEYAPvP<tMPHMsrw<KT?2m~zsTmpY
z)VUcxt~dAN+ZCnr5E#o}YHHYWe*Vtud#{hZ{1Qpe{E$O6+1D3DffZua{QRkzk|TXV
zRDbd~#wG*bX9aC{;0jPsLh=Gi8aQ3HGOeAP$myi at 90X=rPy@(<2!bv6#p0&iutmSb
zoAr3?ZIR0;dppngm57AJ5&&jcJu=qv)W}{K>bq?wfap*O$%8*{sTiU=&dg2}86nE2
zUl&AU9s#BUF>dFm$awNc##I9(rM!93$9TkfKaWfFq#<F!Bs&(oZBf#AY)eeOX(S_K
zyaFYfJ-Hl{6M-EC;T!&}4m@?)_EwaArCke)%ySlq+qX7DIN1#~`OC*jOavCTcD*hF
zI<7ue!gyn2i{Sy40j+Kr6uWd<RVO+nhy3F^0XaE%!98vGu^K1XqC9s>_q26f;=tPI
z1^@RJ^GM0ZU}UcvR4(}VdNlFOc~cCHU}ky8R}F!baMre8c^u<^B#vK0`$`AP3u-Wo
zRaHsG{X3p%+7kE)1eM|<h!5QOsluwXsQWQ+f(cYf;GgfBj1_O+q^r~azMP_pj*iL7
zpH%S!8w^I{*ZGy4;nrg?lz)EERTBO{FPM&md}nNb676YJA<}YZ7FDcEJtrUMyD$dn
zz$cYnuZ6y22njoTZB1~}qF}H^KMO}Gp_4qO3hwwevo9CG$IBU^5l%;)ZHei1(z->S
z+Bt2QczHFxUGi4ZWvh%bx&223e%2XnB`-!D)wgQ56GIDT2+mu@?J{>fB}1!s&+#63
zL#K*W^9Ox#$*3ArPaWLAUC`;aMp2;hO*Yq4U;fOUWzZ at rDQA`CytQ{9_ at lG-R$CYy
zBzC#PH3jXoheoS(0gDqy>k(*PUe9Q*fxT4!)F0T6@%LMRgX5RoSx3^$k`t@?ejA%0
zu5jMZmzp_4#&9M?6MdV(<$f at BMjpRku~3+`Xw#_=Y+0)#$*KC>sPl#uY at jNY$%!uC
z!|^*|WOAM#1BWTPhJ4 at E_?;KB9l~E(o{wX7 at 8h{!_29n2m_I6q7{<A--$H9>tC;|W
zoy{akW`W_Ypb6t8lqJEhi1+rV8^1eYblp at 38W4&EhPB_=QjjTNg2EMuPXcobwg0sM
zbdM}{w}P7TF+}b78&3w9!n<O?W~0Qb<J*o2Sx=tkkGaLHOMedc)!RyCZo^GV+n9-U
zb;fj%za_R<o0Y4#2tgk5?UP6MCb4pD9}`nCn=KFH98_y7u_VRB)<zCDkr4BSg}f02
zeq|Okm<##G6;ln@#L*UE2o3piiD+$ccNRTkB+Cjl4FJ_C(R^328hQV at x`&j;j}r61
z^l&@UpW2<RS&QPiNQQ61tV)8XxiW3BDfQ^4#{mh+Cf?ser8$Eu5+lD7JVOt(gehV*
zP~Y&1g{w)Ng<l)po)u(a%bsRg`W8#?lds(%r?C05pd`8d+_mTnPt at x(AC>FV5(BVz
zR^}p9H1e3X;2+}SC$DR!ND9FabbeHw&R$@Nr2qx)iO75*XKYLW$DK`JhlT(}rBdh;
zuP0^QEuw%o%sPf?%?I|wt5vTAS0Dw$=oj4p at 1yl!)@y#MD?VQN(XQK at sw9?)#=|y4
zi)ri5&u(txXS)om(z4mTEwMy#TiUFnmAU)=kZ{lGjoQ1$v~?cxO|EfVGx?Y7teI8}
z2%z#jId>~h6lt+M2hAnenfI@`e0RgOFh3i4cII}xwL>1vIZ?d_ydKn?5u_N}a>83R
zGAz1 at 8S>tQd4BGAE*8yL&}Wr6aVaEZLM|+Hf>~e&_a0~=)}pqC6-5=hE%Ql-A0cIp
ziFc<)^wkbTerwOFu#|WhjEmvb(=)o~VE9g<Yf24+0=EtuI)EBLm(cL>ZHqWEQ_J|9
zwpK|jWpxN}OlXPQGH!2TMJs;VxIA-&$U&ugXEGXt%Y6|4Rjp>E<9jO^^G;m5q4P?0
zzXMd&SbA%Fpl)!sZpb$<$eN$ncHp%LUvZ_Ec;7%V?g@^Pp)Z5Ar$Me?32)dA7BDp0
z+=4>6yK7;;&v9Mu%JJHm0%bN98|!-G%rLeCpN^v14>o&jj8W6;P{OJ1rH==k9yHc3
z1$#X;t~yMkr1VnHM3L_Jeyf-eu%86CU?!k+`e}NsfU9Ur8eDsH!INR!$0hJGZ+D8!
zzk7|1hCiKD^-Y4cIyL*8dJiq=VX-6q;|hGsP$B>eb&S#4w#+NU_(LV#6C3;zbBb<+
zw7~fp?=W^@+T4QW>+8G0DZmrb(ZLy_kYYe0!D!t5Rq>X0$Q3of7fTjtS<73+RGozi
zojQARrG0*pswV~9un5zzaPT4Dmj^(}*R&e(=!0IeGm}%R&X>aT^j%2NIH$?hp9Cp(
zwWcRP2?&$e at J<Cd8(Y|rO&E(N0Od!UhM?+RmH5S_G at sNsJ0IBkl~Yj}FCLX+>XdM3
zr2VQ`9a-YCmhGofbXI=OB(~8NmEGhPOxyVTFff`FG&>(Ec`Ou6LPqvudR`;O5j%-6
zRTS^z>?hjsYAPS~>(WWGu9_aT?aOg<R?6U#t%?)%rDbRsItC|kZ2Xz>q$|(hbZRiC
zuRf`ztl#Fs&f0`U4sWp7<psCc#Etb!<aVpO4K<Q*aQe2P{-bt2IDM6 at _{0lP`X)dh
z+q_yB49g#z<h3Z!p5TDNtTbri+fGcwM8M<_$NN13+>1;x9l%=NV!hH5bG=urBBBwk
z6%xq{;!!B=u{UbEUBf&nl(^M##hSS6Czdf&mhlpAUZGSM!(i(U?PGs9uH{~-+CD3;
z7Xs^IOIzUad4M?~wwsGl=h3-0mh|O-ETUDe&l*)LIN>$7O+ioLmEaTN(H)1Z78;3}
zkJjBaJ6~TEp~SWdD!6Z}O2bqciGcy8<SEMpxx4sGWQq(b8Ccf(6_adP5Y{iS^f2zL
zP(F~4Y~d;}%57`w_>jPkKX2+YDEyw2S+|qZYNBESO;Mm&ENsagAj#MY>Kcm{ggeY7
z2RE6c>S!n5GM!TvR?gYo3h&BkR-sT5T**D-?J;lI84VgO?YSVgX3v<iRud*uT|R~t
z^6B#xMoWWkssZxf*fw#WBZ`Ev9>@6)<l0V2Y}dZR#Ivti4U6eH#*jc)w3i38^CeD)
zw<TP{NaX7Lz65w*|5)+{e at +){c&1<EjSXMnK%Q`#)jxD;b=v2hDs>i^<>Vxm8J&Mn
zL+I at N{Y{HWvC5{zNS}0Z83xDr)8Lj;romTjS3M*{cBGIer{*k4J=QqDpxSsY>jdvd
z?5zp5CXO2DkF<syn at e6GJmq+V2)E3*aHLW!nM$kXJjTdQQu1Y{-OOG_yO%&T+VO0O
zE2`Gz?N+Lmgg|pFr}0GW8UB+Y*L5$BI;yaTef!Vnxbb<U`K-G$D;ABc<8B*Xk?t~4
z17xW-C($Ay4{_- at M4#{r7QFsyv3qZi7nLNAd^rRN+oz_4=udFCdcN4`A<=w7a(3Uy
zD7YzYQZKT#j$Y9o(f4Zg0xTBG8nEz!F*`fLw=Ab%=xpbTrmfPkQ&ftg*k2aFklu_i
z#n6#AB#9iZMwST%4%B-xD;_*|9w7-z;9TBHV%$ErTFadk2q6k<nlZAAmIl+vI6>rl
zpGHQ4w5+yGp{?ps$U-e+p+myuHs&I*ytUQ!TG`pJq-DF~=9hsl+2Sv+PzOhQB)uz_
z$qtD(w^9q*Yyx9Y5_rFX4qi;{0H0`7L20&wbn@`N7W_lht#S!@f%M9isqt>Yxmg{@
z_ at uVOQbt8+P>lR1B+;Kdd=?yhgXJ2J-|l^6tIEi{VHNs0^q{&#&>5x at o<q7P>E2z=
zM_AihTOad6k%U$cPV%O2)ySY}y{5#0yop{IeWmPF(4-6WQfqyBcDF3zQ?tJTe^{d*
zMF-;6>EM;7RDAdZ<0@=n_ATAr1q)9CYmL$EHUzfFf<8%6BD8I>-- at 4SbG~LJ?|D6z
zw3Uh}g|b5e)_rul#QDg<|2V<jOHPC)L4|G3E^5F8{5<z|@*Titj<FoU>sn_PG}=S9
zQ)>>R#!Xo((nTw8{@NNCP1Q>3t7_{b7d5LjZ(q~1lq6PCH+bZ0xkthS6JfhJFP-%$
z;KGd=3Xa}K1+{i>#9xp+`9<mJM at 99kNeyY{cqwMrmsqRTZ%wM+etSbW5NXwy_vU%-
z8`C at -Sfec_ND$3 at UO3aL)WISlOOco!@2=ElHegae^PRcMR1#CZt<mO-`ol@}YS8Rs
zi3_`u^puw<Tc}CNVU}qetWBG!Ky63Mwzl<LujlnG7qy+DR=NvzX7r)&ZMn*naLkBM
zZzctb>y5CwZFBRW0LXU;N&nS`5yMFps>L}CSOj>R9HJYwid9eVi2*PEfBq|m{9>K<
zs&V#oJ9=n~EUj~xiBSE%cw?-)^FQPV7z6o#to8Ws!2dqS;{T_TlK(Hi#wF179qk1&
z`RH&X?PhG`@=pN~Dm=N~7Rb}-E>p_~s6I&L-or@=5~G{JBjAge^-|;^xg;VD at 2l2^
z&Fp>Y%YMi|?h?^foitc at LO5()0my|j;IomBnn05%LfHo-vOYwP at qt+lDYM#!#9+M%
zp+w1TbATFk2sBBZrR at pP$vYpnoIiqRo8F%uWXtw(vV>5!28~E}J489YYTr9cS7!lZ
zP+OFL39QEUpbR-k6Gr?|qGGuLI<hIZ7$HI`OZfHEmWBYXuSO8s<(LFP%^Gp`EJYwD
zyTZyJ^?DbY-S&sX)W6ldXH(^jrKEF$adevcVzlI*4Lkoglb7g(M~df+Zkb&6vp!-i
z0~-l=Siu;yXa^aK=r=?idye|?dokh9C+{NUg12h1TwbB$$H;-y*M~kJIpzfqZv+1H
z!PlmKTv}A^`Nc at u9CeFog7h^>8J{jNA76^6lbie_12?S;U#+1C^vAa*S&b(%>5!cj
zWqPitR|r2T9;0c7CE~+Iqq;gnCu#q$WHRQ)bd4?e-#b)z_=HqG7+K-hr>1}nLHx>-
zBjoT?w!@*wIbNBvr%azGuc~&OHFMw1&xDOFqc<aLE2WAG$ODt|+-C$*w6E~7hq9|)
zXgKf+^$v|Z{=Ey^XE3yPq)QqFOgLs{LVEb{qOrM!;F38D4-BNbqMOi^7WB2a>l7_0
zVq(%El>8B3;R0g{M-zTPldPYcQhH8A|K|u<x}-m~V0{Ym7~|vp0&(Mx7Xm{Sj}7Zi
z`d?f(PF=7r!6th)kI&~|jeUO at XH)(_J7atD=&N0{GZ3O+0q8B;cOkJF#-1jfpCjK(
z{N?-&;tv}Lq`*hMGB-xsg?P-4u4WW8Er8Q&6aOE_kaes7E@(kqFnH{~3MRx*?zWO$
z=5Q<|025VI$#nR^3C6?M!Bofob at ja~lzU)V(<}R32^N1nVUa~rk69BB?o=QP{p7<N
z37!T{VPR~e5W+&d7^(I>3OPoyj%aywo{TI^ny_0rB-%7c0Vg*914xrjm|`+?R>tW2
z$E01p%wrEV&)saXkFe4@@j(&y81EFA?Vk{LGYVU<@F)5)$|E15S8>EuIj<nz;tzpr
z?gg-5!+Ad3;tAmX`A-fG&gf(P>Ck`{Z*(ggbT`^jE{ZP*f>D%Lbmc)|{d`Dce4aNo
zPq;5fstddyReeTW3A{n#HAFYtuM=1I_;cU%gB(nKloE?pzIrXJT(k&|uX#;tDWBMq
zwE^8yEd99vvSj8TVqX!G%-(Bkz#5_R+SA93WAQQA9;CSg!snB7<&hTO^4ihIDrp-m
z9-70(`1m0E1;l0K$3X2zaCK$>n~vR|^&@ud!!5ag4 at T2d;57>3@<T~Tq+e5j at av>E
zq;0?IaL6Sk(KC9krf|7ux$RJ?uGr7_Bpy=})p(c~ehnQpvzL}Ylj>rFX5(DOuX2&t
zRii$&k_h9K3d0mr_{=Xi#~PT)yp)fD!$6zaR$&vMRUlp@=6>4LG4X_kY{6_9pUjR6
z1-e${5Ib1-ij60_Cqd=AT#~8pt4WL|{8prhp++p`-$zJqrCRGub<b?yX_PvX2z97A
zAh>OJ_<Q8gshT9_OvG4A`IHbQ2&Uc=i$6aU8NH%uO1um-sWNM>8;>r0;(SYN+nG?w
z7B1aFM3h2(y<Z|3=K5nX$0{QPuh|T;zt<5+RVNX~6ZV?_Wa*kBy=0Q5PltBC_u8=p
z711#FKYpOri~2W at 05z;Cu(?7E#N?=q-0o3144(q^nj9<mVT)J((nH`Z(K0%1Ktvb%
z5KUAGZBmK6tCG36LSTME>b?_0#s^X=#n!IUhw3Qpn45)vhryWGLFZXL=c1WLV!R(w
z!Z~5M;FTQo6}QizCJ!zK7W;>T(^Nz?=WK`-dB2)^C3;pNhRmg#Iu4*booQu4^r|Xo
zG<NS$!j~{W{R({6;`}m}xRLWIn3rts+$TT(BoN88p~d%@n;Acnf_SjWdMAI#XZ%yb
zBgX3?9J;9Nls=xf at _NCR9yFb0|1ejEr)U96kOU?9mna`^yg}XyZX`eFaha}Lf{chk
zlLRY+ahx^Bqp>*#Lf=)c7IBO3;-#cXStyP~4-M?FHi at avXbMoi)`0SL&O8Qdci at m<
z<|0ZU;mmw;v(%4YG-Rl46#mGJM7x3QsEP$*T9btxadI1 at IIx}KMoS~3qmoKc8Clx>
zK2Ip$JyHFkKzx`Y*Zk=hgyLe2_ at o6i=gP}>J!m~!Q*#$SuvX<}ph=y%UsQHlP;SN`
zvuyVW8k4(pH{P!0AM1_-M1hKjN33S+n^@@58+Rf2v!oOQSD&4Id&k;I!T1bt8QlDh
zOt=L01LXr`hF7y*3yV;$l*kwfKt+L9xlK=^I_7aoKMnqacYGuh{snc$T#uw5ll_7T
zTNhbR1R46%fekr0)n#Q2&J|p|hAf-o!6pzK7UXA=lRPqJq6wA(DqxXKwj~LvMUu<F
z=`v;l>LBV6Qxc-pT>-05LrG(6q;NzJVRtZ%miC$UyVXzK>rsy|E87P#wSAVA9VFF?
z*q^Vi;=~9?AA9-7$^%MaeA&6>om?y2d4{#LF5^M{m`GW?te<ynI&5TQ<zhPd$p^v%
z8MgnAo%i9G_b;$z5oZcR%9r%D+iz_OiVv5bfA!a{c^`k){fesV>z(_!W5#`N#)}~`
z47Us=yOg9l6((-H=QID*n?L_=?{<FrWUB_lV*aV&4_JROWR$21bsk<=puw|>E4cY!
zLXwsNhl>xev_7&=X$n)WX6wJX*2}ZcUYW`#bIzs4_T;?d>u$IP#%{FUzeB8MpZ)iX
zo2~nNBi&=yES|r0yVLc;v;T6E3~%sPO6ugr7%+HrGjK4}N7%h|yEZp&2kVBur$2H7
zJf at ZU`>~6 at e)*5(+&{<vm;XFD`0wq3mO7p7Z at Xt@iT||fx3T{n`Fx}9?8ysN-n!hV
zl(F)-%=hNUn<dw>zgYY5&Rw&pv*YUy>Bwu<-8^U2+UDwPYA=*AKk)qD%?}OId*^xm
z{*ha^XWn$X@~zdKUxDYmRzA_+opFy>?&Xn;k7c`){~GQ65VxvAN{+v{vLiCi?T8s$
zq*&ztmjbs|)okO}JHFha-0;k%3W at r^Imi8L1sIm|N0zAny!bvRslw*N<BI+FHq5)Y
z=g5L$E1M;sEjn|H??=Von?HZ;*R8)lvtP4P+SdK>p{)(ivyD|!dw#P!yw8YLQ=hzH
z^$c6NwKp?l1xs_{?IPCO^!o<J?-6r}xi{Z;W8c4z->=9XUDmautbSX)b@$D+k0&uI
z7&0j^d|0|nYq7 at Ze*Yz=rBhrbum0O|;q}USse$gn^Y=Z96|m^i{Ol|H^M|6<;Z&20
zF14pUmoMwuq_cR>qmoN6U*D=IKAU^W{$Y)+e(k%@Gro$ssJ%7l_Y*rDDtPgVxo_Lr
z)kdc_{rOh4T{z47WAx$B)th=Y{jzvglWxnue&uS7?nh7Z|Fv$-TV-_WQ~RPDkp?!M
z>mGkSntgEU`)z;koqo at 6TPauOm!HqpVDHDk!cZ5owO=&ee*e3 at Up2aOD(-78e}7}`
zGsBrZw>vIM9 at XEvrabTeowpO3AI{yb8^6BqX^zn3j}HnSeg6OA{u|}&zp>wAxbp(@
z#SEqVldk0F|F6Ae^_QJtJ&Oaw19wwbxy>(?x}^F3yb1F+jK5ng{O+q+cj1?+e#1FB
zkNOVoFW>#Q`1;0q=aaVnUV9<%c+!>rdyf^C0goV>+w`0Ff0}&c>-W2!M-_Be?e3^s
zFaGzS#kA=3{|pai023z=a0)Xp0x5+=V1NUGiVx5?3=9n|oDCrE1Or9^5G|y}zyzcm
j4gsA61RkTB6%zk58vdKWFQ)5M4GI!ZS3j3^P6<r_ZKt^9
literal 0
HcmV?d00001
diff --git a/documentation/toaster-manual/figures/variable-added.png b/documentation/toaster-manual/figures/variable-added.png
new file mode 100644
index 0000000000000000000000000000000000000000..518f25fa151889a42e3104178fd9ce5c4718ab33
GIT binary patch
literal 112163
zcmd?Qhg(zG+CCh_G9tyX3<v_20R*H-ktU#`ptR6?Q>0hvEd<8_1`$xIfDjOAp@}r9
zK at ma^5Fqpbp$7;7l0ZU|-`080`R2Uu`42v>b&+-Ltn9t^v)0q at bw6<i`dS=pylfy4
zh~x322Sy;!37~si<(HGd$B-ne1PF8m^!UL&laTkDv$XK at tC`H_j3~M_Io7lx{6lQ2
zgj=)QlWDJpz^U0tzJ~B?liT%!HnUF&-djO0vyRW4WzScXOFWM}9rOL_yW=8XSx)`&
zmB-rQ<u4~+qfS|#@_5$6h=B6A-R$AzkI-zf#{}9dj=Qcjx at cab?!0zRN$y9XrlG>j
z7Q>4DkaZZt+z(Qgz*tu&iqO%}UBc~eR5L!Hw+N;dGncSlf08P01HJFCeK4~J(U*ZG
z*bkE`gc6y%$YwVs at kfGp!wRdahL-)kd>Zlg+ngVv)Z+iv5Q0?j at hC2L=Hxi#%08m>
z&BgM4PTMWk`jJzv1qn$EU?%^isl!Mv*(?WF_L+HtOufU~I))b>{=3b>((bUn3EOc;
z&&<4k?;aUB$B;dADMq5jA%`}26zRwYXXzcP-db4T({Se#U40Gt-=4822=?oIdW(kA
zO>5CD(uPJ-cN at nMGre`K_mK!QI=A2J^DI|ZnJ*`qMfc6V%&?S`S#Ac<<B%VQOCpI_
z#9Mq-{YEwPFzHk!^A!C6txo^n4I0^pe0nRo;|T{R=f=uF_HJ0~sPgDQwt~E(;tjMM
zH@|E#E)#f>J?2-uI-b4#RACW4vhlW0nuk9b^yb5jSO3!lMz#NhYG`P%oqQQ|V9*_$
zR#AJu0WpHJtzxXMu3lt6DK97Y(O2<3#<Sg17F4=erB|l3TsK6L2=4XC$LXZ{geg0M
z4)T78^1m$*Y8EQTJ2o-#?%0bc{t$_Vl@%iw$>prcRK|fH1~FGR!(e?8)z#H?Awkn$
zfcXH_eaLhmBSfdqv(3Kf2`pnK=9V2o22VzARhnT*d@|SHKIC|C?bm_+e%C1iW;7N2
z)!@<FM<4U}c at i|8vWlFYzX9*T7JVQ1FRGrDm at v&UpTsyU2Cf7tRj6OSeUUv{PDx1!
zp<a^dYf)2Eb0WteIyb6M^~o94{0#r2|FTyQA=D(zf>#f&H3bvqK93u(DQ;7&wiu4p
z at 3v=~izg>1Q_o7HgU)2KbRXJB(0zKxz8mpIY>^y^cenbKBNtO~d#qpc82e}J-{SqP
zNjcDi=e>>)jL*g%mk$P}x^D_u+2iV~3oTQlbyjUuF{pSy^_pPAiF7+|so- at jCKX1V
z>6j*Q+f(`IliY|RROEtqV%jetTWFp9GUcU4NBlVb0L9dSRxkewA;;UNdF+|}xFsHi
z*jJ#=jC=83x at 5b{Xu-mV&eu=8`ajwLZAI3l1CraGX{_1C<r(1zb5vyXjE7z2 at P0kA
zpfeSx=toj9jEsvQ<uvuPL-ur%!qQZWX;K89CNuD;Ynidriw}w-M^0Y?c6+p*u~dsi
zv3f#mq(1383R=pi;3HvG?3NX_n}HZ{QOlqo9-8 at q4%RCo={q9ek9Qa%Zhg at 0KJ3tT
z>#1>idl#TEoq`FP#*ub}=fnSZ&ok*`(8Z0W=?0(a>28ztX+1%VUxw8FVV^BDzfORT
zZG%`Z_$uPV9IKa4MDewT&{wyiXzkpP9 at 5gF{bc^cm`7{;xVoaEr#hpLd8kec1rsJ+
zn2~!K4eRD$)w01pTV8&CW802jAzRtl20<nU#v9bjpP+e>GuD*q!+fI7IE-z;A9CA`
zP9~u|9OiSKot<UI*Cr;u3AHnK1=(UdfR>e+S&iXmk1^RTfYxQu$P}HiiT(7VqT;d0
zHVv>U?Y$Z;x at xNC7pywOxzm24%(hHb?f)1zCTTmHk#W0ia?%n|aT0|xoslgZ2|JKI
zT=m5F)JNnet-|kPeyC|YgGQrWOoU2U);s3 at 0#afM_A?YJR(hE$)@BxzRW68L{*Z33
zBUp9sJ%7<`%UG4G9NZ0I52c3U{bmp|yWJm-s~9p5<C)bkS{XCEi$PZrvF46sj at E=G
z`S-5sG at gD`<iuDf%7ka0C*<~i(Us;Ig+YiOeqM8M_3$+hwwU|)FkjJsnUfptLSm|*
z0QjTdpE5H`lQVjXM=%-q!^U*`ZCrF>umsg!8}vvuq)rrbI at zW%nY`o#SUfwG-6H<1
zy2v4Cb+tQpJ`C8;31e0&s13}6X!?63gQUK7DPVOlSWy at o3B79{a^O>88EM at he)bpl
zpdhnp1cmuyOL75=1}tA+cuV84yJ$JmD$#)uZ%;3}pZ^9&CEtOz+hN2L^e!P0qx2lc
zk!KRv4x+UjlfS#`*DNL;?1riAO~s~V at W})r3f4^(8I4_tEV`6a3*eyscY}pO;<5wg
zT0)H%d at YLHoXfvE#);#Tp$!6cGsFwjBhnfZFv!3 at cz%Z*=V<u|Fls+cgV at sPMllG;
z*jUYr-i7_4^KG;asM(dXCV+*MVp5okSQy3Whi3s+9k6f{Uneu#s1@%y(vNmvxIXpr
zxE|5jqgrfa<fIg{A&)g(08}JJ8J_ef<C=3rCGpfQ5#ddO;LSrQGno{{Nps#0!n~{G
zIBB*75 at C8DxyS0mRLk~OQPzRPmc;F{H%~Uv>)#23Fw9|%OJF at N=6;#)k$=w6LNlT7
zhR at J<ww(Ds2&)C2afTnYh=eqSF28DOY8o9ID-<Wfs(`iI^<N}L at AjHspktv(b-4gz
z+l+I_h2$pcw%8Gf^uPQ8lh(-G2MvkNYjd@;RixQr-7%VLP*Ilosa)ohSyIFYuw<aq
z(NWmCHca>%9}TcM7-mu7?QEYwyY>2x8kby^JU}X5iP$SkXY3~>(Q@)CDrM_#h}Ibe
z1f}3TzG5y|dR^rt&FFp;HAaDr7q>Jz`Yjm5*aLH`GGa6AYXsG?&qY_MZQNWU>VN_|
z+isVp1d|>O$g3Lpdv#L6<?0U-<r=bPWyG>B>Qik!z4iU8C*ZlP`peDKEcSxOX#6Ly
z=07y3OS31pDsN^y;W0}yclX)K-q?UyAf7K9w at I1`b=erCmGxzW(+lP#ZJU;cA1IP2
z=jj5ryZhqr$^O*68r5{L-hOyMsZTeRu=D4gj3&7Y0aj||k>Cuf$TvLH=CW8sg9MH^
z0hwvOhDWW2EYBs0TZ<z9$6Ys7iT?@;YqdiXFesBa0!FYY%#IN0Yp3D1F!ma1u&RD=
zclFN86BP|ZTOv>lbP?s023(y}FIHiEtB2W%-^%@dt0&Oy`8ALY-d|)*HFwW{qtXTz
z|Ly#4fNk$VCK8 at URh<;DZ?@WYSr~(-f_xh>O)hZ2Q`%25Z1E#ART0L`LF$5teoEiQ
zc3YG0wUft!y2;&G`ju5Ovw6fz3c5OIYrA3f3oqAbo5>IlnzenOVeb>x7uj-n(DNQo
z>m?I9U1TC<@qV$>r+x?@LNUN5lcD*2lvY!rf<=kL%NT_MhoR!TSKjzT790%JVBj_f
zX^*4 at UxTj>(zrOmmbu?MT#bhE1wHs!klX`)D9mZp^R(5l^Kcc9B%ivnd7NO2Sg_p-
z`?M at na1V~y?O$yfV_3M&&f?HZcJX%eIXaZ8FFvVgo|M`rU7nfUqh4GkHSKt~4<$Ki
z#2C7$VuK$7Rw1VHbnG%j`6-VKZ`imeliP|;P$T$81eI0vrO4>i6jKtvH6}98C7Kt}
zzhu#^kvq#RgD=Xbxv-`km9}9RymcM1l1#K;-}-0RRu#y6+kGFz!xp`{BTDqYaY6e~
zi9|Hq!fq$`EgQLQJq({TxbZP_IH|UCc_h6Ub>UN6W at _Naaw)IFeXCMZEOM}W*{^h?
z;Hy)G)MWu<T*@?Qsm~U0IXb*pqhsxLD$JK*!IW>Suvf2MjlN<s4!LMGFzDm+4(_O=
zn*s!br{5knRxaIIaFVB?R%>>`S{MovE+^JmA60#K<j;`AgK-(1jK_B#(cC5nQ=MF#
zo%b{B!yZ%)Sd$tN49(u2>^3{JT-_FdIovea#oZ<h^RWWf2X@#}mjK&5$kas#Tn1AQ
zM1)0Z20<-T!M2r%S4p&<-Ez7;zS+A99|xn$;K-Y~9Ysys2Xg#!HHlIf#z62P-i>Ac
z+b&KST7Fw1b)rx~-ST~VZ0sHP3G2)z&qME=O<vu}@q`*5S97Z&!$t}RNv~h*+?RaT
z<ueE=DXEMno9RfG1h;R~m8 at xQH6J&u<Q31`L-WkT`?$LKIPrs>DaxP9jAE*-Rojjz
z=AW4Khxc^H+FrudBYcO;n|fpVYt+oC2Nzl*cA7ZNo`tXu7>Kr-T^=PlkQLs<>2RFs
zYsNl4olvn?V%fIjFV=VXo7Gchk<Z=Swq`c1Ye5r}0fFD19OmhpT!OndH7(Jbtq9P#
zW!jt{x16y*g*exOfrYgs7GF+!u%oW3l3gn(g89h&eoHPRoPpXe?UfGrDD}m?s%lJ)
z!3PQbM;ySkamsSm2Jx_4rKp}$7x`AQgq1jod?2Ofej-W|^P4<LPwI{uv05Ooaes|4
zC}E{l)LYB&oCa3`If`lAs+BA^YHh>diVJfRsZcq!CFylI+xf6>X&Sot?)TLznTb%q
z3QX at Y)9qeE%_jZ#YwzSn_izcI9?CaWJQjCpnjYKf5*kpfP!BN;KL-m9LX_Q|3JJr`
z at H2I5wag)S8WoXybjg#om7$;{@xJt&i1DJ;{t|W>?xRY5$Nw5gG{(XSFuPjaW#i^8
zWEn-k*9J4R^B1IHRw60FI{!!1{vb(>Tt(ii+E+ZqvYsXYa<*EDw?8au?VmXK;>c7F
z at r-Sq(Q;8A3}^Q+gk0*#dd{CzOw>Y=-9`kHp`LeLlGJ=+&ytB0`x at s<rk6)U32%<_
z-v}eAfg8SQ>>WevDrT-KA#H<U&lPgbm_r|r7>_wZP<V&vs~sVx*WbF$lETIUH$JiB
z at +8ArcSBmT*tO*5{QIfqFJ2C8 at MW3YkP{_z{wAJU7NK$d?O)ee#J`tJIoZ~Sf2w}S
zO^dmZGZ1V)W4QI9y;Fj4)UvX&8t9H%lwL`wBs%3V%Z#ti?tX+K>;;w^3k}9eC(EJv
zlm6Os at gx~`4X<G5O}i9SLI0}BVuXKRNyt59(%6)&MDP~GRQ39J=(#V$aNFhPfZZ5W
zr2hP%+m at Jm-rU^>4RclKO77|Mz*CiQF;UR_OPfZsbGAgBajCgA7+?1h<a^XL86tfd
z at v*tm^tx={G`3Hb0rA-qy#bPg&y9xI;RhpHWZJgTWJm22-X%fih2-%uz#b+a?Dozo
zM-mgSz5VMxWzdyUschReoSzYNNhXLNo$BWPvDh>`g&eq5y+=NL<HvseSC7f>%jD(e
zz|EtIkGBp27#0;`IHsaOqeqohxMum at cLp-XZ%f(NsIB{Tn0_1Fmgv+c9=x7VqhLlN
z)f4TQ9 at hVisEXXgc-S|(68I7qvi#R>f9N2BeB=9sFl2fYH&?Z at FlyZ}LuVRB`(3~@
z0Z*S2^TIxrKvdKkc_|cM<e@%LY49=*^g#UaHSgGqtMZ#ShwDEpbDTH^WPDAO=N0u{
zqQ=NaVIakFOs~#<h-qD<wb?nYYYk=PR4<Mb<)EsXC&k)9<E2|$^r;oU(k95={P2uA
zMENLhO<!R$5?Yqz14h2=>!Xqi)W<zCw938MgWaK)rTl(sjA`L!q=WPgAL|?eY<=g{
zDQf}K&@EclyETKug6Rs9&t&D+G|Wbhd^aNE#oa58LWz&VK<`SES=;NBnc<0BgY-${
zZ24e4_cN2rJqMFA=i+Xhd&CAx5X%vK9C?(;FT)#SZ4MbHXoaPymGLZ3)lp1IiPlN8
z%C^O}rxMpUdzzw=9!W?MffE5Mg|^DRyIuF0FZkdRRW=7l8_oHSr-G(ofq>xg&rp9|
zd%Fos!PKy^f%ZZ*9#t+msU5AA^S`F|A@~6I5wD+ at nVA`#x8-j=w(E`mK>Cp;0I5MB
zO=eLiqiP~a#QtQ<vQJw at 8HOs881Cw7alOEi3>C3IcGN1!@b6k39aEU<i@*;f1A^!6
zv;k*ru|12L?DGV|+-dvqOv0IxH}u9-?q@|QJA;#~GOyWk`2TX1tlx=#TiqDS at m}?2
zhjc*D5Zif8$+nvv6W4v7*;Tt<(@PY)txy`)G2~(E2xO$HTJUF=?^GQ&zH at fL#rew>
zg+epL*fo$o78%5W?@}zeaZop>?=2OqG5N2k at gpsynMc2Wm~_?6YAF%x7 at 9*jTs*zs
z>9TIRc4Y8i&;Qm#TwIWv&!g+Bc$v2KmXM=z$z1i!!_QN;Nbc4Ub85)NmbTKqz5~wo
zn>5#@mR=5xQz&+E-bUx>3ZDQ8wIp5H<<)(n at F~04Z1B3t-ogPCvw?miYLB%B6kKcZ
zNvd1cE{Xr`6O&R8vFh#X<4tq{@h`it#bx}jM>cvyZ&>S#RAAmT_Y^$J!?3-EbHbPR
z-S|~q2U^PRjA!r7SX5BdJrGWuAX(IuoJlo-bzsR~jRRJbgelKl4taP@=~#QTPH!2f
zz}Px^V9NXnokFyOMdUUlciHAc5(GWU6^OP1-uzxlg<X(wPxS7TY*uxH7hPx at F?^2e
zHW$3H(DGE-;zAhe3!wDMcJSH;2st3Wb!)tDHSl0wz?3HjPQGk{jy0D*3+1rJc at DQ7
zG+B8cnD6scEfMVrlz$>U%w at C1-O;u-wL^L&@~)WwBYDpO&=FC*iQL1|Xd}7hx|WV5
zn7e+ at V);T3{sAZjh9zAbQng~Jw1&)Mh&x-)ZFAR*8~cRJC#QE$ykz5S_ at VHUm;!gc
z`fs08Os$vvOnb6_dw1ex#}w?{i!aNkTPG$;R&!^(PrTkXJMr?K?F{S}f{mY-s3|&4
zXPj&!sY={uX+3Bb!6m6z4pv9qKQHLf+*i1fL=ffKG&Q|*KqI~2CN;m(s>rMQ{IJcz
zpo81}w|Y7iPp;STz>dFoB~qt4r`3rjHQjPbm?Ti9X-XKzHXd&c7$&DdC~Pi3$|f#o
z4)+$BOJ5zH)Wpk<w4LYP-`<OvDfSj!tW`s3d3Oxub~$g!vNtASKM7JuEmu2A4E9Pj
zFKMP-1SQ&-6h7%LnJP|47mtm6K~dR>nn~B*J{q}bb<zD!pp^tEd@&`@`^GuqdIg)t
zMXkyrPXrJre3z9(@8d_k at r|)bxg+bwS~yrC=i0dLhRdgfeJXaTwmMB<z9yV9y<mYF
zvqP>bw1(P1$wQb;r{JSis2kx-UD$e>CLNq+Z7pzEPoJpD4HI^{gGNWv7ZK1JY4i>N
zPZ<~3pvI2uPzZxEdpcHjikt%-bx~t}0`h;@G>h$(v!A5&81b<TO~h;~c-w`tp~Bob
zpQ99R2Y7SYg-;O5(;s>J6gCo^#-x-3UbJ at gkbD2Zq&}@0aWHayW4kfSA6h}S=UJ~)
zEYBPviUF at jyO3?$a^&f0r6ta8+B#VVsO?*Ey(wdC{^UbEXG!U|ArEtrXIVv+w at rI|
z5e3!z#E18l!$V+mdsN_R5w#rTE5-=Pqv(k{yibtWmO7W#Fey=R#BsQIuk$OK_0_-%
z7GZidCo=z<<JpwfnT;%~xibNsNzg0kU{Du=AcfmRL=!+Qi~a)0I$SgE9-&;<-;AGh
zQRX%GzFYTegrPGh2#w76rG>XySe`px^tWvEGxGxW4uh at C=^)U=lI1&FH~L^$hrW`1
z%CUCq3aM^sc7D=<yh28kU2uxlN-BxFqb=PIfX4;~Q1}SC+8A_RV$H^KU14n$^y$79
z*gjRHk6j-OZupU24?nkTD88SFw^y`#`w;0dj8}70m)y9@;CAm^*c&-||Fl|ZAeLJ0
z?@6HXCJ0J7g5!mS22jxfehu=SZBlYojg9YCRveow?1egRU>X;eypYU4%1bcsRxZYO
z%2hq)uaJ4RsVs^>gcIxOW^2r+v^Og&K0RJM?&Pej_=n3%Pw7sxn;aJSSERB?lo})g
zV?R&(I>pbt2&Hp>iTr1Lx|}F-nNysHeTv25>cwB!OUZ^AHq%_Le$JZ6+<>0tsiN}@
z$Ji1ZkgV<gWK@!XBEt840v~e8uW^5A8WXs(zU9}LJ6d=5E-ubsVA&{;_UVs%Rq#dp
zW3Hi1&<N>INqr&jmR}8UDUyvgg&XgFnPhS3#LohtilM!6rj2AqZX_jLH9cR}EaWi6
z)<qjM!DnATjBChf-CaEI*H~W$39+e4EAk2N=LN6#@#YZmoj?o>%{P{nl@)bFHBhP4
za>5+ADcrY6`*@T`AS2crHh9=di!sbMp5?Bcmfl}zy@?0T7DOuH#f{oAhQ;AUqG<N@
zeHM+F=7$tDRY0SYkuL6ViXPs-1*#UwI+~Z}BNzHC>kJH~Ptua(j(78xELi~*SkL at o
z+`+!t5u0o?Yzbw=@Ccie4%pd$vx0*?Ce(jH3)ei$y-|}}#nkg4p5$hW-XA+ixW(}6
zyAFWZmKg}&_0MhlV?Kp8GVg7m)aa^i`lj6p-09#jdIwnG2ZXGUhzbV4xB=@1w<$tH
zxUV{`g{}(iAvIv>`SfeMG*)V<p``f{ja_!kya5VEf^)6v6qc7wsE>J0TS(;@2jAyJ
z%6{M*@V?ZH&A`gZ^W~tAY)oWXV4B-ABMBa}O(BfhIYom at Tz=&aQX%-%O&wXRTE#YB
zgZy$sqN%6%9OqU95hQ&pmk&8B^Lll;5dv;dr<=fp$F`;^OQAkVbuHKev4Z>j#x*(<
zT*hI2t%`CgV+t1#sS(|5LNdpr%po2$Zr{OOiqjEi`}-%(o%cv5-rJ#qO{~3JPh<F1
ziX4%N>zxM-*Ds2n*Y5PHu?|UeD3+)=k7Qe{#gGACl^F8di6|hBJj(@ARa>3!-AlKQ
zsRlPBV>|%FetPMx61uA6aScCZybVs?zB<rpgvzL62)0B6>L+0<&`OF3-FCcKH5K2%
ziErJCXi<*gMr^0J7%3k`hwV at 8f1_TnX_~RPTCn)n$wegI)#q-_+rM=EwFyAV=ejxU
z`TIJZkuHxWJi=Iv)Z?m}Ux{r+24w_oO%=Mp671Owh*{LCR<{Zjr)k5-BQ|o$`&C}!
zH*xbhT-;>va!uHJLU5qtsEJ&M`m^#;q79zOV!!p_9}ZTkmie8%eQwT94-8(lU1ynp
zbkrr7)MVqQN>1*A<WQ^o3cbbzJw7 at j0IjH3r#hykr<Q#DXi}JDl`-H=^U4;M8t(;g
zgC2ZJas7iz5xb!mA~sV-v-$1qrvd*wW}Ev4O8{TexFY?Lb-IEt;m`Y50Z$J2)r6c-
zE6EI<x(uy==gb1XMzH|d3r1JY8fbaN*;KNTIx{FVI$N|i{F>VMd`L4tD6$2cRrh6i
z*vMn1u#jj8ku-%y*wPxBYnRt+M5pZz1Q1X7C)&>1tkkHVhYCk-Z*2`+0%=|=l?7oI
zj|hrykgGYb!U7{lu5^@OLh6~YB&gkU#B!QagjLLwwS$B=y3htVI}nF)h|eH)LS<z5
zjBm<))G4;!H`=oExSjW;o1Zy#1Hb3)ICA at ZK1^hJbqS?&CPma)zUqy4U;}=ltS&6b
ze6c3S+8nLk=l$l at 1HXQdO(}I!ilGwOvu$RJZ+?Q^o|4l;o|n7KiKjqIFzSq@)ASyD
zh~*CqgoL2I5MvT9=}{w;8kBC`%AZniforvq=+W~#z<G-c;y|!9utf;xuit`!6OQJQ
zRJ>MOg%p&oLe+q1bP;EF=0>5+l?H0>ZSm2gO>P8SFm>CY<E=tXqG;o)4ZZ3?p^wk-
zW1bDno at TUiP5;T7?NM4*m#*>3XmOaMkGrd(X`Qu{f<Wyb at 7oTZXC{csj2EX<Yx&$w
z)QXKW2$Q(#W9`?;A-j!_?{|KcWjj!X_uh&h2!*<^fjBO8Ns<n($>_oKpGC|_fD^Ya
zhTTbr9=+6IaJJ`lC>J+jUn5S7oQR8q1;bLYH|0R(7z01%)v8?7IS?mw_j7Ai&L83)
zt+9a$q2c+F{JO`ZR?1f{yrnF<$qUT6U`=}`!nIS%4#N6O$*;Tj1X_cyFn3TB!P+le
zR}ii>f>r4ck>c+iPdb?H;wJ<eNJsf0iqooZdE!xQAp7Rz&n;M5VxUb`qKMbDOY8Ow
z&BWf`#~e3Y;O==Rf39!5amQ?`ULz85#28x4jIX&RD)%wII4jT>oHk3-aq+HN#CsJ0
zIK(*l_EgB)zYk-f%MBUtSl$VMs1a&3)DkR3kn4DiiS<(m1?zjXJA?Ph=mWH(rQWQN
zm>GUukkBBNM)xvJgTvt_rX*`s$_yH=I$4}or3L<CBj(|1Y+I_Mt`=m9Nm7$Ee_Sz@
z9o)MdX4Lw1{=?ACUqRl?*~U~XSA#jy<t%53BlC7+y#+2iH+Ot_>Rh7 at xJ=y*67=Sv
z*<Vx^q(aW<UY at EH*}7%EjsdF|V^!(3`eABg48T8?Z9h6KOiwA`<<Bv>B7FgRgnRha
zsg2gq&|v=JZo3*;AE`dg-kzo|cxv>`b3Z+IQ~6wDTHi&$4Ao092P}x7PaBV5Izx`g
ze{li&yHk0^+0ztk#<%?I##d7f9^`-jGr9CrQDxo4bO at tUGe<4FH>^#SRhnMoxdQTi
zLK`159Ct|$50j6?jlfs!P0(>Q%F}+*IG4#EQD$nyA4_l>*1_7Z{;+^<l9G57Z4ycc
zkFzLoDDtqo`?<Rh;|>$0E`WCc`0%qDRFs~S1fIZ5txhe7(?jx+BG1q13+2jA7Kn8i
zOmF4klzm#7tz&3^9xb at lZQg#yb1JYJs{8ic;)=Wix2aBAK4!7T|J%Z+{=Z17f9xgS
zXWR-^T{RU%G<FSd8%B4;v))C$WxEtUC{}i8afiLc2s3Ilh>B7RQA6KUYPe(kB)Y>m
z40#o_xqC5^QMEyYwRkecHJ_MP_N8Pd1`lN^dtDyAdo!>hSiVaNf0<3?WYjuN=eV7S
zx@`#LPc?{n%oA6Xiron+R_AnL$HJ#UgvArVGsU1GT5jOWtQ1V~me&cN+**eG>R(z6
zFxZ1IXFlfBC8wYuCHmYFF3%q>WY3Jg%&f$SEqS+<Bwi1VIPE=xh~XGOUg$ZXqHrM`
z#chC}8IjnyMU-;)2@;`4-VKbo+R=IzWLNjn7e=xwbscK`NSsx4<A-t4Sb at _L6>p8M
zT;r^qY_v_wcEo;`o!W54&JYqVU7pQ3NkjSMV4LUKo+QyK)bLPu at 5lpqZaAss15u~t
z;%8 at w8UK1O?Vz0We=|6;Ag48Kpvtyc7=|h?Efv+%)0<QmIR at 8Vrbr!+dinT?l~-wB
z+v|ppO}1YbZhHj-G2AdXWjjnIuW8q>HH=Yt6p7GJ_j%jrG{9DlKP|RYTH_=6xo`t=
zNN1#af%WtxJfS*;l{9)*R at TV=e(jV;`Fy3<@6S#}X%JU~1wKojjw}uD-$p^{9A3{G
zO+F*8JDqd@&*FeUZf$A)wd!^z7z}UmL{N*gYN5?Kl at f?CiSX(3Var$>KZsjH%#p?v
zVxZ7Vp4+JFJ;VPgv^WE`imvm({5AmU4>&r{GH>;si8fDKCS?|v;*#y;*yXYB2Gt@}
zK>If?-wwo&wtakj-UT=XFG{Yw(M&E1Tz;o;Z2&bO%1bIM{bn#`4f%nR?7iJdy-4LJ
zPN<t-Uavu>yo(rKx`Z)l7_)ZFu;1JBf7SV+i9RQQukpNs0QsugF|$8cI4Jq>0AQzJ
zZB88mMex9enXpn$o^f}OpZg at Rv?Zndb>OtTDbG~kQBw!GIB<p^u??BZG7ArLH5-2P
zz`3{n<o at R;C!!X1-q^{o^S7#bRY{$TbG^+wHWTrnm~0^mQM^2Eg8lVU*RSDs&S&7A
zc%;_qHJA$4xoN~rQ9YI8QHR^8eE(S47UJ*6)bP=5YecxS-aEd{10)udgVjYNxO^8>
zK(bpZ{{2m*k4zntoYD2LFXiEs>N3&Q;YEdkXsa(vfmQm!*r9=KS!Dz71pKbavjr9Q
zU_}0QwnE_c7ON=on$zs#ucpu7B5E}ORcf1UmD#g`8;v2T?dt;3-j-Jjh?{&HEn&6_
zO{niu at v0>+GD+d|6A;Iyqq#FDj at N}R5m7+WoG?6iK-{paeT^pe{szj5OoEtKWatO3
zt!$OKm)339M(p&f(rA}d$&HTgiVQ0;C^^vfOPJ~EoZ7R5+1YDM&t3b7Upay;`pg8v
ztj&GqOjcv7dZpP-TgD50pBW7h=jmhUj6fRNyOmKcud_R|^ZJ{yEnJ4Z5kEKHcm}f^
ziq4W~VXj at WMT8pX6k|VmpY!`(^8^c>RGW68dBV18AoVCRfwCpi1{=f?UH$w<ZoSdI
zb6ZKtEdvz{j at 1V6hni#U4?x_TKGjlb5~beeSEP$FaQX9<=4x+{{`$~^!obk2ukqKj
z0H at Htu1X$Il+>eMe77-*BL;4I2=?-%>w&qfGOje+P)AVEs`|bR(pNm#5-$p|)OZmk
zIcmW&-x{*>8;^3uIRG6okK;tl7S*Sa!usoWW}{zJhkz#3KKW`SOC;e3WVy!zSM=yd
zIzZ~A5;#UM2Y2Aco%#_+FO~0P1Rl+!ek5TNf|5N1L8F1&K-Si~-<vJit&$#!P~O4<
z>K}SX0H4 at Pd<@n{$|`|uw)O~fB2v~&1dLb|OPs=du!a!2rOE3-6a8)U(j|~|dACU{
zq;p|7_i?7PJLuiP+)fNSrzy0?T8o0L`sRnopGL=5z0u_YRm9zE4uJ19RR-5vC}h2c
zrfb`fmMXo5$AG<*zbr(PJ)mK_WKKr$Es*So*xMue{OiEj1G4(Z2!*-2HoSNnKm3!`
z<?(ma{ZRoRrU^`xw2Lg+<G2))Z`|;b4Qv^_Lw^=Q^ka1?pI at m^Lws8h1++^HT6evJ
zM>lYsPsR>!1ZYgEh&)IRV%8lpKRUpUs at p!hsW!Z-$SRF}^{$~-O2Tu}|KQIUU60qZ
zA{)z<k032=j*1fdGoWPxdQT^d<)GybqZ8i at X&TRJ40IvBHjtGm?_$%?9OG-+{klgE
z9fj at tQ~k>`!@^CViiacK4f-TK*Ku}n&zP}kAojnlnYMwabW7)&!_>WIiJ$iVa?yR_
zZ-$;ji!Qi~wRKDx|4{fxx^p!NXEGSPF|S{#DsPdLV%<Cpiq_G@*EKra=3}{Gp~3~@
zk$x6fqeS!GNSgq)PS$0(swmCd-aq5p at S`Is<6t8YkJ<0aWo^c#FTy%=3pTjAp2Zkr
z{jUvMhFWnJkwZT{)K~z>B}Grsc4N&cE~{p1Ylo2!uRn<%IGv-+gBWet{SxukFh}`4
zHI2oTmbj4)4Wip;{7sa5XtfSx{Z6N%gv{F0fB9kko9ybhE1PkJ`X0{n77cJgY`w3R
zU4~8?$5z%~r(zkyduH>LkOIx3VtG~74_!#xAIX2=W9EmQTh;Wba~U>CYWc_piSl5b
zb)PXMPuoRWPusc1`mu?hL6omcigv at 7<SrvPM%mjs1Dp8XFs`pqb&J(ZIyC>P0FUtY
z??+$eT4XLDj)&=rlnH{@OFw?T2h+Exx!R2NLqZXH1g at I`(8}GAJ7m+O$;2mDWkDI%
zZDo1 at 6kTVtuQ>DZvks(nHq5c%DsH}U1~#^6FH*OvT1CP-KN8%QeZ~_TsN#9T)=b(3
z;+&bYG4^!{McVFge+?}vX};qQsWVAKv)?slSQi_&jd-HILWnbt+Ro23SMe$8Nha$%
z3*V2wGhgo6RSH%0Fy1|#d@$KItv^DLQO&gjpmNn*4>yI*8^f(%zX}0I(WhI^;cV9#
z=KherErbH&Nra5s;a^H0scafC#B#NreGg?GvvvizxM0gu$h#^;$)oQk6PN3bMfaL7
zH>x~oJ)~&{uD51vrp(RyY8Jfsw4Kv%?1hUx^AT$bnyvr1+^sP4)wwyT4(ZX5$)@8W
z)bzm9Yx(E7N1?$6ZN3j$2f`N-%^!!?^PHWJ at wU#EW{6enlpxjlU>s(Jl|6;q*uRQs
zS;l|FP#fmZ(^^RzYr_S~hjXX-b#qUI?38~S?(R}yEc~@nV=uiGz+ZQ5p%brA;Gg`l
z<kH|L`d?3pI-jl^;y+LA^uO-^2t#9BBoqL^Dzx(&ka1oG;HimnHz^gqZ1bCpLipQ>
zh@)g%kBGRfcMG4s0qKSit#QTEWbc*e5=H#NE7!<K{k`NB$MKBwD9zR1I~UP}>&Yt@
z6aK{Phe+7LN-c6vc>+UfoXI#uDlSdY<>}j<MWVj7ta!Fh=6Ks4?PA>Hy=qH5&x5Dr
z>c`tE=W<e>{))G-02}<SCQPvQrm6lwx6ak1Cp@^u7X35}7T=>=E_Hc$rsYB$^p at Z6
z!ky07i9}0<vqmi<vX>15yyvF8Z+v|8d(q+HJBXdnpA>uonek8R5MqWX?Cmg&Mi<1z
z#r+}nEBO$Y(JstXd#>^N?iB}nGB5kdWj?|2_V%c*qH;dR-%*igx)55 at x5NjV&{Y?g
z^mKIrrz7J<V}(zyjF9QvKbV<nYLyEM&%?9hh(h%#7O{b)es^&l9lQbp=~8V8Kf<`A
zh&(UJ4D$Qd?Ap!LnAli=%lWKon(Yc?oCks%$2l64+aC4D=x)Az06W~C?&*0<+TZUc
zP*enH->Y>wLFTjw85frT;#ylOv^KbDcYU#Y5hW6jg5qoXTj-NBCINQI<z)ct()pP%
z)cLfQoQUXe at uKHmJpzKEfrl4&W93vl#Li`B07zHLBEBZ_BFyA$oV(o_m_Kku>*?E1
z0AKS}5oEAVjnbt)T?Emey8)nJllpH8Q?UdLm$o40y!v!$QN!FYz~)IlW#L&jN2he1
z-|k7pW at p8-mo7Vuec)dFnlAZp#TnNZEiW5jND~{eFZa&brg&^VEeH(78YcBmDv^p&
z?XOOGCAiS!xw)QyD-s3!Kh-oSR2Ff*5ciOK;Kt_>YFKEOE<XBlOTH?A^7kOGokJT$
z^iRT{+Q$p8ejsOmqemQJ>b{Nd<6hH6=0?-Mfc;y0yiy at 83rWx;m3#JhURxfQITZM)
zvvx;?pjA~eBMltu4ZCVH<3!gpX<Xa^YB%S$H7huv|G_c!H at ODd+}<7s__19`B(R>|
z%saPlr~hD90e`6ml90otOwYJwwA3wqJIuks7yc2U at swXWk}=tLa^vDurYJ%gZMDU!
z%SKa6t3qAx+-Bn5NE5LXNr7Pmq$8`x92%<VbhxDR293#KSnNh>zZMNeI8VXWX+EBw
zy0f#h#O4dJp9MM|fWF*bMU+mqIN$B}7`MsBJYA^zdKsoLqV6Ls(fq4DQye&+FZ<r(
z3Kex8A&htgc<L4ujAwuSfYe0FDc`Q_=_!4U%6a#0bZ4hTSok;fU}tAdM;tD`OJ3RC
z3wV_0 at NSB+ag(esxTE9xF0y#6=(SL(8Jsy*vj69F<-ul_MYkZ7HPhsV at Ia@tak^gr
zw_R`-)>WAPs?)_Rv!?oB>9Tl2(gVljYvj)<j5kk{pAJ9LX1+bRS+tb-Fz(XBlsLrM
zBQq=5JJV-E%y^e;7p+!2b*p<KbKLKIxlvv|<!|Als*y>- at V;kuTI?gf(qL`*RMk^s
zO6P3ek|0y$&okki_z32gZxjtC7nS%=syV6vwgeg~)zs43QkON|l{qw_QvFob(Yxo*
z2k&=D38JO!*FU|KD<&;Z%>fH^QmVBG*+zLsZV59hNJ+uZF*Vsi at moJQv<eqxqV`X+
zRov%gESfiz)o+`6F=>Ju2R+83C}#hvz&ODJPa+YH?yjmgzWdC`*x)103NmUqFNZyb
zQr414Q*Rr7OK`-K2}R{TzOEJkCS^(+DTDhcCd(vl=Xy*XE&I4K3CuiraS)#5I6w|7
zDlQH at SjN<n at X)GPy|!@3`q)LhI_!MW5Yj(U<o&_7?*1B|O{b1Cq9J5QwHntTa|YcS
zC9CIe81m@@Jy!3b<M{H2w+DplxA5osUBBBj>_Kf4nJ2^OXePiNx}KE{LzioOvU6pw
zc=orY9=5G9 at 2NBXd9<(8mGb3#eOZ~#_3PIYS<Dx!- at bjD3d>2i_XdR3-Tjwpne;7u
z<s0HND<+@;s at YOXx;9me=BB32zQ1btnfH&~9b_)zp~hFi7TzzT%b5T@#5yN}0)a5K
zm_=RJeTwc-!0OD4t&l}kdR{=R8sp#(`unf>S0T=OW*l5eH!iTbc}Cb|BaS!{5|WC`
z!}0Y9uqAeW{*6s`!-g&`G%zTz_$KWD6%1e9s4I7*lPS>hU at X)3Ar0li^xh}U`p{AR
z-;0;j^8PE$KSx{@WK#y1+j^!hqw!7P>%_z<S!TLQZnS0e`JjV_Il9QP_U{x?Wq#%o
z=qC{$iZ+6^Op$)Dh_wL1 at KiG*XxI_@`LK@~JHkIjgdrXs(g&>R0Jl~QNW=j$*bk=e
zA;uoFr4nqMu5&ypt|{2Z;0GFsgVHkLxnZ}LtG%#?S_!XTJM()0j2;3+^WTLGhGm9v
zpq<_{ao)?9YgtS0i>tP4bA5T$YSzU3`t_b|qo0t=Pc9nBw-qJi4iOUq>At at Su<Vvs
z>v(l{ZzJ~WeB7Tty at n(I;7hK}wcewn&pRoTzG{&}UVhDMV@@D8(z=9C9Ajyn*@<B+
zWBZJ9r>DbhxqN8ey at Yct4n>Tlw!?bH_OQ`xYcQBwSrVU<KK>AASql0zL`RGuJ+AZr
z1Lpp>&S4elr(T+YLg>`M&{jK at C|+LP&rBO_p{na>K=JI>sN-RWW7}9fX at g3_pEwou
zp2-EI+ULN7ChOw5*m-U9-P=ITK&xts6hw)#-O9_yXO1k?=P!Zuv at Hh%<mIKM)D8P^
z4a9STVFw-wR0Cx0&bYwJhO1Z7Q?Ut2N%(c_7FrfjHay1~Yt)6K(8kEamh{S%JWc>6
zm}}#U at 7kkvNR>6OPQ4-{exrpKB*gw7Ry~ZN;LLn+_bwWZ1}Mp6apy%wCnrl)g122=
zT_3%C`7-EA+CiwVuk<odSK>eBUZsv9kCY8<Rhcn^w`UApT#EJIE9MUm8v>Aj at w4lh
zVgSJS=N>Uqg$ZP!CtiNtWN`=+(k}u?lDm6h{CRZ(Qvatsgc(M8%-l!V(ZOJF-|C*5
zudl)CU=CV^&{D9n;_S}9krO;O+~~h52ULr|P%bD?f6!6Q2|$>gSm-?#hf0o*=G2q^
z9Il0!hH;g5|K$bO5f(JA<K>o7#>U2EJ?S6r>xbuZp%QjO at 3gYn0t8>}q+lgHpP(S-
z`}aSEg at u>)4wopjJ!NjT(*R999`N+~eAWppEAX_rCw&tCI9mM2uCTv>z*eoVyQ%!L
ze;BcQ7(qq>j|(;3^_Njq$Kb?mqrH6^an^B+^Ri4}$5jGHdBApXW?Hh|{Wl@~)rXS(
zT^fD#WXb)cOk>cai%=&H(0LK#-8j>=)Ad<+>#eQ-QflzC_<&o38Hw-*{i{$Y?o@`+
z&pqY`vtOfTs0jS`ITtgZZrP8p&N5#{94SZypAc_+IZg#tlF9$2y5wJIHKv)VrwU|7
z|1Qh<(Sa*^q_}1MT~c5Outgg?x~+<;{!yv~sQN{_xXV&+ at zM9M0*vt+mpS|7^t^y#
z741KxdhR*+ at w~H%yJ++uzo;XpiPq>Wg~rWG{mOWF?N_g?oE+2N&lwh7k#0RF{+|<Y
zr;8Z}We6Mr!v+Qi-HidB`sQZ&$jkO6?K_$OF|;JXcwNcPZ$|-OWdj8Udes)X!>*&1
z-(U8;xbpv%R{bzdd=1I6txM%nzs0-#D6o23{m!=MjN*xx|1rsj6+TMKAw8B at V8lg`
zu=(z>|NMH^J}sBxl?8*De;5(`_#Z;sV3aNOO9_Gg^D6v{drERS#o<4OzOsrG(m4%c
z0qW;~zYE;Q?*8}$f%5+P6?E+H?!(uhvw!z)JUt%uckk}6*Fnes?!Mw-x$<|<;QKHC
zbEBwhnxJ3)zIfr*vAciw{(pSS3Of)_La*GwH!)t at x&=_*im$%^_)qahC3ub<YoCje
zNlQ(=nXg?}P;Mm8F|e`EdA`!2!&kW&9~OaEmHS(OT4g+-ZJVc{cV>kuV-Zgr>S9hW
z4XnR!W3slFwB&5Ld-#}#`_<L;spuc)`tgf)x;O4r6miOM_5)4T`76C5gta|yLt7TH
z%^5gHX#Kh7Q8Z!DO;J(9$Cf!U<{s^LIXf?dZl^g#4$LzDH9#B~U>Mh&MmX`ksXIbH
z173)=A>>N{wR=Av0_ybSKh|z!ijglZb;}1FRX|Bsg-mSU+0#Ow3_r%AI)BwX|MyNZ
z=pVldnkk*TS^C)bi at Dx5|D;AcKSzY%l}}G~k)Tgs!x1R&zxNdWEGWHH<Q?r$RWHp_
zqg~i1G3^0l!_CJqA-p)~<G{_Ev(?69fdd<tx_`Z{i44rIGxhTFIx{u}C(k_(=gX<!
zfZv?1cBRX6NbDvSM~fK3Bx^_ARue~Rm;06~-G)vOLbmx+zL`M5&Aje2Vmj6?kKIap
z#b(`Iy^Wz%#q`eN!Fsbg<;|3N->NJ;oIAlqYf^tqu2ynR<V2-?a!mMiKzFNg;p2S2
z6 at Pap3OHb<tiE<Hzpl=-wJ{fQZuO~V5mjZ{B%>O^KV at lIQIvj$cgN|`Ov>OEx&F6C
zerIfYQ}*aw?i%Tjn0UwD>p!K)mCC^f(l)F!%}_2cc%Z@=sH|4iKr%2=Ol{Q`$Bz=^
zavh3;o=pX5RP`?er7c%8G`3jB;Vl)R687n<vx%`P*?U&lZ(-T;pUx at eb*PDYteJr0
zRjR5@#_Rf?-{8bcRp8U)DusiK{6FaCxFLPz$zZVUN at nR`aIfuG|66+bbW;I$Q|*?`
zPcZ+B8OK?FOv;xz+0K&palveL=Xab_yPCWU`(J)z`hm__5iVp`m!f5zKDJ-LK_#Vi
zrFowUYnxR2^yA<)S81Ewo{)N}V73gjnrN+<b!zB{-3p1|>1wJ`h^8i^O2?+vqi0Wq
zM58)?&rxzlDrZ=?#?foP;~xEOGur7cj;Eq_OTR8O_xxs0zGPD4csJD^pgrIR&BQjX
z?#rv#EY8$yHj8KUJpX2;X66gqR1A0$J&y3zuUKL9sDo^x{cqih5sHNZTi<2i__LE&
z{uc3T4grvMD~A&&{xJuLR$~`w1 at GP9<yST-$g$j(v$2{@4>QNy=_uh>@tdjr9ipPr
z`x}INX3^J^C^R_CNWZ)=sBelHEt$%>etdfJeJI&hZFfqf5FUUjDVoZWedd1YFUcqL
zcvR`&{00FQ!P;)B#4Ysjl$Af(+<)y2Ts+54)@;jjBkdWyHQy>N&D+$aaeXi`C(W;U
z7HIGp%hGWhZ0qTtbG`kZLlDH-fKfatS`oK%W5cviBg$~n_o_sH9K2yHG-s<P!+zzL
zf?m$L-ZrMjXfe6z^4F2XtW-YD*AzLGQ_q|@+;F$Y78T3NP4seDOH~FhoB5|Z6z2!W
z-P2Emd at d+5#g&S}m9yWoR*z(n{}}gCuL2BDEa$p`UR_YSX_>+oDovyc<XboR at Znhc
za`Ix#nNs>gWO!h=8`*O`f0V##VltqTLuL(T`B8cenvZN)U~PBsdFi-j$c->VPrpC>
z-2FP^-3kwOP?+%T{^YkC!T1lCtVTY$Uv>$UXfurdouk%F<<DrK?!h-3N4Yw#WQWEZ
zr)Ydi2|Wt!t_O={^ZRTMTdvB9R~U(2GOh%Ds<q1LxD>R+y9tXp)^4i8U9)dKd;3jj
zXWJQ07Jq6ZPe99Pu1 at 4nqxOY4i(zpv_AwY-c$leNqi4q!<lGkTzPot?DebN`wOM{b
zmGhptTcGudh~fzqH<mm{gD+^MfRxX+zv0t^MNjA9)E;NO&3t~PHSw#Rc6X{gD1hPJ
zQa7RA$l5-p!hOn$-`Q}xq|XoIihkm3pDFoq?wp0*@u(ky09~j^5CoA&mC8kk{89Qf
z+d(DNp{x9UB~84=m)suL6kP5o>90BbOtLk at q#T|u(vVL74HP8Md&e%gtYcFu8_nqX
zbwcTRi>x2jsc`*+d)Z*bX^&p^)|)I206h#hg?Y+c0zfH(O#oH0zt_3y^Q$a?A|<1T
zhC3Lne316Lemv?{UGA46^~g%=DvH*)Yxd7s-Ql?%0ea`9nsZO$(7R}`&R8`r>iext
z_*>(k6*;?L9Vj3Puj at jf{Zj8(<GU#yE|ojWIr_MPTWI}W*~_-~*P6^|A}*jWuT~eM
zv-+{-69(P!qJ3%>Sdetlc`Ydqv at t)i=_8dfDL*0k^MPD3zy?+x*tB}bqL`<_xqvb%
zQ+l3LYRpr&c9Or57Syt?X~*JVvc*ZupIpzHSc0tiTJCC}jB?^=Rf25<C<O!GrbF6*
zr&8G4$CSDC>P(z-RVQmlvl~BJpn#`(<Tg{=_!&a6QT at k%dJP95&rQ$}QTU{g*yN<=
ziTj~*^7U_&Q@{M)6hY+q7Z*Uj%2yK6#{V+4rGDX#js%5WdbJr>=?Yp4i1SY-k~MU=
zKsB3tbyMm}Nn7xo_(7Igx+<&hlNBtOw+b(UDvXJO&fKYfHU0Od|5}~T+I}Wh#-40p
zWb`2?j-VzRE`z<B|Ezc_ENpBVU66YpUSp1Hlw`5n0}Yw%C2O?EHy!^{E~<0a<vCTL
z`E$(j$taH+=<aEdIo>9q>G;GUCo;Wc9er>RVpT}!A^ie!RDND7F0`Y=#R4Thc1Ww|
z_#xf)mrflgqgcJ<EuA%mu+f;+v-6uK1fy-gY|oD4QG at u|=Owb?T=$9%#HNEcB%Z)h
zP2dXnv3mXBk9xG+HlY(gp6Mqz4Q%BcTJsxHsA^#5%Z^c<Sd22r=JF4bPUmh6fz=nc
zJASTZd1~M<pqkjL!}C#ATuQ16c4-n;7SaBnOj4FBtCL5kZ3=p|8)mj2n8H671zvTX
zy33NcH~U6>dEm49DXZB`n7LI3uCkT$^K4;*L?3 at Ja@u5LrzMr31%xtReghV`+P2ky
zc%61$M?1**v|SECJL2kcK)+uc at l^!U;dAE#R<Jlaiq;xI5&StFakrlV$N1%ue2r35
zW8;b(r@@RPVRL_|`{DvVfD@{Wlr2_on_GE}dYpNy{>8Do4_n~@6M}`?<FA9~6F6&?
zBV!i_i)IwIZn(A(9ZDr|TW at P-E*I2lb{v+gYyF%P%(2;h^=Ul=E=$3nP1Zl5xC*1Q
z2Q%)O3rp77|JvB0?#%dUX+G@&F^!E~+L%+*M}M2Z#9(^~(?H{FYAl59B!qXHU}&6x
zo)~e~^!f-gNN$+CI`lKtN|*|3;ia6ASDUG-FXBaB3O*BTVE4y+g{B*(dj8E+0HeNh
zr+n_r0K8xEjD$dK;VE4m4iLtHxfJYazHXB`I=yt1B{pkWK%Qec{No-6g;Mf0XPG9O
zJ))ty+RUDjn(C_MRL98=H*{LQDgn7a|BXZa7v at jdSy)p{L2Gj8$H{-R>h;+%KM>-l
z9a!?@@-{9`ByFcNT9O>+aJEKH2XpOC$D_(xp}VT}Wqy*C7SOTYfc$ziht&w)ATc}f
zS-s+sj?_2xpEor_LC%BBZrd1C(r$!UUv5K5RQZ*uLs<DFL8%`)wm20kx at 9fkZvO0s
zd!PScanLA&d<F>1ffVpnWKbun^Wu7yi3B~fnGf-1t4JmEJ#w;NcP+nId7pls74Bnm
z`S`j2k#&>VEl|IYrs1HNf7w7bb4%>xR8HGV37xHy!6Uk-e(+zmNI=R<c+&)&Q_-O5
z>`aR6gMpssEotx`zsdCvJ5}g~A|6Y!*4(XOu`SsBq^(!E at uGB6Nz*(-Y-}7xx-FKd
zAZ-~0;>jGXFIKLtAf{KIxE8jTrt>HCZ#~F2Jp-a;D6+z917d^BnoKb>!i1f39W3?;
zE6&E62&8p{wUc+9%~~)g<O3^waGxIN6n!e{l1uaB!58M~Uf*FQbM?Ze=}OSxY|}z`
zxtkGT=kp4E`PQ6p<|}y3;Tv3nytcNs$x5X$xV~Dk9J{V5U};vnNJFlx9DI&>Djq25
zyjgWGt?`fc5t*?%@{)YG5gWXwP+uijkx<iA7!msHnGrVWRHS;S&s`eRH*V)=8W1I4
z>&`OY<=`ICUN(3JNE5tFJv_>+tfvF=Ys@>^F0y^U4MHp2^Z^%7O;2qKOiKmysz~4T
zpEPESD5Rs<RgF97txa#_a?hyRC7d!3lMdw!jV6Pw16LewA}pVm1xucUbZl%j=GE69
zgjrjSjn9b^+7FUlA~f}k at 4>)09FCWAxU_e|Ns{#J6$-TU+5V?6$F<&`in4g#ca+#h
z)010Eky<l`y42wMyM%0iqeY!Y_4oRid$z{@3`E;mqd{k*L-UTc=ke|yRJJ<D at _GEc
z3CQ#K at u(a9tiJ&{%Q72CeAyNzp8ZoXLA&=se|<X(DjH2}8YBt){&V<UGhp=V$%4<P
zZh$<y&w<j-Zo7rF#{QkDzF}p#!j|%m#lq at Ca`H$>TFJ-q(i^PpE4|-ypgN{jR&ahN
z6;nvby)D)M$KG2;Rn<lR!kg}p?i7$NDd|=~kVZPByW>#ONJ=P3qbMEHeE{i3x<f*`
z4{(Tg`}jQn_r4$R$NP at E2V-o;ID4;{Ypz+px#mXN6Bqucz2Fx7|HGVQhi)V&2yy){
zfgvy&@Ij9~jy(7;LI1B~4*>t$5e+CRDQ at KEg`el|2_{buk5@$Uj#qwHE0SZd`}&xH
z>cFcE_Id3fO{C9j+Sib<ztI%IN*CeM!H?W~U<sAK8DUT5)h8pkz(6EQaQk)2Kz-m{
zQJd~m39a~4D;qr>!fHVNbx#V7Ux8ZC`4E$%UvcO>aG^MAI3ZhcUUc0v>6b$TF5we%
z;|g6QB&0uw1i*;aQ;LEo at 8-wA;vE>kM}6&9a2W304_x#>3*PNaB+?#@m-^gZy9AZq
z(a%3dl>F{QfifmC;=6A1J#iwSPx&bY6JTg}ccXcCETpS*n}!cKxeN<^ofcorKV`Q<
z1Vb360v;Y7PY9w*VLSkxGji}?>BE8kiG>W%&>?=Vw9<rTpcQyA#vZU2&;)jniw at G~
z2}NA_zfXhv5r5^{`(ct++}*ZSjTC%@h#pZ2fKeh!AxaV1w90Z8SN;i<=ujZg1;cR=
z=)g@{v;3As{*SL1d;#8817(5dKonw`cdq<DF)Pym at Yb+`4-f$PQhU at k>d3)h19~Rl
z?NA6g80>P)4^5v4ferwGY103iT{W+Y;_~b9D0gNkV)op0l1i at f*X84`@Kzy3W3-jD
z78DUK5_FbQhO<BYS_f<KTeAOp>*e9153|~0dNCf&d$+sec(E-WXswL<Is0s<TTQ{E
zDoB6khGpue-|_BOV=7Mb{S_?0?`|SWU-Hs!;T}8#<Dt9~WOXOo at N(3{{z0++JlT_M
zFsa)FO;;gvbODEjWL$nU>~Kj at 7PK}SX#ZzYT!Q?0kyJ>jPPNxtXL>K>nn7djYY*>>
z>f*p+*^EytR3F=X){_LqH>Z9PM2OC9PksHyRV3hR$e%oasTCPG_3^n3!~BCvB#oal
ztHJZy6nr~_v&zm(imjxOku+7R))pDF83EsedzSMOn19ljo4dV7R~NtMhf3!^Rp>pm
zKGZ$#hfBlm2!RomorDKT2<&olI(<7XThjDC<#2JQO|v}T&SXEkp&_POrWIn{)Y-Np
zPF%d~t2wm5&nosCw*}4=zM&fYm;w!pDm3f;l3<UZaL??Icn;-EWRefU==jg|tiKc>
zU3#08hE6BZU?6n%4Zt)nl*w&v%dDw?&6-F?;)*V_o-MYyLYjB>vpQD&bZ*-wwp4`(
zr5G3(@;80}iBZdf*Z?^|GT65^S41hAczKDhX8B0XlE?lmH?J#RQ-}>~Tu at h5siK|3
zZ*;-cuI7B3q}OU}tTyE8EoFv+wXVb$48OW at NLLw3+P2s=-Q&a83bK(%$<au(KUSgi
zS`~iA1m${X2(yYpw at RyxF?Ge~u?8|g at OGZE$RPt)rWPKw-10eKrI_kcZI9cEH{)_C
z+Pgpqu&sptw9H-*a^ilcN$r)%K9#C%TYcZi0*;%Zs#OJZ+yy=F75bVUV!G0e$P+Sv
zV0<A0fes03Zg-q_PB*yFtw?Q`SRbjrhb<9E_A`JhqORPwz*~c4CUSf1QaEBA;0fLP
z9OI*iVIxslzSdcZgtMKR%aIHXUlZ93KvPX$O2dvqN@%b~!J+mt#OQmdzZ5g>MB9 at 0
z_qQ#70w8;hPn-4rhKFx^@}S}5P6{qka^bd11X3Z<t;w_#V8)~1KWE);s*ltjMO9^A
z$o71Uj~DK`RKT28fsYq<?D~=Vn=^6^O at xLO-pMO~)@WXeE>-Fq-%!JW8T#4~J0QhX
z8v}{w>CB_f)S0K3_pY%J at DS!{_|);$o*W#I$H*ZA&1?sXfgbK<&(_%3UPtvSg}vdl
z!8bf2Tb)IeZ~YUSVVEalxT-lYXmXNEfZoA at aE!D!Vv<{NV at g<mq|-qwBoCX!`p$=B
zzyxb_|1=soc-MWeigV55fv;TBaH4#?*8+i~X~tC_<F(pF(}~>g=%%aLxSw}4*zt|E
z)^{H5Xrt%i+JwC4#-9k=a<CjXLYJAuUaxe_8H-ZfZ*@Ktp_Jlgw$&I at rCE2nNfnB@
zcTC~<Pl}e+!oXLnG3ZEVd(e!2Hke)oei^sV?&-zbJW?F1ew#2NdWvx9AhTG$+=UF2
z122|s&u8x}XP)kRLDV_Rkze&o7VrU&^XrFCkb`M5uVE13GfDXieCzu=(#&f-SO*MF
ztLjUe<C~I`LmtHS+Boz2oMz;90UHVW?ny_lXjh;E^TaH6K_$7;>P?|CMyLkxedpl&
z26e#E6WJ at e$iP$h4R9==kV?0Ie#}=cHhuAG&q$gILiTjftb4A?6FZ)hb*+y;5anem
zB+VC}!{36NZ6D*p!Gi*4dnTSpkBTGsQ+G8{unH0Fe)Yj`b<aXulIlZh4u#Z8uGL;q
zkd at C0yCh7^#)+YXma5&A3!&aOGnIuAuIboT)XG<@5mb}LJGC1%&(1}XJHIdj37_cM
zU`^hhYRy*q&9LCbT_xAVrjH$kp13dqHv=7AZ<kSG?Q&a8BS|MyZQGcX=Vo4BC`Xwl
zZ;?%1RdB7)W;RW^KhAa&>grM6h(m&Kaj2_(k~EB;ADB;6g=%kZk1L}cN&DEKAgu1s
z#(p2QJ(n<4G;nU?q+QbMTHVP%r5YU74TOl!_e}E&e?`r7^0@@|nZ~{b1fq~mj(Rs#
zru9cI*!jTJx at c}=2uQN|xYrjqTuw66Z;nho6b~^V%i&lFLN03&w|C+K6sVWxSA|{i
z5z2v%U{waA`@rU(iPM`VLYXFVM|Z^j{t~oSq;-3YUB_O3#MAucGh%2B-4*}j5atAY
zf4dN2)gD+e;HcDkC2_Q#m!SC)tdXL9_pLhwzEQ85FQRSP>PcDeY$W>I>bAHQwX(iG
zveUYBvM$v at x9GqHn<NJ1_3x-I6i>{YBBh+FH&#cpZLnTKpuAJ_RA^|X at 9R%J*O85(
zAP#DqcG8^wtYQCTiR<ljBLF&}Rs#3;LK#g4zVmwU0;N*ShRmg(J|J<9R~kzLKE*tM
zN_dKktLQ^xid)MWdlX~n@|oAuOqi**ujsyU7up?rCyE$zSyOf>%69G%MnRHny2ucX
zS=cXWBq$53jhV*pgRiN1{p9DDTV1K__u at c>OMzq%SF+G)>&`j7k!&QID=?Y at Q)3qw
zfIy}KzKs>(pc(&Ir}2<gfCaZ!g1#Q0Aq_M<+fxt8vqT0QMw)8fh4)5eaHwkQ3T1;+
zfmeqjPgW`nZA2w!e)%R)9e<S(E(rh1>tEWo(*8E{=9&-(pl&EX7nGO5omJi2O4Z8g
ztt>CgD!)C7kpAd at H&4~9SIfDJ==pk<)8r_DrUzg5sKoarsY~zaTgPa at lF`=NYx1Q;
z7{`d`=IHiZ;jNL+SAWu9kXrQ7Wt#Fd at KE<e<e_b*sI#K%(KD~GgFiCdkMc|9uRgQ@
z_rZnd2mL{HgI_!KKJ~W?RT~D<?3h>pKCU)oB!l(yqZPop0Y^ii<IXP%ZKm*T1!rT!
zfqr^JzPh8jsWy{pCvFZBEH`az0Bgaf)w4PO=p6;%w^XfdAG6zl1l66J>DyIuw!Sfi
zQ?DdRwqI9M0rAd#?JLD^O&c#uzjOeVpu*s7c`F};7_)a;T>BZ8y6m(4 at sY$EpzxCB
znQrCtj$}$)M_ee&=j&|EZ$mLV0WG1qJV&p(ItP%XL_E^_VLYN?NHAb1*8}hg#C7b7
z5uW0WVIilhZ?p1wNa3qr+rJYjK+BzQSH_<pml2c&o;ZKR!<<?+ydHCY0C=!Wg=qU&
z7d)0>8*?{Yokh9>Q~d)7R?-INk|plDoFp9R477~l)keEjp0a_d5dZH8t2M6KN}OWD
z+<m+y8G{<Q*rc1wf%DeCvU9&FbfvXQhDPAllXwhj*k~>%P?iVWr{!-qO~M-|xtJaI
zghlr!I(05?wq*iE8nRv at JzsN(JcQ5NE6UD1mEaj&^*F+o;9;L>9SpTpZ;k at 5WyIgm
zB$8v1MTG0_eJ+{2La~RHJu*XmH7I%5z^&`Ha0GZJ%af8sS at M@n*<~L>kL7{2z>m^M
zfG1<2izd<|r%>xq09>I<zGk?S!4(J1REReYxDzYbguM#>Y(ymJQoSHBWOiE;0&COj
z<u({FiTe47DG~CP-`d(`Yu~&hutoTcwt9ZgNb>5~gt6r6u!K1CdXLYkqQ9M<5=koI
zHeD at eU`isAKgbO5;bGbav>-Uct1py at fZfQYLqdS$Vu(M2-7E;5RN-Sy;}pd+E94S9
zS_Z(QVSJ4D4iyP%+s6n=ts`l9=(r1WyN}sKf>t#K$Tr!b1*?IDpw{3qdRkm%L`&VJ
z5X#R^mNq`&2)Wy4(!kCLV&CfGb;ub(ra>8UaQJ9iAf*VvLDp1`-3rROp7lF&B0Q5(
zysVF47h>ZNjFSk6(5u}hFB}Pq%hh*|OD+=gt-C7<dKgHXjZaf&AV$LWMia&E9^_d<
z(>!M~V_biP;3pWxLJTe^kZEkFC`=J- at cU5%QPKl$b?F{`0~J>mK%)rQaH0d6=~O*E
zy;ZG^`ZbO`R9#nB!VKK?i37h}&Zb}fuuvDa+HyIV_r%7*F*~1r8D{K68X%Yj36JiN
zocF?GVM!cJxyMR+utZKyPHwQNf|@r*u_WY}di9i}1jBlr8MB|SA6^MZL_~m%2yisL
z>xv1bAx)I+fhXgwxi%*bwsvNnxax7N*w5I^)xUjj at Oj=<w?$bV{#=P%EX_YEFOS}^
z-3w=9!$N+hd-KwCT%hdk*1-xlru=nSr~0DSWzgNcfLQedqPmp93(@m^{%SJXb|mQR
z&rN~g9A=gims5#J`tsk4>?-1c<_#4cjvL6YclnRmtf^ws`&)a44H%<Z776M$h=b7v
zE~eZex;zpR5h at c`LI;rvIb`#7b&cUwC$5IgUeq%cMqOnFjI*pZ3xv%`H1$}ltf90K
z5j=*+v3)Qf0*eipX_cOfvp+T-Gc8dT)~lP>TH0=9a+3hhDPNQ|+&|LFFeWX7^&YZS
zV?XZVh?&Ex4x~L-nul%O)Y_+I_(rS__8CwD5?89n_XV8Sl*w@$CGA`rL!>2XCx_7L
z%D1EE3wN6+J==)$dpU-$d)$wholNw(9szC8^q>dw4R?fnxumG>WON6I_4Xk(5#%eW
z0p#H1X<N(LTnepU^}G=frU;;<iy4Q#WS}*HVx)pDJ38;@erGP%Dta-NdP9tCLO&%M
zB_dcN0TqY3Tu2yMk7fh|IGL&qfmx;EGsP^Q4ZK=wP0Rae^i4V2=pftk<~c$xl at GHA
z+>1N{7?f2aY+4R?bJ1o4v?5!%c4b<s%Wng87Z|7zOR=|cD7TU{BP^{ug^hfSogIO~
zA at 7}0v>6f0>{h(P-Wr<3(7>gKbJ<h>gm1n1`oNXSgEhluS}Ha|HmBcoDm}F6s8%ct
zLO}}?P04OO^&<5<u;Hno+#)-l6%&R?hD8+`{jvB2xMNbuPcnmI>_rnFY+B5HmRgOP
zgvK(^0e+DuUBT_#^Ili;o_ZW4Eh8`HkL3e!aB%F~y_z%Uw>zU#E^m&<64&?(wj|FS
z+d1YRj>qKJc(&}7nn5A-^*~ec8CN2$m4n#5e3w9_9!Entyf!eqR!Z3Tw8>}59Yl?1
z%I();chYX|NG~T!zfgzwFn<GC0)N&}u!Tn1$_(U=Ab(`wn6J*@`<-U8#r(Dsj+u63
zGS^4+WVc{~uK{>>nSP|muvY;z&MV&$fv@{NnT~AF3)+9x5{WaCa)iV5#E2Rut9=sf
znetJC;Q^7xtTW1!$rY7o75C|g?~tIK?&Gva2iQP$!(IDV*RMvLEF=Cm{9L1~qi at 9C
zsogil@~=43V*wQ at Qm@KFW}Mk&1E=Vr@(8Q1N&PpO?O*Z(r7B7oek0AU-CMn>y_5~7
zK1kaUsd<ebZ~KbqrF*f<8!S$h3iU_7^C9Hc^+i%!(;h-M64pDJm>%yMNt2Oh?j^xQ
zg()L?X}gI_{1=y})`Q-jiFpviz9TB31%Li&v!fpv8WTK=L$4x+-x*G+EG*g-|Jw3B
zo`CS(Eb{{b<Hsm-7Y}mX#Q|F36kkF-T3`#t8Q$5zQx{>KryBuT+DiPHsXg;-zLY&p
zyZtj0qExN5xmabW`!o}_9XsLC+VTz+h2IPvLKIxK;dJaXCn7_=qkhImr=J_WjpG7h
zn&tAQUPV_esvw7!5C3LF4aTA7GKBqDJ#pCB;DX%WroxLQ_C^gU2NpAaHjsu3gT~n}
zV5unrQm!{AFO|(I`&-nJ-sjfrycnzSoXbMn(T%w{yls~s at z=JOm_SR!>mWomhttLI
zqeb-S1$mGkwa$KkN>}l|+SntYYDZkH(4*q55Ex{zD>TKHb*sn?d)WoVu5}L{;5arX
za^d at C4U!>>1|;y*U;4VwT^cod8HqBRX7-L<`e;DJvmgb?{2%fUaQzG|`g|UZAL9nk
z=*?k2nOVi0T(vvW4qWi at SvY<jz&+r at _Zf@8#CFCQ$ND_y=g|Xk at ZP}PE2ILYdHQ@*
z_nSQo07kn|121!q)SZ!a)*Y~eX)E=OR@`8xU;=~TFY0 at aWNG{|kbyUsxd%Z$Hc|_R
z;m(>^ut~Zh^WSKfrz=Pa-{UBRb#7t-smJsk=2dj5Q7H~3#f#MqE42h7JKoQU4oL!o
zu#hD0MsG~DZXMd<K>J&+PUhILkXZV0k(Xir`p1&fSIhh+j%K7!aCb0`xv_6!B_S?d
z86!vVX;g`8b7In<chYbJP6(j$<a3U7xoKaqCw0bvcx;99FH+Z?%8gKEE~8g0Xkp+v
zum^!)6~yhKrYXZ_tK$ye<~l#SMcOePYVExZxM*jpg8SRJbz`kyr$E8Ghnmgoh$B7k
zcn at D(8eo2WtTw7&>V%d~XUV?Fen+Ze at TwxVQI069)vodrXPR=QFffUx_U+=V(Q|hE
z_ZW%-IR?VrVwjQB&@NJz9Ab5zZjT6n)0^Gn*)EZ|)K%;i$m>7G8`+=erp8B~$(7l4
z)IvF$-vg=pZLC`!{sb`8At6o=a7S3pUbNt&1xCmq8JO9;cY?bi{MM1y9tY_ixlYkv
zu9_s<F})%e2~P)#Z`+!pB6)2FO<&;*$(Ov|TS!4?fBRXZ)yabmtg^cIlAW7PQ<!_p
zUaYa*rXl_tSDBfBX7N9=u$H?;Omh)wYz=x|BRk9Q!s+#0Hu$Z7#n*2MEHyJ?676{(
zQz?vh>eWSzMr(QK%fsmNmtWn`gm2D&!+Uy~r!4VY^EX76db8oil!bls;k*R(bA@|P
zyG3^juz7zK<z+a|);-wf32N!wfHo~4N_^uUmW$QK=Ag)mq?EvYL3X`i3?!Nm$r1@(
z*U3iQ(Spc#dn`qrdQcsaA=34A3%cj*X_9xNjn6^EM9HuL5%3{M;oNcf1>Adv)t>|p
zRGw^ixZ3Q1)&jd-GDS^W0D`GV#Ttd@`jAO65pZuwF0ol}J-Q?y3u$6b-HsFo61r&C
zqp{c1L%BP$2KS|vEMp+NtY1_}PWX-nzc;uTAEwvPzDPGY^4qZ)45tN!z;4!A_0`S<
zgGAe}iD73wG7{B|b8mOyfMwS&7Qagl)^M$i>`xiEnvAW&W0Es>v%1h)QzIRYGIP4o
zR)+210o%7vRjG5APPeyRiYIFeWwKJ{s%*=)&AF20h1IuSt7)H>(yBTg34BSRsB2SL
z9K*HjyJTv=nuS0T`5;l>;xDu4K|`$=rGk)Bo_=M>jR;CJ{mu`KD{rygyR8Voe}$BC
zyZ0f_tZUTHCl58mPu=o)(Tq4d)s~*#rj9fxF+g%@&Mx-xGnKA*MB6t#CiW*L?SiE!
z1*yoa>%g&O_`*O*bD)W<sM2d4KfL0D1@%tji)}aQL<+fLM+qgM5En^j!SCTjQ;&l*
z at l}MQqR9ZgNjsC|tuC?hW3y^We(XJBlwi0x<4v8;cLL|Ne^iggZ|_2Vgj_!{b;!!H
zywoMn*-sKKla<b(rTNZH1A_)$^1};LlK*l6I^WInqC<R+%f3BBSoJngLaTb}<gY%K
ztpT?N^k~<!E%)0id;dCm+>bn{pspy|y|1&lu1y at jNRiFZI<2OkGNnW=X8XhAt5pX|
z`4(F|6wi`te=kGl0vi=q!#&G)ltDS$jw_mNyMe#jEzo67XIB<Bs77(mj3gB~fy7F_
zAgw at t4?jN%I0z6>!N+mcf>02n27{1U#HY;6AG23!E^8<Oa5;q4K(jvec=l%zfmdHz
z3L^t^EYiT=`Qa9h#x36xg4ldj^W6!<<NfS_D9i<Qr8c2Fs;A4^TPRwP#iFhl`7>Cn
zPJF8gpl6$waukP_#!0eB+m7*M#%%r`oz+q@&oO6>q6l`ed__iL=<aiVRm207KIRcs
z0{-ape~EhI&}0?J3Td%}Y?J`(N0JGH)Jp!zZJ at e+01!;2Z~>F<<0TW!cvv`|C=dzE
zREWpw8wqc-B?HWzR}J1(Z0sMiJ#sx8J}Fc%zH?Ey?)qU&QXOw;lmNXcOI`;<bVz%3
zE<1jldM!sXvb|47Bub~El0a8&NBB)ul`tpOY031&<$aK?PclO8GnR$PU*a6B(&5ic
zC=>Cx4f*Tx1Gx4=-iHxzG#HJ(s~g-hrYDJ!YR3;N3;>aj1h++v-o!{;6QV#af*AUY
z_cb)0`FrLW=|YBzu6WQ}7u{C>grR|X^^q{XZ4(9(%@O{UF0Rs{Xlp`jW$hKs3gy5@
z_#4M_sUgM at 1%+L2NR6;Se}b+OEVA9k)g}AUv|4o2MdP>XXI#P$k-FQX;zb-pZYjX4
z2ZxUupmX?3KU(XCdH~FYJkue$oa7`0iep-%=9{VGTWb+=U5Hml4b!4`5TQpY?Tp_T
zdx8%`)Qpk8<ck3H_&z8A<Z3fS*;|Zz#88iaKN5kCy8i{5erY`;@c54-HJ^&<Y|$@(
z7D;d;LiJPcyp-_+7p}kD@*5y6sKUn#71|KoVa&Y3$`I+#&B^*``a-zbX2%t#R8Kt+
z`!Q+3MH=2X;j;atm(vsb+aOL%H{!QD>#n_B2BM#riu2~I;WJFh5Tlw?$08Bn0!tTw
zwh+`5$?CJ)DvH?c6nqFAPrSu!CE4#WwyQXzZ?`L-XH?5#*JxiqqX||X5DSHezqqk@
z&2cS4elhyto~H2a#({w at 4qTm-=){*4pyC3wx_aF(bGkzf+21R*%LY3gDiCo8YS;pW
z&J}^<$>K{V%WVKp%*kPn>(<J-C*I0S2N`PT%iC#+5&v2o-xr at BJNe(ow3r{aKg60K
z4(QA&Awn&0^HmN$;9MWiwa=y8iA^eqen+Fz?w0h>c6O4OKAD#E5K+Bx{UhA+pLtM$
zo^U?8pJ>z6^E-)zwbo9N%Rt{-{;$?sH8~e&6~n9 at aoy$}UHva&6B6vD!)y?cTj?#c
z>(}z=#XeDSQyvm!51J*ETsE*#wKYcG9xtrr4W?!KNB!{?c_+<kG%sxrYFQG#9Z%k?
zz+bN{lxP8khd~{+!5K~Xf}cwV3~faRs-C<}l1SA0U9r%5(j0NQ7rN?!8*y+BYoFk;
z)ywETf*jNu8A<(ywT>C<LMmT#kcfTq4^B^iEgNi8Whlq?NMwvZA2&c-(xjZl^sg9n
zOFSA&<I`FI{auuggU5z_GfodcWo2suGp(tg)g=_RpBv8t7<Ro&+G`&;q%YxKa<;6H
zdE}q(@L<?lTQM<fh(n(=Ee<2T01SIrBo$8EHLWyf7t!hSb6y0C14R_7Ms7JimEFaq
zfBre&kon`@c<u-zLf at ajnUJJ5Dz!FTr;g3L>Lc1IJJGQ~isFaoCC${E&GwjAnL2&-
z at o}Pm7>ugByE}RReJy^+5ZB%Cf=pAX at AF3p%Hk8 at m9;$D#P_is?*|W9pB)x^_gBVU
zOgkQkonq-4cI&HWz~3v$;Z4PB7(a<gjf%)Ygzj#6sl(-AwJyzTdCJFrx~Vk2G4MKB
zYOYd~vbjozQ}zvap|YWuMR at Hp+$MGl%|`J^;*1ptU1#v7A^(){(RJwx?YvO`$V=c>
zuX3k9-(J-hH5MWFz6C1?Oi3%-Hod?8q#goQI-HZH)&+LneQa#2xWxB)#24n8b4w;O
zbiA-=kNm;ADj6klITcANXEE8?(#;4LzzUQ&o3Zp*iX+-bi*hW$hMNJ;72P)EfBgvM
z)Uov3kbm<)sq}|>9#XxJfDg$dtz4L*T3GWf!Odv%+x8t5%V8U$PS<zZeoxhHE^eTZ
z!p!;4D%4((l-BGY;+!pl&X=|X5JJboEneJ9f9horJcumQ_AoN+_5L_BuHBGygrK}U
zirUnsFTO0u58Qg*%tXf#;??VI?wPO%s^0Ma-3Aw55uuCOi>>lm1}|%rY>S9Zf4dA^
z=$Cvo<chRmC^(-ctPobwdRa>hw1syA$1{69G3emZyQ at Meii39CRwtQ+Aoq{JYrM)&
z6JeF#@_lrtZ{NAq(je%J_OYE!jE}d3v`BRwk9Av!M+ELzGn22t_~jJ4fkXtlKkq$y
zL=DXV>mc<I_}pGuH!Q_G5s>3ywOqaM3)W37GgW~btekIb4nnJFHb|SPz2KV9UtBJJ
z5efyNu|JR>cs&ai5=WzZG_KAIyaAs7A*q}k8uWjFK!Sfd8AssxgR$TsNudV+eZ&L6
z2BLQyyZ)Df0AQ1T3q1du&EQ5NB|Xma;E#%8>j93 at FG#uXE80hN?y|ui{~2Jh8BGG3
zfq?<b5;jBrJ6=Fc=C0TMwnBMOyPX9b!=I>RlwI267irnqJ(rh)k%)xj25%8o>38|@
zMruS)g6buq3Y9mlZREh;xl9SaNLoGdS#=RMtzQ78Ldn+N!&Oj(>y}CHYvSo3__ at UW
zY0gi*g?aH04+;Mb0vt)P#ecnl9qy9-N54PPum>d9zgJ;A at 4w^z|HCWP%0OEG8+>%+
z%C@!<^Hxt{bmYYTH}M-K(to)??z~4^92k1TH#<8kMTZX^8NoGf^Y1rr6{xMQ4wa${
zj*G*I_?Khkv`C9-08~T-<WOnwD?C5Ud4FuUlI)cg>2X9ne;i`U6D39W>YxJcABF>W
z1f}i;;1Uo(z2-s|Er;0uCaK$RkL~?)Ix1X?fPmI{6TE-810=uDp&lYskHc%79yi7_
z1<b(spLHtaqEZIP5_;9dpk`I^8Ye!P|LvMbQz)px93OH)p!jcp>aC_gpE<_6|Mvl`
z|8pL&V*`dZ>0W4brw(qiExDd-v)>g4yP7D at stXVsHB;E?8WkU&X{l--vF1GbhiW&(
z|ID`d10vMdonM9dXGd|>qhU@*GO{Xq4TjO@!o%`8_Pee$#c{^=_Tz0sBR?LEG(D4>
zae at Y%9uzB1`DYIl9aevUO1ZDWzL5(`F#N*~TGnL1cfF9}GN5vE6(KiIpJyxi-DO4^
zH?G4cEJVtF(U9p6IyJSm{ZsSr4j<L$#&t^@B=EaA%zV+vx7Wo28%`Bdn|ifm{gMip
zmhyV}w^0zwdCeg`r3=`E^iQHXORGVZ5Glt6^No#aDQc$dns>)Duz(U at wSV{bcm)!Y
z6p8Yy3sT_InAHWvWroWo5t`tZ?}i|8#It{2QD+*}6!>p%KNJ3ErR^jD2fN<M7Rs};
zGkp<9!PwWsHnv1)!QJAp$8sUk$eyXfa at -vnj-}zbWjYJmIhR4%#c%&*m+=lzdR8H8
zpCOo5lXq9&u(~<bU?4)fuzOR&5KLVw%I{>zSs#Us?u9QLM9h$i{n)J(dCYJVaJ7nu
z`shVU3np>x-V-+s<iHA2;~d(+9MU#Z<l4r-{k8I?KzQs`!0}B;lpJo(hs`g at A%V0l
z#zKou-2Q=*A at 85hZGUbWonJ$Q+AYH69;3I9VpS~Q)ay#X&~@pU|EzVsMJJHhO`tW5
z7W~pGW$=ky4(q3tQSsQXJ<MRSvCoZ-<S*mmY^c-F at PD`%@Pi3e<CBw54qwhL#%_I8
zcv_3gsJ`xlbcoEL%C4Uw54Vxa at WqD9yJF<vY+aH({Xn_AI2$|i76Tb&?u8{nF74K|
z)l-4Z3VC;TLW-9!$-GD--$*Q=&l`MFs`*y*#^92$1}C?u>P1`K at M*2{Ar&E-G6u^$
z1!b*cMn=Zi>?Cf0dxF=2|BkKgMEMI%O-B9U)3Xg4{?BvA9G7$<Zljv&8)lTep9_9e
z7l>Dsfi(m0NCKL``FDWT3s>M_v=&HNHf-a{GjI6vs)~q_2oEW6lK;^VJC2~r{7Z%5
zO++b-F3#=_8RddAIFmz9 at HazN=`X at xIEYhrkP21N`2>Mr_uR7Yf;LkT*C8?Ag8;Iy
z*Dhr$%!KnXI-<Dd4P_zjeCeiqwVgVdMybSA#G`rEe6{ArE&(B$OWg}~aW;A5?<<Tt
zU*BRs^|omER{M+p)ws(^l;*5xtzj(=WzNE`gncS%uwpw*<bmuHuG=9e5*+o{Ux}J(
z{znWIZy`w)%xLFj68#8!jX#k_!K*VSP~-tTK at U=jU~?0VuX**Nx^c(Q-y$n=L3b}I
zZ(Hjc;0bw4ux7HIR-Y>`ofZ?4e-}!p?xU+Q!j9eh4#Kg;Gi|*1vkbzf*J{rqGH%{5
zx_M+Gk6=0yIpPLq)zopmm(hW}E_n=;cD8c6I>So7juat at N&OvF!GG+X+mD=F^eFDD
zLYhh(kAPr)l}f{e_!|4Xb3at!v~zJe;&Mc_rXJHzT%b0;x|;Cd;9y7HuRj&f^3&M#
zT--?A*2F=^gm?PsXQLV;P4-evRi6OkA+ at +%BeDUqE=pG*4M>E#l=z_AZR?%Xexk+C
zF|lxGZ-V%Z&FQZ%&MV+PO>r-7zVZ_yiI5Tz(vOLs%12h!Zt_CI08;UN+JQ02X|7v;
z`+8#4dQxMUn8MJy<2f9ZRCPgsUL1tGNsw8Su_=;e_3~ylD<`DUs3zw_Xn5b>IWo0?
zNe^6tLdKmZ4CuWv)IK56LKMi|GQ19`7U<n-5-H}bjeeqt&^slJ1`4#Wu5fnp at 9FM%
zM9voF4v+AY`;j#Vf!iizmD9Lr2&v$ORE#BqW=LMra3yhem`mYzSJ5?p*Rwzsk9U#o
zUTRk{+*)R2U$xYv3n|iRNotxg2+_zeIWWrW`zLYl-pj$ts$QnESL)BGdW^(fLu-m^
zDW|J2RAOKA@@=xuaowH0Aq>mtX4ga-$zG=`%?FNoM&|<&Oj8eAZG7r?7JKL4B?zo;
zCH?qkY91Z})WEas7U)s)zReELv~!y=w9jonO*WS-qC&;K_jaj_Q#kOGtZXE;NmD)x
z&8yVn;W8dEgPY6lF?cOCj!C;zF6un2PAdR8_y)hS)h4h7bQj-kd9u$boZ#!77<xC2
zG4UoG)(O_s*RxMW)E!o>YbO-=N()y9;XyT~_?f^Y`i97uNUeHoq7ghjzlCYDlR9$=
zGdzhq^T+vgWeX%lhqdgF{L at vK)09=58dj?LoDUQX44S9w>ZS!_ePd|x)f1ZUkf5>>
z_Hg9jsV10liH&NHf`@@)L~0OI4xxpG#q}qb4 at Ucu|CnKg8Uhr+q504!ycLQjtK<Fz
zC;w+W_UMR^99k1}GM{@Hk$9w|i=p-A0y2mCEE_QJT;bkJEkRS4f3;%d_0)sIOcTNx
zQO+ew at yvL~*y2F<f)Mzyd+l+HVCtSw_Jce+vgn=8;?&>^47rd%pQW?3%1`4AR3H5M
zfXeEtOs!5D+a(>9mnvkPpQ58#^+ZwNT+OD+ycs(_R<!|v9b$fEOr#nj=irQicYZ;|
zYymo$`Vn#ri0z{>z6;1hS?lmx6Ts)ny38NYD}!)jL;~9-MUBK+;z(&Oevj4?P5#m0
z&rk)(0g0gRx#7+xA`H(htNY&Y{rNj&J~o-LPJtPviGIy%<UQh}c((6zq)ImDfNIMc
z{`?7UBung6Uq6~w!EOePC`Fs0f*!<?bgzwvs_n_Tz*t*-!5>Y?W-KiGL3T_ue1sr|
z#ADCTnc5qe)oe*Ao>mxVAd!zT`V~?chx56)m3TOA{raXDEW4+V!rqQ3wT_P^rR7)g
z<MENpi3COSBjm(0{g`EY2U<eIbw*=RGhjB1*OlePwUYK#DRQeIc1H8~{6uUIX2n_{
z!s=R1ts8==z)>sh(#zDK@~TGSF3oVPar}R5G-~4ml;9KU+ZVsrVAl?awyfHfFEM|s
z5am2sFx1o8MvgWAb;z*%Fdx0*A>QRYB66~Zr<^uBHcC#`5l(A$@{LkL*wEgmeUF@?
zDSOR(JM(I+2~kZf`px60Q4V(>6KcQPO%92c)y`vm#FA>`+n*?;<vWqIik)OFRlzGc
z$qDf0ifxyUN6^_NloqfIz}q(j8Kb(#YcuX-foA(6WctQkktU<-)r!)OlV1#pyKUS#
z8#Y|7GxZ#Dt;3AGT7uYv-|$64=b0s{ht^;wq9++#EP>um6h{V&Y4h__67aQfk(LEB
zMcGI~TK%o#Z|wHyj|m$ByTTu4nw-cGTdq4JB at L`jn%zfhydHw^>hLEVtDo(4!%dob
zZpEU^_NW4Xnte>TyP!ffdQXV=JMaL(bk5jvqQx{1eWS&qmlpUC-zwLocd-z&ttC1F
zo~knMz*U#>IL6;G?Gl!6y`|tKL1+nCs}dL7 at GKvwB}5GlFWDe5EDFd;MUPnc;m&=i
z3r7o%445833)XIhC6QW<=RdP7t_t|#b0zrKOQfGP1jzgjwIlADs`QEOH)Wx*kLlYo
zq at ShA@!b>TWDVls+&g~k;?cSap=b%OJ4rw}!)SvSI4#inM|GR5=ZL=BrrtmOu}YN;
zq4DCBtF1h3-`jd}d+ at PmL-5?EDqUrLn-V2QlWq0G=*3dT!gJ>2%B5^D(BWL+NME<r
z<*ZcOXn`=g at nT5QgE*irZx2N<nK$!cB0hp!d>-F)^r!ri7w)Z&<mh at hG3OJlg{+kv
z!uF}azzBQFW)_-BUVww?Esc5t<C4qd1}-oho{YO2MY8rvHr>!A-ywKvb~1LlP8B-=
zTh|j;D!IrdTn~tXa_l!wMSbm2czS5SoTmRHrZQ#YDJh<~W4&s}qQ-2zPJ?HW<y3hV
zcx+;qbs at RxwmONh+@-WVdziCqXP>;s1=g_*i0xPFNC0BlkeuUYUNeEuWd-L--8XjC
z-&y|p_|!(jD8Y75rjHMboyhF3zb|QTqh at wz4HJEz<M^&YMT(Yr&BL26$43CAoiuec
zB`(n*nR6g{OPoXH;MutL;%nmj at 3S7hzv!Ve^^Zmeq(2{AmJ<Bxf17_WU0N5UC>-h_
z7^8K?Br)!X=l4j3`J`smJ$(CS`DNqBoF*{YjQR-I=Ol(Z-i0BYwM5f4hW5lkM`Q%|
zeimfaUTm7Mq~`_veM+wW<zWFO8mK2m7)5VX$VoWrnaD9#12)Nm$W9nb_nm*X7KcNE
zyyP(FH-5-_8 at 83tA-BPGaOoa4UtIkNeTEub@c74CxRda%D_SroQo&XXR=xob+EOsV
z`VdwpcXAQN7KRW(1eaev{ijsq;Fn}|FY}Cq at r;$n%?UK~fg+VvEu8$kwoa*vfX?H_
zVk1#?pkdT7!ZL at rpVjbvebq3w_gI7OxW6wP<qr#AW*{BU9tEh%j0q)Ft<lt^kTEPy
zic~!W{`KN7)vFO!n`i3SZdJ4n*TBqP(!<AJQf~Y}X(NZxzrO={F9i~toN26y_9bJ%
zK4YrVYDu<#+6NWpM;z$e=Wo-fer+Z|#y<|w3Ng|Dy0j4okicL%qy^o2B2mK)udj?W
z<Lb7Fv_0(cL3Q2%aIg4raVtl5S7PHzhxU>w`S~s)REjS;crV;5_P`@Bh?O<2Tk%Zk
zswpI~T>QuwZzsb18-76E;%CYQkZtemz_T`Qzsn*qjv%bv+TC;$;8FsD7$k=HXpRTR
z81u}HXvho2dCID at 7A2l?JlB~#TJw^?ekMBG%<~$V(juEDl~1$=xd+reHhIktrPUJj
zm&nqDRq(i6U9^c5$RpZxPUbNn0F4ANbPXDk%z|FBPYZI7{f?S3kIk|LOxuCVXD|u0
z1u063j89{WfBXjKr-I&{x=)wI(6*&clsdomoQiY*4b-rKlr`=8NYj<+8BRPu+mXT^
zHJnJXJG|;TzD~s|*1`qLhWAhpq6M4yRa(w+aYepq;wj_FWXA*;7xdGF$+?7`925_2
zefogo<ZnHBovbfp9JZOb;+js at gnmY>L3 at BPvdd^=_t<{=6$m2&ComOHIG?nQf2%>$
zR9d$kbL}(dHDfX557^jsL=B at ZOcH&q`2?MfA{IX=h-|IHZm7MZ5d at wJY<0yLa_N4J
zV}9xxPaZn(Lu_8o(SBbGk?N!qYj}FSuupukPOYJOCFGGvY)v$2-xwas$h9J}nH^(9
zR(Mx9lgb4VZAI(i0J-H5))t&!hq48Jxhwjsw!{rcbHU7J98Waw=k%Aj!~^ioO8aL@
z4FSC at 2zST4{vvL*>2hZnU5e9gCY$@zzf{w7M=<Sc&d1rVO*M4%CJkK~K$tb5$^cVp
z=(Ji6G%bx=om-lKO2rjfRnjEt#{f1;$~AIUckdMSH&7yj6 at c!C9a{q9bGES0j_+Kd
zaTSNYDfG=~SU?tRJJlBrWzFbmFf0Wa3kqKSPE&G;1ntt||LT!0E02)-q(Qy7YWxch
zE7wBLSDm!TGO`_8?#5kvxSYfnw at dVhD#1FaojW7h3p#>x^C1q*N;Vw8la!v1iRzOb
zU+r!L;x>;C!xIO)gCECz=%q+YHjgf6_lPc4O5{d_G%f=LF(V>$4(7E*067^k<c5L;
z%zDWv&=#t2$980j=+GemXtrK2a08{&t=?E&i=fH(ZS at T85%!HK<?lx$E3*S4e?x$U
zn08!%%GdlWEsW;--%ioNtiNVR&aTYFL)rsbxvgAn%Usmoq2K2Z^}_1I_0)O1zW_Ys
zUE2d~?Ix;Z at szK&@U&#>bDWD~f{BnJN at TiZ00jxwc-gz#?ou&46Xs;;XPj&6_2C`c
z_uyAYhm!cv^6{!d_L_eCl;hw@^eu*8=v|Njm$R|0AJ{MerX!c at JGQe<>Y})~rLp=U
zAq}?N;xC`fM8QH0P<vw9iYiAANg`o-ePZtiHe;<{bRp~EhA9M`{_3^%x(5KyHZiQH
zq>>F6z`H6vpat at u!R`~`Jn8xa<t-}zSoB&&^H at MKD@URGxaaK2wqi%fu`^muK$eN6
zH+yQQnj~9HfPZV)_Q`FXruS5;D`{nAMyVT6D0*1Wy*fTmI#hvO8s;=Ox;W4hk#TK-
zT7RrI;MI+g%jJUQXlu5e at b<R2kES<C5c$fs<yg$ng{bXo4HNP4V3)t>{?-0(Wm(8%
z?ny#|Ou<4Ia2!X-z3)<q-=Y8XP1OX71OeF-eP112MO?tZjGY35{1L8YS<N|u2@?Vx
zzMOY-ZkYk;r>zi88*wR7eZP1KkDuZkX at nzhWKND(*i4$iBujw7(l7bYpsCxw7+xBU
zBxTSMt+TPLy!`$<`_mXZDIS%ye}wc7j~$q2&5)|Pz7E4(s+_UCg|R!`&Lx>J)#r6Z
zXDkqC^gsTR$mgN$d#9#La<VovTH`3`OOd+W%uWd0A3#C;$~EVY9p-s3NXydJRNQ*m
z>`Veel_FhYftE<nH`pc~zbm>J?$6^+gpZ7U@{n`XZx56`7p$+A!Yz?8At+xTi&3PH
z*Y<`>KIGb~eWc`0Vnq!W05cwT^K{BVSvWpD7y6#nyMIifMoK2bron6^;eEE?N#ej)
z4Fpq0REION-(19|>0^r$fJsrRikq}v^B}T#94A?&FE4l6V7aHT<Y?X#DZ=4aX5Yx}
zZQX`bN3JMdck4O2Z=gG<xy*(lB;B!2&P at 2JX)r8is=+H#52Yb#n{}t=0~uEdvh_jN
z at l969a>zCP+*H7{9D- at IODzRVVlA|``G<GE3-wSM9wwpjKfXl1Y*9bJldi&$_1@(n
z+aP^=MDHl@=&c2dg`TfaEg|&V$}`NmtPb6HbiQ58I(~2az5j9nED at pi&fN&Bk`Gj%
zU1;G(ciCkpBkCl0NstqC^pxi8y)G{5)W(;ID@*h7*}8HRe@|;^+zF>a>G>MI#|<kb
zv>KV6$}3GRg;C}A#~YYj359P9pW&HdVkLOa>@N_9O#-jHM>L*=nlQhsIDjA-a~xXL
zbW7KWU|?-?X>HkREf^(eD<hb4_P-z?h(>34k4zAa{6&fHogrdi1*KpHp>YnS>Nm;`
zIm<N#)pyW6ug<OW&ZDeI_hp=*FC;y3Tlgms-lLiht7<d50o3i5`t>tELc9C<IR_Vb
zK$`cnwaaVuRAuil>jMC-sI&DW{t0|F+q=^$8Mcw>-L;LUbD8xI0U4g<e!>B!a at jIc
zD;uf1^SMLhO^`FpFy>UA(cTxOCV^4&_wSgh8k3<`!r at wiF*PX at jx6-a!weZOu at HMX
zKtt~Fg#at(X#Gc3;u at Bi8n=DuJP9gosRjKfdBF^6f8C^&6+QlQU{azvBWa;7S&l73
zT7S+&kdq!<H0{cV+s1<T{Z{xoBb+T6(#**U&$6U_Sl$j-eyKHBQWVUP7i7$_)(5|m
z)A$B|_Js|6$Z8 at Y^=<8$fT3)o_zkEL{|B_l_f!9gkgH#$rKAgYH2LkNSixE{v2omq
zC0s|K^rRtL(vy69f-q}vEuQsi|Iz4$%|X$M`G2^P+{JnsI$&S><yEeYO}P%J!#};L
z1WWh)4^~o4iVY-auwtYy2_K4`uAkA8o{X-HZX_VZG+doCt-s!I(Vt!b1HOONUR0qm
z4<P1NKv(b+bZqqt3U0C}k7hLfKR<&}S1_{oFZi;H@=xgZ|32`)PlrhlfDGrz)S4w$
zE**ySmRgRGg_f*p7c89hKLAPLFu=3g(-%x05D=hru`xoZmJWlPW at XAg1$__lo?n)m
zo at eOOwRhzfKT2C9TxiYiy!6w}S}P7&qO-zXy8=72;V26w0)RI(ZV<i?fj*1Aup#I#
z3^dqigfMesCAeDJ%~fW#aRzyp+E>7-8Rz$4OKTI3ZKnVXO>TQ4@~x{-QvYL;9<;HU
z8MLz%>T7%*$L8{(yN|9xR%NRaho=5gD{VZ?c<y5Vfs}G`iW(3EQ*#_00X>SQ=$ybN
zjOx=f at Uv_?cW8Kr=C7`=Prsn`zab+Gy>|KC#u5wq=R2owBs_L=r1a{SR)?D#ME!8?
zZZ;l&_Hh$v&vAv}=I at R2JQWTr(M78 at b=%q1#>R;=_q2ZD6lt^Kt;qW&ECC57{#@Z=
zfnsz;lpZa3tApOK)la)TPdav92gJp_8G<B`k_Q6w(<V?7U?03r7t+zr;LXp%@+c)Y
z`ggRkjauJz+_&BGMn>@18OZZh#g;S$yVIAV1}iO0xzp~GqP~x=WnH>xOUQadHj4Xa
zrXG3~)w6Nok1)gWF%{nr>}Pqz{JR at e<v_R5Uah=uZR{o57Zuds9;h!?EYjdNV?p+)
z>>;q~JYS}k=69PmWO$wkrVnKz1>SR}5{VQkvd?^*>96?6-|&$?XUF?By7*eo%~}Bq
z8Gds!W*zWOjxA0_Ff_I%B(F{497m$F{B%ys<Av|bmZLNniwJ(Ep3FpLnK0nLnw+RE
zkpT+67vI24;eflexfcxN#$%nYL;(LHN1-d|w*?c_bQKEQ&6zeu*;8I!uT9tlEArMM
z8AMOQXa-TLtI at g|ooiWJrpFaI<#KpwSIGaq-*4Te*8<QJcvL~CsVO+?aO2jwr$#0;
zB)^*ZsdF*~XZg7*>^mtTqfQ#c&y<F&XEud!cVRuCL;xk at XH4dIlW{>O6S-Ndhg+hE
zVJi=B7*xzOe3-IyRizrew85-?A;xZgQ(E}$CQ<iasj_pR<&KbRErYuocq(^R at ol2d
zs=CkW at xdJ$`weWvN9-|Pwda)y1tPRff_<7WaFK7%m_N+pE=~W~bgnuWt|L-I;aBr+
zv#8|M^@IOF8`@dxM5pp8&uj<AexYO3mdW5zGoF>Z<PCgkZNO?MvLM8<8^JVZ4!c?-
zAV7DOYv++QHn0ih;PD<j{v-kH at BKU)Exm|MskpW*>ouJiOLjqz$xwD1ZMk>7HvHVZ
zot<R7?$qudN7B{r at 7&gbcI->rpSOF}xfTzWinGfUe+jDjPCJL+Z*?^URc6P&v at AO&
zhc at O88?IM#R>}j`-WL4<gHv%)PVM=2yHug`$iHrR>Qij&7kGZS(gSZQ1$C)z$?Yi?
zSpUOy&-c{9+}9+6<Ch%ao)wB~CMI2ebeTab_WlpsgKm8ng9=i60kBmTksok)R(sdt
zOr$*?4QodV?-%~bRU-$c`V?p-?dWtp4 at 6gDYl_8Q-pu5S17OoLjFxbGHO{!$%6!!2
z5b&;$P7d?}(JIV5Jcxvxmw(jS!zw9=!EeBL2XzX#)83#y#2b8sk6E`xC=U2iB0;6W
zb0pqp^Do5=@JOl8mM4_2YoW1X`%OVaB^{nji+f$kwS{Y9CUytD(GVrzN-R^(Q~{R(
zuK2C0R;27)sm7esHEIJq-1o`XJ%%J-puQ%*wie}OT$4*#5t=lRm}#SKyyvPAoJm<`
zcQw5jzxMtSHmv5e`ki46F&1N%jgzgky*>M<+5o})f?DD-PEH%!dWO7(ilRmwuyXd!
z;h|hiISz=c0T|OdMm)3gxYcv9mmmE5W at km{#d?niR3vsXUdz}BF}7EI?794|Op3^5
z2777b^VizQC)5FHzEy4S=Ht<o*ZOssWkxbupab4d?YXmu|G~oU%8Ph(X4^y79Ia|K
zh#nn)uN|X2!ggXLd&iJ5Ot+QJfs2}IZ2LC9vceD$4y*N``0YWF9t#TeBO0$7M_L9Q
z2Ef0 at ma061ZB`ZMl1tL>ZFtUUR|XnwL)ERjD<FJj^OFZzIEzi<D at 9+be$<zTk&r{N
zGshKIcC5IxAemPUz&k^45=1mf8YF0OKN!+Un^Cyj;+aauLv40^51zJOldC>;ho_k=
z<jl;+_xyu2%1TDfis$ZE_|mO>#^c$a+5doDA+#6I;u~3eS%W)7Ibv4a{2DU4%fC<E
z7s2}(#h>d306?O`Wu8Cj3Pd`z<wW*C(@<>6{tM^GImdj$0yLuq9C at Px_o!7~E_Vc<
zo-K7#cfdCq9CW(4 at g8&fH)9_;QK?0yNZIbNt~Zys`Ak*d{YE`u_#nf^q|28cyb&Sx
z26ot at hKm|1ar@<*B$I6iMOOlN+T~|W1tyzT8tZKRp!AQ5YH~D at EY~Zm)Gw<vZVVAs
z`&jEz`fy5o?O8%R&HmAK+qQ!ZYF8;#^{(NeisX~{WpC9z4{fEbH~{C~hFQ0UursRF
z)=?rgdM>^~{7Jqd7_uOZEVRAp`*2fkE>h|YUomSH%cX{I#nQ62%N`C3T at m_s(A9-X
zUu|t(<H5@%q|bAEmBHN85B|U`c7{aN&x>OazQ=?BcH%G)Q~9Jn=2+Lcb;+oEDE!iD
z<JD5<9b3o<g5!$#2=W%%>467{ids}(iePNRx7A?>52lqa=lM9Pr<m>5s=kio5I{yb
z{#Gz1(1niYZ?eQ41sLc}Q~634{=vn4taJ~@s%PgX at tZGN(J;8nK?g&UEyfF@%KDV&
z3}Qm>+S(*yM-J%Hk8N6K&RfqvoS*H<r#cROMpwEvb+I;H9$gK9fhXZ4x<s&z;TY`d
zOLZs$KF+L?$PLG>(FFtuxo99HrZDW5;jQta^a(ueSmE6k=F^c-8*G5(gRxx+Q-<@1
ztWwc7x0#a`F3(Z3p}eCI3~#ODmYGijb5O~-ErTBc{G8&K;KjB!>4q*ev20QQFzaZ9
z+-z_mt*kMypR&t_%7fJ`avkX;f6crat{hSP(QC^`>4&-tV=vWVCwM|gN3#EUZvSaZ
z>bx<*$n|!bfdU8CsweiL?GofCd!N?kz`sV)R2>C2ko^4X<2T=5Ki*K6`>g)BfP>Gr
zXdU(w4AstYe0f6vo-lI|ED4J|-TppT<J64(xa(xfkuSomemC&DZIO*+&u9UTBaap{
z4r{?mUG4<I7mu%3o(Bz0UP`u0d#th<ngbFONlwlA1NBA|b!y}!hU2tq18-6t<s3)*
za;B(78Gq|?s at mqf$MqMx1Q}ui!4!Eb08#2S;s^%&vju(3PAJKca>xeNQ^0}pEi!cO
zGwzvVXnkc&-qVVM&+eVhKJ0|XT(|%=jmWQsrD+^ItN)DqcCK1-U^j%(SMShl#kvYt
z*OM05MQqNTDGqmW)Nxh^b~1LPm6fsd7f^r6%K!j|3Qmn(OhD|FTX!!jAs8E(6o27@
zTW<>|Kigi-*_oW at -xnM?Bdxk1i@@4D=$;N22fls#wuax at MpZnK%Jf&z6*~&hfH@^B
znitf7pxK*cG%&$od$O`z*O<`Z5fRG&!`xd&Rn<n}qHEJB-3>}eOE*Xvh=kG&0 at BjW
zmJTVUloX_-rKLkcS~@qO^rkl($-7WLzwe%L$GGQ?anCr1v41dN?X}+Z#+>tgo at dS%
ziftwBYFj&KdwA)kJX1aNND-}@g96y}At&cTG27;tio|wA6Z=l+8oOacadblg=V8pU
zk-raM#_0m4NO_y>QkLHNqyK at M{vzI`QCrV(K4;s|x%bhKW4OJhu at AMU8JQ|DChZi}
zhRIPth?;gr+ZA6RRM44TN0*Y}L5vg_sk=TqAdDO4V>WWrKN{)(vC(><EDV$!NMS&Y
zY*YDEY;7EZ##j3s3vj<<tR_nP#(TNe3WGF7{QzFsiv$OdbE9XUMpXl`t`6p#pF^a4
zHBqe{xU3yPnq2k8N&d|IF;*CgZB!svsmqSc??;?I{oQEL$lCP$xK^p0T*%%0kj-D$
z%}j*dzKaB5x$TyUWjFCqw;|>{x*NAnTui#E(E>b?l={EqlVCPe>MzmGfA(;J5XPum
z?0;kEC%peBUXXo^(&|a78S_Y`{}lH&bX-lSJ>9UsUYNg{R%$;k;%UQwc7=){Z}^`3
z7q=F1>MZQs>BJV<;yN|5*RdKArcyk^{hxQW;RRly?HPfrhY?K4;5A`PF5yCA`NrW2
z0UbyTbDJLCTT;a-$^iUzSNNW3ZI}U`lIOyl{T;&h*yaiU47_nXhy}nJsQ4N)9^Ci5
zv#cQB&79Hw<{m2vWkW+a%&k`nH2^ul3?k{(aC3eAlkN7ZZ!UXO3$=|<mIQDs)sfg&
zd6L{q2l9xb^jwQbin%%`TS$w#H`V23AdRN}PrqC8a=y>sjvpi5yFJ2X5-~p6%P&hm
z at G(^N^?Zh2wEu>nTt}G`1KQm&J&N_F5HtRb1J>_pK2mlMjsdNWhM1Vx(^-jcTc3Q3
zGPx5GLE~J9T!_Pj&A(Wwy?)XDHX<-shqYybm#jN2j!H-yG*_}?x~?Uazk9XhXgsq&
z`w#y%5=s%^Y(+*fZZAR3NAZ~Xt#5>k?U`O1h5W&BOZ}%9otw~r?ed(ZK6GDXPZ%%8
zcci}ur_;%y)wlvE=A=JdWlf<TxR>TC|7Y9cuV`}zIG67g1L#i525!EN=RP+Fhhu(P
zPWTtD;qF2QmOMG%=zS;|@cr(!W})tN&xapKsaT5PVg8^@d1v6H^jpW?hJC#iY^@U8
zes*B`mZ0m at KJRBg!{cY)kpjB?^QqS~t7fXR&d+Wixetj*hfC4e#|%4Zp3pC5fKC)B
zs8jhe{5+$p at RF=}C*9TjPupT1Kf-`sT{B-pDAEkN?Q4 at iPCJsFu}*43*inY0u9XDy
z8M=*E2tofV1Q*CfGqt$e<I2D?<m9_0E!{O|{53c5e)$1YKr|>c2AylYHX6PN&aFlt
zbN%ULx|Rz)u?dmNlXT*Hm%H_V^hkTJ)yW>FNa>I=xQ)6Ia9RAWz}N*y0V{*Jo&tcz
zaCC*Kz~_dBkx>CCe}3)JxnDh28VL&@(lw`{0TXos+ml7CgY_AzEC*J;J&xw%46_Ao
z%eeCIVWYyafrbn!w<BW_S9MPQ*!2H|^H1`@?)QDXF`s<jDz2Bk`iwXLe5=}I5kj54
z+b%l;D`hgD_cuUA#pw!hGo^03M@%{KX8n at TwhzVodwB2b*a5C7;pQM2_nz6FU5Wjn
z%@?KM^=<^sb<M%EMc5Xfh-q&yNHe_C4rQ7haWX}JNsU#Z6IOQpQcmve7Mm|!K4P-I
z!OrWltnzTrF3DBDtS=;42qaZIh<QJ45!h>S*Tq&sd{%#?;CxPOd7_3BJO((;TC?Wr
zC{u;+tvC_ai1e-#u1X$jKZE<N_<o+!IVUnC-;Q1&n at f-1KW@7GdVx0SipCnDz>Yyf
z at B`OQsb=3HjPB}OG>HI9pkckGF`QwJ-(F{T(b=CVc0B)J&VN!kyPc_(!gaPQNqczM
zw40&JeettQZ0HS4hcH*u?-Q(--B60k3?X07HvCBk>bEKwpya~C-!&V=qa%iU!*q%}
zCd<TuG?6~J%--M~{<0;hUXhpN;JdEA^bJpT`nqK7BGMRY!TT~IgFHor^=Rrly<avM
zD$~h<>Y_J=_=8xC^_V80^elq{L4udvFcRD~SlE%CHgV{PVdcoRoE}KHm&WE(ck%Z%
zL6$&%`6={G?@iV+iQ!=c%H?++9)HfOkc&!8e at SE9#dd;&Y(|(TNnD_Ry@*jVF3XU|
zVv1o>7 at 3Dxc_Q%;WC~1tG}R__;bFKOdv?8MWI{CValEvUpQJ6NS}^WBkEA6P_N@$#
zSd$YqkUsBAK0sl1C`CKhqCk};dFO4{jvR+Nv~pv*s)91pya{5dgPS_~kNAXoIj=r~
z=}4`UGP%Lg+?FTROie^bg6~XhXyljJVQC(e;1uWxF(l-Sk6d2i at r!MtN^4r02!RTu
zylR#{@&AJl+8BVAoyhCNe(82=uLbertAOL3o!aQbK^p0+EMYd6(=0_`S!{D+(Qk~L
z$svpV>zf^BgE>F<`gw<>jfd=Z^QkXta;K9Xe{6VSGpb6-W=5OpuF{tWA0}1iW#Rmw
zct4M8<^xy!w{Y6#f{O)A0ouVh`3L?{7Mo`ff7$-G^{emt274(c`x3>be5ulW%A-OJ
z+8nRA-dXN8y1Ae>AgFEJ(6?|oPikJc4;3mJ_!!7H)kMpnc_#xyOC^<+p*5EK0iW(9
zc;i>U3;d=bhYvw4%C=j)5A|+(*$+4H*eK)0pY0V()16VgzzWtWw&KNrx_3sQ?#lKs
zwbBzpda$O at MLWK=9w+#s1)3;7*uj9>0~(!0JXFVQr^jSmT}^~&n6IVuAz;BZEO(jE
zZ9?l3k#m9bmP>b6B4HRFPf{KBpDcptyc`N(V$- at t&sr#<**4NWPC2J^VbZ!r4OWs<
z^|T}A+uhMU6~pIQ<2GitMWNr^=}NRTagS`QDQ8;F>ak`EC2J5hn+3Ic*6fJOnwqVt
z&F2r{nrrU at wThm5Cn0P=2zYH+>i7c`)x8Cao!B4{3jN`17|q<qfrS-Lc8`e-tu3e=
zmdh(}tamFK&Sek?Xy3Fw9pJ`tQa-#u5{yz at KJ&iYs>n5wS$hAEm(}hi!UHm!HxW!P
z^_!$!g%{@U6V<#yR+QGdoh*@T?QMBtLLpe~lo+Z&FcUC#w;n2b6Bygsk0QIb<giC^
z?*k!XiV4fT6X!ztG!lY|)>eefd3_{LNP7?8>uIK6hs at wP%dbaekBAUM77xeTOSt^^
zmgMc|UN)D<sM75Md}wk`COUa+r*J(WMZ2SEEKafB8Rv$a?9C!;0e~*tvifXR7k*^S
zdwQqU*#I9$kxG_EJsD`D+nS|tV!UW22o3nXS9NWqI|IrWth1-LjUD>M7rp>aQ*t!u
zp6HOlI5b(g&O-Vr{(JmO<H at 8CnK03md#ctlU&r1hM4M`A3iD^zTc=Rgzu(pjQ<2Yk
z>2t~dPqSCnrZ7Q``%`{^l(CM*FU$py72bTwh!t+zeVjyMzFF9s{e??bF;Jh7(Q_PH
z?t*pC at m2EV%uyHaYI8UQE0E5pY_y8jQ)ZOH%H;5wlQ?3S8O!2C`FE4MaY3lPFPjqh
zcy=@`Woi+1X9ggx4_CN{ze#)fVJQNqod at 9`prWAo9Mv8jog*(aAP_g*P7NPGCC@*(
z9sU{JUPjh at TPGM+S_7wc{^nFxe<EquEGQ`=T*2bFg#Wi^UR^6sxi)n$p=LlJOR%pn
zSj?uGs*grhce_Jdu77u at VRGj{{>}%#>2ln_e2>C1rIBM)*SA*mmMjk7D?}W$wV3iq
z7Y&`zG&JR*L-DSDd-8S9Yn`p`Sj7z>7eHgm;vG%od`60cP8#)${VcupeGfYYE<0%?
zdtcBop)a+4rz8qmKEnCCT#^It5!YGzv%lQ{PV8UZfN^@fAwjB$xM>n_z>#+a0WM?G
zy&o2_y1(Pi_4tEGl%ZV<%@ygk0JS3qZ$PIvDqIo82?qtubh|Yy;J3()NL}XlMQZ at z
z545?Rz4xFFYl;%B?MCu!?2~;(u3NuU-C*8M^L1EG?pFMlT%qQ;R?0{H8_DNfNAl0q
z|I#7WPr&4y3a)>19HJw^RloBjK22X)@(^oFLJQfGVod3Nu~==mK)EoeO4i%YQY^jZ
zqf=(|FF~aK;s~X6K>4JG7eAFZI&-1q$T;8x5H_Y3HpZ9~$>jacG2hp=`fx=Acl at Pa
z#m{diKj)xZ#qs|J*@CxYi~t>uB}_fQ`fLS9*rzm~XAmrBPwOD%2&4>jfZuJY{DhE_
zkT`KJ4fc6_LnhA5uj$`-Ug=9b9?$~A2K<=KVqZ;WF6N(B>w<@AUD%+ at oHrF*NJsBB
zW-5N1^K*FaKqcer0XB>pCMp(m<>p0~TI~RwTpa42e at D(BJSg_|4{9co at z2kZhjnUk
z6<z`8FfSy%*;~w$j0w!qrfO;}3aumLl<MHp*gXEl%;^P+|F?~m`$RI5we7iIl<WSo
zBO?W(uR#*@<l9MGh@}7bhbs&`$q3ur5L&xtJpbgLwpEgGU~fdc`NzW!_Xq8n4&;0J
zxWwRmZ@$=ILA)*7v3;NFeNk&F6nwTo at k|P+0=w-pj8pVYPhnr|<9X#mE%}lIO4xDk
zei2ykYj?h}rPxTuji9CBUAIiS#_mN~$j8e^HJZpO>Hc=G`}8vtZ%D11{X1qO?l)0e
zcTd5aCK5Xs5St$Qh2-ktSI_V;2i)%<*OB9CDaM56Zi6k-HJG)@9<k0EDPF2&8$CI;
zz^;DxDncgD^zeSqwtMO1em?Ybqi9)(w at h8tOUufaN;wf<I>EOT`*7RFxEcO%<$IGo
z*#2g1pP^nZE&WZOcidDhQi-8(B<IxJla>u-?LIvQy_9pcc6|}y42gn&8_7()+5-mH
zdp|M0E2B^OK1bW#&DK&U!2Frt at N~QQdxHRwh_N~Q)ZjkP3hYX}Y!KrpcYnT@*rwY4
z99byX?DZb)%U+C9QHWOM$UG|F<UFbqXMT;J->5j)8V{N)I<@3u|6Kxslfhl9y(SrJ
zAF_;oQ#UJ;t88Awj4pz!cVEy8BQ10M*X1ap{w4uM*Raq4{yv|A^$fct!0xcD3NPDP
z2pV8p?sBJ_opu0pPHl9J-<{<Mh^5sx&G;GN0xeRy!Y$^?U6#+Z2 at t9aTNwxXcdG2k
z06ka{IuwHKm_D>zLQv_s<x9TXnY1?;^6Xxs_&aX&w<?g`w8XsuRmzjg$j at UbZr}fJ
z%ajgu&M6P?dAC}f9a4YKh~sg4p{2h(d$)30A*Z5<2Xfg64q(k2-QvyNsV|*poBfTA
z^qX!32U9XY)n^Zy0IUzDXDhdD23X(e%{L@==xfvGG at b)8zA{lE^BC_2SoKO+dHmSh
zS4rYM2j9HX{cAG9L&dxyi+Lap{=QlF3Bl}M?!Ny09o!9vM;|e5&NnTITqZ7G{G$ap
z?2C2U<elMYe0g^AQKO?N)dqS}(!#@XXo6bNhr4OyAHl{xPeZ$j;D#)$EhP45A7 at Bv
z^wHd#`!#7(8D!dzzedjF%Y2VJ`S_~;E<^^LHv=97x*2G`H~%vxzl at gMqH?pKztbZL
z#+>FTfdJKxRsGH;L${&Ef%7}yES{SwmYbeyl}T6eu)@Y5-;Z(swmY=;u|Q<Aj#QwZ
z`FiRQ;Ckv5nY$p`plXgcJgVhon~Mx#y9=McwGI>^Rd#>6d!j%56sY(A6p9&g{Y4A}
zKVKWOqMT`)w>NsM1@*0~-_4g7FUS^+YY-e4aDo9<0q3J_J5KBBu^+Yi`fg*S)%dw1
z3J=xGs|~v+97swm<?SEZ=D(-Bv7$x|etG6S(*xvbGtwPaSy^OaJG+-LSgoZA51M$a
zsb9?UFEwucgtiUXLw|a)Cx3IINdNDESwDH at 0D3kl<$o8ydK-vCefk&B5xo7&bNt7k
zUem?bzWmR=VWi+XJ4~1KU(Z7J|Jk$P{PJS|zcj)-_o69e9?os&;9%xb6zT1<TkiA6
zqlT at oqeCU0-W1sCkxU?vLNlX-QGWr-UsJ at Z<i)8(7F0p1I0 at g}|DeHf^9={7#o>js
z+}%5G at 7_*Sc+j6?|9M79PKD|11Lj-g-lc9FKe(1h_)s7+DDU}}3nfXTq;oYc5>+DE
z32bzBm5?;2naN|jXljFbgi*mnSZIVXU2zGKn49vq6FbLy at 2lJz=f8b>b<(4Y{Vl0_
zQpp+f125OG8Ucri-8-?BcpOy9H%ad at k}3%%$=1w`zLe%p(E4;Qf7DN?vOKt?3x at Q{
z_#K!ijf~&|A`DA3pl=}JruW9`6mJ%agk(`V$r7Sr1%jn7plN~fgjF!KI%cnqc^u}!
z9icXQ*)LNm8 at g<r8GD34XL$ZuV+F1M_rwKh-DKn9BN54RhNfrA53~pwT=a};eX`>q
z;r?gC(pc?R+n2R$3;63ZUY<ujb3G1tTT!?X*(kC~t<u|u{%&c{dWUQ3yOu*BK_i_(
zKQF;@3j&@7R#?BYgk9%on}BkSb`QVjz8;@k*O>^nPA0%vrqT24#x^Mtk0u|*W~i?-
zj_Qh#6;{`)GD3kcpNtf-gxjoLcuVhbFV(R8%ZkoYC2+osu|ZUmX&gLi4OA(zb)zgs
zdiL<$^ZWK1aaAWN^VZtup)Op(I$Ss{4K(7Xn$NzQn>&3Tvr6|CwF>KlhtB>8?4$Ye
zrD8{b=|21o<vK>x%O_tXGgJvs{AC*HwTDi=VtE8UZ5TajO84jmUi*h#di)?zCW;DO
z{C2h)Y|T&PWc#d!=4fEGynglx at 3zpMr&k*x%4+%9(G|$-T>q?-xm%#NIuhUk&u;SY
zE=#cGn;zzxN^mT*WtNy%YPD at 36@7O{-Rx*~9{ar at fSp`0uW|~F3HOO2lEn~WFhPGx
zKd2kLxgX(kGH9F}U+2OAJILKP#(i20<6UHHp+F$d_vUc4JZ{LOnKhk at Cqc4Ilp6~M
z9R<)m^*qO;mv3W<dRyj+;V->^VVTAP{q&yTXZWljZpADc#iyYI^-xEwXJ?bReH!-y
zjPLG-2ZncJhjrZW(77|8iEn%HBJ|P2#P|2+D?XjY4|F$FUR3do&L!`RCVntxKqk!L
z1L;eW#cth`I}vVY>M<QZoLWsin2gqcPE3$nBA||tSpX_!=jd>EBIzROlYlo?3imjY
z;Sa=3O$E}2C*z1~ckL_E7%Wh$y+6SqP!2{fWg+&y{;a5}jyDP)tX*=S&n1U)pA#Zx
zNX{Fs<Hn#`o|45{D=V-g_oH2Gr%K1;P8&(^@=PVf!U%R{+QCSwJpFT+%skg(ttsNt
z(XZ=mMECm`D}cR~Y!JnoWpe_By`hO0u%pQKmKae`z-`|Sce~5cu`L(y(F5C&#yK}I
zk}Jo4^NnHZ2DzdjwW1)g9G4h7qX3_8kjQHVt=EkAiEpYa)G*4ApvrQ)y7&;qu*UJ~
z4RMW~nWy0wa&$G3KXk@#%jO3XK7%KD at rJm|Yv6%<IwJ*heuPi8V@%ZMLU1pC*alrj
z1z>g`I}xG})O_Ter}7ujP5AhfG<mfemQ;ahB9OeXP^p7PfkN^Nf2CspJ1iw~sEu5w
zP4zl>dTEK^Z{E0$nr`1F(7Nu8LlyLDJ^a)@&g)*B_oFhNe-hLo5W at N{8iRU(e6{RB
z`A>zLBDQs4G;!tZf?J|R63t!BAoE#INxmWAKpxw1eoFMnDH3t8<%te;2u8_p*vqx3
zhNWXEqn0DlpoN3qw5`zWdrs|ytYpzZGv8X?sTDOsitW$<gmpl`PlJiF&g(}Hp_n^i
zBCiy~3wQU|9z)dPuyk5Fc5v2xh>oM<I~u?1K9%cv?jVn^a(4DjH)h+F@|eO^F^e)8
z&`*@ft-1AZ?|AUjHdpP9{L>qTg))P>J3o`(8h5$lw!&)T)A<cjb>&=O0sOzsxZrK0
zdO+>DV1*I8>9X?;8Lt4P%xaH=1z{V6{rRy4bq!Kmy=Xk{{7LXYZ8%wOsD5UVz)ADZ
zGcn&?BpA;ztnP8cr(s-AULX&3r+lMy?8nAE;C9Q#;sPjsqbEzom353yN45>DqFw1~
z0lvh?)|JP!dminwR+J%jowVUp$w=?)9*Rn=28pEv3iJX2G`Q5+4_&$mB0|nQDkyyb
z at KQGad@t<H)Na4N3$PBIg$MS5MrR{f<Qx9l%n!-scwnwHLta^uUo%Bm5<r^?Nx8HS
z?1;_YUykF`Ae_6GI16P0swAXBckvk)kt}KJ(+|}jFmEHNk6E{4($!sT>t%p`u0kf*
zj(Nv{$v?40_XsBiz$%kEn!M30R38}Y!0U$Esz+C!iZnSKV6LtYF$QPIPA>kKtq}Jj
z$^K(7$7v!=x6w^Hs+Naqsg}a|#MceeLx#ds;;pi7fHvJgQlLs6)MN0$i6tAJZvc8O
z3!z$tkpo>BFpPdbejxu62W4&qCBb)!H2kT?O9&*H{3PN|R`@CL;$X3CR`df!rCSW6
zL9$>E1PXrGMa9=~FM3Uc_`Kv?zxdcS=W|V(a?iNojNPkm$GAW=Btu|q)Lh;;?WO3a
z*I4SLOh2MR8At0d7omm(iCkR<Jaq;Ro%q=1x{(_zo5S5tt81Gq#Za9rEitHyV96qw
z(d at qoi|DND2poC%=?lWX(c?D$Y?xw|-i*e=fSVh(la`;Aq0i-6z}v8a<hJiD*9!-C
z at +OGI`8H20R2GisxSa<qNq%yEL;y%EEvz1(p6^|7k-O7a3#WpiR^8EitklN}W`}#I
zw<r2aR>%Nxrka=88y3bA%Vb&e)AB<^fq05A8ntqXrG4+~k`eoL2(_V|h#Y)$eh(4S
zqwY$z8CiWE#%1_ms{khSM&}0<oDh_QpN&S(a<5DXNaWWiBsgzav+PuCLCmv<BaUu|
zyZd{fWk><r*h`^d at fSn0QbeSYtGfdfoO!_b&JB5qWOTSQj)ULE3r7PzWu8%)K1YJq
z<FCHPKppEYK7;me=!=>|nHQMjTEc7=v}2>-dvOS1EiJRIeib3Hbpp#Dv#lr-j(h6^
z-F+ at _c)35r0zZO at vkra444S&E3yl6e<G at B)m7dn!jr**hmvryVo9Ez~Ir%uj063Ht
zoMFyf#>p=i-MNE{etz_XS{No};YGaHGii+hRh0r%5E#%q&<CFyRJ3thNzDQ4x}Atr
z@)q~UL+~m?)lH^}ERAcR&*zkYXoFu6K(pYma~O3HxtONoA8My@#|ocVeu*Mm)a;tE
zJFh%!unANA=4kZMPGsj6`xHJKwMX?w0`DY%H~Yza`@5whn5%g7+qtei{@-M9cDxIS
zJbcCQ|FGLMshOX|IPjyP?*$lrTy1AlZ~wd#ZYyvo+^ms|-jY~IJ)@<jciS52u6mZp
zr(58bjFq{G0j>5%eLE{Q+F-}F=4APt0`YqRM1u!|#=2Xcc*Q$*RH5l4KxE|<QtQ_u
zKC<n7O$Ual+Rchxa7rKI|HPa5va{fM`Qe>vbszJ&l+Vtzp?~m&gMGczm*ITK!^m4(
zUY_Fe>*VxKj{IaV`xa(v=*;6UI|Prwn=E)>n83IiQIF8$h}`jU0f_*LJH$+m9xZZG
zDQ+yR_%{?i7<hGg&?gAcbq!V){s4pB!(cRM>n5nrUBy-O^7A*@htJKdwA%(tKPS}Y
zj;YURWm((z8@~bVfvNYbuZi*>fVLr~1TGG4=}7HEv%aa#iY$}~z6(7gL%5oRgh6S;
zzz}(_yy^$e*DuUp6aCsH`@%TmG&nwRJ-iF%OSLP3j?;iA+o1FaJwRC-^rWxMDqcN!
z24hhNfB;83bNlB+0&icDpFiVkh?9R|i at b$Q{2eC6d}N^nr1i&bh3sT*FSiVGFJ1?+
zUhh9(269b|lB2e=-0d~%|MBGUF`Og6FLt}_4*wr0*WBI$rB$yabRd_^cQm=nqr;19
zJW-w?UZ>3AKRXD1P&Qw(pq7jyLNk{ii!k`l2Ih-3I+SYy_x3-gQ{n&cJ&u3+OaUqG
zwUBTXmt8vnRi=>i4VL0-K4~Tj4XjsQi=au3r2rC$2!4X~lo#ovmKIBBjGrh;bIN_S
zjOQg~s?E%ePwunfGTO$CxupD!9L5X%*>d^DTXc3chX43+$vG_wBI)mIX^n2;o+;~o
zS`TA9QQx=(@)>2Fyg<chTn`1&Ar?pyoWCc`?rqmRZi;@=ISZ4KgNnRvm%GDviy@?&
zLHTO3MaR#4zg_a`&yz-$eu1Z?sI3(Dm3nw&_wrR*YH<05?m43~CXRa+&ughAEbmRB
zV+E2F`hDY4#E~UD_pW1&0x at Nh*BK9bLE7R~ZU(o1pVAy58l+T~R?+^ezCI5#y;EU}
z@~5*Jria()^UzcXswRxYb4hL`iW2qrOc6Kuvk^UE=D?Cb7e#r!R4Z)e012Fr{q%zc
zq!j=woll=_nxAeA%4t>+7E5 at j$@TEG@=D2bO$>IhU^$(<NlJd>4}$&C+tQkg33gb4
zi_nvA6RRJMKn-AE*P_X>6JnX!$j6a>O)Hf*TkiK`zx{)o0=annM2hT-VK4^Sn at I{I
zDLfpC;T+EwUynL#bs~n!OtfCL at nDtvun^uN%6=lNPqajc=1G#Y&j2tAS%%H?-hi9w
z^Ay0VIeQ)uzb4`ZNsr*0a- at p)G-y at jplq+9HzVV4(id*`<P(R7%43~?tWSG*{-?Z)
z!vs4 at kl}G&#AIc}ifI!#6ZeaZkt5v3Vgnyf6cWi)&Sgmy6}*T%TSA_Jp{&XzBr9!b
z)7*e#HU0r>JU5cf;S<xjoi@(BF6K>`A!D$PMqvH4FwX1n1opez9QR){Ms8jVNnv2t
zghh=|fzf=)ofI8=DaV}O0osRanThV$3j*MWFWwFNOp)a7DE=~i7?PXo<NI{35JoJN
zZS#oBwOo)9X}vm>xrALdt)wyau(K?>GHcNax~VAjFm2NSUzb53J2v`mZA-^jD#DlU
z5PxN>GC2xKBLV}}hGQ!k9DDOw^C09HXIE&bF&yHD6K)fw(V26x3bnH97wn23e5I%u
zZ0N+O8 at K3jTx&`n1)wPdy(zG<(r)<h<+hRr!40xb$>ZkcX?Xfo4GV|N6(wyyJvqh1
zUMT$~mAvdA+V7H5-b8<~bFo~y4 at 7|*v at z~PrnS^uZkECKXD*%0BeIvg)TO36s3rng
z&`rYt<t(;-TLPRb(hqlS8sg9Q+$x*;j1rrlm2X}K`B$7h6kZNw6eZjhOHk<T2FF~q
zV>81Y{(!#siT@%Kg;@`_9Hsn=R<|a@!T at Zi2FlUn@h!3HT0 at 0aCRwN8F-Ns3`A2Br
zB#wGw>hx^_+X7t<Dw82%XiK5#gxh|3!Ob={{EcMPlDIjApR!ouaJM_2*8e<149yol
zI$-7S_P6={{QI5KP-TV2_8A at Do)-ADPa~w3EEKBM)C>nWS+<E8v3OhsMBIdpjR9*7
zIY~i`*zS^{cepo^v5DTOvIsl5)HcaO%hpKQeltF!=7dxnlRh;=+$T9&5KA?#ss
zC57`t6|nBvxn0PQ71(`8RP*s6{t+59!w)&V1s<RohY+njR2M3KbVJ8|ez2n`Bp6eS
z^XK!f)){&pC96j-jUBPpy{6gne_Jd%l3%M?ycv>3ol<We#FBM)3|$V(H94fFat{jy
zZH<x{;<jou<+|PlL6N-`8#jqtHkmWz=@LeKhVjA=lJy0zbpa?RbSv^X$UR-DeP9%r
z!r*`8BrKdaSaqm?glEp=Ujl^A<P|B_VwI|RVoXy50)W(hQ1E*u(7*)MK7B&?0=pcU
z)-_j8erPSX)B0 at M@UaBO#c79(IhJR8a#yOz$Dy%53NeKFuSHOS4^)qOpeHlL-=kb|
zdaTI2*AUV?YB`IJ$Rco4(y7TG3F-#~``A!y^heHz&oXWS!LLQO^Vgu=40k0tveg!>
zYTjzd>dcA^ZNxI1R2lXGgivonWt{y2Z=JA7zO#`!G?13WqFW?2N6bpeTkYP5g#Boa
z)V1fR4H({Tjj^Idt-RdZt<E6aJ0eD2{-!9s<3Z1B+xyfmLAd;BBIX>6xouAHw=VMU
z$#WF-pF=dBqdxtK^{Nm0(ZQbfr!@7}6b97Us<)8Ds0@=nR?(}8689)r=EnzmBd=3S
zf at 4gmv)rAu9@|GaV2`27%ja3)0FZ(ued735%Cyrq3KX<33XUie_dYX)Giiyty+K at Y
zLdO*{z!My7A!{-;tQ%~SMlvW%Sj+c`dczye<|DDXAq3NEEq-_%%#uYwxr<4ZfQgVm
z`Ic8#mhIJEtiT^q&Zv=v0&w6ql;@+|E_2bmm!WxeHaGU#`>IPS4I6_9FZ9LX0oB%8
z`{Z8F$AMu{Gmj*d-Gw?2#Rl?@nO5nqJqr;`7S^1utHepdpXE$Ad@!x<b|FLfg^Zt+
zX;*q at u00ewbX>BX`e<*u*}u1oW!z`8dwWT>|9pO})S_Iy=zU(T3&wPbDr}&I`w=2m
z*ZLf9hs&O_*#lL(eY5)U9a|e3)2K`IAS~nFO?#t0hr*%cPvIf*d1u+0hXwCWNjejM
zzJA6)1^5pnfCM&lco=_;ls&Ic at dS>7)`00>MiR)#Xd~X31Mc-g=?H^|hn*hxhMrnd
zAA=#UTHzB$q_2^FA!F*Rf~9;G3vq<jcG|=i4x at x*CGBuGIL!m0hS0?$7X1wdt5G at D
z$7De0u~fXs5?oAISEl at y;K>JL&_Ne`#`Nd=Lja$8(=`EnnZtMMu+wA$jEX8n&z|Fq
ze`RI`i&+J&q;T6ak~|H{jomFZw?AcO9n9#Sj(E{=X!XMVPKa{4aFErDpHY2vzWe5{
zY)!|;oS*u5ka-Mx$baOV#_zi<nUA(XzA`_E;^p(IA#wPkRy at vFHa{{eD&a*n$s167
z^>gMMxy^XmF}@ty(9Lm1yN74?k}peU$cafd5fPQ4yCS~bo#V7N)wg$)BurOz4Vo{}
z2V;u@=vxG1_3Uv)SOc*z*y04xpk1&7Y at uS@^z_ajeaSEOS1R?4hfL}}O0&q^bMI)_
zx1B1mH$7eUN|OqpCz(0BOJeona$DCxr34(I0sAag8QCflu8j0f#8xuGQAVIT_}!9z
zP at Bt)ghUI~*#NM&#lo^pS at k&W_J$BcLi~{g=*h++0-g!skv4|PD{xr?55Q2wXT6R5
z$A`(r$*iZ2nc_gg5(S#4=0wSDvsTjV`=-g_Mf`S6#xS`fbSNC93+=GCQ^~A#q!LV?
zMQL3M^Q}XNlsZ{OxT7;!?Y`u`FzTe#2?=QWvKRZyY_I<i1CMa&M4-GI$a_y+Fiw_W
z#rw`GBfTjau0)4W0{H=w2TOU!=aH9b3#$WR*1}`Q6OJEECx0k%ug|88%eR4b^GuE$
zuD%(1QLSAMERzL2r?oJ(wXkj7*}iCC+Y5_G{koh1jkJDArE9imx--wUp62AKi>R&V
zV>@?LA+a(Ha}pb%Ak@`Lef{Spw>+Q&M{{|9znJq;HE)TVK^kRuXSXr+%(M*9__O>h
zBbCIauD(D@;A*<=dE;(zueCLjyo$fE`BRZJtbhikmCe&>Esgr}k!6-(s<q%dYx at T?
zqM6;!)uRmDb*~0;w2JhOQXz|z91Q9Nz2W+F80zZDr|wBVliv8-PnVgNHJcgC6AY7#
zqOeez<^v62m0 at R;W79rWGPns5a!;NWG^luD7(<?KssXhGNN!g8I~tm1f+hb1J01JV
zL#7$&DE}ft4H}9zBCQr56QF=mc(q-pssU!k1_*|g8QR26UidshADey`zr9H0uWk-K
zWi>+P?st6&O9?;1eEE++z^D|&9Wa8Jg74a(2Qj%F8<d28&R#5)*4*WCp2a^reAuPy
zyecfeR>t_IcX213BMrBZY4m)>aLh)Ci*2aLRI3y^Yc+0*^hRa(%Uf`JvNaE*86ejy
zAy4r3IG%ZJFj+Qf%W1Ptaf)X<o>qe<TENW`V^*Kg{Sz$P8@^ZXBI>b2I~Y8)G<cB2
z0nB}Ues%GMc(a=NJ6MD|Gcj)9N4e*&^n-&vV2 at KC@VtCL464mM@~UzNR+1}tieBc=
zlx?wpA2)G3|0;FSkn{>fePOR4iyCHkaj}Z#`HOe0S7`3$oqV7HY#!$AO0qM%B|#S7
zf3qyW4kU?xLhsywUqwc$p>7`_8!PTomZpXb9t~<PH8YU9HIYNN%oLJl<8z<rXP~(J
zBfLU^zBF?pizu?HS$j7Qhua_Fv1_gVRvO at H$Zp{U at TLb$^%chg?|5LnJ~mS1k$(_8
zzUxw0N%JL+Bydqy<?CHy#c-`eV)b&JF5B$%?_0D{vR_x#wZ>$h5YB~LMOmX-bKW^9
zyoV$tYzxu3P2dF%sekgkV3EcJPgoXDx2i?dFA#=>NGo|yTz>Q7hlMOn5PReg=7XQU
z#!nL{L@@@q)An*-Fn<bEtdGEDu%P@^aFvM2FFM8v5PjJjMZqs77SS8a#^00&=g`*g
zusXf;W}4HP`Q*EB8`v(|Pt}Xl9-E=<KAK_aH`EF$I`p7VIh%ajBog16wB+HH6OKtR
zQGUw<rM0q0J6Zr!dz_K`gab!k5AZw|#)&d6ct7)2V6(U`190*+Lm?p{p(J>;IHB<v
znEJUJe44Ib|1i{%rh9p!9M~&<j$z^$ZEP&pq$U6SSO76ZVYO%Nr=;IZ^98kDX1fvx
zZ~>J at Jv3J_AM4zdE*j1bOz&?Ed3~R_#cd!JB(Q=95Tw6W?pax<k9nWiLGle*66J+4
zB#b%}?n6h2MsX7znic}f&7kL;YUuN>+=nt9Z6?jb!>nIWDwlyC#xVStmX?`iv7F_#
z$dEH9Yjt^9e%b;b&P+)JzZJ}_NW2HTX*$JN=GJuP$1FqgCAZ_+AJO4z7TEL+)X+R(
z3`{7vVwLZG3sC<+h-QWM>9ul}z(go at lxy<ds`-LnOCQ-_a~;36!xBFC-r0+DCe>K0
z{|ts5Ao{{(z6!1G{Xku6i(n~SVp8`V^_Nd}`;Cf#sJ~d47Rc?}l86iy`5+&0YpWZ+
zqb4LYlIxw4k?NsQ&YQxodTk}{bDrq5ReTD|w2VA;IbC8V5viDe3lYs|t<ezZx7@}D
z*y75nt1fGX)%sythE2HxX=f@@<qFTUpXzs8l#^uGGxC=nKi#Gk*6_(fTuEvb&6n>u
zmwp^HDPBF=dN>XVi$@Epb1iet0!x$X&0jg4kE(d!iR?U=Th`@rq-l23Zd;jM!`}r@
zo+1SSmdFqg5M=(^#Ael4S1VhZpw30A#+Agxi5c+t>NPCi$1&GHss8%&Qqrzu{~>d7
z6uWEl89G6k8Rcj`<+o({R7lUWmfw4 at uoX}p(Y7xTu9Tyf-cdhgDEZZ0^)OwbemqdH
zFx2z?<2$GRejO;SJC1H##@fiThu<?84-01opA|x#fAW9*fzmu|xpa$xGO280)3YG#
ziK)T6ckQ{>I=IU`=JJJd{+{{-71_z9rkh{cP9xeT4>y?@t?(+bXc9rpD`*AV?ucu&
z8c(@wRjsIRe$PoV(zchw*O}D<YiLuaZcdEw2W{!CRQ0dZ|7Zc;gr|>Q`bviw76D~O
z<Htantb<U_vClFt>DOnHJjv>D&BGZjL7QOW&*wR8+91kUqr1+Vk^bTborqiPQZPM7
z$u^3Wd7vD5Mg?e;Jutfpy1Q<zw#mJ{UhOe8e_eeUlt5|4H~>@nBozA<$1oA?8uhaA
ztnJcu$fyu}Y+)g{BFKOCeDmYyex%X^{O at -u)U`GXCdX&u#yXT(OP at WuC=wz4?r1zF
zFXbk at toXg?5s0IYZQ|RlI(j at l9k;|YGWLBHs<C^GzoBovy^m<FtSz6fRGGX3j5X(s
z%yq(hu}6#Rd!wun(=L%3JN5Jm>)X#rtNchLObwZ}M_ at 0ma1ob%6jza;hwhzzEzRnd
z8yq#W5HZcYa(DsBnz5w&YI)-g36my+baQjKp1j=d>+gCcF*B!z_I5+5$?5{Y%^Y_s
zGs)~7vh at g=?v1M7^FSeIw+9_6l>467M at XCGQHQe*!vD*j{`|SG{D$M`p1$E($@F^F
zdvwoJgk^w)9!E5*-UIw`8?y0qY7h}j at Gi->N0%7C{c)U*z3XzrZ-?GU!_j)z=3|Rc
z)g^mSm(s2#U9=_c1A9#HJ3_f3mYVht`Hf(OW-cz8aNEkW^vL6d9nXm@!Lj}As?jH#
zq0(cBeJz!t$pLe7yUJ33NBjI4c#f&cS#$Nm at Ky6!b0&oGxdlh@&h*-`{LC(Z^BYmg
zHs1l6`!cohEjLZ;DQ$%KCZep2H>hk9xx4kS>{QxMQtv<T-v1VT0*DA%ALi;7YlA|&
ze}ob2*TM+=|41ott~cGN|B>pTfFRris8#$^Nn0TY3Tp6#{;e}S^8bE|KoCat$DW<l
zEN}AbP!lmd`@!8I<zagEh19O){6K6*^q!1E>+#?cruxOjXD{ek760i|n?0$PM(kPM
z3`><5?f+n=P9S0q`|#rQbvTl3H1w2sSJj|{M&<&o#uyed;6dT2teAGWWeBgIEx$N2
zpYng}9VvX{TP#?)NsQe>^26yP>U>_m2!^xc-N{*XqWr6&MX=tBz-UUi>PmITWgd&(
zzq%7rPz}Hr7j~x{LCvZP3mg!MRRq|j)H21yV!!C2YBCH-E7F`HbMQ^}H at Dwos^^I}
zp at 8ZsGlxtcD?Uts-~e at 3tm#|?NcCJPZ`la{w`2r0I!Ja%x-m!q37DLo7vJ$z(=s|D
zMh`tjG|>Tef*nvUxHJ&E_CoyiOL+36$=P#a9B4g(%*%npFOb=L9jgtvvjM(0W at R#i
z;0#wNvoZl_vqSkR7by)N(4o6?fpBA)P<Vh}DL3wp<QWBGI^ZX5jj?V&*Es^edcHPV
z;Mk$<c+{o*qPt|tZ!g#6Z1VBgv(GYTXf*-nXf-ekr_;#b+AF at 2g~KRYunSqh8%Sc#
zwipG%Cv5=Hc_3k%)-EHqdW)eA>_UWpW2!C0=T_SK(N?;CxtH`t4Wd$^cBrLs!EfkS
z!%FGAWxM~Dv#<_O76#^e7lPoE#_h*N66F`0<aSs7G`E1S&h*#%ZRwAuLY3i at yv64E
zhX+k9rfa?CX`*U0&!-k5S1x|yZ*N~b@@Wo1C=!)jF{95Gp4k+5K3B!xzI4Hf(#Nk#
zm7w$i1?DXQp%Fjv*?l&1z8+&NT+M&EltR6#dWC2r&yx`e4l-vZw+-m{>>A+7;46?a
z^U?ISct{kd5P+lF(h{Eg?iFr8dMJES^W??NFpZKD{8m_bC4zGI68T69=sd<C?|TII
z#@#|vI4xUgl0z2lrxr5WUF%D0pX%v$(#SO2n3cHS$X@|P4Eh|;u#-8T?DM`3qyP4I
z1~XIdfNl at I%)CGwwKM?pixCO%z^B;l1E62 at qrB_J2Vvb?@nJgic3Jqc at mndW`fawD
zHZ1tD1xjHOsZR|C>`d-!$=B6CG!p^NkI3z0QrkD_fpdIqne-rddaCD at zr0_~lP~GF
zsB8pT&9_BreVRF<o&r-wZCiSxp3Cjxz~bPS`X#^hU{7krg{~=vaer>3cOmdA?JJr`
z=pL&N>MHYie6<dcriTNIs*ik}9ydwX7Um^>{VFxJuz?L+9o|UF@?ZJ(jdk?_Hz3>K
zL{Qe0`c!_x@{z4_Q{H#y|KU~dVL<g!^&OY0c0bX-DwNZvuJItRKs6B;z96;#u<uZV
zJ=W)WA;VMD=K~`j39Z?#twi&*x$zJmuwJ}tp=5tmiyWg0H6HjF7JGg~GPN)S0VW&~
zy93A_4P05&{KtOSsk=88jGsfMx>C;&as>N&qDVQVD`CY3|K(+JC^@VD6}sJ(F!rpB
ze{g*h7!byIz_yNV1r<F8vO+zsJid|w-a8-VzK=VpT;v7(L^D79ByO}Kwhgck1Qhb%
zU)DaXD=#&9?yxZ|4;J+M<E|7s=z0MsOz6Q0QCGIuE5Fad6;YgZapRWLLi8)q9^NRj
z^6c(=!r#g-&PmQshK!d#K56&PEewzc_iG{HKNS5KT1YC00og*1sgFVxnwsTLHLZ3y
zLVh$mdc%X50h0}H>Kfxm=48-MRoO-i6JdiY-C<s%C+o1&DBiu9S#7=-oUysxLKll~
z=)hAm9RPTSysWChJQ^_fQ%4XTn(wmtq{DqJ)t$7dsh+cMlS>I`g{j?^?h5JUEWg;Y
z-bL;CyB?L=;_(3w=jmqK{6l=;Q6mE-DKIFdNW+nK`9PngVY2hvCM%C>(bCjhu2>WP
z*p|*%QX`MiyFhrlplYW`)fy=m`7<su at Kej591tkc>q8C`irrv^I^SUHN`?RwEFkiJ
zcJ$sO&-^jqx%>w6v at ZF<Y~4GKqP8_>5#UMEO&8!~+PwPWq>%&g6`4dEZvT8KbtefY
zHAR2Ev;MHw^lXxMZwF3H{t!nTtW#}E#paEaq<#M%XSBGE0W}_IKhDISTKJqd(c<?i
zBCsam7#wRpO!U^H5RR#ZX2cVF6YipnPiO8ZH5FoRKjCZ~9UQHr<v%~EdBET7??_CV
zN?ZUqP=tPF$MFRIlz(C{99C-bu`Z&h;__B2D7MbnFa+?q67^db$QSl<5pfPC49D02
zY(QvC`eGHs4s=whY<Zw&)rP*tqv}?x4~^%j3t5fvLLgj*cj?FsRhDKqQ+OA0a(tJr
z73Q=f^2Wy4{{>ymsEZD_Ojnr<PgWIz(($VM8GHsmP2Y9{PV27rAEQ|gYT7Z9#@>2F
zKLQVB2`}<+sq+>ItIu|)?pif(oS=D?ZuAnxB)>e;WnZk(Jxh3XOxMfjX<C#)$JF=i
z=I<VcX<fFv?~=(f!;7?Mzo0iBKP1xJ^kUX&ObuO&y|41z9`@6<>$KtWNLHrA)33(G
zvrF1<I7z%V8Q%v^h0;38In&>%|Ge>HjhDaaefmuU{jjy~RsLA_e9X!6uYB=$VH#Ff
zatp(j7u5}6(6ouuTDFzDt~id$6y?pBK*PyUf$+);AG%%TJU(*6RvT2nW-m?hJS*m}
zCV9jJbcnu=*trmUM>3JU)%!xC4Vst<Pwg3`V3K)NBo1I~8i86J4}#Y<pZjznc8TuQ
zaXXGFl*Z~-K-XHehlNvVL9_YhDAm+LpK0l5D;uBZ4(Mh0=QUIYbLTXm8Mqv~@Uv!6
zErKjf1Tq1>L&Ie<CDu&odCgIZ_OwZ*ejyTWfE#-5&P1Sf-z?>*CA>*0AMnw)0oEU`
zL`U6{`hW&(bJP(&wGwPjofbxr_<#c;dSw^TU3TxUVb4~-4o%7$R4w;TeFQu&q~Hnj
zZ(KZAj-a}}<cJv`@YlzOo)=!0?NW{m;6<PP12EVw1t%#KnlBgdRA~za{saPA58p~m
z-dL#BuK%A2(?*E)kmT;QwdM8o5d$T+HwT(7GJkI-m`Q#`Zq(KPlk(A2BvgS0oj=6l
zc0_{Cdi_LhLS?ve2Nv4-FV5~jjq5bw0Ydu at N48{vX%o$+2q-}P&S~F~`DQcI=PXr)
z$yf_7b}c?!kq8G3EZjr5`)WYiPaw9pykfmk1e at Qu;yk#yC3z+55Sc)IJn%oLMOy~x
zf9uJbzWs_nZN^Y!`4^##*Ho^?9Y72{jM2IU+ez^tw1G?^ZQeFe3efa@<~@O3!6u0Y
z at GoyjJ933Fc;(hUp7=pgA}>(nf1*j|(n8B5pZN at Jdvh1e(E`}>@1ibj-TjDitrcy?
z4m7q8Sl6M1rHW6%`d*lv`&6DwI4rmM2JBgtQc0Ey{9)F_vHs~rHJti>rbOoUXE>{P
zFW;sGj(QGI1 at fof?(AR6VAJAjDoUXg2oB>pk!Lz-D&2A1VJFqhL=!c1sGFa67BdXD
zMBeYjgAo#P`oX?OxZQn3Wy(G5ilLB|9-`mSy>rA2o<>Hz*S_F2LH4C-iZYFdV$MM%
z?N~L{y>8B-&XA|BQN8CZMsdi8-~j1NTUEK*QcJJTSvjBOC>%Cm2xmWR!l38nrM%lp
z>)x_j`lmA^e|6^O6go7JZa at 1o{V3_;^Cc6J)Q^md>u>Sb1cSril9Hz`kOX|c9_6{b
zX at _~~`Z&L&*cmo}6pc+|Q&1}Sm0TLvCL~|PX#1FVGi2U0tb>jpJ!86j;<43KRj?PV
z;sh)d6iFI1`6IZ)A#C0utYhgeBkOy7+1~C&_s@$|xQu+Oq2QnAcc5&9+AU><vaO)l
z46exjJxtTKW8+v}u(T!V5X)!&R3gnmMq{Rh?1Ju+j~No{A8X5Hb0VUy^dz7Kq;>Qe
z%9?@l>JVM2Mg3M`z=U8nH8rmKSxfHrD|!^mhlqRz!CxD(Z1dGzG^m7xM8UWX*950N
z_**w0K)Q%y1*sx(v#ng&J_he&7`_QtAR)5n$fv6aB&VdZBskS<s%)5v<0N}xL1nL*
zxxE*b6Rwy8ViVy?%;C2VrzSy84@`7J%{m$Y1c&@x+ZZC56S?(vtO}5$RmCTO`TlFv
zR(F1f6AZSrP`*1id*gED`qI!v&+lsz&KMhgp9MfoGA36d`7=DfFo}1VS&XYxjR~Jc
z0K2E!p9Rh>Ke0b8V&@sKZQ(X2Xtm at SZL+Gs;z9eJ8buA-N-*uIn-g$lA>DID<;f+9
z5hIGh7<*O`3h<FR*$B)tTgy*awYs73=;Ey}#n1z{iRauQ;7LT_$Gt74{AOwrKrm<S
znDP>mMHBHv!T1{u at u7FY^oErf*$&T7_*)^$#C}I%3~1LYhn5P at X-F1VNHvw0X^Anq
zCwzXNFVy8y0U}G&E9)_l`(z^~b3TXXdFj3R7r5bM-*aZ{q`FgTJj{vw;Sz at N#Y=SV
z!C&rxhkKj6v!9;d9U_Sbfaw$u6F?^*t#a;=SD at t;oE+NX$Rc50CtMl0I*L#8OBpv(
z0iM0|<x{~5IgodNZO at v5dZ|jej+YY`of5>ma$xkB^rsoQsfS0G4rH at fRLb*Bl|s>4
zYrN{7c^YJWACnNv^(#Su=yc`WM0+bRj9rNTp{oj2c>Bi1#VVs}XiB(Q|H>vds$m=+
zZ!HKb@{t>N6PwgCGE?7Zojt_Q1BQvpr(h#5JN5Kvcvp%Q(TS2L*5an{#o#wY({0=q
zOp#sc8;u=1lgU0HODBQKY*9f%=siXi0zh}BKoQwM$&X8buku5vZ$m78U(i2iGtq%L
z2Vf>b40u#n;D?@7%>Z=Bjy2?gv>i_K?Lz2A#sUtgNOVn3beAs^zD-7z=&M4o+z-jZ
z{Z{Ea76+(ZC>1*1FBf3Uj>BsG;oJttra5L$h{y9d&J(~en}967>}sb3LW^65kC2}n
zm!E5?o;K`ONi6PrKUyimgm%dr;F%L=G~`~?qW12D`i1+9=fYw@<t8awodJ(%I!~Px
zy{Du at U6Z=xCr{<I)P9Hw8!0-JxeHH#Ec&=+lFJGh?C)nZN1PpiqeT6Cl=wS;kJ3Nl
zLP7m&abd|2Bd%O%Hg68uwyI|%y=N6;0g3pu)QhV3jH^2srk9 at N4`{6W&=nfzr_EP^
z;g=~-WZ$dFN at q?M73;uztjdi6tSm}oJ7s_2`zIoehf25nU at eW!g5#9oy68|$x+n+0
z8mXYhPTf)leLy4Moux)EeM at buU93T*^g?3{xh230*}-@>KRk^6B1gi%w48k6>pZM6
z!mKu6r$Acu%M;Q|ewl2uX}-Q;almdZXTIeyfx7mq#?;YnYjKQ0UO*Cz9tuwcxeBL8
z3pAIG!M_y<*XC18=p7_WlfYl236h1E^?I9UbiAGR3*`=FsSh688cL|9vxI%}8~Gc_
zd>GKd_sAm#=5H$igi&qeF)(3u>-O}{fgv|z<t%={j at Wk2E@2#MY>1t=hoczE@*aOV
zCLb3HDdI=HDq1_ytNQJ{eIbTn)390dDVGtd&^Z_D$Wi!9O$JPEH14j3hf(Pcp7ZmU
zp&!0BgZG!~G2ISoa4d8#(?ZA%5icqxeAL$wNV`l`&F6nJOL at 5)^!puvUs4}iP}}5N
zCD8F$Vt%|FO$Wb^RG~`OKBK at JrR)XvMz*xXU~Z@{2HZ at A!0r6LTatDISNpDW3JP~a
zUu?Otp(PD5XQ(v3juI!lk|Tqu73blnFCxz`I9<=y at SY3I-zGkHP=-mQXT-TrDJIhc
z;^Q5{IGFTNWWk0(Ekjg<VX-d-1O)*F#o%sAgBiNK-E9o$jXM0LtVP-&3!InmJ<s`2
z4+%omMEtS{>OeWfWktal((%LSWN}TxXNd{s#!!+-xN0(eRwx&WEHLHQXi-n9BSUKO
zBHHKbx2Tqm at Yga^0_$&Z+1Cd;SA;wNpi-@~)@IDrxTl*G{8gGWnBXX~Ch$Q$DE`Cq
zYPr>IT#M at 8Vo;dHjC5q2!e47w1K1NIf9|%`5m?YbnR5(E at g#i}OP_=q!D0<KWX4;9
zT109pYO2EDswm-J-bpd+d0$t3_DYKJm)8-`xSlHHpbRlw?GvSo7$_k={kn0$a#nnQ
ztY}%R#Td3VOb`7bDWN-Nxh!^SdFMC&HnRRtUJ^Ar{8PB~%|L5|s*LJMP&pRCNc<?v
zx06-o&y`WXj3fKsUFiQ3Jz!%3;N;_THjGM3zU5`(<CFR~Mvo4rpa+s3+>-P<`2PFf
zo4s$?*b^V{o(B9qx2$X)mjFl|V5OJ#4QG3tA)E9=p1 at hBIG;l|Y5#jKiKOod;eh3#
z;??fo!`7;OmLQB-q0n3nY+GAf&|hokYD6qC{2o-I=vT?a{~(p%`Dr89hxn=JB}zKn
zbYMh&08;>Z@*P-^3P1HuuTL?*{uv4dTl|*22pc?-4J{~n&*CKgUT`3mQLoIXk6!L`
zgF5D=y=8gy%4D+?ZvNKa+Ntc3>(lO35~^qQ0Lo5GZRd`i&ggx{E)p=uIs+}Rjqo5W
zsfD9%pBBRUyImtiU>Y*`6k8EOJSC^IE_Co=b2>B$!&1h;)a?aXKGB%*3oYsv!T*cB
z_W)|@>-vQcT>- at g(owKdmENm}h!l}tReJA)4$2=;X(9sBL68;*y%UNE2uKsDfdr%z
zdI*64;hvz+^WJ%9zL|Hv at 4NHfJ9Ezr$ssw}d+oK?-g~XzT6=B2DZ;fk+utT59V(im
z%Li%AILzBtk&zCGe at 5oAFY&;x%Ob!L;NVZ4#|2W%k!{OleeOH}$t- at kw|CB at -kstt
zOKo|b(QD*4B>y`Hhwtj<iuV}5u1|66VW2)0jpi>$74NpZSwV=sADm3sQ8rkNC~+$0
z*O+_wn;K at KdQBu%spGu`x8^$o<8<Xaj1TT4eqEj9)*H*1sTXYYqj$moEc050vnDc<
z{*|+fr%VQu6sIQV&u=S$zW65<XS#|>TN!fII11F>C~;i#Ub(~{a6$V-I_PW%LmAGJ
zVQ%u0g~d%h2o=PB^DHdN0T-j<dfgjLEH%yJ^Kv;&d$oq6{zChgaTUCjbEz{lFe(}c
zm)mcPwn4>~)kk_{@_V+oXr%vmQFu at s{TG;qGlD?u_Xl)9wQzBT&)K%;7xdi`aL68*
z|5NPO*5*4MLDYfe#kl7e+O}DizXg<3hYFDJ=W(8)?7EI+9UtOWWu&9rZd?Dn$H`X~
zH5IaQVGd619DL;g*f(hzLN%_35{dWFyUD?oK8M4~O{14dn;SiC9n$`$;Q;5%8=u+X
zB-hF!CTPHJx!CR^Zw?d`{|<eAAx?vFEJycoq0sS8BN<Z2K>6Ku#^jo&8o!%wW~lB~
z0maCDplycYBX1Hi(e*mxgGX}X^9OtP$g{$OZ$}Fethe{_4VBJ_M;5N4GU0)Lod;Jz
zQ2k=E0i{QYNWc|Z&i$dP7XvaLA$i5OKoKhwb^U5gQ~2n at _4QxV`DcO5C&9TJS3i~R
znj-j0UQ}1n$SZJO`KD5-8D4c+;ohe~>+7;Mz&HzmNwK9iC$j9o+I2|s?H^g^#2XO}
z)_8 at sDQDSN&$mu0AaX6vCJ^Kj=Bky)9+|KfO?zrq$U_14e{6Seg;|2<;?Xzi|L9?z
zA+f*koSQW7-j*<8__>9mkKjKq1~psR&vhj;8{X_#IP*o+DMFC at qD5ix$4UA^VZx8k
z-(S)PPxboWRMDQs(TImAvuAh|!Sp!-1|-IW--?nL3&}S^j at eB857#_)H%x<7#*Qim
zlu6}f;H7lPiL^0X4f1%V;d7(;GE at cJ4g}YC7Ge*~y0)*y5mYz)TAt(RcM8ljwPb9c
zm1M?jAL4PFyeUTtWfEWj5U*w$@(_TzpL%hlX)|eQS>}T`SyiblJ`4swo=qm1IgWkU
zu$V;ebCnvnsXDMb0&k?Y-bAytc>8uCF7vU=Kx?j<H}1vUiicn~!1GrvKjUnMFccw6
z;lVlt5 at Pvge5d8pE@mVwEt~o;DalONKbRw^v=n at WTQq-ympJ6?G&M((hiG!h={3g}
z%J}0Ax~H>fkCDx=F3ro)Fw<e|eDT(LVTPW$IVVuee{}7Lj974!>=}SWIPK~W8FkrT
z)ed938!8a`s2Y;VMGRu49N-<9pA><693xdRzw~nHz+x=j#Ek;*9Z$w!@Dk+=bbD>B
z4K2Gnqym0#{wvAMkkAQuR2A_m6(yAi&gGMPL{3PJFib&UE~HgDo92yq4mosmdL&4i
zplpXR*j*#4f2^MG*EEa!**&V}Gz~sXfq~V{)E!6yN1RC;R0~$uhq5p1Y at 5OZ*He&i
zxJ>(2I|SA(cON)fh8yFN#$s5^OfQ+jwOI~gturIapk_B))zhTIvEN9N^%2Db`cI>+
z at xP&6et9;2_<bJbO2H$R5&Wv1uQf_)ld2(UYAi?Sb!(Toi9pwJhu5?k2YRB?#xF(g
zCtQjn(Kuub at eaEN75t}ZFXnYe;KD$L>OjUSv_l1rAwlT|Mr^^+n;!!=gR&3JWh621
zBWrwlGj8-87A7~CSrLK1{+BKh1(2?6S^y;haoDIVb?ybzFWg*lb2n}&F#qYc4$2k=
z+qUlSZ*ikm?tRM!rY(-InPp|#YrJ+CnH*41x;i^MeAqzPK=>acgK!NWx}+3LGnPZ+
z%=aXgj=rLvxaiXdhth49kja0QBQl~D8Vg)#1=A%TJu(l(Cj8tj at 1I`qudwkuT8?9v
z at yk_-W#^Hzn6Wvq_+lRTrL_4m))q$@r?$V_uIXKKjJ)+%Iv7Cdn7M&k)kH~~*51Ys
z$0xzriNymNO2C=Z8=#7j<l3LR!I$JAf9~WXF9M{0ZuuVm-v|G2;y<&8f5!OuV4F)O
zU`w8kUHVr}SMX at 9fWIp7;SiyVj}X|hf5id-r1}pU&WL1EQNQ-1p%)m2H~U_)lcf{R
zjCdT$MaEG0b>czuQa46A`j!V at W%}llN8i#b2CTx)gSG(JwNDQ0{JI>3&zOdc{2@=+
z4HwTrL0Vxt?@SS`3qR=pp<!e3+mtDOsotgJo53@{VbA=nNVD2E-v)-8x9Ppom(P6A
zEFE01ZJFnjU|ujV+u}B{h|z*hHbKP)ErmZW`7+1cPEqNu-<(UO!tHMNu{5|@<WC<N
z;Mk>Qak$gQB!vPO>Nph#67MfQuk_<8DaxpS*uU3EaFk>0xq8_vCTf8S9aka0hZhnv
zh=}UYhQZenEM3^AnHFYhIkuNAt#^vs9e7fq$KNrnhs at aXC&*Qv9&c1($u%j5Dvu1l
z$X`+w$Tm-3_smK{XD4I*3+}sPo`VuQCv65@>|BRC{Xtu`!y5qy%m0Yc5DD5>;{wQG
zZ at xq96$a#CQd+eZx|v>Gkrft_rLUzdqN0Qx!xas+Xl8k_lo`^sx1snSqmDQ4(k&Fr
zVLqFHr at P8taC9>9G#iWG#5%ON=`2Piho`F>j6JPIOpA8K4a>2+JKd;M;M?+;$2U_>
z_ai53Hmh>BiWLTYYw8{J=jz(aZ&{dY(7*J)vY3x8Jc*XlsNG)E=o%95|Jc=D6f3kP
zk{q?*UE7w;QoNUV!h2Z3usi*8lK^f|KZvf7BWTpxU!Q at i4D|app0c+^m{fk|-FUcC
z%x8NZTbLV!jnuoV=VnLFhKAL+<e+gXU5&0wyp>a=y<mx=yv-FcQhB*I%=E4sj<=8e
z6)@*t>tKO0Arq4$W%@{`FX`)r>=AsOsUk)x`T0~KHgd*B6ghe>71J-9QhLgrCK7X2
zc4BYu-enG+^MPD+Fr4QwP=Y-z<wDf_VtXjn;*%#JH$fSYDdWSf>i0qBSGx-8(T5D#
zeMgoHK}TQS0L0a7W<(J<V{#E&X3qlL+8KS3Eb~dtsM}OO0sC-xRVtr4O#49hg2;3#
zms+9`f6`;j=ZnCou}cL9L1webH}S5z&_dX+0-)-US at RZiY?l>FwD7qB2{cU4&cMkO
z*`I4!|4Y!YaIlbM#&<xEPOSGiOl(UyS>>^V#M0fs8g%)n?rX$S#*f~6!lk6GUXLc%
z9mF&2;#hq{Z0N9Vy0egHnJ2Ta*pVmc&M>*dxo4`H8)HR)3wn0A()>P=;WGk}M0wt;
ziICK=Ft&H8&|!})3c36JOGlo2A9F!epZ$mz!THO03>Qh(2-~_-8+ at uM`Jt(CqEl}T
z$Uj5<(h<^DrM`3hCf*Ew)$3(8nG8OU!5G9!)gDgldOLdkT<Ffv50~-3PC5^rJoa9|
zk|A}O3qD3`NU5J^0Q7oIbHKih>d)iGT9(Yqr_*dJG>k}5KXt?!!Ju$e*V?r2s#@6G
zx-w(Cc>Kq16uFyOomiLsMV at z`D^eV9168Z9M(XNCaPF85^S!4*wda5m4NW9I@#O$!
zz8)4%Rl_kx-|JSbCpQ_%UHyhj`DyMA9t~<>Ah at RFMvBAo-pGV6zrYjC)n}!^T7C7>
zo=JVX?;Pda%j!YT`9k!X3G2^PVHedPyjCslYfI{5cD0|G*n_Uawiz-~c_IgWzFZ(q
zX)=Ike)i{kI*bnyC7Hgt8$+x2xg732!@Q0*qDZ}Qx3Iszl2U;S;N`*C+n|}$hI4&3
zd at F@@GhAF4kmmrYc8lAy>DTF?e65YwZJsvDx5rjk19ip{kk!hCa>^L4t`&PD|7 at tO
z|6KWTC1hZ8F09Xkole#y&#i^0%WZztnUlXFEWjp^A$MKOMU@~roK8j`BIYvvvm`Zw
zn{4yW;ok33HX^xO)7Odf#Y1t=YsE$*&dpv8GFU$=1oFz1?ngCfJ)(g1$&MoT&(0cc
zfhVa+A;ml^6=mLpDg5i`r4;@8&)s_%ICU%XQLklT$IEi3?g at n77nAr6(Oi%Ga(C4O
z?w?tcMpL>bzrYDiRVO33F4?BON5j9ylSSNUI$N~fww$_XYw#fRq!x2Xn<F$<X~0|6
z<Du at KS`ThWPNn{)GuO9NlRquCi(RV46&<n5#_u||NN(-f&<Sh at -zL&O)A)cm-r`V&
zMI*1_>qQfLiDovxrbtts6kTw*r<M{(SKVJm``(`9c_0nCxMkXXbsuw8%!Low9grm3
zN at MZAsS5R_uVb@M<@<qv_+=Tw2uYVSoi;>kXN_uf4{N_nJid*U at Q}%q9=;bDE`_dQ
zKG}#lucIE6dKWoCdUU|SzB+q6;E)uobxcL1r<9vGVHxPy3}CD8csKv3(X|bo*x;+@
z at lEZ$-7trha4*a=a}jv%j?XEQEMW)Eqit3e+?;r}g7d{P{gE+8<)tzASNGA>twN!S
zOGki~b~*LJMn<fSV|~1nd=2AfOK8z?e&(uN`jKO at bx@0&#!JKKv5^~-|Ku;>Ksv3B
z-zJlDNsMmb5-D@!8&4c`2uJdntWC6*!?HshCr|KysN^J-2a@!`kg`iRyB|+v3vD%{
zef4=v111%F?`U0Mb)NlPPg3(;yX3<IsIH$htN#mXtCh#971}B6{uR&gX}1OhOZ2Y#
z*4*~nT3Eu*@9|C7`91>^?+^ANGM6g_P6}>Y1{1ll)x!ypyLMQn?6P^Ws`NXf#hEFg
zNpN}McYxU)QhDM#0AzK5s at UmW2m`o$o!$XPQNV>iceeLQ<^SCM|N3BQ2ItT?MnrQb
z34ZCccr$<U5Wq~v at J=td&f+WdPqn;O2cohGy-jDu!Uf(D9}HOn^}d-AC18IQzZgeJ
z;5!~cWTGQ&1pH6u(2!@~3}Abw;>%apyQ)3<<#}A at Fmw+lJSCilO)5b^^QHP|py}9%
ztMsrS-}ycDr0iSmlXaL!hH$h5$&CF)Q2D9m=9h$ITM3U1;^rG*M?(*`@o8;VS9Ir`
zmd=VGi-$Sv*l((25XcW6Z@)a2_AOGrV$1%mM_{*^hA+n;IhWJaR+7C3A>GAYisya(
zHeetD?Z>Q6#&#fNG9_k?-b6KIZ#qp5Y^*+0lqa^wX93h`ZNGng6}5e(UxvxTvN#4G
z`pPdxmw;fmEsrOCm}7R3UOvJ?E4&ODI}v48HVpJsr%J~{Qr*_EEo^-s)IUR{0a`H+
zZ0BPEVF)Mcu3W98DfUptt9S=>ysZPX5<Vk}u}YyGMOUz5smQ$6D at s?+S2uj~kCs+T
zlzJx2q=Oc!DMgvj2QIzhwXhT3t_?htnLuxMZfnPz9iY5x^MeKq2S&zz`zp2Gj>VR?
z99gmuoF;?eP|Zx~rEy{#LN>3ETnh>3-GPSmr1LYQ7J8FeEi5IKoIY1`CVyw->Pi)Z
zj=X!2VH$3d+MJCtjAhw;!rWUO9mRAfE`~e=p#>A877&MI+o3+(Pwaduq+{}Ade!&X
z>v^4FzMQ!z9`^MG)3pZ7Wu)b^c}S5jJ}0Zlr)lu8pUZ1BkSZQ8^<>`b34QLUizfev
zWXaC&OzTaU$O7&YXLNo`Q_kk*KOraW`I-W9qC{F}q*OqI>BZ$o6K1Ykhtm8?WiP<f
zDDCdOzc0f!$(kAli`wql;-;}=;j&?5%kU8~jZNJIkD9OX8_0CAk at Vddd6Iaa`N#RO
zjW9E&e%}||R at suB1yW|LYmI5UmQf`K6ukgfOK~SUI#ppR3<)uV^)dh0J1psPqvPe>
zaZDx<Tr_t2#_)$HMy30WC7A?4SXf9cHaO^beW8<*NZ^t3sRWbVRU6Lfnzq_;;_9Ut
zJBboW{ztM3+_5etsAm|Kq?{4uc7;vqfmZTjPWkUAy1;T**hl46!-d4z75AmC+x_X`
zu&5O~->l4B?rXbWbqtr&r}b&PqT^Uh)?R<8AT4VV+XzGAZZSGJI>BNsc%-+2xWKe1
z(x&^56Q;LH8SuxR0V*hebRx2G;Ccv=tgRw&av0R2R81Fp-B9uQhkN_v?XbkBSt~v_
zP#z<jUQmw}QH1N<3zg2DDh^Y&GMFd&pt&K{t+=i2am%yCm;mF>x-POZ=?|6Xft(kH
zg-hpEn9oP}I|=jF(l%ag$`;=N&oijQ9bNT9p#j$_|1&xEpj+sw31tYuZZpV2;Ha_w
zGAVK>-GyK98j+qED{$=`)Y4mJqd`0d^-Rh9enzIo95Ymc7^|Hmod|~)bWmW|k!e_N
zoiti{DrRM$Iy8>g!V;SwZQt^2N%khN=1AI#)tlBREj25Jlwl9a)am|lwK<DZ9R3M*
z9D9$f_5x0ktkt7kj{D at aMlVpi%$hB}X2<1O;`J$^r!wkEmu}jI%eOwRQppGx5p?D=
z5(8T%<;OI-^da8CCSl%@ZoUYY;EIU{{`e`o8TP3l<3cBr7?qeP8R@!`I%cUxgZ<m-
z^nlq+U at 2Maj6CWp1E6;`=)x&9BX3NUgK?9`Znmj*c7 at I0!W5^&D{}AQM%*s<?wUQz
z#-d;(7tZyOa&gRkX7ZIi+SbnIag#Y%-2KE`y}uPbu6FM(Q!stFQn!b{^xiQrIsD5(
zxqF+Zo>|ZKS8hOHtGNXYY%M1T|MO?HkR<kR+1cDDkX)rWohI0~)LY74-pDqZ`=h#E
zo$RnKRpEON^TZ^?oqhL^l2em#3ZI-eBSLw_i;aU*^|ws9EF7bAtWSId?_`cK9z4B8
zU*4eNJeeT+V%9L}A69QOz-RK1;7ryUi){R|3HN#?N7pQUf&9{GTU*iZfD7_U^pBXh
zpkg{{mfSZM3_mBEhd-^6LhX*0Sy(>N9~OUlz3{sb-|L}0&hvA&mv~2OxAADVKxNe;
z#jqXE!ngVvjbm&b=oh`f)}S)W!Ap~vp%WB#k77};`8{GH?doy?YE$=^GQR$(- at AFC
z%3OBod2xsR at zILnoI<|Il8 at Ug&d(X}={c0;0chbKq^%ei5<=guMc`%$%c^N`mYfwG
zR_PB0VoN~^LQsaw-Q&#++d8JbI<vp>un`J#0ZlLIi%=4SE?2k*II+ByC2R3j)Ln>3
zsUqv{)Ncp{j6ux(1w9m*=n at H`w1p7NFAVYRpE1eF78t+?vue_pQmel8lX^Axa&heS
zH}%Sef!|7Ml4FFv?j#?S?~SELfWeLUbeodCb%Y>%C3%VY at lTh$TIjo$wg}uP$zPzV
zX at iKnSyuN7-MFi!Pc(BrB<u)X%5_Z8Ij+EbxTU(1cfu`Ghs7#7$hvGu>kU+hyo>$u
zvCqn>1`xY~@VW(EGFxgZ6gX&Zp~(!|@9wWbA^u3nASpQrMS7DJdf#!OmGy&Vj>X+K
z<>S9lx3FznYP4x9WpTI;#WuH$WH$RYIBV|a-xlzfAr737tFMT?%g|7&bq)L5k$<@C
zP$_I%8!D_ at aYkef(TAbZOnA6ss+j>X^H|XQoYP)~4LrpV&Dg*iQ}l$q8rvBtwZncF
z=J#(%`0J?<cHNio at Czk@sMF&0DZteSnt$h`P4Z65?sb3Shd>iKc?j_x0RAs#^#6pE
zZB+yw>cn!${0gO_+nt#m!!LGMCc!!XFpX$QJ<hY09r=!1I8chdEz|)GIP{9+P8*;n
zSIAM0eBf)5rr3LLFhEwn?h#9-z}FoyjBl21^Tt(j>OK79o_PD_18E(jwIDV-S-B%q
zi at r)w8HxvC9rZ;cYbn&gQpx}sA9JW<#`VFM2^>CoeUnSnzeoB%M(+5IX68p~VSLMQ
zNYR06$r^8&k>df2={h%y(rNtsGnpeyZCB7KNZ8ta26zSKjQl0^a8aJ+NfKK2)f!h|
z)QT;u6KT_v4Ba5-dIb^X87TyT%^YeZ2SPCG(2TyD!$D2~#tO%33(OJ-)SgW at l4~LI
zt)$8*nhFZHaS!za41>eBT7^c&ob6H^pEdFB_6+c87Um9C#x_-An`Sk(?yCBIMg=x;
z9El+Kj%QgE<%uk7#hhAmAQGdHA;sz-xVK<{a25D*b0Is;%ht+^)vM7|qDGgdQdGep
z??wJm at m$!4T-WguydivBav8CQAOux at Hkor4dQOWbc`oS^9 at k%Xk)4~yem3(9vNe8b
z&vJycW1{HbiP<<UkUHRcgtE%2PnU~4;-3F;L%DjUa?W#P-8psGO*n>yC+UXF(b1mh
za$}%A9lPA!7N0$v<Jn405Z^JC3CfU at Cel08Lqx0o(aC_HUAl!>Z-N%GA`+b>Qureu
z8Z4?H)LZO?Cn+7K%Xf^#7ipC`;t8*|G$-kR=(MLz1n#LqqyuHhb^&7FlzzFSkIEZ+
zU}=cRN_zsWmdx2-7E<l#AeFcHWuBj;3)pT_hQ$1SMqt(CSoNmg3jD0{A=k!lcji?E
zwgz>$UBXQswHfTuQ$QpNU_CV{5v|3veSTz`@xHlL8E at H2665m%q15o7WU~eb(;5lL
z>>%%YCvOp!HK+SX$`GD<^y)XHEq5t3OAZ!Sc*H%Jwjtw?$Xji~pRm}cHN3I6aGsKx
zmeQRn(5pC-BBWEC+M`gM88AYx_LO(dm3QXE-NJMr at fktK2Q^<e^@<P8gG=UzW5+TB
z^K3q_Pr>WgJ#JrQd39<gC4r6r6MDnk=D_`^2IM`h>*-8 at -u0w)9w`QZStZ(H&;EGL
z83O+ at _R}%JZjy(r1BNbi5Fu-oW_KE(_yJ-$%!AB#CYWmHR3x9RC&yG{Naed&?8*o(
z4)^pM7}?GObRznVw}Bu`L?hL}QRBfj$SR$mwXs)FMS&2shfMu^<|%jp5N%!6&-LLO
zHTb??WG$D;T65?_q-+*Ol&Usdi)QgZ<ZNbO0~}Q%(PUl_ZlHGL-5>PEOoVW+|Ay5L
zr2ks6G2crNgi-z=l2JGeSvYK#9!T1xD-xm{0P`TV8yvhe&^^FTBZsJ4GmMcBO+ at uK
zT$?>YD|Y8+Z4OCh`ZRmrZ*FtgBSO#qu^<OP8?BCd$AGLWZqCyo$@LM4kwn7Q!=#oL
zM#M0%dFLW3DJlApbayqEz(_ZUN5A=8aqFXA!xkonNhK at arVI}@U~x$Dg7j2zTk-vk
z8g5svLT9NO$~GD>0oi3i=OTt$G)fLc4*VXd{;X8No!0}94PI(ubb*A4(8y!>Y5x=u
zN8#%L|Jm>nHtxGUv5~r3VNU(`?EkR}RV}z-$Q?uKJMFYJlFIAlO5=P{zb%!hE~O)0
z9~<<9cJ?(-4{2*xnHe(yqXU$lr+5t7Thw8hyXVWuR0)3Kxco!Y`*%7*E{$xswW7{p
z7ZO+z?QoW_Telft>u at PyiH@HkvZ!R|<r3Xa^agUObjSbJ%Fq(WCPfIY!Ui>Q!b}wM
zkUiqidsA=RLjLW01$x9$&$oTUcWJ>ZAmQpZJMwjE7@?+gfqMd-<go0xlqR~kcISs+
zv?xl7OXOvxrFOK;r<)(_17jVPHNMbLgb<QX`1$M+akV7Rm!gD#=&9$pEAlHVV=agY
z(f}1)OHhG-H6qw$sxI3Ya<c!DaEd|zCWho8tqE~<i#V%wN*!<gcw06tQ2O|wIc=_b
zjXyY{ubX1b<w8pb9m~$Or#&^mqGNiU+PXalrFqIyhM(>qI(>P`v@=pN?^JUg(uMZG
zYOBMMNWXMKL6Lj0+;CZWNxfM*BfC$Yqs#h;WYPM76)=8=g05=Od$pu1cz<_BZ)R2d
zy%bLTkdDZbttoIS=gHSfgnhih^JQfNd!@9HbId;Bj;dadS)~eoZy?rlb6Bdu3$rM>
z-&lyqoYLLd+U_+w<!9E-{|*d;NcMk*PqxzBzd#>Eit9BQ*e6&o?Fv*G at n7kR`|Xph
ztJhSPaAo2#_}!HbBVPT6 at 86X(TFSgmOWEQErPkGM`&)ul)DP#%h7|t2&{kn)s7F at I
zoW at 7lvB%o#l>M)~#8bX4#il)>671A-HS<18{AsJh8xSJ-QoQKQg!FxO)6h&0K_B+h
zsz9OZJEJjXq$Zd>wnqzw<}oXQuJ7oy6_^JhGtCNKy6_Cw8B+!!c}MeN1Wdv7-48nr
zQf}EqHKmj)Ju$vca*bGaRv5 at u6UDq2UEe)#N3`%WtTN>gcnyQ!_tZu|>5?;8sb$3V
zWI20npSed9$Ye1eLG_UTB{nK<WgzBAGQoz036Xd|{VFRUI~?r48Pj}H3Bm{F(!OzI
zr`nzCb at C9PX6M0+3vAOdjqj8wW);H(eG`YC2Nl~Cy}Dm9m33qz7<d2STt{3;>6-<{
zoEHH@<gmdi8_R~doRQGTIIdx)mBF*Yaj3ZaG96H@^s5aN`^iWa)K46;q1;&vJ76vy
z_%!rC>f$!k(Hk}lJ$_fu%bbX+_fQ4BMTQApZz-#(TYcugGuBcwL`pwP$?K^AyT{}u
z*_NcZXQ;iUm0^)^-$(s+daCxezC=rbAGw?#kH3<(+B9IgWsb|JPgbvAO9&zIE2Kr5
z6f_Km3V1A{C`a~8RSoZSF(&tyQExNMd9|qK;+30~Ykn2D^fEq6hhL at TH8d;Wj9ic$
zMTT9UD-#`4&h;?t)cZtFC2(V<!GcYi-~v~kVE)k?yd=O4Oz9DhZ9Vnn at P<O<M+5;5
z>CHb-oeAhA4Pi at F6LIX*TWE=hiM!vAWb)01%uvpFu{<;s$#7vYoHp|%bL|?D*7#_Z
z{6YCzsWIj2<L=+TdCq}&6LgG+tgFojcBAj(m$zTv)}ALnwBL~C7e*W#O4ya%?3
zEOjOiYP|kD)*<|KiWMLM>kLfo6_O;2Zraeu(l-j at nn0J8Zk`iK)(~Mox3DK^b;g!X
zhj3$fkpIx|xcgP*K6M{uO;kBOtCaTEo4!OV3tn{ws)rhR7143)6bP?U7XkK;YQg{;
zun`fAy|6{)GChbgKfzc0>Ao!!P!L&lcyEs+PHx<B4oX&8NSxWwis0Yqi$B00zJ1ph
z-PZZkXZhCoLdo7zsb&NEnOlJ8(Xwsk&QTlex1u&ffkl*LP+jHB(pdo4-a^EL<W4?T
zp4#<*03Fzzc0Ekd*HSS<(dJ1<xD3xdwIwp9;isPxj6>9Ie70^OqYX>F9k$+949Xd#
zj|ar8_?6f(Jurgl`IAvp at Y4es9E7I_rxUBs1d-PF->ajdM&c0ywYxD6#*P at DI~E5v
zlzz&BhEy(SAzc4iAoP{jEKv3+&kA77yuXA0{C)=4hP-*b%V;U;-Pe-!FpfV~SBO3n
zNS%yFZIez8?~!rBi|6Zt(G{eFcWX!3<5Z9hq*_KAeu8<89!x6J+A<cum^!;8(+(Od
zYtG+}CxS!^$%&C+4E|1q$~w-Fz0ff5zn?-G&?*kXy6C?=`maIrtbOrAl-aQ!($Yw8
z0DFu3#$CQzDyjCZ at jE+`)kQ5{!H9H at HMa9?Oco_BY|WoqtF4}>V3b<=zV7gTZChJY
z7_|Y|WpZ4{#OQYQ!M>wI9fEOHlXRqK|FF395;!o7p at zO2s9VcW)x1zaMiYI6vQqvO
zzZBzL4ebTxY|eqIDC^Zym*Wx_7PBaS!Org+bo93i-+k5skG_$<Q_CpT{;X!2{e7tm
zuV_s;#sC~VcLe!fmxF-cC)igE==WW|c}<gjl_)xN4>Qpkdk;37J>s|itS&?>Tq}7u
z#W*mPTK#a(Ps-^)RT>M8RAeq09&;?u%<H(kDIaW%-2H4E49P8Tg28LgH=^&#-u%_8
zG=X04x$V27C1*kvB$pCYnAsBeKNq`|M#Sg4-3xE1ezaa<%hJDNdXs2(>#dl5ne`~S
zp_ag#WRy`Avs4BHED-|4iDJe}9t5%JKREo7S<f at Gh?=?<=*x4wSV+*Rwh?gpqu!-O
zfb%*}u9h%U4_4ZDNq7uPpB`*_`g1^^o#Yy^902&wzW>t?|I48f7kz|G0N@&+`anVF
zzx<>BvmY#$sXwF%+*)MuYe5ov<yPd(_P!FCHX{KVyudZp9{Q8{bMO<flPsx|u0uQy
zhtfaNlp8s8Y0ft0_#)u%Mts=S4%D6K<M<W9c!<|oNX3p`qq3*D)JvFjSu2O#XW3Sa
zwn16ur%@2}HoM87q5Jdq_Y~1U#gcax=<`>|<31FNFCFY1remYPND9|D_Vvqrmlkfr
z*A*jA4Qj?x?`EUBX#-$n#^axtN8LO9X>-CVrjv)mtmDf;D_V{SaV9Vzy!gb>M#5wz
z0rU=_(*a}Ri`0tutrFU^X7iws8qmp&bcZ(%_{lfCIp2Ts*~I7Q2<Ch|C$~H%cU%~B
z94iMaA`r|6MpQOV3StS{rM&}$#V)JNOhTwEzQd&@zM8mnwn9!_!2c0sapNwHCC7?I
zRGiEw7+Kkq46mll`>>xL_&No@#gwS~?(LYv{kGMqB`8j6lZj7EJYQ2~Zn??z?%4N<
zU5*0w$P(*g`{Eb-!Rg?38D#ayvnq{My;s4xnK{>-2-7{~V<#?Aekws at BhnMO5m+x!
zDM4t7(7>@q(&;#B(cpaik-*Qeu7O~v`AMI3<EA+p6|`e<jL-}!Hb0(5!4RO)cI-rd
zp3rlg at D8IwMASp{DM_xmDnDp`Msq~zKK-hJ4T>+8GJE8E$L2D@)6d;hA13ww8BJEW
z+pW99WtC^MBv-u~5sTvPcnd3=T{p>?PPb8mXI(29h_2Ohpc{KiK~s-j8(Vc}FLTqN
z1uta8mM at V%{4|)AV{L9+kB`xT at _7WPj*SF2P3`gtufV#>O-eKj)z)Q<(l_ufzl%`o
zj-iGEAKw{F+ZQ)KjDP#kEco!K- at w<YIOgi(4<9D77;Z_r2bv?ZjQvNk{?HSd=(rVH
zD0LgJ5mhW(a4F~Z_(=qtT*KN)k3i7T?^=AV7;4ZZ$RA9(43i4Rh0AUg5{MnQg+GNO
zoa7hp6jeY?=G3o^u<?{qXa||lDD7yaW0%Z66|qx#g-3D;jpFyW>m4Mg=EfVojCfu)
z at w#G}k9#)96#K+z^Rg34i8;FFl at TOh&wIx4us`iZm6&r^tcJ1LoXn_FNdU`tuK=s+
z1N?CAYBeLyY9euMqu^qXcas)3!>Ut8*B*1iJ44~A at b;WA at L<qMX%G&`WCx5i%$*0~
ztPCrhRN4<JL=P0(74&PIx+{1MYf3hr=PuyG^0##Y^SKb*Et{Tx%n{Jeeebb^F at dhy
z;+UqD@)OOQR<&5D7)omwfpS<Ol*sOH27fu(KT7gD={qT&N4j9qVkbr?gaerlIbWrg
z9hXeZKOj$lt<}Fw87-u+eB0zzU_rMSEnh^7e++eHq4b^ApvamY^AQ~Kk>*F(=GuJ{
z#*ZJzeHPcgq71G>FPe0Q4B~G>#7A>QJ1v{XjUifJ)atD_@<^R)Nw?O5ur{7kv)=vN
z2024I-5QyA|M$6esG_g1%G$<7W(erh=Du5^Pr<)4JnEihuleC)2XirxkW+0j;Auab
zR?b#WFi=SQRRi6KN}$lSU8Zc*jPI@$8wt&Mh<zUD;Py$a<0cs1;dEu`gWirPhFLA9
za(WV8=vl0<F1fddi_aCe2r$N21eZ0 at 0-HyB8NW|<!jUK4Ez3jG!9#~G1Or at fu<;lw
zKxxS3kGbB|OtiROx-^!|3HN8B)f4;pS|f}gP3L{ihbdIo$Tn{HaOfBIpAXeQTL^#R
z$7O652ieHwRO{cYV*&IqX&1bmYR8OHzSJ)sPwt_fjkzNmMPnABg1?O^+9wm2{19oz
zAW{XbJUkB`JyCX6)5+X!y*5Vd=krQFUn10D$_aR0DW<*~`3vEAe^Xt at GP@!1CSt?B
zhF>+U5q+Ud=og2W2a{Tm7G>Y%+I-mXuw~pBL6)o|`J+JRh}6Wfu^uQ;=EY>KCngjj
zkUs`sQzx-azl%eDY{d53*I-Cnk+}`zmj3)8y1e9+inbRww#TK(ce#z0<iMm5P-2+L
zeQ6NZfE}fIu~^La$9rU!B1_B9)h>ySZZs(Ixu>%N8U6!~C0}7nbkHp5Ttt59!au-0
z$6V*+uM-BL8I_kQCEx8>0|vacv!6KDA40Iyoz}oOQ)kcB)FLglz*-2X<(c)>vEouT
zg*AmUqvp at y`zo(GnH#PbxAz at s44CStvrCe>8b5t>8qYXW1Zpa<H-7Sq8cND93hqT!
zJ+hBem)W13N`W?ctF0~WL|QX?j+a-W&zE!$mGiJL8~YDe{4DvNG%~uNzU*n=vRLo0
z!oOpiMq&_KrROeYtf5)A_1TwYt0wyD0YSQJ^k=~&0_m9A8DI2znCYQWzqCY5j<bt_
zRIk8rz<3G4JKkz?iqu33QC<!=us7j;+33MG`A&M>u+OFu^gtX2zZBtcBx|i=Qj~(5
zRd=qVTnoDgr|Um;6v&yfpJA*;gRZqB2&p`AxbdBWdC_I-<LmTY+^GIK@^7orRZkL)
zco`6hYc66k{^~WihO~RFJkoT{gkQt`z95Pw%@EJh(DUGEVtt}`Q_AC(VL9sdU)W~m
zS1K<qW9j`uE{e9h_*D^)q=sSd5YB+kAQj<zI9DKvb9vh5;*hZsli=`k8rGNI*+X+z
z^D6UbMm4PhT`||Rp17GXAY9WJL|1sE{s>KrJzSOO!BBiz)SH*%&tLUs#ZK8BMERPS
zTE1*-^PmdZ)<g~-2IB<$b`ilp!9i5AangLWAx0iTY at L|}Q46?uklK51HOX>KoC|Oa
z%5YLj4K2yJhuD)~2fX_kbEK0t#v7oiHe;_)g~$DfMaTNK1LJI|pt;T|p)Z(D!^n|6
zR65SjlTVVsPF5OV4VBY<O7m5eJ~&bL5a-9Ti8O%v3VlPEDh0Duu^D!~tPI3`Cds-l
z=&e89FKWyBL%+Hu>FF3&#IrGayVeF^_VUXJ4{Dk0oJuvRAian9Cm{Lb$x}lk%F>C=
zUc!mnCJuk{5#5ja6GrPJ1HS8j6D?Rts-0!mrpXPDE-CG^7rHyV)jB%r<Z;CsAsao2
zo=G_`Cf5 at KYc$X(nz3QbL~b?>mdr({92)4UgwC!VRh}@fZub22G305HwjwqpXIAn_
zCEn<<Hgos-<l)@z(Yo(zs!ndbY!e$CBoW^(j~H<dMzD?52A0+!iZ#a>Oes9!&RmS^
zei&}swDXeDUg8 at 0%yJ1;pZxrj(#1Eb%IT+=oNK_`0w`=OMM#I~F$&bj=m^`vKX=Aj
zMtAVo^gV~b18DG23taWjFv5bO2PA3RGEq>!Zs#*G;k^}*&BFtNGYKCozwpW>?y>Ki
zCfX<5Fe=ezL);9?@MK~OzP+t6J at 1#k@=AokFi*J8GXNV_!K<5M-O$R#&W2Xo>;hL8
zv3|SYk^$M4wN#=h9FhcT=>Y%D;oQxFXVcCm4s0szGxO?SOD at Gyt$Lnsx}49IFDE<u
z`(sl6cR?8mXxuUJS3c_hy;02KMc<$C%^A3{IwTi=yqd&fQ*CnR9cRb3VmG(Hf<y1X
zk?er>&E7B&w6dzu_V$Jlg&i;ggA-dx3iDuG7C+3;bW4&VYCL+c at OuQtykY(KCW7i8
zKmGxx?x;QCs*mw<T{m^fyLwsfG>~Tte+?in%Nfkor?f^2YwLZ?T(J9Gh>E}ekWEfH
z_>;8u7$ei1E%Qz8QH$F{Ix+VJ^Pu~Jy1vkQ&|@D};wsQ*++AJcvDo1^Dy=Kd4u+H<
z(#>CLpVDP!P7b;y-z^w`0lJuxw#~V0E(=!WrGFs3Zu*_$lHyM!lboU&<~k_!lX at zn
zqnvs_^_u~ox|EnKgbmqY{3f9FY at Id#x{`hG$;mog3Qri29c>BPo)3%q<6?pkotNz|
zrxNayvBjL+u<|hMszK?wM at v4mc5Rw;9u=#Yno)F!Jc@~0xoZ}-%4(p*;3wFr>o<>E
zX%evDr2x(Gwf~GtAr**X0PJfJUHk at 7tjWl=Wt{Ikhg@*!haQoK$2qFT*>;;RNuGn?
zom2OVTlCp$WDa)@4N}-t1 at tQkGzCCFo>b=4FdcNOl$})j>?x%_Sg^G5XRP&^T$+mu
z^+D6y5?5bcF(QA(uoCyGLW|AfS7th62R#i4&{Y at S`9Vh&!p*RNUwid6mtd7`CH}!F
z>WNEHuen at B$<g7^GAwAf(i%*3ZZ2E5`~8&B0s7z?n|3!cpLzFiRnprx6}G<e{i6SE
zqi#r#n*8T@*gT&wnuTc?)$h*>e9RRV_aSqw-<$QAB0YMt8SNrQ+A at 8i4B~Bg<FqsZ
zqSIE0FR$6}xY=*IU-A*!zNYC17XG2)5m_VcT<2{wlBSeK!A at J9&0t}`#O{|dRYH1m
z_}tsP`10^(Xul-+T5OIQZ-CqpG$KUK2OUlz;Kz~}uM!In*#zz5kYOttUp6iaKO>Ve
zYF7!49>Is5p2DVS26vMvRvB|*I7H>-E&&gfR5}^YwJSvciz)sKxH+1HdmsXZLY*ZE
zCfv0FPYVSvGgI;qz+O=KMXrSkF2S at 1b2zp24eA;BAcxSvU5ZBU{%+H0kBKXvI%auW
zIn%2Ctx&r6``*`SqzF&_Vw0 at bQpCS^+jxN`)$BZ~xxdpdohFdvlFkU^W&5E^YBz+N
z$BinUo8I>cLhr}rDh|V*x_FN^P at m)D^3VqA;9H at 8fed1ph8Cz8Mx_n?j*{g$r%?#}
zP?X4<;%6=9_i%WWx9~E%!_3(JqPis$mz;rZy+JV#Loan}<yb~{ZM5S_lLrz1ntr(d
z2dgqA3g9O?UJ&YXy at 87Cg70X@ba)H6G=KWOLR$sT=Nikku`F(*=%@Z6!X(ZdrCD&r
zB$I>@jPO2hVhp;`Vz1nTk!p4_9xR#49rckNj~I*Xw&R+A$;Ix4{%gYs`X6urJ=3ip
z8?t5R>7$`n&K7<v;@ztz><B>~sm^!*8kjfEyli{!*1Ne!FBsXKhqMs^WyP{p8WS1*
zYYa2I+O_3-CdyCms3oPGI|KuqkPnvFmG<YegSJM`9Y5c#->}r&-H;Od7t+K>Di0j~
zd}KBz>x#_agRt7y76`;f2<BCmG#U3<X1WKN+Y~s3C)tflSoy<7L6?c^7jx#`O*W&(
zr>M-8+{1`W>0fl<Y8{(rzPjXsy770zN(~X!)16P&Q~kUkIAou&P7z#MfuD at m^((I~
z<pCzZqjkW`mJF<2{MyN1D92xd_#t4zOmdC*{{I!O`9B+ZA-4a&B^IMqSC?00FYsJM
z^TXl&pY8Li*H9RdXuW)bVw=yMVDaIiy4@;N9Cq at k{P)@=xd8^|!;J9wNBJ_7*3H?k
zZ?t?nwH$#oqI2`JUgfK(`{>0x4VHwDVP+EH3oBJWc;j7?Fn%xm>Q!5WlAExTQ!~FE
zpe>QZLGZw<Ny(@9<7rr`zBcGd0TaUH5IlYB<2YMbbLKKx0q4aaENQC=*OCNycyD7F
zVvC>1D8LEa*JYyIt&?a+8Im`bX;3}tnLOAVoS;<7sh?=wBTz1r{3jrGi<@XLWPOK>
zW}~!veRRS?<`$R=^)v2#ikc^Sy-g0<-~LVjH-O}1k8z(D-Z4E#NmdUl?UvSi3ayZ0
z_oFu=_vo`0qKH%qbnj?;QfZi_>x6bse2@|ou`}f!ow4K~e9pU{nYZeUbxOaY)rWV&
zqn68sC|uQdF-(8;qtwmcAIob;-Yb1kHu5(o^Cc{|R;IB5)~dPPgTv2{`y=M+#ko%-
zcU_-?>T*J*PB7cPmkN!lD%J&Y?mU4rva15ZLpj#xR!m0nJWmxRJC5>9voD?_dEPwz
zIiMiLS)`;Ble2 at c{Us%x2`UEpb=3W!n<(x+o4R$5(aqeFYlwicDbj$|ab3XYA-b+|
zlHz(7X{%z})_7V?XHrA<sh`AEm#FDJVfN8|FKlk30S2K4kLorVlYa_Z{Y6>;lltW;
z8Ha+TwCV5_AYyDR*I?oCg}1mgV at 7Bz`zQArQs|1j`n~xX&7vC7y`q$lZ_xK{dz<ve
z$z|9|GC2%RhrgfReu<IyU*cf4u!K;)!yL<Ra9V&)Up at WyZJl^G%miJ at 7Xm++N_%8%
zbyp<iiO9}jb=l9Sk0?)<Zt;sCLiJ^y88UYLgV4{sJ1|huZnZ0muhB(>MGv{&E>l}X
zimpwPhZx?m!6XY!N$B5;8<XGzbl7$09La<VgTkM8#okbjd|F%7X)H{6S9l|l{vDe@
zagaG3zy>K=cSfDkBL;>V=wsCR7bX!!ZOU#wvS5r}s+RjbU71+E4~F!elI{EZjYRAS
z%qj;8`{SR!)yFlyy-rTOPJE0X1rN}JJ*(>HY3t6liIO~La8^`Mizl<89_3l>Z`^+=
zYM?(c;=*XwH#+d#?!(8qt9D=paw3E>nt1CK9*yOo1w#tb*E^`d*u#5!qJZ?yTI9NK
zWY8zJG?zmH=)DTlxxziF{^9kj>Jtqj4S+Zq$d#~fx+1A@<!smnQ!s!A>sLJx{l%{0
zY-tUNF2u9$H!r(nA5cc!cHZ%JB6C9E5=F=e1y|=!Pg9LrR$L7E^ZMV<xl!xAE93sP
ztQ^z;6($|tp)xQp<+Qe5i5sI2T9P?@1#JD}LEej7H(edICf3^uMwg#4VR}nBdbaHY
z7<PI1Vxqi^Kl%K5s*ptJv`<M@@u(Ykw5+*@?~Cpl?Q$_gJvbqFZzHeUiAUk;ZtQRK
z?{Zl;8S0sMtJ)q!-70%ZyP+7GQ1+>n`rW5&XZ`E+fiI>Nx<_n%FIZq|3`Smhy|q`^
zc-^Z*KOFXWnA=F**!8BPB6ut_zw4IrYw~B04YhXyIT>HPz2 at rLPXgUv4Y0h8V@6+L
z$ex`Ak485bV*ro_#*a#!&b3Ytn68sHz3?=1^4sL03W2Nnv|j(4?XQXq%(&qHk_pM(
zp5q|4`5PI*@w<Hzjf6MWnZcqV=X{%Lnvuw&na<gsD>Iy}l8$r*_NnhYsY0qRhDX$H
z9qqpQL@<_v1gf{F)p-egs~onf_cq%;*aKX#c<5&O`joB at WV~6mYZ6|oP6B(V6+Vz;
zzz-c;aeuq8b7deC%#vH-^yd2CyaSR%TCTT8jD4GQg9j{4i4OFpL;UNuXC#<Y!&$Fn
zKc7AeOL(S at 0bC7@mo_G+6E%N%*G=C9zE#q7JZe-jY2nY~Hm^5Eu;x(TEe))bT-;*%
z5$ePRG?IaHPou2g=41rA`e?U(6}ibOVBGs5eTq+o0ZE<YuyjZCrbON7)V05PQEb7~
zVh;|pM0eJ9!s7w}W`|!`5Z(>9F7R?)xD}(>(aDm3yH3{;(53-Wa~99LVhH7DiUiZ9
zT1E`yT=D@|t1+aRix*iucdk^OJ59$<*u=_NXY)p#pv9ljR1Qm0YCv6Yed;iT&J|5i
zW%?;|&RHLa)YjKET*djnX?#I{L-w3=Qfi%}QGDE=R0_8AWb&V7w4Bq1#%FS-;qJLJ
zH>dn5f!@hwg^S^A!Y5O-)hRjS at 6a&kv~qu7oK<2BZE8AUV)?dF-*0*WjdeZHd*fFC
ziUb%df~ZG~ZA!JaDPRT;mRoAjPK7O<68t$<uGju_!&4rx at mG<TAn)S*l3c1?G at g1G
z8S at PCLb^?V6G|K$t|QxKy{789^3Ihy29!(J$2vqnUrdm|rW?pG?u4aODasIR+}ord
zhkTnHbDarl=<F%1)R~Rxg6Ll~K-%xoPPEOwR at 52~N~*mcsxI$5gNzXC9rDu+H0^-T
z4X=;!IIpY(nzS^ri?W-+-)=G8KKYxvVFSz;H?&c4GegGzUA|`K?+MIwcov^#=IqLF
zz7Kwl$qd&_Ke40pag#~Ip~F~qpw|^oJr-Q=VdFzsn at C=DSf|Y&z~KGyR|d=%DF5=+
z<=^@3I5`_y|DBNT;ziTv|IU>A<_$lX`{qvq4)FCVBbof4v<94<pJ}4N#0Gz_Aqrxm
zjlb72sl~rj3P13C^<S^X|97N7^9=a6PrUh$7v!rk-~X3I{)_bg#gzYVT+P)^I)P at T
zBdq at ZDztP9E0*uGJ)Fw_uYOAflTq5zNz0vgJt2^#rCFn0GBRcea4H`^{G}z@%net|
z at VOb;*YSN<eS%nLf?T5#f3DBx3wPRNN_VzL(2bd85*E~&e7Z4zlY5wwgR-;NYUgtq
zZbp~nB4g+;(B%8ZtTaNZt5+yps1B)A3Sk>)ERA7-v->TE_ANEIg_sRY&6=Qt at EdB<
z&SweCrLiZkcW?Hq|KX|UMKEE<B#oxqaaIKK3k%P6gwQ7{nO**AX^;Ix8M)5T^oQ%|
zzZbu-^H0-?v0p?s{ex^%PjkD#8M3*RucAAMix^nk--rl6ZsJgZ(Q<(%aNM?ydHTWH
z-!8jKLY!XWVt1ulBQ&Ak`K9V3L27v*F(ka(GoxOt?5tU1=xm7VS$!8|*CqMAT_qFQ
zrWh*CjXC at aI(U2PetSAvyve(kc0D5u;<~V<O_)HEoG<-!CX-AV7;g+<TO3i^CfqcE
zZ@)O07y-5nU8(f>=@;svQgJcHn|F_QG_6{3%iT!_=0TY=(9+)l$1R!7ZMPR5wZ?9b
z;Fe6Gf9Z6QBd!piX%C(CheO(plZMcyUyqksyVIe|SU>S5KQhP$vJ>0u3qZKUJM3Ja
zkwbjzARR{+PJ%F({HVls1~(=GO;)jkjh+;>8&hq37-~N_$g?xVX(@YuO at Tm&hWcvx
zbT?%t<uCyJnN$6-a8G)0i{`fxHJPU|Blq9Qy&$aQ2m%2|D@*&5giD&=-n7aEf_ge`
zzgSdptFkotZ$6(P!VBP0l~~4X=NG)E`Tb+ujuY?oudVIIcl1f6;jv^Fo9G?R?D3<%
z3T=DKRQ00dz8wqZNOeSqg5070x--wTVX~e*))?h#C^vQq!jBu2s*ADrzxZ^c9bpU8
z-j^ZlxE-bhXA-b-+hieE%}>5;<1`n$5A=Ed$n=nL49T at 2c3=0y$Fk at 4nL_dp-n2U4
z?4KgsLZoV)XI2y1-M^X308JNlpt~g+h&~NX*OLt=lNRrr9OuT-vs&aKVggv#vWm0c
zSK`zQOaB!MKt>ek+KjZ(ey?|_5eK_-y-9R#K0a at HlLR7%Lamu(7bnSDyM{|ifbFGB
z7+mc5-66 at JRE>Z5p_wt=u232Qg~YlAED8F-m98Y4xnkVw7m-+&T36ggbONw-iT#)L
ztf&fr<R@$A8GABS at 6QrZeYaIifd0f(;#?7?lp-WT-}M-e-LXQ}kqkG5jYPj|A*{_|
zFNVaj&u-7DlyH%q;Lqg)|8vFq-#n+(lH3l!;WN_s@~V0H(=M$4NcI4xZ0n(q5qQoh
zNk}ws5A{4(wnP63Ni&n)nBx;P#p~1v-vXa^4*?(az05=tl<EFH>@B*My?9;xXn4hu
zZ~kz<lChO;A3eF;DmUBcQKbAg-3{a{aXfjr<BUY$wX8pHleUIJ>#nlTb%!?A at y68q
zNws2PfO~aunoOdbvaQ>0A*uQu=bIzMTq}x2NhIq0Xxg^#vrmb1q`a<G4lzhaufUrE
zl3>${22$Q$)NZqK`LU_bLgbDeEQH?w#wL|Y948fgcrM8P)q{0Bh9>ylSI at ZS6-Bt2
zVU(+Mrw{A3clsw1+3Q<OueTW$#ElQTA{1HG at 3F^Te7Jp(m|&(pG^+5XPd%NJnk=e|
z#99>+?88<e-g9Vhp{lua&S~K`*eFRBqC&K|OLE>{X4g;O&E)XK_AWu4^`q4Bp6kJ+
zh}#s2te<P;eN#ptX49l_6bN9SSyjMJAZJBBz060U>8yPLA0G;Re%&rs6VdJYss)qp
zTQj30ldyIflLkMU+dRX;JSdC3mATQoEgfi0%&<Dgtx36V^6(o9_P&Pg6RG^u=y>w?
zk%zPmWQ{kfFn)1Pj*^m9^p8G}*K;_Ezec{f5yCmyz)@3;WDWc>x(QjPD^<F*2WC88
zy~*WM;;;XO5$kp59kol3dIh*b^AlA~oo+$iBsJb7PNp9k+ee-jJEJ?>w7om~pqijL
z_OKuPE^WiT-|=qDw9|e&#C%{oUy~4`!ny0eyL?|ZJt)TICx<t`+>k6Ij{YKl!E&Q4
zWiy$2VowW=z^Z(!BPGgfMw~rQiWd6#mWJ8wqDXaJK{sKL-jVYIwZ*&k6?cU%ex7h5
znF-LMbW9YRvU{+Me%}{9sC%vfrj!7k(H!wyZlKhyyysgoU_q_lSGv-Kqyb0wkZ}l6
z<rqS~c at Y_>S#iJMbxFsCl+W^UBD6NXj2|9weM+G=OuXJJD4Y}fJR_KszAfy9#1`x2
zcf3l8^q)2uhg(B$$>!MJdhJUO`xbxwiTcGQo#*52qeEURj%Q4Vv+Nl1KEGf26_IB@
zSS9=U%A4C{pHjGCd`eG+$3xEw0(Qb7c}4fqufKkEPWeNYL`#HC@;y&7vip;E2#Fp*
z>;BC6hz#@Ig${#4EO1YG2A9n}axnE&XZpl*ye^}Nd8 at r6yyo#mpFmrCUGpOAmsb|_
zV<{PQbR#%4W{iC$rc_C9Tr_!B3d_c^I1Sb*I>@L?_Qze{J=97lGD(@uk_~Y*ma0uS
zY_ZkPE at W;}b^Apd15<b=vOk<#X%@#fW86 at eK|TDd_nwmokcMZ_QRXL;*A=@bP7rc5
z4b8*dKOcTim+8YIXWQNq at Tpxy*tUTpct-J=<)aE(UC6z+isKEOJ<zZ0565q%Hhg}<
ze5-nKGAMA~$!bOG!Swfcq|-b1E=M at 7c}%dvvOi*PK)F2~LUMDCMfaG%G2(|lRq`ge
zEYu3s at 9R7_5T%?u``ak*{r_O?t>dElqPNi at 1Vlo*gds+xyHlkF1f at Z`yPKf}q(iy{
zl$7oUX^;|O=#=glV90yW at 9(|ud+(q3@(&*lGw1BH_u6Z(=UFw3W|19VXw(9VAKOl8
z()9j>=Q7Z3>(@>tNxW)>X^yuXT$cte$F0b~Eg5BI`aSFN);wNyMR))C(&dZ7T4ytM
z$LQ5>(}>SYlb{N6-5DQvUqo*qkJjXu$ufS6$6NV&L`IBhXy2aEm>DG at 5y<E^N8cV7
zaOezur?E+0nbB6dzmU-xtt8c$P*+oAo|Ak3tXsIoS*P)Sh{(~_85JZ;SME4m3J)hl
zF?PP!!3LS5INzomw<kjLd<OX1c06!mgLkv%F5`9PJX=|RJI&g|oH1AiU+Tx3SZJ#$
zg;UxcI%kXOu{ZB5Ysp;Ko~Me*bO3fx>yy96^nQW~vWg`xBNqS55W+U~U?GHsFoYn5
z*8lz0D>~Gzn2r9`3T+K#XO2-W1<^cA$6sGFtP0Qjj6P?vPyI>YOesa9WAxGeFiMUR
zHlAEE_9C^x$Rv$fdTn^{WX5nFi}ANu?+R))JD5NJW7hh!+Z8N?m!;KyRvMB4A2{hk
zCDP=HZYx$_8;b-h*;@|uSc5VCFV<*i<5s9?Mh1nkM33_MAA!2_Xd4Dma#v^LA+PGu
zQxxcYc1U2=CvGLBt_7b?d76KCiQe96+;2`fe}47-D{UB3Hxi3(sGUHH>B9cJ`awe6
z^ShA_td1Ii-u|vdTR1sv>YBU72Qphjd{V23#0GO``BBHiavcIGa*#oypBQzhUlT0!
zds~Sn8*5-dnD>MTD;L$0hXIyllNsGIMO=(w-JC4}p>fd)$=xFT6!6tlv$*N9xO%k5
z;kVaJ(_A at xX7%lJz#=+C{fkPxEyT#W_S2(k`%b8rEy*x7*Q~sDeoqdLty|(D_Y-e`
zcC0 at Y83`F^zqM4w^HBpcetW4lIm at H)_%=zAlvs)Za)CD-{#2G3#-LzE;{yw^v at q?c
zqFPkTE7~zs#OvO3!D)=CB3`Y;NKd25unMhx7so}YHmqN(%y?;r*^1Y&F(DYb;v at 0I
zG%S!NqwSGyNle-hN-me|#H~~5<QI%hlSjpA?St>MHymsgr|P_Rg!+=#5~G++h|HF{
zct&;`N;2mLb-{9*GSyY=T5D3~t#@`GTI{Krlt>c;T&zJ2<aLu*A%ZNkblW~StFxOK
za(V&l7;=+%olaHwRkb>}Aom6_&{yY3bSj&np9Rz;u6Y8oRb^rtk9^%o4}bfXjuHb}
zvz6eVI7YZ&$^$x1D5Q4Yl9TMS_zjWw2Q*x`0UJ~PS0*<i(A4W_E)d~_Aw at uMwOPd%
zOLA4kAVbnIUfu7fb-7p{tyCzYkhpjXa^6%SckxiDge26S7_tJL37);#f3|J`c*Y85
z4UJ7c7h8_05~byLabQ_AeUw9{&NN&;Pk$8!>HIJU73}K&9v!DfnO~#^*J^jOy{+YH
zN%-0l4JdxY4i1;C{Fq5?yOILk5j>?n2bNai?)8<uKP3llcFgX^-39rHhKCSflF&>+
z7P-Yeg5PH?MrzAypM%Z@$5Z4souAf!9JIbQdu}pkpaW_+zH)^A$weLJD86DZYp)$u
zGj;x9V*19}`?^+42N0pNw+0U=wT9h_&c|dysuH4AhcOuUI*sCUjz0 at BKXphRksrTg
z%kw`L*q{Wa*rJ#Uav{F&Z9#I at Z0|q5?kORCtfnB5IGiKkrdOs@&)K5$*xF4j6w*Z^
zF_io2n&-nLPC6Y`L_{xv0Q5;62{j|%+wF)rkL{Xg-}29bqV`qio$K(Q*6zQY=WDW~
zy4=#aof?*&-6`6Arm_^6Z&@MZDNL`@&esEH&)jdZ-2CIzZGMaoEichaj??$;#UWm8
zD|X!*AqH91>Q*F-Y*Kp<1AZH4&9|mygOr35zlqTGUC$eL$fqo#y&Rf~Znd*nAN2H#
zhq9EkvvegCO#M-DuehWmHZX*>xWAN4a at s)&W2?l5D at 8%5wC%IMUr%ChtqTRii_#T`
zl^MWzXutVT<J6|h(B(@8-KRhmr_YRdKHI5U!{nOS`DzM7wI;o+;=guqL~)TOlseiP
zKY3hi*yZ~31ZrHth0IZsUon{WXtdgzuDT`)iFy!z0+B7oQ7M-`6=Y?!wib2G$eZn!
z2-$9^7`9UE;Mlj at R76_d2_c`Xf$hUFyB&aTrduIxe3{;B(DG8GLOwqEZ7&?{f<)Mk
z>dmk`n!mXR&hy7!O96A`J9_UkX3722uReU3lavg!xx7 at 7x&C`PdAa{Pq?jK|*HVAM
z#B#y1q8WD?(-)Ku;2sGohFkhG`iSDbP&MZT{T@`r?v1W=8#b(YE?xMDrRtqd7aNY@
zZy4L>#H#Pb1a5DU&hrNjHe(?Sa7C5hV)?XTEI(Kj=egq<ZA!^1ilupfagonj!^_~I
zrLP8k_IRSz25T=r_nMKX30wNG;oK&=QkrVseO<@gSMhHit at O9IjPfqLh$?eiRJEfn
zvHg;hY<S294;Qepv7sxOJm`Kazm at bh!r*5IkAySo@*86tZ=9(s)z-JX_O_ at 7m2VBw
zixq~sY+A+eu}ZJ5V!3LJT4i~0shh9nZB)JW9iO__fd7Jm)@DEz?8mJ;ecE;j2g=f|
ztaOF?9QVKkTY)-t!N9e3CqzE at l)FE+`^nGEC*8+8Y&Dadjx8OuZ>RWTJrG0rVQY_8
zFDKW6Akla)(g%IBHv4z2DveXCd0w?>Qoo(EVwH&R4qHPlwdYp~7Kn~>p=x0JWXwX$
zsrSvTE{jfHYQc7kVsm<A5{T7j9{DY8-g1HvN8j|gWs!So&#L2|Jyb=gb=wLX^L^N%
zX262Y5)7^5$AHCqH?#esH%GJA((T(;0Cs3(8-9au_PIlBdfZ$d3lsk<ayl*sZ0ed9
z`4fz0)nskg2f{5L$H+j5+8z at 9%`>m#)khE4ewuMB6io2nHvEH0yblBeK at 64XkL_(n
z-^-OyeqF-cC)=T5-wxmcFfnKO5wHKE at ZUfIRSTtuTDR<aEglm+)J<c+?|@KTaND-g
zzc$hTZiWjMlT2z&T_5^%E|p~ZADgyS3e@?vPy(Ljb^9ONHa-^yVAU*O%x71Bg%hCF
z>hT@`R3|8Q3uxl}uQQiD-2?Uy1U|a^KfOa1r5|{f?tIYE3y`1qt#I4z`CJmr{gTF;
z-yP at fdV9%T=-_%!=IhX*n*dB{Q<<r0>;HV_G$H5?n!2*JWieE8kM`!;$`{qa#U=Q#
z{Wkw}`rhMYX3AS+s4?vS at g-BtqZp8{r%UjQY*cZj9KAeUnf=@2OVs+M>-F9Xzt?&%
zW=_s-Fl9*orze&d#osk-M)jAPcD?x{4gx8Wj2`b^+zao#nvK|dA#m6lnq5V5xzGjj
zyS(H)xIefss`(PNouEX%sgT5eRC3`Lm6u01?|az3a+Y4MT`uZHN`2!of7z at Qb06+^
zJ1hf)Ht3mLZsOjxJDIH7`<=3bd_f?ev-G9a>vi|b%Y?_#(Y{Ea%L3dxvda~3kY@#A
zZs}GBF{9t^hrYy40FnY-#t4Yr4GlK>vFvu2J at PNvygEyW;h)-^=yATeb8qk2)c-lO
z78KgfzO<xXW_nJy=y!iF<#fgBOS5<nTe`u$Nx8+i&qIoijy_uS#%V)b&7|(8>4E=R
zD1a360X=PMUX0*_eCd%pR5(R1ukB0VXD5u+p8e-{=xrG3cX;|Eo0l4RsKj&_$uml{
z(@u^~PRJU;Dz<ssRL~Pt8JTuTycVPm at i1r8eu)PC_IqX@!R$5MY at hHvZNVjiO;I7C
zAIo%ptTor0F?Ww-WMnQ+6O;g%_v>PhiFR-~!v*<^Q{C6z?CD1rq$Iss_G8`s>RXn+
zUfJhy#L+Q6jwgn=d}R&2JHGrXa<SBQi5w$#hw|_`XMaXB*RRfdaBE|aao0t`l$4$K
z%h^ZkH)MBn-t|L5!t%NkyMR>xC4T=C$stt#msB26e(vSRo3uwwrvdCgI;?`1kKEU|
zsBa#|SHILe+0eUx;fH-6q+hCg-GhtJ_8tJr1*&<3?R~`P^8IAg4F*jgF0c)yCa)!T
z#Atbfr7SK8{Pmwv8gkxSBW8eNQ`j;xeE#4ekb~!yE8-4TApeY#a^+CpZ$<z%Ar%Qo
z%+2R->y>_Dh+Gj^@#?&|>CnlcFXP~XS{W_q<|Lxf=e`w?thqzVM86T3ea+|x*xA+J
zv+;lJz+<4*akf%c_|g6gpY$B8b$^jquakkiUcpuSc9I;}la~8{m^natW5lj7z&=Mv
zVpm&qoJL0&wtE+LYj^fysLGKTEi(*r)jh~-q4zjCk-@@cQJ|YYYfJpmwHngx&zIPa
zLzV8rnvH%NaXPVqzg^&3!;hZ4!-YFTnWWDU;Q1b1M{y~wS?SsJO*=b|lf~<HyWfZT
zPDDt{0HbT`a~@MW9)jQm*oCR4d|1$bWPEGXgNpx at j1A%@Y+k;j1g1cTZcH1y+TTiJ
z#RkE;c;69v-zmPf79-B4uaqUy`6BxU$(F(;<7YdQ4DNYM^ih2RqyL7>w4dK4D559#
z-N>ZVcQpTdU4_tF*b>$;LN0jgPXs_#(W}=!@<&wi-Q~H7``!E@@HrWHaVZy^>uO68
z`Fp6T^h1v*EU0Jl`U5s-^gZm%>;E;o)UitJaPdp?o7F80ec$8clfy%w<#I*gTh(Bb
zp6mOQ at rB-NKv{4K3);2b;r4g+iu>F+iv3bn*d7k5-%vHaZk-blyrc8qM_OJ=UMg2S
zzTJypA9@$n!=nq-9?3WQx;Bv@&OegqcYpye>Sy;wm2SVb-MzJW0%{&~odO!zx+<2V
z|L4#6Pfe8roAh))!YO&l3vkFQ=s=H}msa~&x{@O{1%!l{f(m>1my(2+?v%a#TxT5?
zbSpVS?mIJ24)4|mI3M<l&++rBJ(-(xcie8ycC-pn5X%%k7S$bvZ$DSYXW^6Cemx(J
zIn+NS9+fvZORW0K;H75WMeExS;^9|~w~OLs&#v`#4o!7H(}0*#&$EJVj=$}sje!5p
zK{liLw+jgU7&tDlKD_N3f7d9czY?9|c2zRV)^fi_2Zm#FMk}>3EC~Zz;n43w$0j{q
z+ol7LJuAuY0);xT&WPj#?nO^@*OH%i_{HMAtFeg at o(b{F%;j2zIvNFVbm8AG^y#-<
z;sbi8LvwFS=X=-1EtjPz%$=R9Qs)paoHBMU{~p;Bbh&%6WPPJ6+C8UUMnX%yhXX3f
zOc>RMx!f(DgE%7SP}e}O#?Hy<GT0Vf at GO^1IDa^X^_<^(B7?f$g*lQMuH^tM-7|wM
zJE3JC6UX3V0m&ALRDJ1ZA4!!q$~XUr=SlJOhzu|@rpFj+v6-0{R>O2hH*GnwIgX%_
z1y3N=PYns%w`tc$jv at h0s0VOBSt#w{gX~ULWxgwFJUV$<oD$NUeu|yvD|Cu*6TDMI
zH7j3B!@64xt``L<{1Ai4&7SP6)!vv4n{AaawOF1Ajoi6;MqQ*yqZC#J3`iCCLi{0e
z6 at dp?B(o>yVri(c&mZ4Xj=0h at +olEcLF57{+vZ)HW;tshvhi at QtR9W{4t_$?MVC+s
ziNYwisFi+v!WZ*5sm^7a*(&6o>lcL^ice?lE3h@%gZ}p+x7YxO)7oe^MmyZHtlj7E
zeAdM<7kXZY?%)3&cnCx;j;&Yu`QtZ!ku~QR<(o|e4DqPmCuyN(t=M{Nt!66d at n5N1
zWa&J+3tKHh4fP0Q0wBWEn$?z6LYdwMHNWx)x&t6`4tiBl&9j`qn#@THwQ(|jkP5U>
z;-jj>2z9ukC&UYxoTJ4BYIX7R0u{VZM~iGGXr0p)>tfWQr608rI6__A(tz`i;=wRE
z=0aLl>MvNlySmk1>9e`L2dHPUA4Ycw!Nl0Dg^MY4e^*+Tcl)zp86KE at W7HAg!{S95
zO`yG3%H^1vRHRE>&JI)|9DHht3S$vtmKaxvG-v!(gj-8$$S|agjr$k`LDYsjZ{G%x
zvL<v)@OrEe2DPEd{Tc*My3Wu_>T3**T89K#jp>GW)P5PPYA8eQBBOhBa>76_y at tf|
zj!lb`Bk}}S2IWcdiourFBs7g}qqclhO0xuAD_}b^mT=Rq8D=(s=LIcva<nBnui(qI
zl4zAgDX}5ZQeUaX0nhm?A+}htp?(;Bg at bko0??C&Cgfo%e&mQx=C9RRB`r_MQB*!!
zVN<;Nu(hRpcH_%`k&sk(YlSI4$(ivj>YDvfZG8D7;`iC7yw~yA4bd};G7}uQV&P+!
z#^A2ryC(HKR@*BDRF$;J(40YQsD+O3-mmC5`&Yc^vfanUcE-xPF(KSPc#a0ez82CW
zze8793NF4_u`SLk-A||=@8`_<yg9WJ`h+^OLpAXxqY7Ed65L6OAm$nNr`c&G>m4z8
zgRkl?`qHP-i+D8m{qJftbHY-RH`8~Sm54^PIzM&=X!Wz(7eh=p3_U*6q4cv)L1xAz
zX$%G5(~i(_c#dy5!0;h+na_mAIzcOn#eBS?s1gNxOX;%}aA5{r&)!&rJ#ABpp<*0+
z5$2`28&RO!!{Oi1g;lkD5W%?JVh>1}5xIjUkkMCQ2Z~;18wO4m%4hWN5dcr-Z8<=}
zcKV|z$ik?xKPFDVxk+oC&f&3LKL%`2RZxY(%{tB{Oj0`I!`F1D&F=C()JgZpcDyUL
z90;EpE!R($;usvgKB7EE`A}I2;y696Dha{%Tkia2f+r1GFU%FubXf6*I_l%#hs6Tf
zGKUC<Qjz|#d6BR3^kp9UANResc2{Lu1touZl`EdUqoQUA!CrFDiSUN!Ggf at liw?zc
zQT(jP%NaS<Rcw2K4RKH_x at qA*G6)yP-H?w|AdCN+LvF)6I%I?eD<e1q$oKFsvMiF`
z{kM)X;+B?k_9tUy;9k)C%Up139r{wWREi<>p#P`5#B5$lT)pvw_)iR7Z$J&DF}4Tg
zCCrE4SZ&GO&vI<{pYD%EBV=W~zlk$Bh~Va9{5aYC{ZT`tpt#xTCPZj<R;*+C{otM8
zk?s~PgxtpstB<F<Uksp+tb<prtK at bqevYYAGahJj+;PD(-uBe!^!Tp{aeRiq3sv*1
z^E0>cF5|Yj*Gq|dMyjo6pJr#oqr_QSYltsoD%cu;D^D=$-w-oa7Crpj!Q^q3MS at p*
zvI%xjUtW~$w0ew|wqLKmqd0rX_f!Ybf}7B%!eN!S-hubv_^>VA2e0uzB(t~<a^UL^
z3cf20f4NG1zf$b2f|pTLyY2nhrt#7z16}wHxca1;jb{Nb;!Y{&&7^AEs<y8x^o61>
zC4#VN6}>QgJOrH4v$;Q;rjA%D!XPkMwTe}(C(lWWq=_*2f&r?X)i#MMNL<l4Hl9mY
z&oeCsuSq$mf)i5=O&DV#WO+STt!0?|BC-zQD=IUDNl7syGkWYjJQ73+*!t^p2Nbf)
zg`O0NtSzL8ha}c1T5CQvy2s`PrYRbHr>DkJ`f>%H9;;H8e;3iqBKhqXd3-ECbv<S$
zHQD$;>Y~|v at iM*=t;kbX*5Q@!j%E9<Gn4unymK|xxVE;Tl(X*?T+5I}$%1kX9I2Lz
zYOP~f$>LY3rQIoQZNbNx)akWj{3BiT&I0JMooWz<5uChEbs6KNi~KUwVOR4ab3Ec9
z_?R1#P8 at a7;w;bc{u0^3DE$2JqZOvZc)l71 at g^S!>zsFV+lPCZ(Bjr1XXZ(FXGhx!
z_B%YIIqo{Wn5ep^*4%@=UyAcw(n9l!BWl*X1H-}=ZU2J9Jein^4{S>=oMCJ=0OSYo
ze(Sc;p4oFyMgtRMp!>Vy*fX>J6qZy&kt2gtuf|>t&W{2WC2=yqMm+ADEK6WEe90g^
z(O-<FsFq`;Z9801;6V7eipYk=>&~<FJjiQ-7IUSU537|)LlpEKU1z(y=%WG?q$q|-
ztmvLp>4bOeYPgCBDTT6|A}Ho$x*s5W7|2=Xx+HCMnp^e4tC&kwa+?pDn_{#*CN#P2
zk#v%%w|(`9bpjx%)^w{*j%(9Cl3&!OW;T4|zt`_;L!YOhA%vW?1!omeo1?X((Z2Ii
z at f2YKtub9E*Qf59rYwfJ+~7I;`~D+tHb4QS73CQ-xqT1U=N$9zWpri>8rZ#!(XG)`
zbZk9v!pB%Gn!8hXv{2QmkQG&OikWy6BR?nXj at sK@yGvg<x88aiwknpm5kP&vjnvg0
zYl8~QL?h<fB49gh=bO22HTVaMt`uPxr~tb<^w-`7xRdtVeS7;RQc058rMq)}g#zKd
zSOlNuV^G1t4(<m~Ex3H(>+Je_{_7)jJ!ec#e*w(pS at lM~R7epidsQv?D<VemQHW_L
zlOB}9tv%-5*>`S}e(`o8U2cgqdRcC2mi(Us!0h!HDDTs2e|%Ou{Mbr-vHqU)5Cika
z0f<9<9gD6!jgLVN|NF}KJiYjlWs5mzeF#6Z>2N_=aSFuw?D^xJq&U5}a*22zg$U!G
zCcC+7ISsOntq9AEaJwIF=%fv`ahbOJS&BLJsQ$XHk8QTgOZZS#(yzwO-8|qRhg!eV
z7}EI<GIO&9DaB1fJKXXrUoEE=eba3)L7`@J3=8L}`*5I%lUn&KtZJ;@_UxKX-CW)N
zeq_tHtoe1*DGq2s8Z_<Ge%kC23L4X%`SkoAof<o#=K8P1>i(5jr^fEJz8KEzQ9+`V
ztqfDG5QI;3Uktcin9df4{IWEoS1S#dI)d7QR(ecT<)XWW+Z_3;${8=E-ah)Ok&OnO
zVmEHT(HreQ+lb#ySBC=#jQkaYB-c=^p3e<eXCogqb?gO5CWK4h!2>iE4AUXyRG?x6
zMxIwJ2i)admdn1LhE$N)nQy7hfNEqFme9^OCiCmx<0iY%Lwu0;5eiTu>|b2~+Q(ns
z;PcS2_f<eIvjyD6O4aHW9BuRpOK-pCVM&1|%RdqzJ}VI!LcQEd7q~gqw44i~oNY^o
zzUH-;X<JT=7+6^gyVS0gp!v`3T3BEI3<WGpZD>L?Pk+I)W|hzT7nmykUA4RAer7N)
zH?_y{8 at y99k!Vm&yNbGVGnl(H%=wlH$v|wsRZy)_?2!Q2)_U^p__=<$g9 at nOmQ1I-
zPg*Bzy9I7J`7%Q(Q at yw&9>9j<JwS6eix|MOt5BdK;&p}r82W$y at n~D)bO0ab{^AB@
ziXRDYB?eM-Bu(?9lASnIgF_o&c;V<sxeUR^VcV(2QCdv-!QrFQ<EU+FI=gImG=b|z
zJXy5NWzTm>LsTSJo`z)Dt8&b780EjZ2}?9V$&>qh7{(+QYeM0O7o2#g)_hB at 7bY<O
zj0rUpiJAkvk&fP<7IkbA7{|;<@HCy{`@-&<@rYqmEb}l+LK at O(MBuHPX6-BMR*+mu
zsA>{_w~Ou9+4JiWw=2VJLyK^?$tiv-&Fz;)w$-z(c_rC3HMXT#Jz>m~XB?ksBZnw8
zh%OTv>c|44U*-9J_7Sb=)i$5osrt7F`_RG?%BI<4ALI^2*Wd7G!bV-8chns$n1&J9
z3Mc*=^XWz%V6^lC1$zebMR9fh7LOS(w2i!*85ISR1cuif{V<^qlmqBr)`at}8+{Q#
zwbgnf0gNAC)HjVLNGrv1wxgsn`3ug<^t`<(%3#J*77;s*ycsm~383idBgu=r+Uwb=
zB!C?{0D@%zFGS3*r)j_E6{u5jz9df2oJt+vej-iA52ckYbPL;~KoF`khs8<eIgyO4
znl>0$j`?6IJ=56(kt_M&2 at p5y?2t-N%JL4+i6wgBHLTBSAUqW#d$heyE9u-^hxOAe
z!>tEMp*!{%MB$1re><5(d$_NoJBEyLQ(Q1w^X0FjPaW3Mq<3*o_HGijUfpbXAytqj
zH&@j~sm{4At$p1Oy_K{fR&Ji7%^<g>xYHn%v0>vZEPd8kn=PViKi7L@#2BL9YDbu2
zhGzjko*pWo)QP%MS@{@|<ZN3$w14ZWR;}0`UUvcL=COt7xN=}xn1(?PuA+5UoIUgu
z6uX6Mg3=-ZYIByF at g~z<#jUx9?KbICmMuDiT6-+4I&0WqAstZ^GGv%VO^#86C&rY~
z+`}eVfVV2!{KT^p at D<w9fW96-U1*QEs3x<iRc9LxwCx|}1?|EPthy!-zf9K2nmf3B
zb1YX|TH61sZxsKMvV}B?_z<}&J}>P40^tHVc%I;=^uBM~8>4j@*q<7vh6ZB0IaljO
z&B=Z_?Q?;&0tIGbv08qAQ-L@}LZAcBiK+<Y;#JqJ+Yl%4lkf}5PqDULSR34g#@^yH
zS2H}XJ_w7IERBX3*JapR>t>a<XLar#_)#c4djyyWJ?BC at KG6xNj?dOio88lmf;SDi
z4i?#2<>T at h<4uxJ?GPhRH@&`XHuc!-b)N4`#H(C3)!;KATULGhU at HavXpY5j)rY9#
z1WurZe<baGqYYk19aevOzVa_&L)!f5HfRE`%4Hg=95};o`YI{iD=npX&p?2x6EE-d
zgs~o=w8j4;DZSY;y$~VnMqPMb{8A`S(s<`N5)s(p5~Rfeb)xEQZG<ZwA^BlNlU11B
z95c<-p8*p?<Ue}zff)b)DY){T1o0>b`Q?!efk|ecG-- at Pw=VjDo2ldq=?aTy?WoN0
zpkIAN-qSUXofaAGxaTQSDhhdItB~?m8?g}6#*|EB at sytvrvfvh>=Ag;5-fvFvK(Z%
zE7vFrqnochOIimut>$X=%^MdN4?7R8M~1{YhxDR=H=+C|3T8O+ at ziqokeOa>pQPb2
z4K<I6n at uD9*;vS9w+2CrIbCF(cxrf1@{Lbq8{`#NpKvB~jj8N=zgsHHJRb6wtXH8P
zWO^9XA$0P}8As2`PKs}r&FfASs2>A2{Z4(TMIghvTMTZ|wwKRCQl07e!}`{G at sD%u
z{_Li9nfr!!#dTXk1+HBD)0Q4+cv#rTKW3`<6JU>iKhC|~w?USQH&8km*ZPO&={GsG
znFI1<l`{t9vkk=_clVPxvUxjG^SY|aR&~X(3#Wf_(ClN-rq)te+2R6t1d?yGsBxUW
z>sWs#uRBMr)>HdsKxkpBSTE6(5~;WE8Y4x9@^K(?uP%vkAwCJClXccgfSm3vf9OqY
z<6a7ygxXuhR4E-t#D;DC`0JObF(=N!)m7_e5Py`<{Ti7%^-8&0_PNx%FXVb_GR8vi
zl5zbitjVJzg`1<v?_yZIxIrd89UO1cU at 9iZg4iPrv&vOBq2*t-wkUcE86Sm+60XZ~
z)~J#$*61;$RMASWLP%4{75u`1P at 3KjKI(`Q>!c^J&oqn_zN7^}m<&PRkTMU!nihP`
z_f+)xkqfq-K+l)*SMhiJH{kmS<QIjHinW5<n369luN!%S<wC}GB@&;%gE8$HmWm14
zSb2j|uIN=KBsg479E at FgR5+_jvyOV``qwMDQ-Clf+sAD2j}@c>bkT+$`>1?;ziaHc
z^*Rn)0e>9#Ow2}wb;t@)drGe&5JG<yhSe(0AR|z_*q5{h8%hJ~oDpdO41i~2HR5TS
z6-`RCVG;h<d$qp%wi5-&Heph+v4A%wtZ=ZL!RXIo(kV~`^JwsndWcEEJ(BPxPet))
zKU0g`uNkG?{I<txhh5G;PecF$g<*rKzTPje()tzSReEt3#i*6}!rg~q87PC-tv94=
zddk2<N{60Q(9F|UYH|g(W8~eOxu2RPzyz7`pYyu^kHiR^{YPTdGC^k!I~T4EU>61&
ztyAsjFqDp&{*UTs?32O9yRneO2YZ3)pL<*;{u8sWa&d(&E|fD+o-b6B4f!m>;Ptq{
z^)U5|%qWBK3!-8F{m`%;+@)3YhC}%2(|0!*N(Fj%ZAKlAl%(M`ro|tSHCTN$cLDTY
z7Z<AbMm&3Jw;%t{Rbd;CO)ydP`xYQ0hZ}47MoeuY<WP7_a+$iw*6<ak(vaU*ooMt?
z#z2xMrz76@;)@Z~YTP;U_>f_C87iW at kMnX)z0UCC>zu^<dc&>@-K|xq{jBJTh0dHg
zh(20fPd=U(D>u>E>`7$k+U%@bhmS at 0$wn>dEGDGKwrE1++2_a`ZCPZz+`{$WU2)GN
zgv#J3J;DDWezM}YFfNupR*Ba$<hBhlqjgm6v*&FV-V^7`-gOKG0SqYd6+4IVkhL_#
z{qnuGCq38ri|d%z0{ILP#hrWJDdv=$>{$hgcjcZck`m}m^vE=m-5ghD*5bNq+2J-q
zR3d$ZetdYQ`}^Vto3LbFg0jt*1c!64+D6P^&P2cnX8_Of2DeDv=PGerACjia8-uCI
z5p!sM`bE9(J(+YqmfSC8>{Wsx8qzK^T+dI3on>Nkzu}_OYUS|5PBRcGx*GzjBF+vF
z$GNu;T_3|N><K%Q)UPX(|3l4>Kngi;@H3(U;ywIKchc2$u31lbjwQ5%DV;=PH9OP+
z_dJY?sQhxJ1m+uTeuOQTQEm#TE}&5&nm?^g{O~L;0`jvfa%%jwBUK9{l+ZYHwc}&H
zaEht!h3b4z__)ZuWi~qdB<|jq^03&Ay-fh23pj*JEmtwJDE2vY6_#sDxz<7PVhQO&
zn|`8b1o!ZTbLt>krzAeV at m)eQ1O3uAhz||*oPJ-InFjOIVvn%;x?*GSG9GgIjwn+>
zm$HYack+5ms7*_eU at IQAt6aKKsti-^{ZmM-|6AvGQ7YDA1jAyfoux{f^Imtf&%R&y
zjicB2)M$w5s`Nlm>MkbWSL{3A^wSsHNjG=fQ at duou3s45&65W0XekzOKpw~M&@QYr
zYG?aud$UbA+ at 2m|ghM)?jnvoARac8mEL>zudy?w2_$lAaSn4_)vn&Of?*(Np1pzr(
zTvv at kb(c66S^T)~A6iB4KcpE+N_x`;l*q<v5GN}Y*zpz@;OW(9dbVp{7hl0sLWMB{
zB~b<cZzTF7?pjmdR5|j47Nb7?AMsxc+ttaKpon)m=Ywciuk;ri_|y$F^1cxc`>&DE
zEj1m;%?GJ1NbrIGbpEhFGQd$`;u{jUZu|uxZc9c0GtN2I&mYu{b_rLzo at q+db#%NR
z!t;XrKyZbAPhmfL&x!2FF?up4 at 4mc+Z{m&Ioi{7no4apCr!1vu63Y3SGhR`h*P<9x
zZDO!!*R8=9tlL*VImtu%V>^AU+hv57n(?YxS4mzyJ2eVgwR^LF+y1Uf&bhU2_|`>N
zj~yY~rJeVZpmW!%mFS|W$x+TRO9|{Qt}z!_Jk|7lX3Fl?@2V#?d%Nr!ow&mEaXhdc
z>Jx`YyHeZGM`zKS+t3q|u|WJ8?mu`zpTf=`J$OQLTgUN`KeB^CQ!(Yf%HjU<lZIOA
zh at CmUD=0|`w*tTI{JZ at ML=8Z5eC|{>2a%Sck<F3x#pHp?Y!i3)<>JGSX%89->b#%Q
z)kf09r|PG#POFJi at NvnRk$U1_DKd6}tp&Q=7HpT)z=+ad1O|s(;C3`DIum=C>r692
z%IHi7q?GUloAxJ~5M)wHfM;ktp!D|3)Zq!WOu)Mm?h^a1gA2~^sjj%Pwe$ygJ^3HJ
z?tKF){1PXe$q1TvyGvRo096rMrWL5$8Y+5=>nb6gdTFLoWhmw(BN<dLhMUi6&rF)G
zZsdss$t;Yj=_s$4i6ocM?N#x#FWK&&i;Gz;xw`9s51RZyDF{y;g?PcMcvRO3>1XCw
zR3g^ky(=mkZ}k$deJqg1NIDk~^fOEG*UUK&Nztaipb!r%$YRSc_$G|*U!t<a2h<Na
z>+yPqhkaEsZ*V%R;dCnFwMD1`i2zqj#+;Zn)Eg2ih=kC}DN~61^jzuLPCS}myh_6<
zcT<X}WR;c>-ESy32OswI3k>zc4#IaYyhEHHkn~-ly6J?EWKOH+Z_R2u{(7i8h;(xz
z;W_1+=QT%lOX=AZV+W{P$hv2w6V%NkuN6<NvsU$e4!NU$f<}%@8qOvJ?&LWsDlfSh
zclF6jlJwhwy)O4*DhTIT;Lrw4m}z2=op`(EX(gu+Ur at RHx|e+q`~{iN)%Mk?jzR$3
zN at AJo-F=#{uDu`Uev?>f?H)>akV)t!6IjZ8^58|_J5;+<L*Kird``>Q?1 at Y}`}!WT
z>}|>e at XN*z{$_t*RCeSz-uZ`})$q=P!_H{01$@wkN`%IUHGeV#HEnK0#DmLqoQjdp
zHkOxSZ2*-{gC)2;Jc^<TxkK{iW&MZ9UX^avyxsWO-}MLv at phx86iK|mS7K46&@|)P
z%T}8P4C}s4>o027tB6j*i4JD>wRv(-lC{2EMGI%H1#-RSjh?Hv+iK)#k$*g<Jt1v4
z{ZXmae(V0lZ?Qo%N9Cl+qY~ZNQLi#1I`l3wBXTJWG`BXg07_&nRF%b+$FDW!+<|qq
zcs1jIhf0SP+I7QAYE;EA#qePv!=RSDn;tbj+A_omH3{$z4Wi~6m-ZQ<;A!=7WYA)U
za{Te(4%M22x;$HQiz(hV#FrxVPGTrW_QS77_h%lJtOHtw2>Jcl%@y}Z8KI4w_t_Uv
z+#}VEM6Pb3$&cun@@*=fMFm>9zr)4sb=0}m7>!!N;!H(#=<elg0vjf87HeLQob{$i
z(bzcpP|bfDuZa)7qkek0xd|Srj&>8?<z9f^H(EL4$yv|+%x at hA)WGO3^yYT-<{eiR
zkR}wJA>^{{IO6Uh7{&tp*RedyO!m5b`u05&N{;36T6x`+b~CBov4oD}aiV5|-EF9S
zC7xu+%V5%VZPSp5b5Z7QTzxfm_xj->82eDN!mZOjOVP6;6;vw3W(26>${u8?8uA1|
z?#;yWjo7Cw2|}JId_v6LMHw;tv~EG=Zmk)^hKUhPx^3FmS$dspG;w$()#}tkw?^NV
zAozT0Zt<KzW<kIUv(VOm{A5rjW1X&|IL?Q)o1QdYZ!bJ!gKi!|hl~1d!F^8kkajx!
zg)dp*8>tG~{P%SWeRXRZm|;0;<@%4zDig|o_f347z)#}I{`B=2YyCoFVd(s{PnNR^
zF1=8kq+hyQPns;eeje12m(52+QKK1km-pid3B at k<HV_<cBjyKlP8>EUsXehIwvi~?
zq08!cZ=Id|fU(={ZR@$kCJ+{|;R}5RiK+3rNsiGgQI90C>08l;R=xBkXk0lgZ~=Zu
zp|(y>Eh%{ogdYLYE;ji70sJmh7<X7V=%wY$#xIm7gO`X+TYP4!d8E=HtP?T(i8QaO
zwl9+#3RoWjDVGl*`LlHwQEosRZ#T2}HTi5C=>p$0hv?;vscd`;bmaPyMe%8$S~JP+
zugv6;(}?qh+Nip76~k4ASVDBmA-FrUeWYT~wpZCNh;+-h#R-!+1aJ;(WpCebryq*r
zzgo$++$-Ps4t1NmFmP|RW0P*G75x;pWdy|C00*xNO?L&+Bj4S^To~)ea=F;E&eTBC
zD}=({)m1_blMZSHE1iCf)6m<Wz-JGc{-N44tJS9=R$ojHAA8A5KHy=SOe%$!LU3w%
z{NGbif<U;-BJ{61{Tul5FGtdQ8R6)EeF0tuGCZ<tlz^<FMHCUy1*gD0!N6<WBNxPM
z_`hf_Ny+lRIWi99i<0HAu5}%ysl_MuRJpL-m678lmqQ at a#7i^<H><t({eMYy<GT-m
zXY3+9 at E|I$WV<h9E22T3V-knI6m6o;lO7UN<}v;Y)B at -L>%WAw&(|d+F&}M3l##aw
z54Rr7GzQ6wG`LcRqN4*DV_TFTeoUrcRHFKu`pcVw8oEPaxQ=i)Tb`AZ$7R6(_FouL
z9d8rNw|EJPD;<I~em2jcNdHUmq4l!;`vk7Nl1J_<r9)eAwv{{Q<v$~8XI`Su^jZUi
z-R;+|)<rN{@G{C!{R<jA$GSSBz6g1)-4c8t>0E-R*E_6fi}hSCUx_-Xi2l22ZZ;6*
zklT8U#m_cba2>wgo@{UY7!QqV at pU8q@-`I6fL^o$c@%}pQy_OFG;09qL2C0Cf2N4e
zypo^V%vl77ZSjUZPy at 3FFm;tj$aqJn at mz&1deAZ9wqWA(OeGE+H})aKz|)V$!S7nS
zayWk+lfG*y`fM%$)A|>ez^pM+l6?3b8UifomhQuR$A~mSpJ$`pV08dz*mAA6($GaV
zC3=JNE?SwMAmN1jC>03JNF^?)YpB7;BdlvE*|Er%jdoV$v5!Q+ilX0CNk|=*+>UXw
z07I5XEJUv5&rZ7<MMQQZ%O<n5emr&R+JQs at s0xw;wqY{;$1PwVwtxK_bHJzPzDdyP
zgjoC_{E*bvDh3GK`9QU|z!uyAe!vOj8A+GBYeo+~u?y$D#$j8#iqdKDzUU=G?x>iD
zK=iGT at XPetqj!6TS^_BYKY8~(Lzb;+f8P*}I+JztT_aNnfQ7Gqd72>0#8D5R1$uIB
zuuE;F14Ks?xYbFEJ{nohZNye`MeFB_PP at F-UrzzkHx(G99+2^nWsNw&^Y2WG3vKp-
zpX at K1KkR_N6w3J^qaEcrkY7lajO(?f+sd3Tu%4rLc-6Wyw&|(qL1&|da`YY-oxd2Y
zQP4Te#UetShjloKel6M>YOP_v8hlz5wusD#3=3q6z_SBF%mKH4>~QFq>XS|vEcrz0
zA{_j$q|L;Hf?(_d3*tb;#&%8)ER-oak%;Kr0rM+CN-?t52c>sd3iu#d^35bQ%0&<Q
zk;MNkg5W8A2klu7v(yZ)K%N%|iLn6%!WHs3ZT$zYsq7$*;alR)&k)(Pb}qPcNLzlc
zcm@(cNBrJk=ykzVQD0U(Wj2X;3e{zm!LtfMIVPr$#+2h*X;jyeo^%;k&#Zn2t}>$j
zP9&1*rEEeJ#PBGd at tFkkC>=9-3kSHMVKJKTAdOt1o#A3b%%3NiNlqE-NfT4 at rknMC
z6?uiNT>|!Pj-t at VZ#$$T at 4u>mi;awUs9rK3j&^VqGZ|BPtn->`ecTQ|;U9!8=ry0E
z4qw#!TNf&0XB$3L4`_uy?8elDW?1odD{lDbx2XQ;8jkEDy$R^<j#|&0;cosm&p|D&
z(?I5Jm at sbE@<7m>z;~r%QE2QvVi{8mD{EQc@~H-}X7I9=KZ=V$;SG>kTO7L5Kkxd9
zK^G1IBxfQ8x#S|$!=Qw=uxdp}%Hf;wEZ0jLv8t2Uv5J*zHkaq($rpX%ot)S}bc)=2
z!*kJ}+y?U+Cm<Q_6|c8s=hLquog}kVQDdMt$1z6XWq-MWRj6<zk_l;=la~6D`<H<p
z!bM$aXVW7%Z5YoAc3;>=L?Q=A0G)j7Zr)ILn4oZE081dv&WMxGWi;bpx)M#6fVNgW
zbTrg at -EV3huFR6TabXp`vAz at qxL{3;fRvl0?7kY&%Ped)fY(FI#bVvRykARtpXjXv
zeo3CRA6uV?qWe2fSgwK`M7(Zeoe*`KQ+gWawHL}6FQ?`^?6l&2+j1DDT;`)cwQ?n9
zLw6{X#;?n$FXO#GW?r|T	{&Z~K;n{vlwH3ea6p6;zkjlEVFofPxGA)t9KA4++ra
zx&(cc%XfZg>xB9s0jN{K2Ut0vj87(+0Ug{xwxQya9qK-)T%i#hkZ~t}rk>J34w)>?
z&!IQ&ryXMmA{riswGiZWsumD``H2Q>&|Zf+w*%$ik0X-Zwtt=7JIGwXw(h}G at lUv!
z2QuOY<KLcw6kX$J14=dmRxGlRq_&>x6w+2cvXKh>>Lr^%EuJm-9rJS-hjlWZKPYx&
zSxcK$B!OBEQ^6gAoRzfwt at foQABPo^**je{h at 4c4Dv|+_e=VwNt at rK_K4gIe&K*Sa
z$-3Yl=$@ti=Oyp-5-$4;Oe at 2zPc4;N5re#Q at IoD*XHBj6_bI4aj1;0)yFH at Chj0tR
z`a_9wlErjfg9mrO3e at neb!^65=;|3)cZ4AEaeB({hoo;8K0w<Q#+z!g0rfJZxKc7#
z5!+5(o$?uCe$f-_8%6#F1qA}4rbjYoby|`SSv&9Es at bBk*QK~?-)O!23son-e6q}W
zGerNy@{dMmYHnwhsKQ2VMG0{);ile#jnQhM5k$wg#pcoE=A=(kaek4q8c`bk523~w
z0?wUbJwg4k<k7Y)og at Q3Y|f)SE6Ef=$tgUBkI`u{(ep>ODN8!-bvga#@SXguq|i{t
zSVdhRwb3srF*_4YLI7HAlR#_n!M1P8vYF!QB_3$ju)4Pwsuk&?^LV<hW`IQJx+^>h
zRDp$q^p!vcH6vHwX8w=y1&CvNk9+R$P=qgp1~?I~8vj|fbcUSRYEuR?Y-lLn&q1on
ze`wZK-)qS%RT*dzvy|Y at 9duEa#(;i`^K|t)8(6#{yVL9<1JK-*$8(U28s{%--WEK=
z$l?g6Kjm$<c}woc+jIq(l{=dR6!tEU{AYZyBqmSb at HBo@rDVR(k6#Mm1!%D#w_RCq
zg8F0gAOHGZ%0fw@<|<(KXm%sLiz8+=?hF{J-I>X6 at RJYaKj*i#nah`a6 at iJg6Z@
zF_%#1>hBvaCiRGZlykgI95#7Cx;et2 at 3SQUm_JXYJcxNXWhsFm_XlPw%oYCq9bDs>
zA^T2H&Wc9f(E|i<-B>$u>R6*ZD at s!uq7i7&t=rkg1V#n9KqK_^+9Ae{h?^$3WftJz
zELT+z%5T~0;TgRGHCv2 at uA}v at auUh~&SFe#RJdgzXAGlTPrQAC(EcctPYe2fXz~F!
zE}XH=S2fXrW~!57q`Dg2e_b?vY~3iTc_-~w+k<>k`bk->u{=Xv5pK=fYqp(ty11bF
z+JWP#yNcCFBm-yEEY0?Jbvgwgdn<OA^VDcD*rEj>x03eH|1mvz7)n@?^mzHNYKMwf
zK8C>p^9Zw&+Lta+ewq<@n2DMGww>vx0VBQWbO=e2#sjiRwX`2+5u)62bkLTJ*a}D}
z&?7w)%^obi#w$L`$28x_^HIU>apC+#iyGwH21Ke at e4ae%4a<G}p;9pTt5Ddx at 0|s-
zHi{?&4ce95<w3_L;oCgHFp|9WNTjOSreI%=9-gD_4GLOi{2Vj2_El)5T=xvhO9L^U
zp<xke+T%ApE(ZS`rlKVu%Ez+1n;-cDf~!7<+I`X&W at T%KH6`O at XPvNrYbZ7Mdp-%o
zA?x1{>){nuFvpWFt8^rYE#0q`$ex+qtis4|*`??HI~9N9|8qsTz`{l^^ecyoEyI;1
zd+kxoMXBZKroDKf+_)h>&c~HzTCgGp7rb35R2<tZrrCpvsgVGk^gUzFq0h)UT%?~-
zy7ki&>ZgWEp1xgDjRlhAol}2ypjsdE|D=aQwlG1bCk at Q&qwcxz%BTDp3ed{*N{`Vo
zirq<8<oe^buPLMvu7~u|O<d%a!XOs at Z(}X9oA0qoy at 2Qfvr11nu+oc?{S<UVQ;Yg<
zxRLFH<po<_YorTBv)_EnN^O6QgVS8WNh;0}wGbG}OGTTTI3ttYsMBIoik*F9>i>xa
z;2nZZ>ghtwc5jK&^FH at ISnRE>e~t0|bQXy;V(WaQe*Er%^GCx~Jg=Vh$-1Xrq<oW&
z|0?9SxneF*FW~opq0VtlEW>%^^nAn3(hMq7j4P*A^9kji(amTsV*$V3>e;h=hUvIw
zYqcs0i?>LC`%kXtYlr#k2FR|vM!G%u>m_nZTHUs|DWTC18_V{8vP2&K_}`1M+$Xep
zZ(Gt0EukN1d{%4?l-;9CO8S9WRBbpOH%(nF*Z<=SwP2T0FjePQ6o}vJkbLd~)Fw-z
z`T^69%ElC+eB^slhoGRtUXsDg&2|B`^%F`A9?Kh_ukrYUWkRk#8J1ayEa$CffBi!b
zVgM-fXdwT?iaJ#Rt%{{<->qxi>3F$wEf}YM4qGcJZop*Z%KGi!52}VBQNIi7H{sIM
z)a=;UpwAs=SUncNr4o6&6(*fGJwM<5;|H?Dzv?qrJAihydRoO|Y;FBy+l9RG15R=A
z$-{l4Kd^<m2t}2avi4W`OzFG-1sA!rz=1*@Jhv~+l`1KgExw!oG*ceoLp5N6Z&!c)
zJ^f#Dk81G402~@W^shUaFJR?5vnCI9t~+JAas#sn{Dl8~CR_58;^Hje+6b?j+5^1{
z{ETaaK71AMm$+R0U3uUV3`p$x|8S|0803o<D@$L|-mbp_WGUZ?y5qcs5QKUy1YEtS
zN<E_~gCkJ2T|LYlm9CurL!w*OK!iu(E7d0;0x}{xIy&CyPHv0+WCTG+e?JD!`I at VK
z^B<jZM5IjPl$>CM_pgD!4jy3g^&irUuva-${O?g6+)Ys1h(`4%3RPUDF`F*#K)vAk
zQm;F1$?U?^KLfmF(bWwvGO_-_WXUsL0Av5A#vuUhbS5m-qk=FFq>i`xLOIYa1>xMi
zR3aVbyrKMTxJe`=M?1s!HCCO5{cVZ4*7;n5H%Du9k&%%GH=XwqTvTNqhcGtWmWWd+
zaUHn*ayz^4BOtGp$=8d^RF%HX=a}#%73gR;B3YpSYh^=KNL<_ at 66oIZgdkQNL>)Ms
zY`;i;2t8Ya;BYa5yg(jc-}}CJ>wC+yfeOY*=GLj5L8G3{0hEUOWhAHT9+kNJQxkIG
zIWQ9Fu7emD<k-~)5 at CD!s^}(3Yp?g&X&x at sa&?;M`}D1||4GU!e at MzgbNmc)(0u|*
zm_1uYQ3-pV|1&&xzwgC_wudXYSy=e8oEUY7D3}ahP28YJ{S?FC^%G=fwYo+PA5yZ$
zC!!uG{=&1hs$nnp#$&_{+|AL4m`g}GYfl5*7UJUYe%=Y`5`Vcp+f at N3W!Zg+sjmLM
zV<8SNGIAaX)N)}@dU(5)OhfT%xjj;hQ{TGZqZI7ShAS;CT~Q^VQ7L}U%N1DAerIw6
z6;JL1miwd;YO}XzXkvnT?|rJjx4*x#sqZ&&MgPuiv>CTI%KY{h-}v at Fe&m0xzW@?7
z^^b1|{?YKevQYU1rTkis3T2who8cC`r*{tn6DMVD>bs1I;kf-1TIIcYVzkh#>Vx}|
zMkF|GBCxu7jQI{^FijZ#$!-48oodwP7)sSBs0~ckxi}JXyoehh&cVfnwX8%3`U#=y
zMaXgm0j~|AZI*&z9`peJGE!Yc>NpIrUDN)yc#R^JlaC=73IaJ%hi$(|=(UEs-k<TM
zqqL!mixrcDsA?5mn*PtNCSV7;^rkNSsF__^{sUtjgr|T|pO=D#?Sm}>RB^<`QhP6h
z&@bUI{o_9a1UFZ^<=Q>VvOU+h;-q~gB;26zF0NMFoL14F&5MSbB_5~gOdt*7dyO+~
zXMZ$M(JfYz#^PF~dTk-PGws)Al_}gM>sy1isbX<|;3X8qJtO;OPq%D~R3{7XibB(}
zL1Ez?{(h4JeqZiBMRm|;wR>2q(ope&M6A-cTsT1 at f}b=oPt5S&2t+8f-R<H^DCX1H
z_vQrSzTF5c*x{~oPlyeYv+2W8zSg(5g1oq1P{zYVTfRVlsz_z{*);d)8hV5tec8tT
zMLOu{+6M!*J^J3ZWG0Jy3k-k}FJNAH!`9IJna(IJ2`)vCWX7W#zjYESPpfGT at 2vsy
zn&NvxKukgs)wOwQXlhE9$hU>D7aX<I*%^m-gBOcLm_HH?$Y7>5j<>hB)c$v(SR|mw
zLimxNzDS?h%K-dow#T4Q<>L1s20h`(=M$$b`dXcXgP3C0ITl60^8C0-FHo+<l=;)M
zt6n?Ub&P(G+kQP&QBNZH9^`THWLC0Z^N<uo|2d{&TDRBHa2aK>M+_#ap~4n8lz*Y+
zmFzg0JoT2!;LE6*i*Cfi$B4I3=-4wVMK<E>Y{E at -eYUP&*LYXCsCd~HOa3h}!V+wn
zA$$gUuFl)rTrB6NEbIQU<(FD)qrp*idR5Iw!$UvH<{q0;CM~)WmM?4B!Pnm$bI<Gc
z#b-VGO4ne)?l+?2gp)cP6`$Sgcx&2?f%vUSx^zz5UaliHa)AH=bt}tHqqs3z7ZDBF
z<sR7-Du%bU=neeKKYEHVVk1`K&oe&4BJQxP4%4HE%Dx?-Mfny at W+^ySe`jZf8nOJ|
z9ko)=W=qyrIkeZukym-ru*{+wx@)|?XhtQkr1569DzHdVRFmz{JpzhkKe5qVFut%G
zXlgORGxBC>Q at U?LcLK4q6t$)d^c)<Ayox`|d+a;_k=B98QgTb(l4Lr+jMrWs00oeR
zZj0hW1_HKd4wBDsh}z4G9_5t-RmKmuCRd$@H8|IpQLS?tS1<I)@VW5<xnV#^igfF&
zwHjCm at _4v@Gxj*@bv#5s?;|G6)0H9~V#pO+G^2jFZ^k32K#^-IVi5<4yyoJaLs2~h
zFKs2pXOrOc%^P|F#{1UL-&3&<8-&D}=zcYzbm?n?+MGYkK%cFUtaz+DiOhI=GocSA
z$;3U7sw6tnXz`<>h3M#gAT&(n`=$~6p+_Yu6dXyn?1%fs4V2RV>@)DCrA6LiayVlL
zhhomKRbq5!$DtGq|BxcUlga5oX&IiLOq4AnVvj{f=Y9+vDjatP)0c=KFnFcaGE?k!
z=Kklt#$(VE3h%8^mw7<TA+FK<?L;um at MfaEc)twBPZip<8kBMvKj>BEh>&IZI75b)
zG(UkHuOJjE%k}9%kAzL(fco<YO+2x&KsDp*FT&xMZ;KnB)fuls<+-1HG+=89dg4aH
zHY^ExW?;~vhX3Z9Lo4i21QgHS-OaJ{;0M1pLrv+&fQ7aU#_u0^kkf*za3WfLK at B|B
z81m&<f~j3 at 9DzE3)b5G(dxHAu at P}xsnj<3INXnYm!XVYMf8f5l99Nq?L%6j4s@=|Q
zDJ~Ja`Qj*-k-_I}c?5>L{}*j<9TZ33go_SNaDqD_K!Qt<;10pv9TEucZkqtXB_udO
zgR at 9ran~dS2)4lD0fJj_KSSR4JLfxf&L6jK-MckK?H02$vpqfC{XE^j?(lD>vSUJD
z+f_}t!=nan0^@RreW8sBn1I}YAt`_W$G$&z3=)AEJOtpBG5$HP2%}#Sj`hp6-BvIY
zDNErMRku;~oPa+v79%fA8#FUv?m35*N`SBOFiFs9-aPr<oKKIHdAQXU{$L~dY(BIp
zKUg=^Sf2a5`)kwjhy%uZPttPm<aI5sZc1T+uy!hil*3=qj8e_Q(UMwdxeTjkk3S=~
zAF?HWW;>w7)jMpIdF%P=A;n}uc~Tf#0qvovJ^HA|u?9&Q1K`*lD-rhkXF_@&-V39W
z-!%4bCRQO5lyXm(`d%v#F_xkr0hnSk9~hUn8V!h^mxQ}8 at L?}|*P<$J$zyhw?=fr7
zJ|pj7l}f7YE=JY}YGhS>y%nt2_MTE5T%B0|#HdA#|MCgZ!{n4M2-&>q!;DHXd3til
z;=aPu9#$!^uhTt)PuZJ_3OT&Vsu`>jdYv&*G(Ozs7bT%f(h{Hv`eE|CMYBLUFqArI
zyp3qx4BV`<tQ|nSqxpSum=YKa?m*w%fUSE&#I^XtuF4M;)ZmgTrVY0?IWt|t=>?u_
zxuHVUOh{mY33Hq$bHvrX<K;KsR)>awF%_5JZbzB8x>>*o=&nz_k^4vJuFo-7 at b^~e
zQ|0U>Lib@)JC1CxkaFAmEo~&iCxYRP3vRRb#*+%*v{D>&FjHx^Xrc-;S~pQ`!sJAd
z9l*ar#8*a5$=Fv~ipbKXAA1C>dJ($ol=vEF7(xnNP|^b*E+R~;=N5U9pSHPg{TWZ&
zY%-~yPUSfq1T822v_R!CMZ#W-1;w;%zYf&b&3$U(T at NY*TaF~^MF=a_^l>{up5~*H
zQIv9@%fUatf9^ah+KZugJBf+$JrRd1 at BM1jAq8k}j`;PrqSl3tfY+PJkL<r_oy)fj
zLjqkRYZ at ViSW>TdZ$)E8_jJf(_KQeeEx+qjrX{2!cm5g?U%mojg5<D6V7F;ec^QT2
zat1rj20NUABB^7+Mz^1)&Hi**nfJDs?C$q#M%mYu7bR9n;)-)tW)1p|GAK3*5b?dO
zW@|8~@iS`11TvR-_BLf=7`v9Ex<w{%O6 at THNi(vx-!Ynon@`Rn;w<vQ84?{S6wo1C
zIbn>7uiF_|cbaoZ%t|A?I2vpZcD$7ps|`P`dq2x?4p9B{iyyf&V^>J$?j<*ZJ at 2Bv
zc#91L1ZpUMW5Q|R;3~;$%hN|*KKA6o^8<o-kxr%M;P!Nz??<NkIm&FmP|fzPvQEZr
z`MBUx<SxnWxG?_fJa{DOwa}r`tlPPTL=@;YS<6)T)Zc?EYUQd*aeG{w<`6j;hi(C6
zj~_2uo6U;po6{Z8e<<^XdaCgwKM%rK_1AXFX-j9D?PbhRAv=kgUE{5cNeZx;l!)`X
z0mH(B(;;JP!R3|uD7Aq_LBMl4FR6PrRUDM5D9-Qg>~ckXKvkPou5UsZYgB#>Ah`If
z*R<X(s4arIrd(C?HvSPAd(d`~q&hebh^WgDvva4>7`v48(4vg7<XM9P_J(kl_+dp0
zq}lHWKw#)OYr0{;E9ToLxl^EbaYFIc)@{EXo3w>C8tH*t&R#P_gw6cRLb{%&0BzXA
zc*~_q>=bc|Sw9bv_}dHSRWE}}_~FkcAjVX_mpYe*831jI3)$D#Z&EM;j|lP@=Q+bD
z3&r>)C>Ju5U3QsSn*{!>dZD$OojqYnp4X4c9V>4;vRV&1x4fr-i2|l1^Yw$&T}~5T
zWC<wp!Ja~^ww3Rbh(qUb(L2GIZEv#nPcfGECfNDqb&m_gW at q{Ag9YR5heuIMn+O_7
zu)9DvyG3wko1Jz$ixZTxHK!4i){Gd#RX-rG%aBKfa2(j*u{=D9WN9vF{|vSnCcU8u
z3};IUOL;`tnfxyFmn}zPhBK9R!aB84W at UV;ZneLvwoBCzsw?@zEJtGHTz{?p$idFc
zGtmIiFlG**Vk-Oc=0h*ReO-$%%3p(IiQH-Lj<6y9ZC3{=u^KO4rX79+#}gTwjQ4Nr
zX}x_p>zmZRkn(<SpBf;If7M#@1wHq|M3n at kbF8{T2^{cp!AC2sA4{;4mjn(>FsN0n
zf<LRA+?GC at BjubiB{x8Hy}Cl)YkhB7!xahqbjG7o-5o_P7s<5KEPP%UzB`mKfCJ#W
z7LSButBp51>Y_+`bW|>xj$XP-TAdLIAD=9tzof3(DDO7%^bsttMDm>;(XZHScoSAX
zY#AZ)Hb92cq=XFkzFmEM;TrTcJZ6}lcEM*Q$%7`fyaLI<js3LQEpN(62bZ>9V*5n9
z4{)_1B)vlB#AUZ1c*|otBT6dQ;hg at qSh~Y}!)ryl3Y%<?6n?4g(|5c$!<TsQEgVuM
zEfTvWf8$pcC>Sqqyk7OH4lJvQu+d*aIryRDRD3jqlV^xMSs6b}V~JHAwl}JX;}yey
zmr)r7LvNE|+FmjJ#J9IjWB-nEp3}&-nlB7nlyp2Qvr0E(fvS^V@$Ce!X9*0e at 5Gp1
zap<+3-Dteci{C)CT7dl-{@;6aUqwUN>xR;af9nP9t_oDzoX1#sH69*CIRids6UdP!
zSU!8vtj)V%lu<?soYL?D6EC|jZOE-2Clscm8K4Usz&YT)SEs6Djc}+L8T!Y%G(<U6
zz1Y#Y)5^S4%yzRah7I6Cm^K!!B5|Z$cn4CXv|FP>E}nDhry-j_kzEC{`gT^|o_i$E
z<o`+1V-jrli2VeKxqAL^u8%2Tc^?c3P9(Wd#2CS~OLnYQj=@&J3$dC=jd;q7=qV{L
zA9rTpzEcLL&RHLthPQ4%z41#69-GWYZpDl-eU}s)wYecf^=c9-x6e<QnNVTH;tly}
zLqHZ=HY!X4VJ=*ZD=5?HvnfLF<y)G4_G}}O(NnZiL#X&2_so1gG(^8+K?@(qG^+e%
zbmk<QeMDt#gzAikns4U$;^Aku0{PD0P4gytPy-#L66kJmM8wMNSXs;GG<T8JKFi4r
zWRnK5{(!QR|4q=yog)O=E_65ND7So0NqGUg?$$20M`1=Uj?d0~@PHEwxp`u3j>RH}
zoN`5M0NYX(i{^BUe-w|kvPDlGdu`9 at cU&h&Xg9HWO-&>w;KJg^s3-gUe8_~-9&Gd}
z(Pr?buRT`R`uk at Axual$GQyuUk`*1rsx+JraM)PD77CeGTh61ui7qP}m6G{^Bexp7
zg--d&E2#ar>h`e?+S;43S;Yo7=t^+AT;}IhtA63&RGVJT&QxW%sLnz~=U7WT<V&Tl
zX|#9^jw8c|1gboQX1|qNKs-DrV)F^GmI+DgRy{I^J%<k>Z*DmNHg4tJoYVPlt38M0
zm!KX<q%G>RCZEGLTikSRzm+F`W){WMyV`$CKt1GN0*}?#RbEeOoM+7Y#-qQB7OtP7
zf+R4G@(l;Fku_b~V6EjyPMX%rT1FUm76qto`Qng3*1cn<Hy%?EYo`vfQYFwfCOaV~
z9p at Ti1KY6T)l#<O{}z3!3KDaE&wcdFDLSWOEpq-~3g&hE5!CB3Z>0A17;D`HxwFLS
zJpHQg(P875;no|~F*NE8)^?6h<RS^Rym`t$Cyoke`(AmXT{2_#y)mYo56Va0GBrYl
z%>O}xh)OTB^K$E|2VF9HYkTc6ph%9gV!C|8SR?UA>~*KS0V9u?>gga~DwSW*02yr9
z at e)hIt}EqirifL>jtNelE9LvZi at M>T(It`FuEhZLQr{e&o;8LBQpqNxGj7^clt^@U
z<(JuS>?tX|l-^{vKS&@7cY(@2ie^DgS|z|l&tzVL6|~DlDNyY!G%{l$HR=_iVnNB>
zc7mMX-i4Kcu9bn7l>tJ9%!xp&NdkXS-3z7D#1D8nY at hjkn(R=(urYgW4_z<RZB&nm
z)7u?yKkco9RB$b8zpoK~kzfsF?DFW3GR#_-MGf3%W#ih)$WdFcRkH@$_2;_WSH7>Y
zc1^z}Ify!IDe$Eg4;P6ZEn4#_K5RCpsYkA+ at F4k)cLHdv#v+O+wPFl>xG%AWlEQ2T
zp1lN6ZJJ at 5jf&PE65<CK*kjw>iCruh_O92!IS~W^+;JrD667KY2|wZ9Q+oFugEp_g
z8ox_7OAC_PmW#{vZnxI)Q1YXi^mq0MLw%ib=+gUqeL{VM)L}CNL6^-<_nD?`4+bHV
z3`6$HAIj021u1#B$0x}uZTtu>@8o$iL$2oEYZOkO#GzJ0Ca^QBG3fjg{8zQz&scfB
z)&$N7yQc1igjMK|*iBj$j<_oiKdNoYLleKGIr8;2uP|-MD4&pE^Cc7?X3h1RYuV-u
z-a8!nqAK}aVi7UI0SEY0-^0CMwSPv7A at q|8E9tL^F03P^PSMk|Cka6L-u1pe-vD1j
zhZnx3?!q3&)YM)3mB*Us{Z=OABL+lH8!|MK1n>WKL!(2xVntbX?T*$bqJ{Dzcuat7
zhRbgexv~R?s>=ns-|tq^rN8l-7uxcKpCsJFUUH|>nD0h^b`9QYX6`ZY^et;HbLfG8
z>w&*AUIN*hk}@=i{!)43%YX=@=;BG{byvA0dauZ#fwxu8Wb;Sg6H7`mo0z5S-P62R
zRjrPdE=IniG~gh&V>zApFXO*jf)W5*+7Jg=vECi=eO52O7R-B<NHxwozvNY at qI;Cz
zGx(C%wPoIRKDI-4h8gqHE%JMl|AZ&rYzxcRE at Fl!jd`#PH5oi+kRaOXAP1B}RXnEk
zUAF#^UBt at rVl$<MwPuR-BSOqK7_&t}AiML=>^l_umVR=wYT?5QPV|4Tc2KeAcLCRL
z==0NMg0<|?^DGF0JLsgezk%Sw{9-ih+ZV5k_|dV?jkfgXOd{3}ytIVede4pUD1PWV
zsVCop2}xmxd%qXPK6noHjTvsHkX=X6g<K;Uri_5^|Gwn@(oQPOq2b|ZJ3BkBtlXmy
zv~@{DL_|PB-=dJ?o+u{_^19zEQH2 at BFlE`hW!b&S_h89QI%0PB9s3~8-Cv%4qa38M
z|GoqN{GYjme`}B!ga`iR|L%|b$r`-8|9oed=U;aE{<_xxyJNk_KOO6l{wJMQ77=31
zjMcG-5waAye}y~>p%c%c%ll#O-qPG&e at gHvT$UZp at 7V*UEIDR#ciz-c>R6ct)kjIU
zfy}#)85rz6|DKgHi!v}gp7}x2XFAoit8*;XB-8<uuh&XHJYOVMilc*%EOpV at i$q3@
ze6RhK-q$fY$L+t_ at O-5iM33XmINEKFbbp*DAp)MIZ8~$>uYdODeC~k at axfF+ZF(np
zGD$xJ1Mo(gGwBuemqxh?BoxM-!ZeJ>M0Dn|i%4VJu_m0<`vr~01XVX^&m`p@$_#0J
z6S{fbZ}P?8m{p|n6A~G__l;}8$|mPS#LPXYx)i4jk*JtVWh-)Mc0Jq^PC2eG1c@*o
zl1~lOrj1PNtaSt7%4dSPAJL@;`~}E3 at xJ+zvEd~y46%2E at d>u}B8M1<b4Q^Insz3J
z-2NbHgGEitPo7lPcH10mvSJ1jW1Vt|XI(>I#CgmzW0sOe6%>4LK`<dhC3j}*-;5Iz
zM4{YYIJU9p)x}$9c-%ahI#_*7il96U3hUeJhGdn`!ygYWkFHuB!kByd4f{A!=al79
zJGaKy{s_EQXiyJn#2QJ#)29w0ZNVnXTITYtH(D%2!8uM|+|Pej5yX5lKm}%B4F6`J
zCcg5TnY?Fwp|3#rq72XpyABSUc<L;um?%su!{1gfm*l!@NT6{85(kaETT<x21Wtb5
z)2%5W8mK4 at Kp%ZcjI>BituO0Kj=c1L<0k&~$ft5hjE6r)aTJ at 8UC;sP#(8$Bq-H|o
z110R6RtjKLs1A&M9G>N)WzT~38#39Kc9|eN<zB&mM0sp&Q-T8C>ABR>8QQ~ko5OYu
zpsK&6PpnN*HWcX`1qrn^VU!(&wwqGi1dv6#-q9FLIc_&g_y3KA!DhB0jh4>sG0HFu
zE7X6N^}|wxybB77+?#Gy6j&vUS|ga5?~`l6o|<=)O)_Ns6MkyY??a%tPCqDRQV-HN
z%-*X{*n;b+KMrv>N612SFrCL67ucjzT~wvAn{NJ#5^8S7#FK0M$kJpBvP}LVe<@rt
zZjv7i4+j~D!EIbRHw#lWffB&OiKMq at t%%5G+4TcmB}Z_+y_Ah1rf at Bwyx;uV!54#U
zhtnh at YQklk@RfjEwXedr=+jmAX?Rt#`Y);$?9?22S-SPUX-%Y;R`(XL-p9IeVY at s0
zkp819mOFQp#-2x<?V!v9=DeMv8oo0m5J1qfupHJJ++t@#PkmTEfaIM at ev5u9^F56>
z>=0xc(t2+s`2X4k+#iDeXi1*B*rTkUTCB2ShJ~<n?J4k$7$4|6cL>XF*n(Z!e$Udb
zJSlS_PMQeQ*X;a<K)Bq${MO|BVodj3m*cr7 at dAb}Dp>m}Oa1xs2`svs4ZOMYBX9ea
zZ$2<IQU#r0&1-=SLOIMRah>OKAc9o!ZBMOkt=Ox5ZL!xWjB}@H_KYyellrr-uR at sD
z-b|h*;geo5EUdLN0_=X~mqeV?rW*nn2J*U at LMALuBeru?1j&X9`nQf-ztP#f8wk-i
zkw(Ll=&R~(9xP%Q?64U at 9*}qCkrt737joePsjRvpw9kMEwlPkLxb(f{w_uR#W7nn%
z22}GT(m&A*E(H?5JvoHVqYd706olB<pF}?V1F|M;VwnQ+oa#Ykhe3n-(B_I$$L82m
z>V1_4@!Q(TTTb18xYxFAhhQrp&(pugm%my_f#~yZ=_L>m(8+)davj8}NCw1E&S97y
zG8|T0_R4~yT|MwhJEWz=sq?6``~Y034W!((jLZk^-6V?AgNY3UDd{MDj66mUyN878
z1WakTN{g_&ELGZ^x=e1GzW>5oc=SRGyVb~_ at FcRdtw7m>f3^SvQkBn|`;L1-v&5b6
zC2QDQ1wGmq8+l)6j~}2zzUI&FNe^f>ALK{prRd46U84et^K_t*I^g!rVw4RK&^}q(
z`AkLHf<OD)8_!Yt6dGfzmNDDG*{^v{#5rr)__8^^xdr5Nk!rgz+rh6vMN9)ntT7<}
zO+%FG?gc5LS>%+o<FJnLg#V`&0PJ<)<AAi3PYMR|^LyP59y}^>AfLt^ksDKeT$yYA
z6-{}udDPZx)?er1vu60k&;*_|6Wxh%+n76;1_@`23$+h2yP1j3vF^f@>DZaE4 at tF$
z!4`Z$Uvo)$A38AD8zB4xISNQnB<WEVKA at JaPylq5FCGfpAj?%9+(TdEp1rM&xx8XP
zS)V#Bi at J~BNvw0WN*0#wv!Qg@?5qEzkLyNJj9od!bkIbV+?Sp8CZkG>t;M5XkP{)a
zS3aw>f(Ld_oiF%6zD2rCBw(8P#;92Al>>&7zNWy+`A1|)kEibLNVx`7RV7JPN`OJL
zv-w#x%O|0SPQr(Yu at No;Kl4n_QryG{mCS-aAQKEQwP4d2B{uMBe`%kahvpx=2(zYp
zkHqaYWg>Q7h?I++VkXFW+zdN8ZFj|Tt-_x7Fm8P5V`*WBk-CfBcqA_%Zcg~JnL88x
zp?K5N3f{A>zHjqA4JXh4*ok^>Z7*>w<!N1KmG33=HwP_>;-+4UXf};Fh#4Px=wJZ}
zM~<)#Ww3pW%l*?Ig!`|`j<GbnT2}z^JxyA=+iMah60^@BeC1%>j~2u&WsJ%rtx4~n
zjK}j_q>Xr@(b(csf|j%@Nxvl*0dm~DtOBH(Hz4da39xBzHz=<5djYmBq^r!3Zg30v
zR<$&c=3b8Br^=!42E7uX9l4P6)hrhCM_a13zyw`*UygFi?|mJlw1gG+aF$LOE70(Y
zus87PccXR|46AWLF3=-{WU5%;(7AzNwWLLgaPM5}>*o)Rlk0C^y+Gx%+A6_eq97VK
zj}Xw<$g8M{H)iyK_^79<I&1}95HI;8^R`=~LmK=|$u-7&Jr`e9=$AM;ljnV$eql|b
zT!RuO5ZY)_Hby-8p31je*D^yQBE#thIo%aZcSW;&S1z0ywmsCCW&b>z%Hcn(6lAtN
z^F6zO9S|L^y;pVU{bPUZ^|xeTqBAy*{cW<t*+l2dyy#sen35Fm;+OY_Fy;Z1Pa-Mm
z_b61c#wTLBqQH6#pFZ at E^nuoZ%5vYR?Q34$Wk2TzNszKn#fkpjH}<{X8r8W_8=^`E
z<}dU4K|KEl6``$$&xkdSyC_U%QFE2Mw2IvMqiEXDOOi)dYt70ESF-Su5~980%rkjv
zQ2S`G7|4XC?6ulwP?k4HpwRy^=ECZnsK)%Dv=|V?5~p-ySZ at 9Uj|5;<DE&f&w8X)b
z&>M|;*q*K|gS&-fp%<17!W4acDeRzJb(;3#U6lYMBzi!ye6FRz(64zPx-iE7h%MY6
zmZRz;jAXI4pLCm{v`qr1bOB>abL at W{%20ws5^8BF)k4WM+VhPghL_hVP*s!^kQ)(D
zy&FP3aO at A&&|<W{hj{4%t0k3zh{|+YAo_($-%5OUMo?F}gVl|gI;NzKvHm{mH7g_$
zb5WS~3JDn1kIz5Bmdi|_0_>@BK9)?<J_aTh$i@&JL!#lAs3?+yH>wrr*1mkTtZx}O
z0tu28#ariNt#zX;6{9TqO(ep27s&3>GfL_XCrCWiEwTNJpuuo2&zkd{#`CyHJ2H#M
z^xx!Mn;eVh3&f1q>|3dwPnuob`s<`#I8K#397myWJFV4|YKUx5Z2Pi<QXdznlvyuY
z7p|fi(qHrWWX5~+9aZv`wt2u_HkVD7F+wFKTGQ!Stjl8H+g1uLas8DGmy_n79CTo+
zi+Gp;MOznfs-{_j0sP6F{6e4;Xk+JjMk0V;Is<=<#nO_dtM&DD&fRP=TX at _vca|T`
zk1-4TC<FbO7Eh8v0%{pCQdAB at UmDH1ck>U`9uvps^>CIc{3RVuOd;h7f?xu?>Yr7D
z=*8&fc?I8E%}lj5mzdydZ0X%)yU31a>y=H`#8M<L(1Q+q+YVA_+v#;)a{CqP0n=Ko
zEQ;=U`iyO3oT2G^zw^D-E_>N*D-{znsGsg!W%k}@KJA<Ys%DGt;UR0?<cb`9nZ48k
z$vJD0{^ab3`z)%F%J%Im?oza{epuZpPS7%EXP?6!$I|6sHDP_!&(Dp~N;>9id5-<D
zkio!vz?@<87cfV#Z${Q+XI>DD8?)_xzU=b6efr1uxegPc5^Wl_PvXRxf6{l8i at A0A
zqlG*|j=(RZ#R at Hzx1mhcSgi9?p8bekxx|pjaYp=t7a`WBR7u-;tv_fpm!B`_o>Qj?
z5N+(UrF%Qg*%Bt?KqKjEr90-5Jl28|ai}bJijADa@(YUxUrjZO7weANbroOC^<7aF
z9q0x+7h1~)8(z&QUFH9xgpg!I{mqN>;MbhVRZe!dJLL%tpRA9cg3<QoKZQhq&fln2
zO7>Yq1&Y=)Of;}K;Rcgb34IWpK9rEM<$y~o$44$nPr$9qLTi3uLsP_E<%!$Xkt-IG
z9{uJc>8Y;aUA&sY4En=M9 at pd2Sz9^P_3F0Fx6~?+wCYdIX+g>d4E}bf-MmA^h1T<`
zK)@IOcM0A-0t7EZ=)Xsh-PfQ^NaEq)RoB*r#>L at 2jqYB-NdVt~*mP-W>8XhHziVq~
zX#Qq#TwNje|J>VSpp5%-juk&YZwmI_=0*j5F8Im^nQ9QSgWu)8zQRfX{|O at 8)PF~z
z35)&Zg!}vZ(<4kpS?Q>#sBFbV|3RaF@#_RVv7FFRZj8d3jONE$TH3#O`QOSo0vw=Y
z;Xl1w2|qFaL)$D(1^jjQ_op8JTh+x4T>Iny2iJOL+{0*0bcp#rNF}tR|F3G2+k<t?
z$Q|aI=5*PoKD~m!-4jFIzP7N)j^(HqI{iH_0RG%}U0^Yl7&$OD^Bsg*4D8<e%V{`M
zLOzf;;`)apan at id!ms)CB~o^8GU4A^{qtZ6gT7x5_Ix`vZ`aTtk084DB^Njtjn7uW
zQiXyIFJ<*qFq>e_LfX}bb=JbP-Wz}s9TL2Gi~g}SI4(J<zQV%(NU}wSR{H~X(UG(0
z#PBNtL8ZO*{*zR~5`+jzgNeJD{3>~l8T7XGb__peK5oWf`DDxar|)UlpPF;AwwT6R
z2J!OA)V`6Rd%&86kQ*D=SHHh6!vE0mspt^ncDdGohS=Q$OEbE6t*w}TB7r}Sp7=Np
z4*H%27u-7Z%o+rrRjOq!S{g3c058^+Y_!89eLk`Sl0$3NG$JJdoDbEc7F4A)-`*R?
z6;;%~<O?4!0=78xdU^S0(P6C$JDN~h_o*|^RDfwCH<-y%lfq*r{2m0CE=5y8tBvga
zg4qXdcp9 at v=;*Rv1xVm*n_3`n0i*B8hD}k18fu1?7VzlH%_8wHcw=PE0$g&iQx0kF
z)A{ZM_bIC^!qS<s9}MhmysIzq{ul5<mJF^%2F0R~$#9<G#TnVj6Opw3Vi_zE0841d
zHSi!{Vi&~j*L)0 at Ok9X!J^woY9P_walRMME;KkNhs;ZE`^#ILsR6U9+LlxatKFbR>
z?Hf%Ep at egk?p;=AQo|^nhgTo&RdyKt{&6^DLb70IUojV;aulGtU7VG?nHumu{4j(*
zyZXImIA^uyj|-J!eaK_-m`UfOJqG7#$261c0{hHQ;1 at o`L{2t=<-eCAieI-GRzD1`
zSHXpCzxKI)+w0~i<om1~1E^syn=vXcrVV@&C*xEjnQGhYni+e~+K;7co0`+FGUWzl
zdiz`I7T}Su%L6rz7vAK12llrik#RnkBUv5$fy~|(j at 28skHUUR^40IK9a~NN>L{P9
zvg&2rx^J<MshQ5ue3FN}2#92a^)~bk{X!^%ezH9V$Gt35L0MfS#h<!7{so4adB(%Z
zVuE8iu2Lel&*ekz4Z`RQXv-$(K^S)3bM)8|Ok!_ek+gUrSNn>_&SVPA1zxvX8R+d_
zE7H^$;EaCqV(&0lV5F_OK*;){2|5W}@5Jc%6`5WKDmj5lX3Ls0!MbL0Zex#;cl~H&
z)4j-IP<DPE)Cb6n1uA&U&f%Xp{jBXY7&mn7eDoL$k{<hR$4Dx|jp_d8U3Kjr0ktd6
z9DoTs7BDzlhT)e30AGxCw#0CvBS at sCg{1-BW%Wi!pXD)?3WC5ClkIp?tgU54%&IMY
zPG8%VRffxpfHmVb;lJoY-7478FC?S*d|?)i*C>|_S+Wh;brjS1 at t3svK-;5SQ9zb-
z9(>?aRB~2$F8 at mz+~xpo(yK7r#TkpMb?mR$AF5{@eG7>rUM_bs+}>1$yneK-Dtft3
zb-iAMD at a$xK$|cn>Vh|JRYU&qLUFE92xs4UdA)@$xMzs!u9NM8$f|{on_m<{Wkm0{
z^4sTps3qKh{hjL)2m0-y3w!Xv(&Alp*J*-XMccLDW&Z*_al&KDo3Ot0kQF*X=g9iG
z#;9c$eDOZ37xIe*BQ`xlqYtjP=>+Q>@R!KW6gU8!WwP;Sas`@>e&$Q&f+r5R7WNAv
z6|RX$^q-mnDe*sDX1HMcmaO9W;FVAU(JY_;qLBt)%4!WZz_V*?yFc8lK at +M6KEwW|
z8`-nnAb>$p7HM=e at BAeArNp(I2uP_koNCj;Y)Y|Ff={=!Fl9f6nwPtu7|&e#pC(I-
z at ZG}^BYzN%gjn)hgaaC85rrcW+hAhU6aDa at ohmhJyV2we`qD|UF?kws&SCf=P07=$
zK=!cABBgfg<0tpN>>v96S0j=|;A}XR0G0gR8OGQ*e!`@iIup#@Zo0b7F2REym#V{G
zsTlGwi^Ub)-U6 at TOx7b%=-nL>;X^h((=DpKRy^Rwetm`RSkLn`irXysNhQDd338RW
zO5TV~=#T(%2xGiD8#rTEZWedWk1yd&VliyD-#YA<+f%N0eL)I2ODA_`OA-6BzGve~
zm{DH?uC)X9hen_H-dvK+H9fi&uWdHQ1ac}K(I!~$_qhBL7gRVLbm_1-F7kzX6#gN$
zLWdmtBtD2Z1lxca4D4yFv%Zrw^gL^Jy{E9|kQT&D;qYJ2%xm<3*V!rl<QR>U+ue|)
z{(>t`>v^eH9xED1xn?!>95IqRvx4Cl-<6+%1jehU-^klxF>&$?K%)9DV-Q{{8+zC-
z>4B+YTPzYt?J~Q~6SCeMHjdELkzaZBqe=~2#>;3C`=NiZI>AZ<f$BO&Dx^I}ZWB_#
zjNCwKU{#p*B1s+-teyJ3(r99db)fm*hR`hw)cu&Qvu&U1nf9ItUo5a at JUfc2dPaUZ
zp_eeGulm*<RUi{rd%x#Jp%%Dda)`+NJbej0y+{JMDdQO4WB!s5bgZ7g-~u%^a)2Zj
zA$yP#dG0!3)3dS7v10UQ at zSDpzE|sMyx8Ih!^f+2?VZ=_64&lT^;8{8+6<4f3-<+k
z&(7W}6(+`WuDlz1H?Z&XKDK?}ZpN{Z=XSW!TbLDDeYV4lA?y4l767CF(~tTV0XseO
zIb1Emt#7wI_v~er1n+|G%sj8a+vgKaSdS7Z at qS4cn%WJGE2uvLS_ at a-8xU%%b=(7@
z6m&>3oQ>UiV4|_*X~lSGH4Y at wWuEx;nwv`}NELnRE=+1^%+*CB6;lxBgfCD{mwd^r
zd3~1({h$vv1h|O|JDp2;qx$lXoAs9aCb32B7{FcIWH{X`>l1r>A4vV1`JjFR#Db!j
zCz$jklDLb_3Av at fuTyHE6Pt}3Sn<8{pmVGjIT+9eKY-f{rt9-!QUvry>nhL>Nb9_e
z*|(@Yv1FoFI6gDCterVnl%$T5MgF!*d%fUyef=6|@x*T2#VN at 5j>QrcqV4cY_|UiY
zDWJmm at La~QZ_u31x;HJ!v1es6kq{6!jG?C`Tee|%-}xuRxzl^)fwwA>1;gQkj^i1N
zmeH8~_U#^t+e7 at ovw0tc&XU4(W$gkz=-D#DKAQeuWqDagW3ni2O1S-d%|7Ru4kn<V
z!`WkX2XT6AFjf?f=agQAG-ZZzkj?c at m+2i7)4ReU&rh2*43gU^_#iKfW&0i}aa6hy
z3=Qgg>>OS8B57jQtuVvKBh$R0{D}84OJD5Pt;8^iY$Y5>-o^N4qSnugJAL at b4#}z?
zUc_2$W%)YMJpkrEyTSY?#00B$4^!H%rrz?kHfqt7zFHpg&-Qp!hzfhm3re{h{qBvN
zKjl&173dbwKlpAh{6v-&>l6+CZ=V-W1W;<*pYR|32)W&(=stWdem#bf=|ru>pow{C
zwJkrnun!y7F9C1e%8Q%jcc6(WSfgLfap|_X!uKY6(7S?kU4oV<xF5UxZO8a}e^YGQ
z at y-?t2w27~B#7zzj at +4SC-(UYk0`<Ru;WgZ1P#(AKt+3X8tZlaV;{e`TOLSL*^2 at W
z?%D_NC9WY+Q4g*UdhlJ<RF at _0E^u$TL9t&M_&1xFl?sxT2Mp)#q8gXrh?F$8RPi<#
z at dh;xQ$l_h_|Oop<~iEGvH13A;0yT%TY9#=i36c>O=Jx``+^|vm7hp`syO+2stu{-
z=Cl2GY(+n#zjufhF_WoGd9ExMZAAR|Eq{p4_;n?Zl%SGXE+>7~{qXi33%6LjJveld
zRG-FvG7=@)tgtb55^FN0(1FgZ`Ht|*E&Jxm*?-&Z5- at rq?aw3xV<b&fEsD?McHs7s
zm%{f`TlI|d(!4kF?YfTzsJq8!uFE&uRx};$rTi5gC2sA~z|%57V!1(_%5f1yc2oj^
zXLAX at qVb8OFK%u9s<_e4`y}MhEM)NkmtQx<vf;o15x68Q)Tui(C<w9lBq0s?`jMj}
z^4Qr?fHpwh88(D&yvQ}Jya$TA<0L9h^C1GJRZ1+daEn1yyU;9x_YC-46_+t=86XJ8
zw$h9~=N=&}ZAlf~Zl#Q}*X45EEKgfl!s5pyF2Hm>->SvKS)RQ_<$D}a3?eVh(C795
z`JFW(82KCvFFsCIdX%S{r^@&+vZ at 0D>W7cSRU($3+c at ZIyfLa;>F5K%K?UvK20rkA
z7KiFcm^0n$(scHeAa)bd8J*Rot3f8-+}RQu96q(|cj>ar-{!kH%g+idhA8Pkmulz9
z`$QIn#o62XeT+opbD#{g9FE9;_Q`0!Ztov at s;Cgr2DLDi-Nv$XK0p=A4-y;*?#ozA
zSQAX>9qvj<NoXYkb?6>6fUx1d`y*wqCUU0%JNnv5nn8eiRPydbriycyUl021(7^fQ
z^xo`iquDt9oNST!kOcxHi!Z|$_DB})>e#Ed7sxpeA2_MDV=mnMv_)*5G4~JLmEK$s
z){9>|R$!EvD_rc;Z~!Wg8jrD^(-4RA;JO0|j+Z8LhJ6yCpn~s$MjiI9zr?=gwbNk&
zIVfI=fvZJ%Ri~Qe-y7@#3?PU74?sND1zUqo(8n7grM+N`{oXMq$wr$%HEy<Y_&n(w
z<LMbu<lgS1hf!4H;UB)eoIjfE{vylp23-7fa})HKabiC+R-vYWOpYPB`}S5m>F{~J
zrW;+`kiUUlaQsW&s5*F&ujm_a*Uuj`1F;5rD?5x at PKn%P#e<|pYg|MNZmAVlZt^*<
z9vrT}V6<#axi2cXe+8-DL(j+pJ#e(%hHlx<XF22M4%rM9`<(%4N4mxI4(mg2GJ+SC
zrb>_fkGxph8pga>Z(7HmZBKCq?P~Vi4>A7x@<jYS&dLt*HH_B3<eX_=B5EpY0)(^w
z0B1F#zpy+Tx%0^T{{a-1(<F$J9TwgBr5Py8K=?mTQug;GpFYum$UVz%sjuMtrv%wQ
zI*>o!eGloWsi`g8+z6xd>8bH@{0=5J6rNMR%YSNMV$$2y)n$l}|Iglkv(5a8puEll
z#eGF-!Q?%ytuOcn{J68fpL0 at 8|98iH4{-SKKa%>tF%tj$_J3E!{c~hc8~<NtvNcgO
zwT%yc1S}n<#rxr}Lema2(th=|>c8>-?(}W1!g9eQ=}ghm=~k$y*!I!DmWgg$m&ksX
z8Y!UjbivOz*<kmKI+-%mXCbC-eDCWs*D-6^IF_^=bD1rJ{iFPa0n at elqLG`A{gO01
zeK8lXPaVhE>s`xNs#hirWeF7>TZ<z1F8wd-Qu5|=YfrTilqBJF*{=j>?SWPsVYrQH
zzR*jT3vj at P*Ddy`Uy3_e at AlW?_-~o;uSu03HWR;t>KR~&J()=A7OT)>yWEDYeJ(X7
zcXWx+7Prsx_I+|QQ`i~`9`%5_=G&z&?I~?B)9-&SXd#%b0)9($S9x=ym9}Rmlc0U8
zyytx$Tz=P-4e#&)<!pXGwpUgbmk}m_UOtI6aKuqE!>%>MZY9Fo?~ky687=F4F`#k?
zg?a6KoisQp`9od-7x0B?QQe5od}tER+SM~?DZ<zP_TeOd9y4Bx+ at Ut#X*z&`gN08~
zhk|v0P5tWaRVBDSq3;0k?bwm&kHJ+`JfXECH8?!3|7f}<d-A#|XN<f=CXVGGD`u;f
zof%Q_n#Szv?^TYAPt|Pg3PVHoL1k~hU+x|mNf}9)_K}gJOw>|GD?Q}Vf}dDqJ!kP|
zsx`?`&!-KyX!8>5KOV<*F$X^ph<BB at o6*{4$uq%q_LF{4=&oyJp=_U7Im&QUca!%3
zs<+Di;*nZGIaIeL_({JR8%ef3K9Sh2JQV^_$J&z?Ta!K94QoMPo}@}WiB7Dr0 at Av#
zWhD?su+w^<E};%IU^<;n-oZF8nlRvK!`?yeu3~|cqzXf16#gtuM^8Q^fGpeP)%)b)
z(S_fg+ZTqOTQ@)9q3hA5wr8#6J7eYKvphSV-I~xOu5yd+JPBhqgfLCo)P8}!SABhc
zo5IzOR$tI40{)=bXXM-w5zv1yH&Zp=0$cTnwDfKq at O81hLuIChR@ZOlDUxPK1=lsy
zQ|3sGOt+Hm6fNy+g^jaWdsh?bIXr1)vDiLA6^4z#VDoQkmN^ZeySm7dBxdXMh?9{5
zC{53ZTw%I+w#XI6==g$Bjd^)OUI8j(CZA^%K7*eCm*T(T`YomIK-DiAP&A;)J-rZ3
zTa5FnnQk}U at H6mr9Is9!>p+x_Ep~_!%s;1%jY#C=2n;uP;r5jK^32WH1d>JMWVUM~
zo{#1fIJoMS$0}Pk7ZZh!kHp>8c7iwQc9WmJ1zjN^^L4?+mF<@ke*&nJm|TvFl6O87
zMpLU)|NC6WC%d4wjgHoj_6F3q*@0^Ntp@)Umx>`Q2U`jBlaR+1P8$@#&exfGlz<)`
z*W^Int&2v$2w$iym=U!9yExIFev-8ao at ENA1ovI3Dxf_@=Jwj;4zPT$Y3!F%veOgr
z(5Ov29ET1I{jz$^?1a2>?JKm_`8VrIqz=~Mxt2eL;-Z2N&xRiyDtqa9M;|$fk!O<2
zsAt0dc#c%O<%#fyo~k`Z|1|yWsq1S?>8T}h=63;g0bWwW`8L3FiIVWgpYT+k55yk4
zoF<ad!&bt8N!qT%NH0Bw<(6_;H at +B+3jF5Z<JpL#xT(Z=Jw7Z|X9x`^P)!~!IFY;S
z<zq%~iJeMScNyxQDQ)xq at nAiTHuv;#^$8^&#|yjdovwpAGS)9?aI<}KZ!3gQMR=H)
zhR)H%rczF5^m at D=M;1;0 at iDnD4CqC0BHH;mF6-ND$;WHej(zIwchx9@$|aPI*Xc=r
zzl$5ujm;Ezd|W{cYz581pT%x&KJc`g^7uZ}d}9=VLn96x<1|nOaa$fYkSoKkT$E#b
zhV2T*bX|^mjg+n`qxSWeujt<v8{S1^fVxndIpTw>MjXfD5FnA&Z(DkHMS6L{^IYJK
zWrS}f{B}y?eYb4Otr<pEt=jXtjuG^0a*yN40OQ%dv#QlQ)SnU<1KZurK}R>Bk))X}
zdnT^E(Crba at kb~{<wnotnqt>^mzC1RDf9 at 4M(H$KDTF_tNF}bW$Maz20Ua<5^l5~I
z`~+geueW#J78GNM;bAn_eP=13e8T}dC;Rnh)2%3%k*R3ZTa{S)!}^WsMowibURv7k
znRtF{ELYoQve!2V|HhICWa!OPS at ZyM=h|+>UIn+4L0_0%*&@6G6AfMUjm(e7*=>U?
z`uG6M)_ymgWA1TzxW_KhSNk_=4jq{IzpqXX%CNs+l|*9_WGU5e(8?Dg4Dzaoi%TMn
z2a!caXc*G?!-LGAA>UCt(=aCy=rylIXHkV)`l}0(A+g>bUo%Z*QYWLcH#t_YzRQZ-
zn_ew1 at raKK#}O-j%cm?=m~yaOJEwf at ZK|7VQ6tqLHsmz#)&)&XOs*D<uem3QHSWO1
zWOoBkTZKyU=pqX%o5Pty8;|E#KqHfL!MPcu-o_GUG<p<RKKvYx(%oI_hdyfoixwaW
znd<eTMw}HdkXH&89Uqwv!=zgf6`*jXs}zVGo<^5WUEUNWOZz`j_q1CFpCdBs;nzb8
z4&&=4*Eehp5nXyba^}Zlr2Z8~AyX7N@`*D-mUS&9i+KFE(F3y|eZFb{0EwEStdx#t
z!sJGAH_SeP%qPwbvm|nN*MiI2e|!%#_3gy>foMK@{vGc;0{-sw)O%%PD+eMze*6<D
z*Qn%6t&#EQ8hNkBh~63%)fs2S5%b&k(&U<Y?<YBnj=a311-!lONwlE9&vg8`ss%<X
zb;;6qJ1xWTl2IhvLX-pv37tqt6tks*#v$bBP`zUnmE3vza1Z4^xaX4!y$DPKR#b>}
zQPX=vsDvmBbWE$IT}`*B92F8C%~!6sDJURjp5||Q>==IgUTlO%U_-K)@H|?h48ESL
zZ;qRK9AR4x^F at 6A)py*>?ca>G%X{YJ&{4dBfHGzBevHSht$^d_^Oh6c^r%(rzEs^W
zhgY5S|6E3ve9Y&vFKZhhf|wPF6L+LKo}d_jG(Ya{z6Dbq{Yz=Ico`iIyWusVm-n`o
zRiX+FV&rRz*f)bF)#!!{5351TMxrf2<HxMs>C@}Q_sX`I++(IY31!^)G8ZZ?ezHz3
zfE)kCuH~fPeAD+RQq`7u_2Z at yY+%qk&JFClcI*ST^ooouc|&b89_Ej<Bs<D=X;{&g
z-Je at 9XwWf;(DkFK_ybhSH<sM-E-ZxK-UhFbQ`7b at Eunt=@|z5U;E$}`Q*B?>?MKL+
zw;;FUn&0;MOBwD++sLR5?AOTxEwd4HBjePfd5~BDBm#!=vYI504+f}DU&8FW?M3GL
ziSe1=UB&T#tAKm|*e at kP?xew~-*o5{;uhtJnTetWyBgkja3f2)*wNc(FjuOZI_=8d
z9iZCSMhqg8A6-WG+gb#}DUou0XGzUO27Zpu*o1N4j5KT=|Eu&lZxM)asTJW+a$4Hn
z-fgJx3OP5cKtT3m7?bp8Lyq&Z6Vr0RciVBLe~#8h48+lAe_C&q-*#Ez;N$&*J!IX_
z$=H6aSA9l#dF<y`fgAqG$00$zE$%nY<@t*GoeFjp3pU_zld1iR8Z<pOH2;*M&?ifW
zYQ1s*jILB4g;}Z053<&7Y*F&*LQ8$;7j1Otb=!S1?XX;TL1CFzKyA&`RMKf=@4||^
z_i_r6ENm at VE1hjgp?YkH0eD#i8KO at 9s7{HVxd<r(zP<g$$kGW$8T7cQw4PMogys=Y
zF|hyxF?cO6x=70s-%X%PaHB?3$-F+k-wELGlh~fM$i5;YN5+xX2|Qp7@<*B)J(En*
zj5<Th-4LfOPAB^fBdla(Ngk$g(IKt<j_=x#<QXYX+>FYcBpB;+^?9KBlw5d~c<Cbs
zcmRK!A&&U2O;-zl4(~`nBgbqu{x-Wl-|Lq>1_U;6pojs9uEo}KU^B~%m>qU_?hjfu
zy^S2D#XQQEUDEb(JWtT{Y)%Ncmp&6`(~Tev_x9>vlnvOdGiyU=<{+Cl>Ol{GRq^0~
zrr;LuA8VdifDXBAw!m8#ttaMsCn7hgd{sSVus at 6t!WqfHnYp5l7pU>Q(+mFuIVsBw
zUibJKU_Za~avf$sRyD-)hF|WDt)9v(+oxgu&9+N~m!5-2R#n>prAS`=@(HcI4%eo`
zgyHD3Q)&kX+E}kBiz)|1-FQ_!k9 at fdDl*UROmxv<21+MZvM0;9r)sY#!gG*QWhCGb
zF|AquhZ52Q4Y$?)$ggsi34bz<Tz-1{pfx-7{aBH4y-1dUHt`RtDQ6K`i0(#0 at VY4R
zD_o+>BAQ+6NQ&+6Crc+8$TQm0 at 9PIP`K1Ls`f}PAER7RRo7A><OR0gaOvmF`v51PN
z2S4y)RMpCKo at QLZz`L-+Odl>zo^@*B;DD><6dL<LD4+x&;7O<v at fh*6oSM&=toQ17
zZL{T)Fc$&%_NEZw>t+<uXF~o)FqjmZn0EMnA`FT#J|afqgDe<ws^?ICPK(^%FAPq%
z$V2X=Tv1;{{S323HXA3e_7)zzY=irj^5f;Py4D%R#kt)F<oBa>?*npLKrMA7kN at eo
zX*j*~e0OzwOwr_hVD>J+2-{(I2#>Vr)_(k;XsRqM28@%(ipuf)t$vYh)f;t1VU5VD
zFC&az*Xh=58mjmthf)1;v>Y%hH#iRQS5>Epp5n at UE!Za55?)hTpMQ0#@`KDt^x at HK
z%c6Fv(00RjO%K0$COC$lT=&|J+BvG_I=2aU)4+_3m&rYKa2>RxFJOgEv0bGRo=!wB
z9>uKR>=sSccjfJ8IMRfbFRUl(a?j1!U&hXk&M*teDI$T<JR2p-C%gz!6PT4aQ)Quk
zfbNya>}<IUGP2hI=3K1XPktPsaG7HVD9_8=Ipu!I(u%jsNj#$xyWv>WR at 5kxq_twd
zD28eWhZbRfwkK$NPO{ss17Se*&;1&h-Q$vpVlfGQR$ce*X*826U)^kc%9V00wCcvZ
z`Zuwp?VCZ`4uR;(2m^%6N&jM)0JLH7ILL07nh!3 at ad}n=ik}DXWGM7_ADpK2w{HrF
zpC^-5`v{bEuO{{6Sd*n$y_B$jl^edSHT<ll`#pN=YtcQ|PEv$B)#8K&CgNsR=1*UI
zF+L)v^_J%Gswqif)lt$7G(SBUVa_f-FyhaYJH^B=wyFK9*OFSs;Lx6(AziWHt5K`4
zZO$K~!|L@}Aan7G$-2Zfy~9}rtl`6<OSlcXbttIdqRfe)4za?a{<T<Yw6dn$4>sHz
zrTDk6X#epiD=5^|RXika=0SvA#@`b6(bT{5Tx5?)BEOA{E>2de+B(WjE%AA)m6jyk
zQyY}n|6!rP5a8c}^uL6`|5?BA|1n$e4=wTk`)M>$2Ezi=j?VM4y<~<zF}98{^YHP7
z9e$%Y&)->&o_H$iL0cU#oJJY$<BaFw;gObkloCX%*`Y5Yh++QJL%<146y$S(+|0eR
z_H!1LN}`U`6RLVAN=_FPYtaW`Mj2Ug`+-J*Nvv#jU52Wd^wa$WD}(Vt!2%=1|7He~
z<N;RVRwYfEKm0Rn at h7?Cm(c0 at gKxfWau2Qbk}|mUkNp^V{N*H`fQzPl^q_xF_HSh1
z7m at LZA2-kFHtBGI^o?X+ELYTQQkb)P+;I`otH1*Au+O@%*6mMiQNH{BWappS!QbCy
zelfNiZT<1aulsnU;FrE|RGtmkP~k2lz^7z|m8{b3Iv>vAieds#nnuaOmo*y8GFXX=
zii*%frTCsmB@*EvzmXJGU`LFp4SEXSc&nw|aZ%JfD-2KNXAC-Rfq%a{F+>6&`1AlO
zu!PU{P`^JenXcha|6a~h4kkq>?eed1-hN#pow9NzU8exFt9ngSGLRazG%BfN)734k
zPrcM;9f|pv6K at m{AItNnV8`z3b6sbd at D}Mwx5rcD6f3MkI;W{Yr9V$#gV=@dT||<y
zB>Tv3k0+&;&;9y+5!AbGx}@LS0t<@|!%g#kdclTSz54VjsWzB<s9EK*i=7USENY<+
z$yWyb<W2(_lPe#;HTe&lomHr{SQI+BX^~brMx-?8E#O#x^Zs*fAm^vCF at wh`IBmKo
zm)^IsP9YThIiH5{L`g<{k9Ab2rvg99<jKz(n!1EQzipNAA5bnI_j!#q_0UG~R0mNS
zwI+te1re^fvYHMZZGEMw_}B*@r(k9HleH{bXsI<;t19+?oS_|5ISCG8g5r1UwO}v8
z2&i86V{7WB>?aagCRY(Co%`8nwJRPaFypJ#fV$|j6}M+AM<L4LmF4F@=du*CD^?Y*
zQb(u&2ou9UGEdqj+j&0k(Bl0nwm84R{4}oV?(n0J)_Y(4U|ZsKXfs38^=yLocY(ZE
z9;`3>DA4UIVWlr^Ny)e_c+k(BbTUehSLB4L1$fu1^F_Y%%d1su8tNmS2;?e8t7#QX
z^Yb!m%<v<8<@=)?zfPnYrO#><h*fY+T|D~~wBM33eHIMM#;?4}9BFN>qGFxhuj7^P
zUo1;?-jhpwDeQ<s at kEcUbfM~1tY)J~S*5#NHgwc3 at g3_2>)5OlGt=5s>)2~m%k2*d
zNb5q?W4WHMUg~X*OeO79olO|Kc)eJ0qxRBDHAk);f!AvPB2S-`FK&jHirS~ro&;qJ
zm~S^73h9G?E=G;E{b|kWw9TlUO#2UA+v#$^nxz0zQM#Nq at AmgR?O*c8HXCUMR=V_-
zH_xf- at Z(|)&AX*e!bPp?76kD}2mwgPTYvx at LH+}sDZYN~Jg!6Hdpas$N^34t&n4U!
zulaGYNN1hvq<l!|=|*y66_mzXJZE0$fV^W)!7l(e=DHW1RHih!R%=0Vtv{8A%~U^n
z8|L;zN-=e|x_??@`MJ>AxHtcUYvF)7a=z9cvyLln$w0l4neFU5KBnyVZUxFqn$E4t
zfO|Vx*RZ!2-kN-6hprD^ZPC;W&01EEpyJS@=FP+w^p{XE_~Hzr9;0R0@}gho;4s_&
z(9iK$iMl}7A2(*bsI)_0UBo$#%HA9<fjRcu;U+LJ*nE3^<tP+JtA-W(p2~EjK&5pS
zajSr|RBPKcekf#SD|+#`tX8A{JT?A%@k;GC$LZz<pHd|h3ZjkVU?TuXiTx{>9py%M
zGT=wJ;So}9d22_z^9rR97b=F_&H_4<^_iOJ17HQ?iFGlri?eh-!=ZC?rW(~O$?t`T
z02!7=az91C2l!*=JFGlZfcVAyj at L*?#>0W98Li894b7gZL2YCoR`z<b+#W|RJ#04>
zp%m=frK%e^*D4-|kI%{T*0xt5O~)aPp0wJabP8_I=whIy;z=uPo8B5>EU7?q5=Qjx
z?|*3p+*;ukpCXvL1J17v4;%wei=nYR-<eedg3{;0+eZ4=bJ_W<KkWz?E))e`WFY|t
ztjLl8a9a%y?o;pU at mzJFcNeqyQy7dRqSrDY(xkRl6F@{<AMqm9R55_cLKLgdaX{bq
z(`j*++9Of*5l6gwkwJ=LRyvnr6a=2M{u`H<t-IKkKRp&PAm-ab0rN*W0`ID)$ZXy;
zh2 at Qm^ewbxYIr|&l;ndqDD8Tx4v<sSHjAvoy+<$Jw2~G3NE|b{UQ+VTxC;9Dss|g7
zRC3nQOl=1cvoE&!*TY8!*3V$sbU8U?C(lVvwZfF%JG`8$3b`{!SveFArUDkku(RVv
z^3(=cu0OPo%XmKH5Ag;E6JB*~^_3n206QI6G7N;I;R3dBfNBbEY+HDlH_kGmtKRHq
zHSo2fzU<1(Nq0koZza`V!EUAm8spYhJE@#WN?gN6^x3{yZL)DM^+D|*--0dDk`T9n
zQ~cIDsmVv_Dkv2sLh}8yB~!V4)!SY3><{2%sVr%Shdy>)j#H~2?oI7=F^gO5+d7>o
z{!|$L$P~8^=Ni0W{AG;1%;Hm;sSr``F^#yBIo&Y}8LE{<Z-e at QBjO*)-+ic<b5J4U
z)jzU}t7Ili_w8x$*Z6S)i?f4D85hbbj8Bp-4~@)s>jU-vu>$)2>$dhz`vp{cI;OXr
zaj`yh!2g()*XgLz(3NkO%bWS7@|CTc9p(G|(2GCMB0tpB^etR2{`$(dSF>XpHwG`P
z-fLvXp89adN$(kZBMpFwz7?G4*Lc`S<{KNcZn&<vFHa<?r~I<)l_#?|GN;G9s1LrQ
z^CsWihofZ08%O8x)hD<`kKXl<Tand1+t>3=-v;a0q6r7{ZhTx5{95K$Y#Fa_pOnhe
zjq1sNvQHSy*;3ZiBb_~q at m=%ov&{EO-g#Bm%<6w_S$;P*R%`$I at W2%s*}U;)a)lzP
z*I)M4?wn~k-S1`9u9 at Adb1!<W5|L6CUNU{bTJ3Gg4~*VETC>&6E$`3YTYdhv91P~`
zCQcWbe0|QAd3iq!W!L9l33gt2Vdq_&Bay1B+U{Sis;jYE{dM)@&&*q=g`~bdZMoy2
z-*J;apX3?-Ezvu9*6+sLZL2-cE{X|Szp5r+{h|viU#8Dzz4YgY%&eG$U+gL;`py0F
z>c^J%xm#+>cc(Bgh_wMjiJ>O at MU-jo?;XmyFRq%c-L*0L#ht6g8CAT0-wMVvHG0n2
zWc^huDg4~81&+<X%B|+M`Q_eTRlCso<u?oIdwYz0e+s_?`TTq0HB$l4H)(Qx7k}OG
zaQ=Vo+=klgt8#D4U%&k>;Ps36+;z9MuD$iHaK`7!RdIbUt+)CXf1X#r at R~DFk-bRQ
zUDh`9h1qk?+i}O)L|5OxJwLx{Q at r)|%d;67emv%2U}QMpUYZ>7@$awF_@@&mM*d%S
z`lb4-$9|qdw*?M&e(B$|M*rUayxk`c{+fPyTKx6b8+ at l6dARiP=l_fUr^y7qp8xCY
z<_EHWHG at UeyO^y1ny-EFkD1{Cs9<EMxpG0|R-Tb*zR8~}$3u2M&R2i9 at 7<K6pZ-q0
z=D93B=g;r#_wnWHYqnqA_%GbieZ3CXll4xy-=0Rt7W_X{Z``-ytN&kMdhFYGO614B
zCWC7W7k%evXwU=|OCXSN5af0cXkb+a*7jf^2DTW)i~tVDfap<$0~$QP?K#f<a&;`y
Q3I#=lr>mdKI;Vst08^GG!vFvP
literal 0
HcmV?d00001
diff --git a/documentation/toaster-manual/toaster-manual-intro.xml b/documentation/toaster-manual/toaster-manual-intro.xml
index ad9e08b..9f4c38b 100644
--- a/documentation/toaster-manual/toaster-manual-intro.xml
+++ b/documentation/toaster-manual/toaster-manual-intro.xml
@@ -39,7 +39,7 @@
<para>
You can use Toaster in Analysis Mode or Build Mode:
<itemizedlist>
- <listitem><para><emphasis>Analysis Mode:</emphasis>
+ <listitem><para id='toaster-analysis-mode'><emphasis>Analysis Mode:</emphasis>
In Analysis Mode, you can record builds and statistics.
In this Mode, you directly access the
<filename>bitbake</filename> command, which you then use to
@@ -82,7 +82,7 @@
</para></listitem>
</itemizedlist>
</para></listitem>
- <listitem><para><emphasis>Build Mode:</emphasis>
+ <listitem><para id='toaster-build-mode'><emphasis>Build Mode:</emphasis>
In Build Mode, Toaster handles the build configuration,
scheduling and execution.
In this mode, all your interaction with the build system
diff --git a/documentation/toaster-manual/toaster-manual-reference.xml b/documentation/toaster-manual/toaster-manual-reference.xml
index 0c9401f..faca4ca 100644
--- a/documentation/toaster-manual/toaster-manual-reference.xml
+++ b/documentation/toaster-manual/toaster-manual-reference.xml
@@ -214,48 +214,48 @@
In the file, you will find a section for layer sources
such as the following:
<literallayout class='monospaced'>
- "layersources": [
- {
- "name": "Local Yocto Project",
- "sourcetype": "local",
- "apiurl": "../../",
- "branches": ["HEAD", "master", "fido", "dizzy"],
- "layers": [
- {
- "name": "openembedded-core",
- "local_path": "meta",
- "vcs_url": "remote:origin",
- "dirpath": "meta"
- },
- {
- "name": "meta-yocto",
- "local_path": "meta-yocto",
- "vcs_url": "remote:origin",
- "dirpath": "meta-yocto"
- },
- {
- "name": "meta-yocto-bsp",
- "local_path": "meta-yocto-bsp",
- "vcs_url": "remote:origin",
- "dirpath": "meta-yocto-bsp"
- }
-
- ]
- },
- {
- "name": "OpenEmbedded",
- "sourcetype": "layerindex",
- "apiurl": "http://layers.openembedded.org/layerindex/api/",
- "branches": ["master", "fido", "dizzy"]
- },
- {
- "name": "Imported layers",
- "sourcetype": "imported",
- "apiurl": "",
- "branches": ["master", "fido", "dizzy", "HEAD"]
+ "layersources": [
+ {
+ "name": "Local Yocto Project",
+ "sourcetype": "local",
+ "apiurl": "../../",
+ "branches": ["HEAD" ],
+ "layers": [
+ {
+ "name": "openembedded-core",
+ "local_path": "meta",
+ "vcs_url": "remote:origin",
+ "dirpath": "meta"
+ },
+ {
+ "name": "meta-yocto",
+ "local_path": "meta-yocto",
+ "vcs_url": "remote:origin",
+ "dirpath": "meta-yocto"
+ },
+ {
+ "name": "meta-yocto-bsp",
+ "local_path": "meta-yocto-bsp",
+ "vcs_url": "remote:origin",
+ "dirpath": "meta-yocto-bsp"
+ }
+
+ ]
+ },
+ {
+ "name": "OpenEmbedded",
+ "sourcetype": "layerindex",
+ "apiurl": "http://layers.openembedded.org/layerindex/api/",
+ "branches": ["master", "jethro" ,"fido"]
+ },
+ {
+ "name": "Imported layers",
+ "sourcetype": "imported",
+ "apiurl": "",
+ "branches": ["master", "jethro","fido", "HEAD"]
- }
- ],
+ }
+ ],
</literallayout>
You should add your own layer source to this section by
following the same format used for the "OpenEmbedded"
@@ -268,7 +268,7 @@
indicate which branches from your layer source you want
to make available through Toaster.
For example, the OpenEmbedded layer source makes
- available only its "master", "fido", and "dizzy"
+ available only its "master", "fido", and "jethro"
branches.
</para>
@@ -373,12 +373,12 @@
As shipped, Toaster is configured to work with the following
releases:
<itemizedlist>
- <listitem><para><emphasis>Yocto Project 1.7 "Dizzy" or OpenEmbedded "Dizzy":</emphasis>
+ <listitem><para><emphasis>Yocto Project 2.0 "Jethro" or OpenEmbedded "Jethro":</emphasis>
This release causes your Toaster projects to
- build against the head of the dizzy branch at
- <ulink url='&YOCTO_GIT_URL;/cgit/cgit.cgi/poky/log/?h=dizzy'></ulink>
+ build against the head of the jethro branch at
+ <ulink url='&YOCTO_GIT_URL;/cgit/cgit.cgi/poky/log/?h=jethro'></ulink>
or
- <ulink url='http://git.openembedded.org/openembedded-core/commit/?h=dizzy'></ulink>.
+ <ulink url='http://git.openembedded.org/openembedded-core/commit/?h=jethro'></ulink>.
</para></listitem>
<listitem><para><emphasis>Yocto Project 1.8 "Fido" or OpenEmbedded "Fido":</emphasis>
This release causes your Toaster projects to
@@ -489,7 +489,7 @@
The branch for the layer source
(<filename>branch</filename>) used with the release.
For example, for the OpenEmbedded layer source, the
- "master", "fido", and "dizzy" branches are available.
+ "master", "fido", and "jethro" branches are available.
</para></listitem>
<listitem><para><emphasis>Default Layers:</emphasis>
The set of default layers
@@ -538,7 +538,7 @@
"branch": "master",
"defaultlayers": [ "openembedded-core" ],
"layersourcepriority": { "Imported layers": 99, "Local OpenEmbedded" : 10, "OpenEmbedded" : 0 },
- "helptext": "Toaster will run your builds using the OpenEmbedded master branch, where active development takes place. This is not a stable branch, so your builds might not work as expected."
+ "helptext": "Toaster will run your builds using the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/\">Yocto Project master branch</a>, where active development takes place. This is not a stable branch, so your builds might not work as expected."
}
]
</literallayout>
@@ -662,7 +662,6 @@
"IMAGE_FSTYPES": "ext3 jffs2 tar.bz2",
"IMAGE_INSTALL_append": "",
"PACKAGE_CLASSES": "package_rpm",
- "SDKMACHINE" : "x86_64"
},
</literallayout>
</para>
@@ -710,48 +709,48 @@
<para>
Here is the default <filename>layersources</filename> area:
<literallayout class='monospaced'>
- "layersources": [
- {
- "name": "Local Yocto Project",
- "sourcetype": "local",
- "apiurl": "../../",
- "branches": ["HEAD", "master", "fido", "dizzy"],
- "layers": [
- {
- "name": "openembedded-core",
- "local_path": "meta",
- "vcs_url": "remote:origin",
- "dirpath": "meta"
- },
- {
- "name": "meta-yocto",
- "local_path": "meta-yocto",
- "vcs_url": "remote:origin",
- "dirpath": "meta-yocto"
- },
- {
- "name": "meta-yocto-bsp",
- "local_path": "meta-yocto-bsp",
- "vcs_url": "remote:origin",
- "dirpath": "meta-yocto-bsp"
- }
-
- ]
- },
- {
- "name": "OpenEmbedded",
- "sourcetype": "layerindex",
- "apiurl": "http://layers.openembedded.org/layerindex/api/",
- "branches": ["master", "fido", "dizzy"]
- },
- {
- "name": "Imported layers",
- "sourcetype": "imported",
- "apiurl": "",
- "branches": ["master", "fido", "dizzy", "HEAD"]
+ "layersources": [
+ {
+ "name": "Local Yocto Project",
+ "sourcetype": "local",
+ "apiurl": "../../",
+ "branches": ["HEAD" ],
+ "layers": [
+ {
+ "name": "openembedded-core",
+ "local_path": "meta",
+ "vcs_url": "remote:origin",
+ "dirpath": "meta"
+ },
+ {
+ "name": "meta-yocto",
+ "local_path": "meta-yocto",
+ "vcs_url": "remote:origin",
+ "dirpath": "meta-yocto"
+ },
+ {
+ "name": "meta-yocto-bsp",
+ "local_path": "meta-yocto-bsp",
+ "vcs_url": "remote:origin",
+ "dirpath": "meta-yocto-bsp"
+ }
+
+ ]
+ },
+ {
+ "name": "OpenEmbedded",
+ "sourcetype": "layerindex",
+ "apiurl": "http://layers.openembedded.org/layerindex/api/",
+ "branches": ["master", "jethro" ,"fido"]
+ },
+ {
+ "name": "Imported layers",
+ "sourcetype": "imported",
+ "apiurl": "",
+ "branches": ["master", "jethro","fido", "HEAD"]
- }
- ],
+ }
+ ],
</literallayout>
</para>
</section>
@@ -763,7 +762,7 @@
This area of the JSON file defines the version of
BitBake Toaster uses.
As shipped, Toaster is configured to recognize four
- versions of BitBake: master, fido, dizzy, and HEAD.
+ versions of BitBake: master, fido, jethro, and HEAD.
<note>
HEAD is a special option that builds whatever is
available on disk, without checking out any remote
@@ -781,18 +780,18 @@
"branch": "master",
"dirpath": "bitbake"
},
+ {
+ "name": "jethro",
+ "giturl": "remote:origin",
+ "branch": "jethro",
+ "dirpath": "bitbake"
+ },
{
"name": "fido",
"giturl": "remote:origin",
"branch": "fido",
"dirpath": "bitbake"
},
- {
- "name": "dizzy",
- "giturl": "remote:origin",
- "branch": "dizzy",
- "dirpath": "bitbake"
- },
{
"name": "HEAD",
"giturl": "remote:origin",
@@ -848,6 +847,15 @@
"helptext": "Toaster will run your builds using the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/\">Yocto Project master branch</a>, where active development takes place. This is not a stable branch, so your builds might not work as expected."
},
{
+ "name": "jethro",
+ "description": "Yocto Project 2.0 Jethro",
+ "bitbake": "jethro",
+ "branch": "jethro",
+ "defaultlayers": [ "openembedded-core", "meta-yocto", "meta-yocto-bsp"],
+ "layersourcepriority": { "Imported layers": 99, "Local Yocto Project" : 10, "OpenEmbedded" : 0 },
+ "helptext": "Toaster will run your builds with the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=jethro\">Yocto Project 2.0 \"Jethro\"</a> branch."
+ },
+ {
"name": "fido",
"description": "Yocto Project 1.8 Fido",
"bitbake": "fido",
@@ -857,15 +865,6 @@
"helptext": "Toaster will run your builds with the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=fido\">Yocto Project 1.8 \"Fido\"</a> branch."
},
{
- "name": "dizzy",
- "description": "Yocto Project 1.7 Dizzy",
- "bitbake": "dizzy",
- "branch": "dizzy",
- "defaultlayers": [ "openembedded-core", "meta-yocto", "meta-yocto-bsp"],
- "layersourcepriority": { "Imported layers": 99, "Local Yocto Project" : 10, "OpenEmbedded" : 0 },
- "helptext": "Toaster will run your builds with the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=dizzy\">Yocto Project 1.7 \"Dizzy\"</a> branch."
- },
- {
"name": "local",
"description": "Local Yocto Project",
"bitbake": "HEAD",
diff --git a/documentation/toaster-manual/toaster-manual-setup-and-use.xml b/documentation/toaster-manual/toaster-manual-setup-and-use.xml
index 869d249..2693569 100644
--- a/documentation/toaster-manual/toaster-manual-setup-and-use.xml
+++ b/documentation/toaster-manual/toaster-manual-setup-and-use.xml
@@ -6,9 +6,488 @@
<title>Setting Up and Using Toaster</title>
- <section id='using-toaster-in-analysis-mode'>
+ <section id='starting-toaster-for-local-development'>
+ <title>Starting Toaster for Local Development</title>
+
+ <para>
+ Once you have set up the Yocto Project and installed the
+ Toaster system dependencies as described in
+ "<link linkend='toaster-manual-start'>Preparing to Use Toaster</link>",
+ you are ready to start Toaster.
+ </para>
+
+ <para>
+ If you want to configure and start your builds using the
+ Toaster web interface
+ (i.e. "<link linkend='toaster-build-mode'>Build Mode</link>"),
+ navigate to the root of your
+ <ulink url='&YOCTO_DOCS_DEV_URL;#source-directory'>Source Directory</ulink>
+ (e.g. <filename>poky</filename>):
+ <literallayout class='monospaced'>
+ $ cd poky
+ </literallayout>
+ Next, start Toaster:
+ <literallayout class='monospaced'>
+ $ bitbake/bin/toaster
+ </literallayout>
+ Open your favourite browser and enter the following:
+ <literallayout class='monospaced'>
+ http://127.0.0.1:8000
+ </literallayout>
+ If you would rather configure and start your builds
+ using the command line
+ (i.e. <link linkend='toaster-analysis-mode'>Analysis Mode</link>),
+ you can get Toaster to "listen"
+ to your builds and collect information about them.
+ To do that, navigate to the root of your Source Directory:
+ <literallayout class='monospaced'>
+ $ cd poky
+ </literallayout>
+ Once in that directory, source the build environment script:
+ <literallayout class='monospaced'>
+ $ source oe-init-build-env
+ </literallayout>
+ Next, from the build directory (e.g.
+ <filename>poky/build</filename>), start Toaster using this
+ command:
+ <literallayout class='monospaced'>
+ $ source ../bitbake/bin/toaster
+ </literallayout>
+ You can now run builds normally.
+ </para>
+
+ <para>
+ To see the build information provided by Toaster, open your
+ favorite browser and enter the following:
+ <literallayout class='monospaced'>
+ http://127.0.0.1:8000
+ </literallayout>
+ </para>
+ </section>
+
+ <section id='setting-a-different-port'>
+ <title>Setting a Different Port</title>
+
+ <para>
+ By default, Toaster starts on port 8000.
+ You can use the <filename>WEBPORT</filename> parameter to
+ set a different port.
+ For example, either of the following commands sets the
+ port to "8400":
+ <literallayout class='monospaced'>
+ $ bitbake/bin/toaster webport=8400
+ </literallayout>
+ or
+ <literallayout class='monospaced'>
+ $ source ../bitbake/bin/toaster webport=8400
+ </literallayout>
+ </para>
+ </section>
+
+ <section id='the-directory-for-cloning-layers'>
+ <title>The Directory for Cloning Layers</title>
+
+ <para>
+ If you are running Toaster in
+ <link linkend='toaster-build-mode'>Build Mode</link>,
+ Toaster creates a <filename>_toaster_clones</filename>
+ directory inside your Source Directory
+ (i.e. <filename>poky</filename>).
+ For example, suppose you use this command to start Toaster:
+ <literallayout class='monospaced'>
+ poky/bitbake/bin/toaster
+ </literallayout>
+ In this example, Toaster creates and uses the
+ <filename>poky/_toaster_clones</filename>
+ directory to clone any layers needed for your builds.
+ </para>
+
+ <para>
+ Alternatively, if you would like all of your Toaster related
+ files and directories to be in a particular location other than
+ the default, you can set the <filename>TOASTER_DIR</filename>
+ environment variable, which takes precedence over your current
+ working directory.
+ Setting this environment variable causes Toaster to create and use
+ <filename>$TOASTER_DIR./_toaster_clones</filename>.
+ </para>
+ </section>
+
+ <section id='toaster-the-build-directory'>
+ <title>The Build Directory</title>
+
+ <para>
+ If you are running Toaster in
+ <link linkend='toaster-build-mode'>Build Mode</link>,
+ Toaster creates a build directory within your Source
+ Directory (e.g. <filename>poky</filename>).
+ For example, suppose you use this command to start Toaster:
+ <literallayout class='monospaced'>
+ poky/bitbake/bin/toaster
+ </literallayout>
+ In this example, Toaster creates and uses the
+ <filename>poky/build</filename>
+ directory to execute the builds.
+ </para>
+
+ <para>
+ Alternatively, if you would like all of your Toaster related files
+ and directories to be in a particular location, you can set
+ the <filename>TOASTER_DIR</filename> environment variable,
+ which takes precedence over your current working directory.
+ Setting this environment variable causes Toaster to use
+ <filename>$TOASTER_DIR./build</filename> as the build directory.
+ </para>
+ </section>
+
+ <section id='toaster-creating-a-django-super-user'>
+ <title>Creating a Django Superuser</title>
+
+ <para>
+ Toaster is built on the
+ <ulink url='https://www.djangoproject.com/'>Django framework</ulink>.
+ Django provides an administration interface you can use
+ to edit Toaster configuration parameters.
+ </para>
+
+ <para>
+ To access the Django administration interface, you must
+ create a superuser by following these steps:
+ <orderedlist>
+ <listitem><para>
+ If you used <filename>virtualenv</filename>, which is
+ recommended, to set up the Toaster system dependencies,
+ you need be sure the virtual environment is activated.
+ To activate this environment, use the following:
+ <literallayout class='monospaced'>
+ $ source venv/bin/activate
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ From the root of your checkout directory, invoke the
+ following command from <filename>manage.py</filename>:
+ <literallayout class='monospaced'>
+ $ ./bitbake/lib/toaster/manage.py createsuperuser
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ Django prompts you for the username, which you need to
+ provide.
+ </para></listitem>
+ <listitem><para>
+ Django prompts you for an email address, which is
+ optional.
+ </para></listitem>
+ <listitem><para>
+ Django prompts you for a password, which you must provide.
+ </para></listitem>
+ <listitem><para>
+ Django prompts you to re-enter your password for verification.
+ </para></listitem>
+ </orderedlist>
+ After completing these steps, the following confirmation message
+ appears:
+ <literallayout class='monospaced'>
+ Superuser created successfully.
+ </literallayout>
+ </para>
+
+ <para>
+ Creating a superuser allows you to access the Django administration
+ interface through a browser.
+ The URL for this interface is the same as the URL used for the
+ Toaster instance with "/admin" on the end.
+ For example, if you are running Toaster locally, use the
+ following URL:
+ <literallayout class='monospaced'>
+ http://127.0.0.1:8000/admin
+ </literallayout>
+ You can use the Django administration interface to set Toaster
+ configuration parameters such as the build directory, layer sources,
+ default variable values, and BitBake versions.
+ </para>
+ </section>
+
+ <section id='toaster-setting-up-a-production-instance-of-toaster'>
+ <title>Setting Up a Production Instance of Toaster</title>
+
+ <para>
+ You can use a production instance of Toaster to share the
+ Toaster instance with remote users, multiple users, or both.
+ The production instance is also the setup that can cope with
+ heavier loads on the web service.
+ Use the instructions in the following sections to set up
+ Toaster in
+ <link linkend='toaster-build-mode'>Build Mode</link>
+ where builds and projects are run,
+ viewed, and defined through the Toaster web interface.
+ </para>
+
+ <section id='toaster-production-instance-requirements'>
+ <title>Requirements</title>
+
+ <para>
+ Be sure you meet the following requirements:
+ <note>
+ You must comply with all Apache,
+ <filename>mod-wsgi</filename>, and Mysql requirements.
+ </note>
+ <itemizedlist>
+ <listitem><para>
+ Have all the build requirements as described in
+ "<link linkend='toaster-setting-up-the-basic-system-requirements'>Setting Up the Basic System Requirements</link>"
+ chapter.
+ </para></listitem>
+ <listitem><para>
+ Have an Apache webserver.
+ </para></listitem>
+ <listitem><para>
+ Have <filename>mod-wsgi</filename> for the Apache
+ webserver.
+ </para></listitem>
+ <listitem><para>
+ Use the Mysql database server.
+ </para></listitem>
+ <listitem><para>
+ If you are using Ubuntu 14.04.3, run the following:
+ <literallayout class='monospaced'>
+ $ sudo apt-get install apache2 libapache2-mod-wsgi mysql-server virtualenv libmysqlclient-dev
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ If you are using Fedora 22 or a RedHat distribution, run
+ the following:
+ <literallayout class='monospaced'>
+ $ sudo dnf install httpd mod_wsgi python-virtualenv gcc mysql-devel
+ </literallayout>
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </section>
+
+ <section id='toaster-installation-steps'>
+ <title>Installation</title>
+
+ <para>
+ Perform the following steps to install Toaster:
+ <orderedlist>
+ <listitem><para>
+ Checkout a copy of <filename>poky</filename>
+ into the web server directory.
+ You will be using <filename>/var/www/toaster</filename>:
+ <literallayout class='monospaced'>
+ $ mkdir -p /var/www/toaster
+ $ cd /var/www/toaster/
+ $ git clone git://git.yoctoproject.org/poky
+ $ git checkout &DISTRO_NAME;
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ Initialize a virtual environment and install Toaster
+ dependencies.
+ Using a virtual environment keeps the Python packages
+ isolated from your system-provided packages:
+ <literallayout class='monospaced'>
+ $ cd /var/www/toaster/
+ $ virtualenv venv
+ $ source ./venv/bin/activate
+ $ pip install -r ./poky/bitbake/toaster-requirements.txt
+ $ pip install mysql
+ $ pip install MySQL-python
+ </literallayout>
+ <note>
+ Isolating these packages is not required but is
+ recommended.
+ Alternatively, you can use your operating system's
+ package manager to install the packages.
+ </note>
+ </para></listitem>
+ <listitem><para>
+ Configure Toaster by editing
+ <filename>/var/www/toaster/poky/bitbake/lib/toaster/toastermain/settings.py</filename>
+ as follows:
+ <itemizedlist>
+ <listitem><para>
+ Edit the <filename>DATABASE</filename> settings:
+ <literallayout class='monospaced'>
+ DATABASES = {
+ 'default': {
+ 'ENGINE': 'django.db.backends.mysql',
+ 'NAME': 'toaster_data',
+ 'USER': 'toaster',
+ 'PASSWORD': 'yourpasswordhere',
+ 'HOST': 'localhost',
+ 'PORT': '3306',
+ }
+ }
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ Edit the <filename>SECRET_KEY</filename>:
+ <literallayout class='monospaced'>
+ SECRET_KEY = '<replaceable>your_secret_key</replaceable>'
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ Edit the <filename>STATIC_ROOT</filename>:
+ <literallayout class='monospaced'>
+ STATIC_ROOT = '/var/www/toaster/static_files/'
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ Enable Build Mode by adding the following
+ line to <filename>settings.py</filename>:
+ <literallayout class='monospaced'>
+ BUILD_MODE=True
+ </literallayout>
+ </para></listitem>
+ </itemizedlist>
+ </para></listitem>
+ <listitem><para>
+ Add the database and user to the <filename>mysql</filename>
+ server defined earlier:
+ <literallayout class='monospaced'>
+ $ mysql -u root -p
+ mysql> CREATE DATABASE toaster_data;
+ mysql> CREATE USER 'toaster'@'localhost' identified by 'yourpasswordhere';
+ mysql> GRANT all on toaster_data.* to 'toaster'@'localhost';
+ mysql> quit
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ Get Toaster to create the database schema,
+ default data, and gather the statically-served files:
+ <literallayout class='monospaced'>
+ $ cd /var/www/toaster/poky/
+ $ ./bitbake/lib/toaster/manage.py syncdb
+ $ ./bitbake/lib/toaster/manage.py migrate
+ $ TOASTER_DIR=`pwd` TOASTER_CONF=./meta-yocto/conf/toasterconf.json ./bitbake/lib/toaster/manage.py checksettings
+ $ ./bitbake/lib/toaster/manage.py collectstatic
+ </literallayout>
+ </para>
+
+ <para>
+ For the above set of commands, after moving to the
+ <filename>poky</filename> directory,
+ the <filename>syncdb</filename> and <filename>migrate</filename>
+ commands ensure the database
+ schema has had changes propagated correctly (i.e.
+ migrations).
+ </para>
+
+ <para>
+ The next line sets the Toaster root directory
+ <filename>TOASTER_DIR</filename> and the location of
+ the Toaster configuration file
+ <filename>TOASTER_CONF</filename>, which is
+ relative to the Toaster root directory
+ <filename>TOASTER_DIR</filename>.
+ For more information on the Toaster configuration file
+ <filename>TOASTER_CONF</filename>, see the
+ <link linkend='toaster-json-files'>JSON Files</link>
+ section of this manual.
+ </para>
+
+ <para>
+ This line also runs the <filename>checksettings</filename>
+ command, which configures the location of the Toaster
+ <ulink url='&YOCTO_DOCS_DEV_URL;#build-directory'>Build directory</ulink>.
+ The Toaster root directory <filename>TOASTER_DIR</filename>
+ determines where the Toaster build directory
+ is created on the file system.
+ In the example above,
+ <filename>TOASTER_DIR</filename> is set as follows:
+ <literallayout class="monospaced">
+ /var/www/toaster/poky
+ </literallayout>
+ This setting causes the Toaster build directory to be:
+ <literallayout class="monospaced">
+ /var/www/toaster/poky/build
+ </literallayout>
+ </para>
+
+ <para>
+ Finally, the <filename>collectstatic</filename> command
+ is a Django framework command that collects all the
+ statically served files into a designated directory to
+ be served up by the Apache web server.
+ </para></listitem>
+ <listitem><para>
+ Add an Apache configuration file for Toaster to your Apache web
+ server's configuration directory.
+ If you are using Ubuntu or Debian, put the file here:
+ <literallayout class='monospaced'>
+ /etc/apache2/conf-available/toaster.conf
+ </literallayout>
+ If you are using Fedora or RedHat, put it here:
+ <literallayout class='monospaced'>
+ /etc/httpd/conf.d/toaster.conf
+ </literallayout>
+ Following is a sample Apache configuration for Toaster
+ you can follow:
+ <literallayout class='monospaced'>
+ Alias /static /var/www/toaster/static_files
+ <Directory /var/www/toaster/static_files>
+ Order allow,deny
+ Allow from all
+ Require all granted
+ </Directory>
+
+ WSGIDaemonProcess toaster_wsgi python-path=/var/www/toaster/poky/bitbake/lib/toaster:/var/www/toaster/venv/lib/python2.7/site-packages
+
+ WSGIScriptAlias / "/var/www/toaster/poky/bitbake/lib/toaster/toastermain/wsgi.py"
+ <Location />
+ WSGIProcessGroup toastern_wsgi
+ </Location>
+ </literallayout>
+ If you are using Ubuntu or Debian,
+ you will need to enable the config and module for Apache:
+ <literallayout class='monospaced'>
+ $ sudo a2enmod wsgi
+ $ sudo a2enconf toaster
+ $ chmod +x bitbake/lib/toaster/toastermain/wsgi.py
+ </literallayout>
+ Finally, restart Apache to make sure all new configuration
+ is loaded.
+ For Ubuntu and Debian use:
+ <literallayout class='monospaced'>
+ $ sudo service apache2 restart
+ </literallayout>
+ For Fedora and RedHat use:
+ <literallayout class='monospaced'>
+ $ sudo service httpd restart
+ </literallayout>
+ </para></listitem>
+ <listitem><para>
+ Install the build runner service.
+ This service needs to be running in order to dispatch
+ builds.
+ Use this command:
+ <literallayout class='monospaced'>
+ /var/www/toaster/poky/bitbake/lib/toaster/manage.py runbuilds
+ </literallayout>
+ Here is an example:
+ <literallayout class='monospaced'>
+ #!/bin/sh
+ # toaster run builds dispatcher
+ cd /var/www/toaster/
+ source ./venv/bin/activate
+ ./bitbake/lib/toaster/manage.py runbuilds
+ </literallayout>
+ </para></listitem>
+ </orderedlist>
+ You can now open up a browser and start using Toaster.
+ </para>
+ </section>
+ </section>
+
+
+
+
+<!-- <section id='using-toaster-in-analysis-mode'>
<title>Using Toaster in Analysis Mode</title>
+
<para>
This section describes how to use Toaster in Analysis Mode
after setting Toaster up as a local instance or as a hosted
@@ -324,14 +803,14 @@
<listitem><para><emphasis>Start the BitBake Server:</emphasis>
Start the BitBake server using the following command:
<literallayout class='monospaced'>
- $ bitbake --postread conf/toaster.conf --server-only -t xmlrpc -B localhost:0 && export BBSERVER=localhost:-1
+ $ bitbake ‐‐postread conf/toaster.conf ‐‐server-only -t xmlrpc -B localhost:0 && export BBSERVER=localhost:-1
</literallayout>
</para></listitem>
<listitem><para><emphasis>Start the Logging Server:</emphasis>
Start the Toaster Logging Interface using the following
command:
<literallayout class='monospaced'>
- $ nohup bitbake --observe-only -u toasterui >toaster_ui.log &
+ $ nohup bitbake ‐‐observe-only -u toasterui >toaster_ui.log &
</literallayout>
<note>
No hard-coded ports are used in the BitBake options
@@ -810,6 +1289,7 @@
</para>
</section>
</section>
+-->
<section id='using-the-toaster-web-interface'>
<title>Using the Toaster Web Interface</title>
@@ -867,58 +1347,119 @@
CPU usage, and disk I/O.
</para></listitem>
</itemizedlist>
- Following are several videos that show how to use the Toaster GUI:
- <itemizedlist>
- <listitem><para><emphasis>Build Configuration:</emphasis>
- This
- <ulink url='https://www.youtube.com/watch?v=qYgDZ8YzV6w'>video</ulink>
- overviews and demonstrates build configuration for Toaster.
- </para></listitem>
- <listitem><para><emphasis>Toaster Homepage and Table Controls:</emphasis>
- This
- <ulink url='https://www.youtube.com/watch?v=QEARDnrR1Xw'>video</ulink>
- goes over the Toaster entry page, and provides
- an overview of the data manipulation capabilities of
- Toaster, which include search, sorting and filtering by
- different criteria.
- </para></listitem>
- <listitem><para><emphasis>Build Dashboard:</emphasis>
- This
- <ulink url='https://www.youtube.com/watch?v=KKqHYcnp2gE'>video</ulink>
- shows you the build dashboard, a page providing an
- overview of the information available for a selected build.
- </para></listitem>
- <listitem><para><emphasis>Image Information:</emphasis>
- This
- <ulink url='https://www.youtube.com/watch?v=XqYGFsmA0Rw'>video</ulink>
- walks through the information Toaster provides
- about images: packages installed and root file system.
- </para></listitem>
- <listitem><para><emphasis>Configuration:</emphasis>
- This
- <ulink url='https://www.youtube.com/watch?v=UW-j-T2TzIg'>video</ulink>
- provides Toaster build configuration information.
- </para></listitem>
- <listitem><para><emphasis>Tasks:</emphasis>
- This
- <ulink url='https://www.youtube.com/watch?v=D4-9vGSxQtw'>video</ulink>
- shows the information Toaster provides about the
- tasks run by the build system.
- </para></listitem>
- <listitem><para><emphasis>Recipes and Packages Built:</emphasis>
- This
- <ulink url='https://www.youtube.com/watch?v=x-6dx4huNnw'>video</ulink>
- shows the information Toaster provides about recipes
- and packages built.
- </para></listitem>
- <listitem><para><emphasis>Performance Data:</emphasis>
- This
- <ulink url='https://www.youtube.com/watch?v=qWGMrJoqusQ'>video</ulink>
- shows the build performance data provided by
- Toaster.
- </para></listitem>
- </itemizedlist>
</para>
+
+ <section id='web-interface-videos'>
+ <title>Toaster Web Interface Videos</title>
+
+ <para>
+ Following are several videos that show how to use the Toaster GUI:
+ <itemizedlist>
+ <listitem><para><emphasis>Build Configuration:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=qYgDZ8YzV6w'>video</ulink>
+ overviews and demonstrates build configuration for Toaster.
+ </para></listitem>
+ <listitem><para><emphasis>Build Custom Layers:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=QJzaE_XjX5c'>video</ulink>
+ shows you how to build custom layers that are used with
+ Toaster.
+ </para></listitem>
+ <listitem><para><emphasis>Toaster Homepage and Table Controls:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=QEARDnrR1Xw'>video</ulink>
+ goes over the Toaster entry page, and provides
+ an overview of the data manipulation capabilities of
+ Toaster, which include search, sorting and filtering by
+ different criteria.
+ </para></listitem>
+ <listitem><para><emphasis>Build Dashboard:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=KKqHYcnp2gE'>video</ulink>
+ shows you the build dashboard, a page providing an
+ overview of the information available for a selected build.
+ </para></listitem>
+ <listitem><para><emphasis>Image Information:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=XqYGFsmA0Rw'>video</ulink>
+ walks through the information Toaster provides
+ about images: packages installed and root file system.
+ </para></listitem>
+ <listitem><para><emphasis>Configuration:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=UW-j-T2TzIg'>video</ulink>
+ provides Toaster build configuration information.
+ </para></listitem>
+ <listitem><para><emphasis>Tasks:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=D4-9vGSxQtw'>video</ulink>
+ shows the information Toaster provides about the
+ tasks run by the build system.
+ </para></listitem>
+ <listitem><para><emphasis>Recipes and Packages Built:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=x-6dx4huNnw'>video</ulink>
+ shows the information Toaster provides about recipes
+ and packages built.
+ </para></listitem>
+ <listitem><para><emphasis>Performance Data:</emphasis>
+ This
+ <ulink url='https://www.youtube.com/watch?v=qWGMrJoqusQ'>video</ulink>
+ shows the build performance data provided by
+ Toaster.
+ </para></listitem>
+ </itemizedlist>
+ </para>
+ </section>
+
+ <section id='toaster-web-interface-preferred-version'>
+ <title>Building a Specific Recipe Given Multiple Versions</title>
+
+ <para>
+ Occasionally, a layer might provide more than one version of
+ the same recipe.
+ For example, the <filename>openembedded-core</filename> layer
+ provides two versions of the <filename>bash</filename> recipe
+ (i.e. 3.2.48 and 4.3.30-r0) and two versions of the
+ <filename>which</filename> recipe (i.e. 2.21 and 2.18).
+ The following figure shows this exact scenario:
+ <imagedata fileref="figures/bash-oecore.png" align="center" width="9in" depth="6in" />
+ </para>
+
+ <para>
+ By default, the OpenEmbedded build system builds one of the
+ two recipes.
+ For the <filename>bash</filename> case, version 4.3.30-r0 is
+ built by default.
+ Unfortunately, Toaster as it exists, is not able to override
+ the default recipe version.
+ If you would like to build bash 3.2.48, you need to set the
+ <ulink url='&YOCTO_DOCS_REF_URL;#var-PREFERRED_VERSION'><filename>PREFERRED_VERSION</filename></ulink>
+ variable.
+ You can do so from Toaster, using the "Add variable" form,
+ which is available in the "BitBake variables" page of the
+ project configuration section as shown in the following screen:
+ <imagedata fileref="figures/add-variable.png" align="center" width="9in" depth="6in" />
+ </para>
+
+ <para>
+ To specify <filename>bash</filename> 3.2.48 as the version to build,
+ enter "PREFERRED_VERSION_bash" in the "Variable" field, and "3.2.48"
+ in the "Value" field.
+ Next, click the "Add variable" button:
+ <imagedata fileref="figures/set-variable.png" align="center" width="9in" depth="6in" />
+ </para>
+
+ <para>
+ After clicking the "Add variable" button, the settings for
+ <filename>PREFERRED_VERSION</filename> are added to the bottom
+ of the BitBake variables list.
+ With these settings, the OpenEmbedded build system builds the
+ desired version of the recipe rather than the default version:
+ <imagedata fileref="figures/variable-added.png" align="center" width="9in" depth="6in" />
+ </para>
+ </section>
</section>
<!--
diff --git a/documentation/toaster-manual/toaster-manual-start.xml b/documentation/toaster-manual/toaster-manual-start.xml
index fbdb5ec..daefa79 100644
--- a/documentation/toaster-manual/toaster-manual-start.xml
+++ b/documentation/toaster-manual/toaster-manual-start.xml
@@ -15,12 +15,13 @@
<title>Setting Up the Basic System Requirements</title>
<para>
- You first need to be sure your build system is set up to run
- the Yocto Project.
- See the
- "<ulink url='&YOCTO_DOCS_QS_URL;#yp-resources'>Setting Up to Use the Yocto Project</ulink>"
- section in the Yocto Project Quick Start for information on how
- to set up your system for the Yocto Project.
+ Before you can use Toaster, you need to first set up your
+ build system to run the Yocto Project.
+ To do this, follow the instructions in the
+ "<ulink url='&YOCTO_DOCS_QS_URL;#packages'>The Build Host Packages</ulink>"
+ and
+ "<ulink url='&YOCTO_DOCS_QS_URL;#releases'>Yocto Project Release</ulink>"
+ sections in the Yocto Project Quick Start.
</para>
</section>
@@ -41,16 +42,21 @@
install-compatible format.
</para>
- <section id='toaster-optional-virtual-environment'>
- <title>Optionally Setting Up a Python Virtual Environment</title>
+ <section id='toaster-virtual-environment'>
+ <title>Set Up a Python Virtual Environment</title>
<para>
- It is highly recommended that you use a Python virtual
- environment that allows you to maintain a dedicated Python
- executable and its own set of installed modules.
- Doing so separates the executable from the Python and modules
- provided by the operating system and therefore avoids any
- version conflicts.
+ Set up a Python virtual environment that allows you
+ to maintain a dedicated Python executable and its own
+ set of installed modules.
+ Doing so separates the executable from Python and the
+ modules provided by the operating system.
+ This separation avoids any version conflicts.
+ <note>
+ Creating a virtual environment is not absolutely
+ necessary.
+ However, doing so is highly recommended.
+ </note>
</para>
<para>
@@ -73,7 +79,7 @@
</para></listitem>
</orderedlist>
<note>
- If you do choose to set up a virtual environment in
+ After setting up a virtual environment in
which to run Toaster, you must initialize that
virtual environment each time you want to start
Toaster.
diff --git a/documentation/toaster-manual/toaster-manual.xml b/documentation/toaster-manual/toaster-manual.xml
index 9dac6d9..59dca8f 100644
--- a/documentation/toaster-manual/toaster-manual.xml
+++ b/documentation/toaster-manual/toaster-manual.xml
@@ -26,7 +26,7 @@
<affiliation>
<orgname>Intel Corporation</orgname>
</affiliation>
- <email>scott.m.rifenbark at intel.com</email>
+ <email>srifenbark at gmail.com</email>
</author>
</authorgroup>
@@ -37,9 +37,9 @@
<revremark>Released with the Yocto Project 1.8 Release.</revremark>
</revision>
<revision>
- <revnumber>1.9</revnumber>
+ <revnumber>2.0</revnumber>
<date>October 2015</date>
- <revremark>Released with the Yocto Project 1.9 Release.</revremark>
+ <revremark>Released with the Yocto Project 2.0 Release.</revremark>
</revision>
</revhistory>
diff --git a/documentation/tools/mega-manual.sed b/documentation/tools/mega-manual.sed
index bec40b3..088a99b 100644
--- a/documentation/tools/mega-manual.sed
+++ b/documentation/tools/mega-manual.sed
@@ -2,32 +2,32 @@
# This style is for manual folders like "yocto-project-qs" and "poky-ref-manual".
# This is the old way that did it. Can't do that now that we have "bitbake-user-manual" strings
# in the mega-manual.
-# s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/[a-z]*-[a-z]*-[a-z]*\/[a-z]*-[a-z]*-[a-z]*.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/yocto-project-qs\/yocto-project-qs.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/poky-ref-manual\/poky-ref-manual.html#/\"link\" href=\"#/g
+# s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/[a-z]*-[a-z]*-[a-z]*\/[a-z]*-[a-z]*-[a-z]*.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/yocto-project-qs\/yocto-project-qs.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/poky-ref-manual\/poky-ref-manual.html#/\"link\" href=\"#/g
# Processes all other manuals (<word>-<word> style) except for the BitBake User Manual because
# it is not included in the mega-manual.
# This style is for manual folders that use two word, which is the standard now (e.g. "ref-manual").
# This was the one-liner that worked before we introduced the BitBake User Manual, which is
# not in the mega-manual.
-# s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/[a-z]*-[a-z]*\/[a-z]*-[a-z]*.html#/\"link\" href=\"#/g
+# s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/[a-z]*-[a-z]*\/[a-z]*-[a-z]*.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/adt-manual\/adt-manual.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/bsp-guide\/bsp-guide.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/dev-manual\/dev-manual.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/kernel-dev\/kernel-dev.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/profile-manual\/profile-manual.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/ref-manual\/ref-manual.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/toaster-manual\/toaster-manual.html#/\"link\" href=\"#/g
-s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/yocto-project-qs\/yocto-project-qs.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/adt-manual\/adt-manual.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/bsp-guide\/bsp-guide.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/dev-manual\/dev-manual.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/kernel-dev\/kernel-dev.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/profile-manual\/profile-manual.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/ref-manual\/ref-manual.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/toaster-manual\/toaster-manual.html#/\"link\" href=\"#/g
+s/\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/yocto-project-qs\/yocto-project-qs.html#/\"link\" href=\"#/g
# Process cases where just an external manual is referenced without an id anchor
-s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/yocto-project-qs\/yocto-project-qs.html\" target=\"_top\">Yocto Project Quick Start<\/a>/Yocto Project Quick Start/g
-s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/dev-manual\/dev-manual.html\" target=\"_top\">Yocto Project Development Manual<\/a>/Yocto Project Development Manual/g
-s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/adt-manual\/adt-manual.html\" target=\"_top\">Yocto Project Application Developer's Guide<\/a>/Yocto Project Application Developer's Guide/g
-s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/bsp-guide\/bsp-guide.html\" target=\"_top\">Yocto Project Board Support Package (BSP) Developer's Guide<\/a>/Yocto Project Board Support Package (BSP) Developer's Guide/g
-s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/profile-manual\/profile-manual.html\" target=\"_top\">Yocto Project Profiling and Tracing Manual<\/a>/Yocto Project Profiling and Tracing Manual/g
-s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/kernel-dev\/kernel-dev.html\" target=\"_top\">Yocto Project Linux Kernel Development Manual<\/a>/Yocto Project Linux Kernel Development Manual/g
-s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/ref-manual\/ref-manual.html\" target=\"_top\">Yocto Project Reference Manual<\/a>/Yocto Project Reference Manual/g
-s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/1.9\/toaster-manual\/toaster-manual.html\" target=\"_top\">Toaster User Manual<\/a>/Toaster User Manual/g
+s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/yocto-project-qs\/yocto-project-qs.html\" target=\"_top\">Yocto Project Quick Start<\/a>/Yocto Project Quick Start/g
+s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/dev-manual\/dev-manual.html\" target=\"_top\">Yocto Project Development Manual<\/a>/Yocto Project Development Manual/g
+s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/adt-manual\/adt-manual.html\" target=\"_top\">Yocto Project Application Developer's Guide<\/a>/Yocto Project Application Developer's Guide/g
+s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/bsp-guide\/bsp-guide.html\" target=\"_top\">Yocto Project Board Support Package (BSP) Developer's Guide<\/a>/Yocto Project Board Support Package (BSP) Developer's Guide/g
+s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/profile-manual\/profile-manual.html\" target=\"_top\">Yocto Project Profiling and Tracing Manual<\/a>/Yocto Project Profiling and Tracing Manual/g
+s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/kernel-dev\/kernel-dev.html\" target=\"_top\">Yocto Project Linux Kernel Development Manual<\/a>/Yocto Project Linux Kernel Development Manual/g
+s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/ref-manual\/ref-manual.html\" target=\"_top\">Yocto Project Reference Manual<\/a>/Yocto Project Reference Manual/g
+s/<a class=\"ulink\" href=\"http:\/\/www.yoctoproject.org\/docs\/2.0\/toaster-manual\/toaster-manual.html\" target=\"_top\">Toaster User Manual<\/a>/Toaster User Manual/g
diff --git a/documentation/yocto-project-qs/yocto-project-qs.xml b/documentation/yocto-project-qs/yocto-project-qs.xml
index 5da7314..5315dfe 100644
--- a/documentation/yocto-project-qs/yocto-project-qs.xml
+++ b/documentation/yocto-project-qs/yocto-project-qs.xml
@@ -308,7 +308,7 @@
</para></listitem>
<listitem><para><emphasis>Fedora</emphasis>
<literallayout class='monospaced'>
- $ sudo yum install &FEDORA_HOST_PACKAGES_ESSENTIAL; SDL-devel xterm
+ $ sudo dnf install &FEDORA_HOST_PACKAGES_ESSENTIAL; SDL-devel xterm
</literallayout>
</para></listitem>
<listitem><para><emphasis>OpenSUSE</emphasis>
diff --git a/meta-selftest/conf/machine/qemux86copy.conf b/meta-selftest/conf/machine/qemux86copy.conf
new file mode 100644
index 0000000..76c13fd
--- /dev/null
+++ b/meta-selftest/conf/machine/qemux86copy.conf
@@ -0,0 +1,3 @@
+require conf/machine/qemux86.conf
+
+MACHINEOVERRIDES .= ":qemux86"
diff --git a/meta-selftest/lib/devtool/__init__.py b/meta-selftest/lib/devtool/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/meta-selftest/lib/devtool/test.py b/meta-selftest/lib/devtool/test.py
new file mode 100644
index 0000000..b7474b5
--- /dev/null
+++ b/meta-selftest/lib/devtool/test.py
@@ -0,0 +1,11 @@
+import argparse
+
+def selftest_reverse(args, config, basepath, workspace):
+ """Reverse the value passed to verify the plugin is executing."""
+ print args.value[::-1]
+
+def register_commands(subparsers, context):
+ parser_build = subparsers.add_parser('selftest-reverse', help='Reverse value (for selftest)',
+ formatter_class=argparse.ArgumentDefaultsHelpFormatter)
+ parser_build.add_argument('value', help='Value to reverse')
+ parser_build.set_defaults(func=selftest_reverse)
diff --git a/meta-selftest/recipes-test/error/error.bb b/meta-selftest/recipes-test/error/error.bb
new file mode 100644
index 0000000..a7bdecf
--- /dev/null
+++ b/meta-selftest/recipes-test/error/error.bb
@@ -0,0 +1,11 @@
+SUMMARY = "Error Test case that fails on do_compile"
+DESCRIPTION = "This generates a compile time error to be used to for testing."
+LICENSE = "MIT"
+LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
+
+INHIBIT_DEFAULT_DEPS = "1"
+EXCLUDE_FROM_WORLD = "1"
+
+do_compile() {
+ bbfatal "Failing as expected.";
+}
diff --git a/meta-selftest/recipes-test/images/error-image.bb b/meta-selftest/recipes-test/images/error-image.bb
new file mode 100644
index 0000000..13d9cc0
--- /dev/null
+++ b/meta-selftest/recipes-test/images/error-image.bb
@@ -0,0 +1,8 @@
+SUMMARY = "An image that includes the error recipe and will therefore fail"
+DESCRIPTION = "This generates an error. Not currently used by oe-selftest"
+
+IMAGE_INSTALL = "error"
+
+IMAGE_LINGUAS = " "
+
+inherit core-image
diff --git a/meta-selftest/recipes-test/images/test-empty-image.bb b/meta-selftest/recipes-test/images/test-empty-image.bb
new file mode 100644
index 0000000..88d8d61
--- /dev/null
+++ b/meta-selftest/recipes-test/images/test-empty-image.bb
@@ -0,0 +1,6 @@
+SUMMARY = "An empty image."
+IMAGE_INSTALL = ""
+IMAGE_LINGUAS = ""
+PACKAGE_INSTALL = ""
+
+inherit image
diff --git a/meta-selftest/recipes-test/images/wic-image-minimal.bb b/meta-selftest/recipes-test/images/wic-image-minimal.bb
index 073c569..89451bd 100644
--- a/meta-selftest/recipes-test/images/wic-image-minimal.bb
+++ b/meta-selftest/recipes-test/images/wic-image-minimal.bb
@@ -1,10 +1,14 @@
SUMMARY = "An example of partitioned image."
+SRC_URI = "file://${FILE_DIRNAME}/${BPN}.wks"
+
IMAGE_INSTALL = "packagegroup-core-boot ${ROOTFS_PKGMANAGE_BOOTSTRAP}"
IMAGE_FSTYPES = "wic.bz2"
RM_OLD_IMAGE = "1"
+DEPENDS = "syslinux syslinux-native parted-native dosfstools-native mtools-native"
+
# core-image-minimal is referenced in .wks, so we need its rootfs
# to be ready before our rootfs
do_rootfs[depends] += "core-image-minimal:do_rootfs"
diff --git a/meta-selftest/recipes-test/images/wic-image-minimal.wks b/meta-selftest/recipes-test/images/wic-image-minimal.wks
index 29cd8f2..8f9be09 100644
--- a/meta-selftest/recipes-test/images/wic-image-minimal.wks
+++ b/meta-selftest/recipes-test/images/wic-image-minimal.wks
@@ -3,8 +3,8 @@
# created from core-image-minimal and wic-image-minimal image recipes.
part /boot --source bootimg-pcbios --ondisk sda --label boot --active --align 1024
-part / --source rootfs --ondisk sda --fstype=ext2 --label platform --align 1024
-part /core --source rootfs --rootfs-dir=core-image-minimal --ondisk sda --fstype=ext2 --label core --align 1024
-part /backup --source rootfs --rootfs-dir=wic-image-minimal --ondisk sda --fstype=ext2 --label backup --align 1024
+part / --source rootfs --ondisk sda --fstype=ext4 --label platform --align 1024
+part /core --source rootfs --rootfs-dir=core-image-minimal --ondisk sda --fstype=ext4 --label core --align 1024
+part /backup --source rootfs --rootfs-dir=wic-image-minimal --ondisk sda --fstype=ext4 --label backup --align 1024
bootloader --timeout=0 --append="rootwait console=tty0"
diff --git a/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb b/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb
index cce44d9..6194d4f 100644
--- a/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb
+++ b/meta-skeleton/recipes-kernel/linux/linux-yocto-custom.bb
@@ -43,9 +43,9 @@
#
# example configuration addition:
# SRC_URI += "file://smp.cfg"
-# example patch addition (for kernel v3.4 only):
-# SRC_URI += "file://0001-linux-version-tweak.patch
-# example feature addition (for kernel v3.4 only):
+# example patch addition (for kernel v4.x only):
+# SRC_URI += "file://0001-linux-version-tweak.patch"
+# example feature addition (for kernel v4.x only):
# SRC_URI += "file://feature.scc"
#
@@ -56,15 +56,14 @@ require recipes-kernel/linux/linux-yocto.inc
# tree if you do not want to build from Linus' tree.
SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git;protocol=git;nocheckout=1;name=machine"
-LINUX_VERSION ?= "3.4"
-LINUX_VERSION_EXTENSION ?= "-custom"
+LINUX_VERSION ?= "4.2"
+LINUX_VERSION_EXTENSION_append = "-custom"
# Modify SRCREV to a different commit hash in a copy of this recipe to
# build a different release of the Linux kernel.
-# tag: v3.4 76e10d158efb6d4516018846f60c2ab5501900bc
-SRCREV_machine="76e10d158efb6d4516018846f60c2ab5501900bc"
+# tag: v4.2 64291f7db5bd8150a74ad2036f1037e6a0428df2
+SRCREV_machine="64291f7db5bd8150a74ad2036f1037e6a0428df2"
-PR = "r1"
PV = "${LINUX_VERSION}+git${SRCPV}"
# Override COMPATIBLE_MACHINE to include your machine in a copy of this recipe
diff --git a/meta-skeleton/recipes-kernel/linux/linux-yocto-custom/0001-linux-version-tweak.patch b/meta-skeleton/recipes-kernel/linux/linux-yocto-custom/0001-linux-version-tweak.patch
index c9562da..1c88315 100644
--- a/meta-skeleton/recipes-kernel/linux/linux-yocto-custom/0001-linux-version-tweak.patch
+++ b/meta-skeleton/recipes-kernel/linux/linux-yocto-custom/0001-linux-version-tweak.patch
@@ -1,26 +1,29 @@
-From 5a55943a6bbb10a79994a0b18071b2427dffb15f Mon Sep 17 00:00:00 2001
+From fb2c401374d4efe89e8da795e21d96fac038639d Mon Sep 17 00:00:00 2001
From: Bruce Ashfield <bruce.ashfield at windriver.com>
Date: Mon, 11 Jun 2012 15:31:42 -0400
Subject: [PATCH] linux: version tweak
+Upstream-Status: Inappropriate [example code]
+
Signed-off-by: Bruce Ashfield <bruce.ashfield at windriver.com>
+Signed-off-by: Saul Wold <sgw at linux.intel.com>
---
- Makefile | 2 +-
- 1 files changed, 1 insertions(+), 1 deletions(-)
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
diff --git a/Makefile b/Makefile
-index a687963..f5b1ac3 100644
+index c361593..099e8ff 100644
--- a/Makefile
+++ b/Makefile
-@@ -2,7 +2,7 @@ VERSION = 3
- PATCHLEVEL = 4
+@@ -2,7 +2,7 @@ VERSION = 4
+ PATCHLEVEL = 2
SUBLEVEL = 0
EXTRAVERSION =
--NAME = Saber-toothed Squirrel
-+NAME = Saber-toothed Squirrel-custom
+-NAME = Hurr durr I'ma sheep
++NAME = Hurr durr I'ma customized sheep
# *DOCUMENTATION*
# To see a list of typical targets execute "make help"
--
-1.7.5.4
+2.1.4
diff --git a/meta-yocto-bsp/conf/machine/beaglebone.conf b/meta-yocto-bsp/conf/machine/beaglebone.conf
index 0daebf3..ff46fb2 100644
--- a/meta-yocto-bsp/conf/machine/beaglebone.conf
+++ b/meta-yocto-bsp/conf/machine/beaglebone.conf
@@ -22,7 +22,7 @@ EXTRA_IMAGECMD_jffs2 = "-lnp "
SERIAL_CONSOLE = "115200 ttyO0"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
-PREFERRED_VERSION_linux-yocto ?= "3.19%"
+PREFERRED_VERSION_linux-yocto ?= "4.1%"
KERNEL_IMAGETYPE = "zImage"
KERNEL_DEVICETREE = "am335x-bone.dtb am335x-boneblack.dtb"
diff --git a/meta-yocto-bsp/conf/machine/edgerouter.conf b/meta-yocto-bsp/conf/machine/edgerouter.conf
index 45ef237..476e690 100644
--- a/meta-yocto-bsp/conf/machine/edgerouter.conf
+++ b/meta-yocto-bsp/conf/machine/edgerouter.conf
@@ -11,7 +11,7 @@ KERNEL_ALT_IMAGETYPE = "vmlinux.bin"
KERNEL_IMAGE_STRIP_EXTRA_SECTIONS = ".comment"
PREFERRED_PROVIDER_virtual/kernel ?= "linux-yocto"
-PREFERRED_VERSION_linux-yocto ?= "3.19%"
+PREFERRED_VERSION_linux-yocto ?= "4.1%"
SERIAL_CONSOLE = "115200 ttyS0"
USE_VT ?= "0"
diff --git a/meta-yocto-bsp/conf/machine/include/genericx86-common.inc b/meta-yocto-bsp/conf/machine/include/genericx86-common.inc
index 7c10b56..1588556 100644
--- a/meta-yocto-bsp/conf/machine/include/genericx86-common.inc
+++ b/meta-yocto-bsp/conf/machine/include/genericx86-common.inc
@@ -13,7 +13,7 @@ XSERVER ?= "${XSERVER_X86_BASE} \
${XSERVER_X86_MODESETTING} \
"
-MACHINE_EXTRA_RRECOMMENDS += "linux-firmware v86d eee-acpi-scripts"
+MACHINE_EXTRA_RRECOMMENDS += "linux-firmware eee-acpi-scripts"
GLIBC_ADDONS = "nptl"
diff --git a/meta-yocto-bsp/conf/machine/mpc8315e-rdb.conf b/meta-yocto-bsp/conf/machine/mpc8315e-rdb.conf
index 2beef48..036b05f 100644
--- a/meta-yocto-bsp/conf/machine/mpc8315e-rdb.conf
+++ b/meta-yocto-bsp/conf/machine/mpc8315e-rdb.conf
@@ -14,7 +14,7 @@ SERIAL_CONSOLE = "115200 ttyS0"
MACHINE_FEATURES = "keyboard pci ext2 ext3 serial"
-PREFERRED_VERSION_linux-yocto ?= "3.19%"
+PREFERRED_VERSION_linux-yocto ?= "4.1%"
PREFERRED_PROVIDER_virtual/kernel = "linux-yocto"
PREFERRED_PROVIDER_virtual/xserver ?= "xserver-xorg"
diff --git a/meta-yocto-bsp/lib/oeqa/yoctobsp.py b/meta-yocto-bsp/lib/oeqa/yoctobsp.py
new file mode 100644
index 0000000..4c539a1
--- /dev/null
+++ b/meta-yocto-bsp/lib/oeqa/yoctobsp.py
@@ -0,0 +1,39 @@
+import unittest
+import os
+import logging
+import tempfile
+import shutil
+
+from oeqa.selftest.base import oeSelfTest
+from oeqa.utils.commands import runCmd
+from oeqa.utils.decorators import skipUnlessPassed
+
+class YoctoBSP(oeSelfTest):
+
+ @classmethod
+ def setUpClass(self):
+ result = runCmd("yocto-bsp list karch")
+ self.karchs = [karch.lstrip() for karch in result.output.splitlines()][1:]
+
+ def test_yoctobsp_listproperties(self):
+ for karch in self.karchs:
+ result = runCmd("yocto-bsp list %s properties" % karch)
+ self.assertEqual(0, result.status, msg="Properties from %s architecture could not be listed" % karch)
+
+ def test_yoctobsp_create(self):
+ # Generate a temporal file and folders for each karch
+ json = "{\"use_default_kernel\":\"yes\"}\n"
+ fd = tempfile.NamedTemporaryFile(delete=False)
+ fd.write(json)
+ fd.close()
+ tmpfolders = dict([(karch, tempfile.mkdtemp()) for karch in self.karchs])
+ # Create BSP
+ for karch in self.karchs:
+ result = runCmd("yocto-bsp create test %s -o %s -i %s" % (karch, "%s/unitest" % tmpfolders[karch], fd.name))
+ self.assertEqual(0, result.status, msg="Could not create a BSP with architecture %s using %s " % (karch, fd.name))
+ # Remove tmp file/folders
+ os.unlink(fd.name)
+ self.assertFalse(os.path.exists(fd.name), msg = "Temporal file %s could not be removed" % fd.name)
+ for tree in tmpfolders.values():
+ shutil.rmtree(tree)
+ self.assertFalse(os.path.exists(tree), msg = "Temporal folder %s could not be removed" % tree)
diff --git a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.14.bbappend b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.14.bbappend
index 589ece7..310aeb8 100644
--- a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -7,8 +7,8 @@ KBRANCH_mpc8315e-rdb = "standard/fsl-mpc8315e-rdb"
KMACHINE_genericx86 ?= "common-pc"
KMACHINE_genericx86-64 ?= "common-pc-64"
-SRCREV_machine_genericx86 ?= "af1f7f586bd32d39c057f17606991b887eadb389"
-SRCREV_machine_genericx86-64 ?= "578602a722dbfb260801f3b37c6eafd2abb2340d"
+SRCREV_machine_genericx86 ?= "d9bf859dfae6f88b88b157119c20ae4d5e51420a"
+SRCREV_machine_genericx86-64 ?= "93b2b800d85c1565af7d96f3776dc38c85ae1902"
SRCREV_machine_edgerouter ?= "578602a722dbfb260801f3b37c6eafd2abb2340d"
SRCREV_machine_beaglebone ?= "578602a722dbfb260801f3b37c6eafd2abb2340d"
SRCREV_machine_mpc8315e-rdb ?= "1cb1bbaf63cecc918cf36c89819a7464af4c4b13"
@@ -18,3 +18,6 @@ COMPATIBLE_MACHINE_genericx86-64 = "genericx86-64"
COMPATIBLE_MACHINE_edgerouter = "edgerouter"
COMPATIBLE_MACHINE_beaglebone = "beaglebone"
COMPATIBLE_MACHINE_mpc8315e-rdb = "mpc8315e-rdb"
+
+LINUX_VERSION_genericx86 = "3.14.39"
+LINUX_VERSION_genericx86-64 = "3.14.39"
diff --git a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.19.bbappend b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.19.bbappend
index c87f840..396af14 100644
--- a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.19.bbappend
+++ b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_3.19.bbappend
@@ -7,8 +7,8 @@ KBRANCH_mpc8315e-rdb = "standard/fsl-mpc8315e-rdb"
KMACHINE_genericx86 ?= "common-pc"
KMACHINE_genericx86-64 ?= "common-pc-64"
-SRCREV_machine_genericx86 ?= "e152349de59b43b2a75f2c332b44171df461d5a0"
-SRCREV_machine_genericx86-64 ?= "e152349de59b43b2a75f2c332b44171df461d5a0"
+SRCREV_machine_genericx86 ?= "1583bf79b946cd5581d84d8c369b819a5ecb94b4"
+SRCREV_machine_genericx86-64 ?= "1583bf79b946cd5581d84d8c369b819a5ecb94b4"
SRCREV_machine_edgerouter ?= "e152349de59b43b2a75f2c332b44171df461d5a0"
SRCREV_machine_beaglebone ?= "e152349de59b43b2a75f2c332b44171df461d5a0"
SRCREV_machine_mpc8315e-rdb ?= "2893f3e8ece72f6f47329714d6afe4c9c545bbf9"
diff --git a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_4.1.bbappend b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_4.1.bbappend
index a5fe0e6..571da39 100644
--- a/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_4.1.bbappend
+++ b/meta-yocto-bsp/recipes-kernel/linux/linux-yocto_4.1.bbappend
@@ -1,11 +1,23 @@
KBRANCH_genericx86 = "standard/base"
KBRANCH_genericx86-64 = "standard/base"
+KBRANCH_edgerouter = "standard/edgerouter"
+KBRANCH_beaglebone = "standard/beaglebone"
+KBRANCH_mpc8315e-rdb = "standard/fsl-mpc8315e-rdb"
KMACHINE_genericx86 ?= "common-pc"
KMACHINE_genericx86-64 ?= "common-pc-64"
-SRCREV_machine_genericx86 ?= "4e30e64c44df9e59bd13239951bb8d2b5b276e6f"
-SRCREV_machine_genericx86-64 ?= "4e30e64c44df9e59bd13239951bb8d2b5b276e6f"
+SRCREV_machine_genericx86 ?= "2e0ac7b6c4e3ada23a84756287e9b7051ace939a"
+SRCREV_machine_genericx86-64 ?= "2e0ac7b6c4e3ada23a84756287e9b7051ace939a"
+SRCREV_machine_edgerouter ?= "79a31b9d23db126f8a6be3eb88fd683056a213f1"
+SRCREV_machine_beaglebone ?= "efb6ffb2ca96a364f916c9890ad023fc595e0e6e"
+SRCREV_machine_mpc8315e-rdb ?= "79a31b9d23db126f8a6be3eb88fd683056a213f1"
COMPATIBLE_MACHINE_genericx86 = "genericx86"
COMPATIBLE_MACHINE_genericx86-64 = "genericx86-64"
+COMPATIBLE_MACHINE_edgerouter = "edgerouter"
+COMPATIBLE_MACHINE_beaglebone = "beaglebone"
+COMPATIBLE_MACHINE_mpc8315e-rdb = "mpc8315e-rdb"
+
+LINUX_VERSION_genericx86 = "4.1.17"
+LINUX_VERSION_genericx86-64 = "4.1.17"
diff --git a/meta-yocto/conf/distro/poky.conf b/meta-yocto/conf/distro/poky.conf
index 7ac17fb..f654f9e 100644
--- a/meta-yocto/conf/distro/poky.conf
+++ b/meta-yocto/conf/distro/poky.conf
@@ -1,7 +1,7 @@
DISTRO = "poky"
DISTRO_NAME = "Poky (Yocto Project Reference Distro)"
-DISTRO_VERSION = "1.8+snapshot-${DATE}"
-DISTRO_CODENAME = "master"
+DISTRO_VERSION = "2.0.1"
+DISTRO_CODENAME = "jethro"
SDK_VENDOR = "-pokysdk"
SDK_VERSION := "${@'${DISTRO_VERSION}'.replace('snapshot-${DATE}','snapshot')}"
@@ -72,10 +72,13 @@ CONNECTIVITY_CHECK_URIS ?= " \
SANITY_TESTED_DISTROS ?= " \
poky-1.7 \n \
poky-1.8 \n \
+ poky-2.0 \n \
Ubuntu-14.04 \n \
Ubuntu-14.10 \n \
Ubuntu-15.04 \n \
+ Ubuntu-15.10 \n \
Fedora-21 \n \
+ Fedora-22 \n \
CentOS-6.* \n \
CentOS-7.* \n \
Debian-7.* \n \
diff --git a/meta-yocto/conf/local.conf.sample b/meta-yocto/conf/local.conf.sample
index 371349d..bf6dd90 100644
--- a/meta-yocto/conf/local.conf.sample
+++ b/meta-yocto/conf/local.conf.sample
@@ -151,7 +151,9 @@ EXTRA_IMAGE_FEATURES = "debug-tweaks"
# - 'image-swab' to perform host system intrusion detection
# NOTE: if listing mklibs & prelink both, then make sure mklibs is before prelink
# NOTE: mklibs also needs to be explicitly enabled for a given image, see local.conf.extended
-USER_CLASSES ?= "buildstats image-mklibs image-prelink"
+# NOTE: image-prelink is currently broken due to problems with the prelinker. It is advised
+# that you do NOT run the prelinker at this time.
+USER_CLASSES ?= "buildstats image-mklibs"
#
# Runtime testing of images
diff --git a/meta-yocto/conf/local.conf.sample.extended b/meta-yocto/conf/local.conf.sample.extended
index ccdd326..bc765a1 100644
--- a/meta-yocto/conf/local.conf.sample.extended
+++ b/meta-yocto/conf/local.conf.sample.extended
@@ -165,6 +165,15 @@
# currently an example class is image_types_uboot
# IMAGE_CLASSES = " image_types_uboot"
+# The following options will build a companion 'debug filesystem' in addition
+# to the normal deployable filesystem. This companion system allows a
+# debugger to know the symbols and related sources. It can be used to
+# debug a remote 'production' system without having to add the debug symbols
+# and sources to remote system. If IMAGE_FSTYPES_DEBUGFS is not defined, it
+# defaults to IMAGE_FSTYPES.
+#IMAGE_GEN_DEBUGFS = "1"
+#IMAGE_FSTYPES_DEBUGFS = "tar.gz"
+
# Incremental rpm image generation, the rootfs would be totally removed
# and re-created in the second generation by default, but with
# INC_RPM_IMAGE_GEN = "1", the rpm based rootfs would be kept, and will
diff --git a/meta-yocto/conf/toasterconf.json b/meta-yocto/conf/toasterconf.json
index c455276..3df1703 100644
--- a/meta-yocto/conf/toasterconf.json
+++ b/meta-yocto/conf/toasterconf.json
@@ -12,7 +12,7 @@
"name": "Local Yocto Project",
"sourcetype": "local",
"apiurl": "../../",
- "branches": ["HEAD", "master", "fido", "dizzy"],
+ "branches": ["HEAD" ],
"layers": [
{
"name": "openembedded-core",
@@ -39,13 +39,13 @@
"name": "OpenEmbedded",
"sourcetype": "layerindex",
"apiurl": "http://layers.openembedded.org/layerindex/api/",
- "branches": ["master", "fido", "dizzy"]
+ "branches": ["master", "jethro" ,"fido"]
},
{
"name": "Imported layers",
"sourcetype": "imported",
"apiurl": "",
- "branches": ["master", "fido", "dizzy", "HEAD"]
+ "branches": ["master", "jethro","fido", "HEAD"]
}
],
@@ -57,15 +57,15 @@
"dirpath": "bitbake"
},
{
- "name": "fido",
+ "name": "jethro",
"giturl": "remote:origin",
- "branch": "fido",
+ "branch": "jethro",
"dirpath": "bitbake"
},
{
- "name": "dizzy",
+ "name": "fido",
"giturl": "remote:origin",
- "branch": "dizzy",
+ "branch": "fido",
"dirpath": "bitbake"
},
{
@@ -89,6 +89,15 @@
"helptext": "Toaster will run your builds using the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/\">Yocto Project master branch</a>, where active development takes place. This is not a stable branch, so your builds might not work as expected."
},
{
+ "name": "jethro",
+ "description": "Yocto Project 2.0 Jethro",
+ "bitbake": "jethro",
+ "branch": "jethro",
+ "defaultlayers": [ "openembedded-core", "meta-yocto", "meta-yocto-bsp"],
+ "layersourcepriority": { "Imported layers": 99, "Local Yocto Project" : 10, "OpenEmbedded" : 0 },
+ "helptext": "Toaster will run your builds with the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=jethro\">Yocto Project 2.0 \"Jethro\"</a> branch."
+ },
+ {
"name": "fido",
"description": "Yocto Project 1.8 Fido",
"bitbake": "fido",
@@ -98,15 +107,6 @@
"helptext": "Toaster will run your builds with the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=fido\">Yocto Project 1.8 \"Fido\"</a> branch."
},
{
- "name": "dizzy",
- "description": "Yocto Project 1.7 Dizzy",
- "bitbake": "dizzy",
- "branch": "dizzy",
- "defaultlayers": [ "openembedded-core", "meta-yocto", "meta-yocto-bsp"],
- "layersourcepriority": { "Imported layers": 99, "Local Yocto Project" : 10, "OpenEmbedded" : 0 },
- "helptext": "Toaster will run your builds with the tip of the <a href=\"http://git.yoctoproject.org/cgit/cgit.cgi/poky/log/?h=dizzy\">Yocto Project 1.7 \"Dizzy\"</a> branch."
- },
- {
"name": "local",
"description": "Local Yocto Project",
"bitbake": "HEAD",
diff --git a/meta/classes/allarch.bbclass b/meta/classes/allarch.bbclass
index 2fea7c0..4af38d7 100644
--- a/meta/classes/allarch.bbclass
+++ b/meta/classes/allarch.bbclass
@@ -27,6 +27,10 @@ python () {
d.setVar("PACKAGE_EXTRA_ARCHS", "")
d.setVar("SDK_ARCH", "none")
d.setVar("SDK_CC_ARCH", "none")
+ d.setVar("TARGET_CPPFLAGS", "none")
+ d.setVar("TARGET_CFLAGS", "none")
+ d.setVar("TARGET_CXXFLAGS", "none")
+ d.setVar("TARGET_LDFLAGS", "none")
# Avoid this being unnecessarily different due to nuances of
# the target machine that aren't important for "all" arch
diff --git a/meta/classes/archiver.bbclass b/meta/classes/archiver.bbclass
index 089d707..41a552c 100644
--- a/meta/classes/archiver.bbclass
+++ b/meta/classes/archiver.bbclass
@@ -99,27 +99,6 @@ python () {
d.appendVarFlag('do_package_write_rpm', 'depends', ' %s:do_ar_patched' % pn)
elif ar_src == "configured":
d.appendVarFlag('do_package_write_rpm', 'depends', ' %s:do_ar_configured' % pn)
-
- # The gcc staff uses shared source
- flag = d.getVarFlag("do_unpack", "stamp-base", True)
- if flag:
- if ar_src in [ 'original', 'patched' ]:
- ar_outdir = os.path.join(d.getVar('ARCHIVER_TOPDIR', True), 'work-shared')
- d.setVar('ARCHIVER_OUTDIR', ar_outdir)
- d.setVarFlag('do_ar_original', 'stamp-base', flag)
- d.setVarFlag('do_ar_patched', 'stamp-base', flag)
- d.setVarFlag('do_unpack_and_patch', 'stamp-base', flag)
- d.setVarFlag('do_ar_original', 'vardepsexclude', 'PN PF ARCHIVER_OUTDIR WORKDIR')
- d.setVarFlag('do_unpack_and_patch', 'vardepsexclude', 'PN PF ARCHIVER_OUTDIR WORKDIR')
- d.setVarFlag('do_ar_patched', 'vardepsexclude', 'PN PF ARCHIVER_OUTDIR WORKDIR')
- d.setVarFlag('create_diff_gz', 'vardepsexclude', 'PF')
- d.setVarFlag('create_tarball', 'vardepsexclude', 'PF')
-
- flag_clean = d.getVarFlag('do_unpack', 'stamp-base-clean', True)
- if flag_clean:
- d.setVarFlag('do_ar_original', 'stamp-base-clean', flag_clean)
- d.setVarFlag('do_ar_patched', 'stamp-base-clean', flag_clean)
- d.setVarFlag('do_unpack_and_patch', 'stamp-base-clean', flag_clean)
}
# Take all the sources for a recipe and puts them in WORKDIR/archiver-work/.
@@ -178,13 +157,8 @@ python do_ar_patched() {
# Get the ARCHIVER_OUTDIR before we reset the WORKDIR
ar_outdir = d.getVar('ARCHIVER_OUTDIR', True)
bb.note('Archiving the patched source...')
- d.setVar('WORKDIR', d.getVar('ARCHIVER_WORKDIR', True))
- # The gcc staff uses shared source
- flag = d.getVarFlag('do_unpack', 'stamp-base', True)
- if flag:
- create_tarball(d, d.getVar('S', True), 'patched', ar_outdir, 'gcc')
- else:
- create_tarball(d, d.getVar('S', True), 'patched', ar_outdir)
+ d.setVar('WORKDIR', ar_outdir)
+ create_tarball(d, d.getVar('S', True), 'patched', ar_outdir)
}
python do_ar_configured() {
@@ -222,17 +196,18 @@ python do_ar_configured() {
create_tarball(d, srcdir, 'configured', ar_outdir)
}
-def create_tarball(d, srcdir, suffix, ar_outdir, pf=None):
+def create_tarball(d, srcdir, suffix, ar_outdir):
"""
create the tarball from srcdir
"""
import tarfile
+ # Make sure we are only creating a single tarball for gcc sources
+ if d.getVar('SRC_URI', True) == "" and 'gcc' in d.getVar('PN', True):
+ return
+
bb.utils.mkdirhier(ar_outdir)
- if pf:
- tarname = os.path.join(ar_outdir, '%s-%s.tar.gz' % (pf, suffix))
- else:
- tarname = os.path.join(ar_outdir, '%s-%s.tar.gz' % \
+ tarname = os.path.join(ar_outdir, '%s-%s.tar.gz' % \
(d.getVar('PF', True), suffix))
srcdir = srcdir.rstrip('/')
@@ -275,11 +250,9 @@ python do_unpack_and_patch() {
[ 'patched', 'configured'] and \
d.getVarFlag('ARCHIVER_MODE', 'diff', True) != '1':
return
-
- ar_outdir = d.getVar('ARCHIVER_OUTDIR', True)
-
# Change the WORKDIR to make do_unpack do_patch run in another dir.
- d.setVar('WORKDIR', d.getVar('ARCHIVER_WORKDIR', True))
+ ar_outdir = d.getVar('ARCHIVER_OUTDIR', True)
+ d.setVar('WORKDIR', ar_outdir)
# The changed 'WORKDIR' also casued 'B' changed, create dir 'B' for the
# possibly requiring of the following tasks (such as some recipes's
@@ -299,7 +272,11 @@ python do_unpack_and_patch() {
src = d.getVar('S', True).rstrip('/')
src_orig = '%s.orig' % src
oe.path.copytree(src, src_orig)
- bb.build.exec_func('do_patch', d)
+
+ # Make sure gcc sources are patched only once
+ if not ((d.getVar('SRC_URI', True) == "" and 'gcc' in d.getVar('PN', True))):
+ bb.build.exec_func('do_patch', d)
+
# Create the patches
if d.getVarFlag('ARCHIVER_MODE', 'diff', True) == '1':
bb.note('Creating diff gz...')
@@ -370,7 +347,6 @@ do_deploy_archives[sstate-inputdirs] = "${ARCHIVER_TOPDIR}"
do_deploy_archives[sstate-outputdirs] = "${DEPLOY_DIR_SRC}"
addtask do_ar_original after do_unpack
-addtask do_unpack_and_patch after do_patch
addtask do_ar_patched after do_unpack_and_patch
addtask do_ar_configured after do_unpack_and_patch
addtask do_dumpdata
@@ -383,3 +359,11 @@ do_deploy_all_archives[recideptask] = "do_${BB_DEFAULT_TASK}"
do_deploy_all_archives() {
:
}
+
+python () {
+ # Add tasks in the correct order, specifically for linux-yocto to avoid race condition
+ if bb.data.inherits_class('kernel-yocto', d):
+ bb.build.addtask('do_kernel_configme', 'do_configure', 'do_unpack_and_patch', d)
+ else:
+ bb.build.addtask('do_unpack_and_patch', None, 'do_patch', d)
+}
diff --git a/meta/classes/autotools.bbclass b/meta/classes/autotools.bbclass
index 819045a..d546a5c 100644
--- a/meta/classes/autotools.bbclass
+++ b/meta/classes/autotools.bbclass
@@ -77,16 +77,20 @@ CONFIGUREOPTS = " --build=${BUILD_SYS} \
${@append_libtool_sysroot(d)}"
CONFIGUREOPT_DEPTRACK ?= "--disable-dependency-tracking"
+AUTOTOOLS_SCRIPT_PATH ?= "${S}"
+CONFIGURE_SCRIPT ?= "${AUTOTOOLS_SCRIPT_PATH}/configure"
+
+AUTOTOOLS_AUXDIR ?= "${AUTOTOOLS_SCRIPT_PATH}"
oe_runconf () {
- cfgscript="${S}/configure"
+ cfgscript="${CONFIGURE_SCRIPT}"
if [ -x "$cfgscript" ] ; then
bbnote "Running $cfgscript ${CONFIGUREOPTS} ${EXTRA_OECONF} $@"
set +e
${CACHED_CONFIGUREVARS} $cfgscript ${CONFIGUREOPTS} ${EXTRA_OECONF} "$@"
if [ "$?" != "0" ]; then
echo "Configure failed. The contents of all config.log files follows to aid debugging"
- find ${S} -ignore_readdir_race -name config.log -print -exec cat {} \;
+ find ${B} -ignore_readdir_race -name config.log -print -exec cat {} \;
die "oe_runconf failed"
fi
set -e
@@ -95,8 +99,6 @@ oe_runconf () {
fi
}
-AUTOTOOLS_AUXDIR ?= "${S}"
-
CONFIGURESTAMPFILE = "${WORKDIR}/configure.sstate"
autotools_preconfigure() {
@@ -134,7 +136,7 @@ do_configure[postfuncs] += "autotools_postconfigure"
ACLOCALDIR = "${B}/aclocal-copy"
python autotools_copy_aclocals () {
- s = d.getVar("S", True)
+ s = d.getVar("AUTOTOOLS_SCRIPT_PATH", True)
if not os.path.exists(s + "/configure.in") and not os.path.exists(s + "/configure.ac"):
if not d.getVar("AUTOTOOLS_COPYACLOCAL", False):
return
@@ -168,9 +170,9 @@ python autotools_copy_aclocals () {
for datadep in data[3]:
if datadep in done:
continue
- done.append(datadep)
if (not data[0].endswith("-native")) and taskdepdata[datadep][0].endswith("-native") and dep != start:
continue
+ done.append(datadep)
new.append(datadep)
if taskdepdata[datadep][1] == "do_configure":
configuredeps.append(taskdepdata[datadep][0])
@@ -228,13 +230,13 @@ autotools_do_configure() {
( for ac in `find ${S} -ignore_readdir_race -name configure.in -o -name configure.ac`; do
rm -f `dirname $ac`/configure
done )
- if [ -e ${S}/configure.in -o -e ${S}/configure.ac ]; then
+ if [ -e ${AUTOTOOLS_SCRIPT_PATH}/configure.in -o -e ${AUTOTOOLS_SCRIPT_PATH}/configure.ac ]; then
olddir=`pwd`
- cd ${S}
+ cd ${AUTOTOOLS_SCRIPT_PATH}
ACLOCAL="aclocal --system-acdir=${ACLOCALDIR}/"
if [ x"${acpaths}" = xdefault ]; then
acpaths=
- for i in `find ${S} -ignore_readdir_race -maxdepth 2 -name \*.m4|grep -v 'aclocal.m4'| \
+ for i in `find ${AUTOTOOLS_SCRIPT_PATH} -ignore_readdir_race -maxdepth 2 -name \*.m4|grep -v 'aclocal.m4'| \
grep -v 'acinclude.m4' | grep -v 'aclocal-copy' | sed -e 's,\(.*/\).*$,\1,'|sort -u`; do
acpaths="$acpaths -I $i"
done
@@ -265,21 +267,20 @@ autotools_do_configure() {
bbnote Executing glib-gettextize --force --copy
echo "no" | glib-gettextize --force --copy
fi
- else if grep "^[[:space:]]*AM_GNU_GETTEXT" $CONFIGURE_AC >/dev/null; then
+ elif grep "^[[:space:]]*AM_GNU_GETTEXT" $CONFIGURE_AC >/dev/null; then
# We'd call gettextize here if it wasn't so broken...
- cp ${STAGING_DATADIR_NATIVE}/gettext/config.rpath ${AUTOTOOLS_AUXDIR}/
- if [ -d ${S}/po/ ]; then
- cp -f ${STAGING_DATADIR_NATIVE}/gettext/po/Makefile.in.in ${S}/po/
- if [ ! -e ${S}/po/remove-potcdate.sin ]; then
- cp ${STAGING_DATADIR_NATIVE}/gettext/po/remove-potcdate.sin ${S}/po/
- fi
+ cp ${STAGING_DATADIR_NATIVE}/gettext/config.rpath ${AUTOTOOLS_AUXDIR}/
+ if [ -d ${S}/po/ ]; then
+ cp -f ${STAGING_DATADIR_NATIVE}/gettext/po/Makefile.in.in ${S}/po/
+ if [ ! -e ${S}/po/remove-potcdate.sin ]; then
+ cp ${STAGING_DATADIR_NATIVE}/gettext/po/remove-potcdate.sin ${S}/po/
fi
- for i in gettext.m4 iconv.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 po.m4 progtest.m4; do
- for j in `find ${S} -ignore_readdir_race -name $i | grep -v aclocal-copy`; do
- rm $j
- done
- done
fi
+ for i in gettext.m4 iconv.m4 lib-ld.m4 lib-link.m4 lib-prefix.m4 nls.m4 po.m4 progtest.m4; do
+ for j in `find ${S} -ignore_readdir_race -name $i | grep -v aclocal-copy`; do
+ rm $j
+ done
+ done
fi
mkdir -p m4
if grep "^[[:space:]]*[AI][CT]_PROG_INTLTOOL" $CONFIGURE_AC >/dev/null; then
@@ -290,7 +291,7 @@ autotools_do_configure() {
ACLOCAL="$ACLOCAL" autoreconf -Wcross --verbose --install --force ${EXTRA_AUTORECONF} $acpaths || die "autoreconf execution failed."
cd $olddir
fi
- if [ -e ${S}/configure ]; then
+ if [ -e ${CONFIGURE_SCRIPT} ]; then
oe_runconf
else
bbnote "nothing to configure"
diff --git a/meta/classes/base.bbclass b/meta/classes/base.bbclass
index f078001..9bd5499 100644
--- a/meta/classes/base.bbclass
+++ b/meta/classes/base.bbclass
@@ -391,7 +391,8 @@ python () {
items = flagval.split(",")
num = len(items)
if num > 4:
- bb.error("Only enable,disable,depend,rdepend can be specified!")
+ bb.error("%s: PACKAGECONFIG[%s] Only enable,disable,depend,rdepend can be specified!"
+ % (d.getVar('PN', True), flag))
if flag in pkgconfig:
if num >= 3 and items[2]:
@@ -512,7 +513,8 @@ python () {
if unskipped_pkgs:
for pkg in skipped_pkgs:
bb.debug(1, "SKIPPING the package " + pkg + " at do_rootfs because it's " + recipe_license)
- d.setVar('LICENSE_EXCLUSION-' + pkg, 1)
+ mlprefix = d.getVar('MLPREFIX', True)
+ d.setVar('LICENSE_EXCLUSION-' + mlprefix + pkg, 1)
for pkg in unskipped_pkgs:
bb.debug(1, "INCLUDING the package " + pkg)
elif all_skipped or incompatible_license(d, bad_licenses):
diff --git a/meta/classes/buildhistory.bbclass b/meta/classes/buildhistory.bbclass
index 4db0441..5e2581f 100644
--- a/meta/classes/buildhistory.bbclass
+++ b/meta/classes/buildhistory.bbclass
@@ -521,7 +521,7 @@ POPULATE_SDK_POST_TARGET_COMMAND_append = " buildhistory_list_installed_sdk_targ
POPULATE_SDK_POST_HOST_COMMAND_append = " buildhistory_list_installed_sdk_host ;\
buildhistory_get_sdk_installed_host ; "
-SDK_POSTPROCESS_COMMAND += "buildhistory_get_sdkinfo ; "
+SDK_POSTPROCESS_COMMAND_append = " buildhistory_get_sdkinfo ; "
def buildhistory_get_build_id(d):
if d.getVar('BB_WORKERCONTEXT', True) != '1':
diff --git a/meta/classes/cpan-base.bbclass b/meta/classes/cpan-base.bbclass
index d9817ba..7810a4d 100644
--- a/meta/classes/cpan-base.bbclass
+++ b/meta/classes/cpan-base.bbclass
@@ -49,7 +49,11 @@ PERLVERSION[vardepvalue] = ""
FILES_${PN}-dbg += "${PERLLIBDIRS}/auto/*/.debug \
${PERLLIBDIRS}/auto/*/*/.debug \
${PERLLIBDIRS}/auto/*/*/*/.debug \
+ ${PERLLIBDIRS}/auto/*/*/*/*/.debug \
+ ${PERLLIBDIRS}/auto/*/*/*/*/*/.debug \
${PERLLIBDIRS}/vendor_perl/${PERLVERSION}/auto/*/.debug \
${PERLLIBDIRS}/vendor_perl/${PERLVERSION}/auto/*/*/.debug \
${PERLLIBDIRS}/vendor_perl/${PERLVERSION}/auto/*/*/*/.debug \
+ ${PERLLIBDIRS}/vendor_perl/${PERLVERSION}/auto/*/*/*/*/.debug \
+ ${PERLLIBDIRS}/vendor_perl/${PERLVERSION}/auto/*/*/*/*/*/.debug \
"
diff --git a/meta/classes/cpan.bbclass b/meta/classes/cpan.bbclass
index e2bbd2f..8e079e0 100644
--- a/meta/classes/cpan.bbclass
+++ b/meta/classes/cpan.bbclass
@@ -17,7 +17,7 @@ export PERLHOSTLIB = "${STAGING_LIBDIR_NATIVE}/perl-native/perl/${@get_perl_vers
cpan_do_configure () {
export PERL5LIB="${PERL_ARCHLIB}"
- yes '' | perl ${EXTRA_PERLFLAGS} Makefile.PL ${EXTRA_CPANFLAGS}
+ yes '' | perl ${EXTRA_PERLFLAGS} Makefile.PL INSTALLDIRS=vendor ${EXTRA_CPANFLAGS}
# Makefile.PLs can exit with success without generating a
# Makefile, e.g. in cases of missing configure time
diff --git a/meta/classes/cpan_build.bbclass b/meta/classes/cpan_build.bbclass
index 4f648a6..fac074d 100644
--- a/meta/classes/cpan_build.bbclass
+++ b/meta/classes/cpan_build.bbclass
@@ -8,6 +8,7 @@ EXTRA_CPAN_BUILD_FLAGS ?= ""
# Env var which tells perl if it should use host (no) or target (yes) settings
export PERLCONFIGTARGET = "${@is_target(d)}"
export PERL_ARCHLIB = "${STAGING_LIBDIR}${PERL_OWN_DIR}/perl/${@get_perl_version(d)}"
+export PERLHOSTLIB = "${STAGING_LIBDIR_NATIVE}/perl-native/perl/${@get_perl_version(d)}/"
export LD = "${CCLD}"
cpan_build_do_configure () {
@@ -16,22 +17,24 @@ cpan_build_do_configure () {
. ${STAGING_LIBDIR}/perl/config.sh
fi
- perl Build.PL --installdirs vendor \
- --destdir ${D} \
- --install_path arch="${libdir}/perl" \
- --install_path script=${bindir} \
- --install_path bin=${bindir} \
- --install_path bindoc=${mandir}/man1 \
- --install_path libdoc=${mandir}/man3 \
- ${EXTRA_CPAN_BUILD_FLAGS}
+ perl Build.PL --installdirs vendor --destdir ${D} \
+ ${EXTRA_CPAN_BUILD_FLAGS}
+
+ # Build.PLs can exit with success without generating a
+ # Build, e.g. in cases of missing configure time
+ # dependencies. This is considered a best practice by
+ # cpantesters.org. See:
+ # * http://wiki.cpantesters.org/wiki/CPANAuthorNotes
+ # * http://www.nntp.perl.org/group/perl.qa/2008/08/msg11236.html
+ [ -e Build ] || bbfatal "No Build was generated by Build.PL"
}
cpan_build_do_compile () {
- perl Build
+ perl Build verbose=1
}
cpan_build_do_install () {
- perl Build install
+ perl Build install --destdir ${D}
}
EXPORT_FUNCTIONS do_configure do_compile do_install
diff --git a/meta/classes/cross-canadian.bbclass b/meta/classes/cross-canadian.bbclass
index d30a168..ea17f09 100644
--- a/meta/classes/cross-canadian.bbclass
+++ b/meta/classes/cross-canadian.bbclass
@@ -67,7 +67,7 @@ python () {
d.appendVar("CANADIANEXTRAOS", " linux-gnuspe linux-uclibcspe linux-muslspe")
elif tarch == "mips64":
d.appendVar("CANADIANEXTRAOS", " linux-gnun32 linux-uclibcn32 linux-musln32")
- if tarch == "arm":
+ if tarch == "arm" or tarch == "armeb":
d.setVar("TARGET_OS", "linux-gnueabi")
else:
d.setVar("TARGET_OS", "linux")
diff --git a/meta/classes/deploy.bbclass b/meta/classes/deploy.bbclass
index 78f5e4a..8ad07da 100644
--- a/meta/classes/deploy.bbclass
+++ b/meta/classes/deploy.bbclass
@@ -8,3 +8,4 @@ python do_deploy_setscene () {
}
addtask do_deploy_setscene
do_deploy[dirs] = "${DEPLOYDIR} ${B}"
+do_deploy[stamp-extra-info] = "${MACHINE}"
diff --git a/meta/classes/distrodata.bbclass b/meta/classes/distrodata.bbclass
index 4168e43..44c06e1 100644
--- a/meta/classes/distrodata.bbclass
+++ b/meta/classes/distrodata.bbclass
@@ -33,7 +33,7 @@ python do_distrodata_np() {
tmpdir = d.getVar('TMPDIR', True)
distro_check_dir = os.path.join(tmpdir, "distro_check")
datetime = localdata.getVar('DATETIME', True)
- dist_check.update_distro_data(distro_check_dir, datetime)
+ dist_check.update_distro_data(distro_check_dir, datetime, localdata)
if pn.find("-native") != -1:
pnstripped = pn.split("-native")
@@ -118,7 +118,7 @@ python do_distrodata() {
tmpdir = d.getVar('TMPDIR', True)
distro_check_dir = os.path.join(tmpdir, "distro_check")
datetime = localdata.getVar('DATETIME', True)
- dist_check.update_distro_data(distro_check_dir, datetime)
+ dist_check.update_distro_data(distro_check_dir, datetime, localdata)
pn = d.getVar("PN", True)
bb.note("Package Name: %s" % pn)
@@ -271,10 +271,11 @@ python do_checkpkg() {
from bb.fetch2 import FetchError, NoMethodError, decodeurl
"""first check whether a uri is provided"""
- src_uri = d.getVar('SRC_URI', True)
- if not src_uri:
- return
- uri_type, _, _, _, _, _ = decodeurl(src_uri)
+ src_uri = (d.getVar('SRC_URI', True) or '').split()
+ if src_uri:
+ uri_type, _, _, _, _, _ = decodeurl(src_uri[0])
+ else:
+ uri_type = "none"
"""initialize log files."""
logpath = d.getVar('LOG_DIR', True)
@@ -354,7 +355,10 @@ python do_checkpkg() {
elif cmp == 0:
pstatus = "MATCH"
- psrcuri = psrcuri.split()[0]
+ if psrcuri:
+ psrcuri = psrcuri.split()[0]
+ else:
+ psrcuri = "none"
pdepends = "".join(pdepends.split("\t"))
pdesc = "".join(pdesc.split("\t"))
no_upgr_reason = d.getVar('RECIPE_NO_UPDATE_REASON', True)
@@ -402,7 +406,7 @@ python do_distro_check() {
bb.utils.mkdirhier(logpath)
result_file = os.path.join(logpath, "distrocheck.csv")
datetime = localdata.getVar('DATETIME', True)
- dc.update_distro_data(distro_check_dir, datetime)
+ dc.update_distro_data(distro_check_dir, datetime, localdata)
# do the comparison
result = dc.compare_in_distro_packages_list(distro_check_dir, d)
diff --git a/meta/classes/distutils3.bbclass b/meta/classes/distutils3.bbclass
index e909ef4..443bf3a 100644
--- a/meta/classes/distutils3.bbclass
+++ b/meta/classes/distutils3.bbclass
@@ -21,6 +21,7 @@ distutils3_do_compile() {
build ${DISTUTILS_BUILD_ARGS} || \
bbfatal "${PYTHON_PN} setup.py build_ext execution failed."
}
+distutils3_do_compile[vardepsexclude] = "MACHINE"
distutils3_stage_headers() {
install -d ${STAGING_DIR_HOST}${PYTHON_SITEPACKAGES_DIR}
@@ -33,6 +34,7 @@ distutils3_stage_headers() {
${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py install_headers ${DISTUTILS_STAGE_HEADERS_ARGS} || \
bbfatal "${PYTHON_PN} setup.py install_headers execution failed."
}
+distutils3_stage_headers[vardepsexclude] = "MACHINE"
distutils3_stage_all() {
if [ ${BUILD_SYS} != ${HOST_SYS} ]; then
@@ -48,6 +50,7 @@ distutils3_stage_all() {
${STAGING_BINDIR_NATIVE}/${PYTHON_PN}-native/${PYTHON_PN} setup.py install ${DISTUTILS_STAGE_ALL_ARGS} || \
bbfatal "${PYTHON_PN} setup.py install (stage) execution failed."
}
+distutils3_stage_all[vardepsexclude] = "MACHINE"
distutils3_do_install() {
install -d ${D}${PYTHON_SITEPACKAGES_DIR}
@@ -90,6 +93,7 @@ distutils3_do_install() {
rmdir ${D}${datadir}/share
fi
}
+distutils3_do_install[vardepsexclude] = "MACHINE"
EXPORT_FUNCTIONS do_compile do_install
diff --git a/meta/classes/externalsrc.bbclass b/meta/classes/externalsrc.bbclass
index 0fa5817..f7ed66d 100644
--- a/meta/classes/externalsrc.bbclass
+++ b/meta/classes/externalsrc.bbclass
@@ -73,7 +73,8 @@ python () {
fetch_tasks = ['do_fetch', 'do_unpack']
# If we deltask do_patch, there's no dependency to ensure do_unpack gets run, so add one
- d.appendVarFlag('do_configure', 'deps', ['do_unpack'])
+ # Note that we cannot use d.appendVarFlag() here because deps is expected to be a list object, not a string
+ d.setVarFlag('do_configure', 'deps', (d.getVarFlag('do_configure', 'deps', False) or []) + ['do_unpack'])
for task in d.getVar("SRCTREECOVEREDTASKS", True).split():
if local_srcuri and task in fetch_tasks:
@@ -88,5 +89,5 @@ python () {
python externalsrc_compile_prefunc() {
# Make it obvious that this is happening, since forgetting about it could lead to much confusion
- bb.warn('Compiling %s from external source %s' % (d.getVar('PN', True), d.getVar('EXTERNALSRC', True)))
+ bb.plain('NOTE: %s: compiling from external source tree %s' % (d.getVar('PN', True), d.getVar('EXTERNALSRC', True)))
}
diff --git a/meta/classes/fontcache.bbclass b/meta/classes/fontcache.bbclass
index d122387..8ebdfc4 100644
--- a/meta/classes/fontcache.bbclass
+++ b/meta/classes/fontcache.bbclass
@@ -9,12 +9,23 @@ inherit qemu
FONT_PACKAGES ??= "${PN}"
FONT_EXTRA_RDEPENDS ?= "fontconfig-utils"
FONTCONFIG_CACHE_DIR ?= "${localstatedir}/cache/fontconfig"
+FONTCONFIG_CACHE_PARAMS ?= "-v"
+# You can change this to e.g. FC_DEBUG=16 to debug fc-cache issues,
+# something has to be set, because qemuwrapper is using this variable after -E
+# multiple variables aren't allowed because for qemu they are separated
+# by comma and in -n "$D" case they should be separated by space
+FONTCONFIG_CACHE_ENV ?= "FC_DEBUG=1"
fontcache_common() {
-if [ "x$D" != "x" ] ; then
- $INTERCEPT_DIR/postinst_intercept update_font_cache ${PKG} mlprefix=${MLPREFIX} bindir=${bindir} \
- libdir=${libdir} base_libdir=${base_libdir} fontconfigcachedir=${FONTCONFIG_CACHE_DIR}
+if [ -n "$D" ] ; then
+ $INTERCEPT_DIR/postinst_intercept update_font_cache ${PKG} mlprefix=${MLPREFIX} \
+ 'bindir="${bindir}"' \
+ 'libdir="${libdir}"' \
+ 'base_libdir="${base_libdir}"' \
+ 'fontconfigcachedir="${FONTCONFIG_CACHE_DIR}"' \
+ 'fontconfigcacheparams="${FONTCONFIG_CACHE_PARAMS}"' \
+ 'fontconfigcacheenv="${FONTCONFIG_CACHE_ENV}"'
else
- fc-cache
+ ${FONTCONFIG_CACHE_ENV} fc-cache ${FONTCONFIG_CACHE_PARAMS}
fi
}
diff --git a/meta/classes/grub-efi.bbclass b/meta/classes/grub-efi.bbclass
index 4ddc2bb..9a4220a 100644
--- a/meta/classes/grub-efi.bbclass
+++ b/meta/classes/grub-efi.bbclass
@@ -52,7 +52,8 @@ efi_iso_populate() {
mkdir -p ${EFIIMGDIR}/${EFIDIR}
cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
cp $iso_dir/vmlinuz ${EFIIMGDIR}
- echo "${GRUB_IMAGE}" > ${EFIIMGDIR}/startup.nsh
+ EFIPATH=$(echo "${EFIDIR}" | sed 's/\//\\/g')
+ echo "fs0:${EFIPATH}\\${GRUB_IMAGE}" > ${EFIIMGDIR}/startup.nsh
if [ -f "$iso_dir/initrd" ] ; then
cp $iso_dir/initrd ${EFIIMGDIR}
fi
diff --git a/meta/classes/gtk-icon-cache.bbclass b/meta/classes/gtk-icon-cache.bbclass
index 12358e3..0f1052b 100644
--- a/meta/classes/gtk-icon-cache.bbclass
+++ b/meta/classes/gtk-icon-cache.bbclass
@@ -4,12 +4,13 @@ DEPENDS += "${@['hicolor-icon-theme', '']['${BPN}' == 'hicolor-icon-theme']} gtk
gtk_icon_cache_postinst() {
if [ "x$D" != "x" ]; then
- $INTERCEPT_DIR/postinst_intercept update_icon_cache ${PKG} mlprefix=${MLPREFIX} libdir=${libdir} \
- base_libdir=${base_libdir}
+ $INTERCEPT_DIR/postinst_intercept update_icon_cache ${PKG} \
+ mlprefix=${MLPREFIX} \
+ libdir_native=${libdir_native}
else
# Update the pixbuf loaders in case they haven't been registered yet
- GDK_PIXBUF_MODULEDIR=${libdir}/gdk-pixbuf-2.0/2.10.0/loaders gdk-pixbuf-query-loaders --update-cache
+ ${libdir}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders --update-cache
for icondir in /usr/share/icons/* ; do
if [ -d $icondir ] ; then
@@ -21,8 +22,9 @@ fi
gtk_icon_cache_postrm() {
if [ "x$D" != "x" ]; then
- $INTERCEPT_DIR/postinst_intercept update_icon_cache ${PKG} mlprefix=${MLPREFIX} libdir=${libdir} \
- base_libdir=${base_libdir}
+ $INTERCEPT_DIR/postinst_intercept update_icon_cache ${PKG} \
+ mlprefix=${MLPREFIX} \
+ libdir=${libdir}
else
for icondir in /usr/share/icons/* ; do
if [ -d $icondir ] ; then
diff --git a/meta/classes/gummiboot.bbclass b/meta/classes/gummiboot.bbclass
index 3d9c08b..9a97ac1 100644
--- a/meta/classes/gummiboot.bbclass
+++ b/meta/classes/gummiboot.bbclass
@@ -46,7 +46,8 @@ efi_iso_populate() {
mkdir -p ${EFIIMGDIR}/${EFIDIR}
cp $iso_dir/${EFIDIR}/* ${EFIIMGDIR}${EFIDIR}
cp $iso_dir/vmlinuz ${EFIIMGDIR}
- echo "${DEST_EFI_IMAGE}" > ${EFIIMGDIR}/startup.nsh
+ EFIPATH=$(echo "${EFIDIR}" | sed 's/\//\\/g')
+ echo "fs0:${EFIPATH}\\${DEST_EFI_IMAGE}" > ${EFIIMGDIR}/startup.nsh
if [ -f "$iso_dir/initrd" ] ; then
cp $iso_dir/initrd ${EFIIMGDIR}
fi
diff --git a/meta/classes/image-live.bbclass b/meta/classes/image-live.bbclass
index fa7a131..23e4a5c 100644
--- a/meta/classes/image-live.bbclass
+++ b/meta/classes/image-live.bbclass
@@ -2,7 +2,7 @@
AUTO_SYSLINUXCFG = "1"
INITRD_IMAGE ?= "core-image-minimal-initramfs"
INITRD ?= "${DEPLOY_DIR_IMAGE}/${INITRD_IMAGE}-${MACHINE}.cpio.gz"
-SYSLINUX_ROOT = "root=/dev/ram0"
+SYSLINUX_ROOT ?= "root=/dev/ram0"
SYSLINUX_TIMEOUT ?= "50"
SYSLINUX_LABELS ?= "boot install"
LABELS_append = " ${SYSLINUX_LABELS} "
diff --git a/meta/classes/image-mklibs.bbclass b/meta/classes/image-mklibs.bbclass
index c455a8e..cfb3ffc 100644
--- a/meta/classes/image-mklibs.bbclass
+++ b/meta/classes/image-mklibs.bbclass
@@ -25,7 +25,7 @@ mklibs_optimize_image_doit() {
x86_64)
dynamic_loader="${base_libdir}/ld-linux-x86-64.so.2"
;;
- i586 )
+ i*86 )
dynamic_loader="${base_libdir}/ld-linux.so.2"
;;
arm )
diff --git a/meta/classes/image-vm.bbclass b/meta/classes/image-vm.bbclass
index 0632667..5ddd1cb 100644
--- a/meta/classes/image-vm.bbclass
+++ b/meta/classes/image-vm.bbclass
@@ -18,7 +18,8 @@ inherit boot-directdisk
IMAGE_TYPEDEP_vmdk = "ext4"
IMAGE_TYPEDEP_vdi = "ext4"
IMAGE_TYPEDEP_qcow2 = "ext4"
-IMAGE_TYPES_MASKED += "vmdk vdi qcow2"
+IMAGE_TYPEDEP_hdddirect = "ext4"
+IMAGE_TYPES_MASKED += "vmdk vdi qcow2 hdddirect"
create_vmdk_image () {
qemu-img convert -O vmdk ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.hdddirect ${DEPLOY_DIR_IMAGE}/${IMAGE_NAME}.vmdk
diff --git a/meta/classes/image.bbclass b/meta/classes/image.bbclass
index 86a98bb..d2f8105 100644
--- a/meta/classes/image.bbclass
+++ b/meta/classes/image.bbclass
@@ -150,7 +150,7 @@ def build_live(d):
IMAGE_TYPE_live = "${@build_live(d)}"
inherit ${IMAGE_TYPE_live}
-IMAGE_TYPE_vm = '${@bb.utils.contains_any("IMAGE_FSTYPES", ["vmdk", "vdi", "qcow2"], "image-vm", "", d)}'
+IMAGE_TYPE_vm = '${@bb.utils.contains_any("IMAGE_FSTYPES", ["vmdk", "vdi", "qcow2", "hdddirect"], "image-vm", "", d)}'
inherit ${IMAGE_TYPE_vm}
python () {
@@ -239,6 +239,29 @@ read_only_rootfs_hook () {
# Tweak the mount option and fs_passno for rootfs in fstab
sed -i -e '/^[#[:space:]]*\/dev\/root/{s/defaults/ro/;s/\([[:space:]]*[[:digit:]]\)\([[:space:]]*\)[[:digit:]]$/\1\20/}' ${IMAGE_ROOTFS}/etc/fstab
+ # If we're using openssh and the /etc/ssh directory has no pre-generated keys,
+ # we should configure openssh to use the configuration file /etc/ssh/sshd_config_readonly
+ # and the keys under /var/run/ssh.
+ if [ -d ${IMAGE_ROOTFS}/etc/ssh ]; then
+ if [ -e ${IMAGE_ROOTFS}/etc/ssh/ssh_host_rsa_key ]; then
+ echo "SYSCONFDIR=/etc/ssh" >> ${IMAGE_ROOTFS}/etc/default/ssh
+ echo "SSHD_OPTS=" >> ${IMAGE_ROOTFS}/etc/default/ssh
+ else
+ echo "SYSCONFDIR=/var/run/ssh" >> ${IMAGE_ROOTFS}/etc/default/ssh
+ echo "SSHD_OPTS='-f /etc/ssh/sshd_config_readonly'" >> ${IMAGE_ROOTFS}/etc/default/ssh
+ fi
+ fi
+
+ # Also tweak the key location for dropbear in the same way.
+ if [ -d ${IMAGE_ROOTFS}/etc/dropbear ]; then
+ if [ -e ${IMAGE_ROOTFS}/etc/dropbear/dropbear_rsa_host_key ]; then
+ echo "DROPBEAR_RSAKEY_DIR=/etc/dropbear" >> ${IMAGE_ROOTFS}/etc/default/dropbear
+ else
+ echo "DROPBEAR_RSAKEY_DIR=/var/lib/dropbear" >> ${IMAGE_ROOTFS}/etc/default/dropbear
+ fi
+ fi
+
+
if ${@bb.utils.contains("DISTRO_FEATURES", "sysvinit", "true", "false", d)}; then
# Change the value of ROOTFS_READ_ONLY in /etc/default/rcS to yes
if [ -e ${IMAGE_ROOTFS}/etc/default/rcS ]; then
@@ -249,18 +272,6 @@ read_only_rootfs_hook () {
if [ -x ${IMAGE_ROOTFS}/etc/init.d/populate-volatile.sh ]; then
${IMAGE_ROOTFS}/etc/init.d/populate-volatile.sh
fi
- # If we're using openssh and the /etc/ssh directory has no pre-generated keys,
- # we should configure openssh to use the configuration file /etc/ssh/sshd_config_readonly
- # and the keys under /var/run/ssh.
- if [ -d ${IMAGE_ROOTFS}/etc/ssh ]; then
- if [ -e ${IMAGE_ROOTFS}/etc/ssh/ssh_host_rsa_key ]; then
- echo "SYSCONFDIR=/etc/ssh" >> ${IMAGE_ROOTFS}/etc/default/ssh
- echo "SSHD_OPTS=" >> ${IMAGE_ROOTFS}/etc/default/ssh
- else
- echo "SYSCONFDIR=/var/run/ssh" >> ${IMAGE_ROOTFS}/etc/default/ssh
- echo "SSHD_OPTS='-f /etc/ssh/sshd_config_readonly'" >> ${IMAGE_ROOTFS}/etc/default/ssh
- fi
- fi
fi
if ${@bb.utils.contains("DISTRO_FEATURES", "systemd", "true", "false", d)}; then
diff --git a/meta/classes/image_types.bbclass b/meta/classes/image_types.bbclass
index 306403e..5036919 100644
--- a/meta/classes/image_types.bbclass
+++ b/meta/classes/image_types.bbclass
@@ -13,7 +13,7 @@ def imagetypes_getdepends(d):
deps = []
ctypes = d.getVar('COMPRESSIONTYPES', True).split()
for type in (d.getVar('IMAGE_FSTYPES', True) or "").split():
- if type in ["vmdk", "vdi", "qcow2", "live", "iso", "hddimg"]:
+ if type in ["vmdk", "vdi", "qcow2", "hdddirect", "live", "iso", "hddimg"]:
type = "ext4"
basetype = type
for ctype in ctypes:
@@ -139,17 +139,19 @@ multiubi_mkfs() {
# Cleanup cfg file
mv ubinize${vname}.cfg ${DEPLOY_DIR_IMAGE}/
- # Create own symlink
- cd ${DEPLOY_DIR_IMAGE}
- if [ -e ${IMAGE_NAME}${vname}.rootfs.ubifs ]; then
- ln -sf ${IMAGE_NAME}${vname}.rootfs.ubifs \
- ${IMAGE_LINK_NAME}${vname}.ubifs
- fi
- if [ -e ${IMAGE_NAME}${vname}.rootfs.ubi ]; then
- ln -sf ${IMAGE_NAME}${vname}.rootfs.ubi \
- ${IMAGE_LINK_NAME}${vname}.ubi
+ # Create own symlinks for 'named' volumes
+ if [ -n "$vname" ]; then
+ cd ${DEPLOY_DIR_IMAGE}
+ if [ -e ${IMAGE_NAME}${vname}.rootfs.ubifs ]; then
+ ln -sf ${IMAGE_NAME}${vname}.rootfs.ubifs \
+ ${IMAGE_LINK_NAME}${vname}.ubifs
+ fi
+ if [ -e ${IMAGE_NAME}${vname}.rootfs.ubi ]; then
+ ln -sf ${IMAGE_NAME}${vname}.rootfs.ubi \
+ ${IMAGE_LINK_NAME}${vname}.ubi
+ fi
+ cd -
fi
- cd -
}
IMAGE_CMD_multiubi () {
@@ -225,6 +227,7 @@ IMAGE_TYPES = " \
vmdk \
vdi \
qcow2 \
+ hdddirect \
elf \
wic wic.gz wic.bz2 wic.lzma \
"
@@ -252,7 +255,7 @@ DEPLOYABLE_IMAGE_TYPES ?= "hddimg iso"
IMAGE_EXTENSION_live = "hddimg iso"
# The IMAGE_TYPES_MASKED variable will be used to mask out from the IMAGE_FSTYPES,
-# images that will not be built at do_rootfs time: vmdk, vdi, qcow2, hddimg, iso, etc.
+# images that will not be built at do_rootfs time: vmdk, vdi, qcow2, hdddirect, hddimg, iso, etc.
IMAGE_TYPES_MASKED ?= ""
# The WICVARS variable is used to define list of bitbake variables used in wic code
diff --git a/meta/classes/insane.bbclass b/meta/classes/insane.bbclass
index 5c8629a..a77438d 100644
--- a/meta/classes/insane.bbclass
+++ b/meta/classes/insane.bbclass
@@ -32,7 +32,7 @@ WARN_QA ?= "ldflags useless-rpaths rpaths staticdev libdir xorg-driver-abi \
installed-vs-shipped compile-host-path install-host-path \
pn-overrides infodir build-deps file-rdeps \
unknown-configure-option symlink-to-sysroot multilib \
- invalid-pkgconfig host-user-contaminated \
+ invalid-packageconfig host-user-contaminated \
"
ERROR_QA ?= "dev-so debug-deps dev-deps debug-files arch pkgconfig la \
perms dep-cmp pkgvarcheck perm-config perm-line perm-link \
@@ -86,6 +86,7 @@ def package_qa_get_machine_dict():
"mipsel": ( 8, 0, 0, True, 32),
"mips64": ( 8, 0, 0, False, 64),
"mips64el": ( 8, 0, 0, True, 64),
+ "nios2": (113, 0, 0, True, 32),
"s390": (22, 0, 0, False, 32),
"sh4": (42, 0, 0, True, 32),
"sparc": ( 2, 0, 0, False, 32),
@@ -166,7 +167,7 @@ def package_qa_get_machine_dict():
def package_qa_clean_path(path,d):
""" Remove the common prefix from the path. In this case it is the TMPDIR"""
- return path.replace(d.getVar('TMPDIR',True),"")
+ return path.replace(d.getVar("TMPDIR", True) + "/", "")
def package_qa_write_error(type, error, d):
logfile = d.getVar('QA_LOGFILE', True)
@@ -980,6 +981,7 @@ def package_qa_check_host_user(path, name, d, elf, messages):
return
dest = d.getVar('PKGDEST', True)
+ pn = d.getVar('PN', True)
home = os.path.join(dest, 'home')
if path == home or path.startswith(home + os.sep):
return
@@ -991,14 +993,15 @@ def package_qa_check_host_user(path, name, d, elf, messages):
if exc.errno != errno.ENOENT:
raise
else:
+ rootfs_path = path[len(dest):]
check_uid = int(d.getVar('HOST_USER_UID', True))
if stat.st_uid == check_uid:
- messages["host-user-contaminated"] = "%s is owned by uid %d, which is the same as the user running bitbake. This may be due to host contamination" % (path, check_uid)
+ messages["host-user-contaminated"] = "%s: %s is owned by uid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, rootfs_path, check_uid)
return False
check_gid = int(d.getVar('HOST_USER_GID', True))
if stat.st_gid == check_gid:
- messages["host-user-contaminated"] = "%s is owned by gid %d, which is the same as the user running bitbake. This may be due to host contamination" % (path, check_gid)
+ messages["host-user-contaminated"] = "%s: %s is owned by gid %d, which is the same as the user running bitbake. This may be due to host contamination" % (pn, rootfs_path, check_gid)
return False
return True
@@ -1089,7 +1092,7 @@ python do_package_qa () {
# Check package name
if not pkgname_pattern.match(package):
package_qa_handle_error("pkgname",
- "%s doesn't match the [a-z0-9.+-]+ regex\n" % package, d)
+ "%s doesn't match the [a-z0-9.+-]+ regex" % package, d)
path = "%s/%s" % (pkgdest, package)
if not package_qa_walk(path, warnchecks, errorchecks, skip, package, d):
@@ -1143,7 +1146,7 @@ python do_qa_configure() {
if "config.log" in files:
if subprocess.call(statement, shell=True) == 0:
bb.fatal("""This autoconf log indicates errors, it looked at host include and/or library paths while determining system capabilities.
-Rerun configure task after fixing this. The path was '%s'""" % root)
+Rerun configure task after fixing this.""")
if "configure.ac" in files:
configs.append(os.path.join(root,"configure.ac"))
@@ -1207,7 +1210,7 @@ Missing inherit gettext?""" % (gt, config))
if pconfig not in pkgconfigflags:
pn = d.getVar('PN', True)
error_msg = "%s: invalid PACKAGECONFIG: %s" % (pn, pconfig)
- package_qa_handle_error("invalid-pkgconfig", error_msg, d)
+ package_qa_handle_error("invalid-packageconfig", error_msg, d)
}
python do_qa_unpack() {
diff --git a/meta/classes/kernel-arch.bbclass b/meta/classes/kernel-arch.bbclass
index 211b72b..d8b180e 100644
--- a/meta/classes/kernel-arch.bbclass
+++ b/meta/classes/kernel-arch.bbclass
@@ -13,14 +13,17 @@ valid_archs = "alpha cris ia64 \
sh sh64 um h8300 \
parisc s390 v850 \
avr32 blackfin \
- microblaze"
+ microblaze \
+ nios2"
def map_kernel_arch(a, d):
import re
valid_archs = d.getVar('valid_archs', True).split()
- if re.match('(i.86|athlon|x86.64)$', a): return 'x86'
+ if re.match('i.86$', a): return 'i386'
+ elif re.match('x86.64$', a): return 'x86_64'
+ elif re.match('athlon$', a): return 'x86'
elif re.match('armeb$', a): return 'arm'
elif re.match('aarch64$', a): return 'arm64'
elif re.match('aarch64_be$', a): return 'arm64'
diff --git a/meta/classes/kernel-yocto.bbclass b/meta/classes/kernel-yocto.bbclass
index 325f94c..c2d0d30 100644
--- a/meta/classes/kernel-yocto.bbclass
+++ b/meta/classes/kernel-yocto.bbclass
@@ -52,7 +52,9 @@ def get_machine_branch(d, default):
parm = urldata.parm
if "branch" in parm:
branches = urldata.parm.get("branch").split(',')
- return branches[0]
+ btype = urldata.parm.get("type")
+ if btype != "kmeta":
+ return branches[0]
return default
@@ -182,11 +184,18 @@ do_kernel_checkout() {
source_dir=`echo ${S} | sed 's%/$%%'`
source_workdir="${WORKDIR}/git"
if [ -d "${WORKDIR}/git/" ]; then
- # case: git repository (bare or non-bare)
+ # case: git repository
# if S is WORKDIR/git, then we shouldn't be moving or deleting the tree.
if [ "${source_dir}" != "${source_workdir}" ]; then
- rm -rf ${S}
- mv ${WORKDIR}/git ${S}
+ if [ -d "${source_workdir}/.git" ]; then
+ # regular git repository with .git
+ rm -rf ${S}
+ mv ${WORKDIR}/git ${S}
+ else
+ # create source for bare cloned git repository
+ git clone ${WORKDIR}/git ${S}
+ rm -rf ${WORKDIR}/git
+ fi
fi
cd ${S}
else
diff --git a/meta/classes/kernel.bbclass b/meta/classes/kernel.bbclass
index dfbdfd2..ee3e9a0 100644
--- a/meta/classes/kernel.bbclass
+++ b/meta/classes/kernel.bbclass
@@ -309,9 +309,18 @@ do_shared_workdir () {
cp -fR include/generated/* $kerneldir/include/generated/
fi
- if [ -d arch/${ARCH}/include/generated ]; then
- mkdir -p $kerneldir/arch/${ARCH}/include/generated/
- cp -fR arch/${ARCH}/include/generated/* $kerneldir/arch/${ARCH}/include/generated/
+ # When ARCH is set to i386 or x86_64, we need to map ARCH to the real name of src
+ # dir (x86) under arch/ of kenrel tree, so that we can find correct source to copy.
+
+ if [ "${ARCH}" = "i386" ] || [ "${ARCH}" = "x86_64" ]; then
+ KERNEL_SRCARCH=x86
+ else
+ KERNEL_SRCARCH=${ARCH}
+ fi
+
+ if [ -d arch/${KERNEL_SRCARCH}/include/generated ]; then
+ mkdir -p $kerneldir/arch/${KERNEL_SRCARCH}/include/generated/
+ cp -fR arch/${KERNEL_SRCARCH}/include/generated/* $kerneldir/arch/${KERNEL_SRCARCH}/include/generated/
fi
}
@@ -413,7 +422,7 @@ do_strip() {
gawk '{print $1}'`
for str in ${KERNEL_IMAGE_STRIP_EXTRA_SECTIONS}; do {
- if [ "$headers" != *"$str"* ]; then
+ if ! (echo "$headers" | grep -q "^$str$"); then
bbwarn "Section not found: $str";
fi
diff --git a/meta/classes/libc-package.bbclass b/meta/classes/libc-package.bbclass
index 47be691..adb4230 100644
--- a/meta/classes/libc-package.bbclass
+++ b/meta/classes/libc-package.bbclass
@@ -236,8 +236,8 @@ python package_do_split_gconvs () {
supported[locale] = charset
def output_locale_source(name, pkgname, locale, encoding):
- d.setVar('RDEPENDS_%s' % pkgname, 'localedef %s-localedata-%s %s-charmap-%s' % \
- (mlprefix+bpn, legitimize_package_name(locale), mlprefix+bpn, legitimize_package_name(encoding)))
+ d.setVar('RDEPENDS_%s' % pkgname, '%slocaledef %s-localedata-%s %s-charmap-%s' % \
+ (mlprefix, mlprefix+bpn, legitimize_package_name(locale), mlprefix+bpn, legitimize_package_name(encoding)))
d.setVar('pkg_postinst_%s' % pkgname, d.getVar('locale_base_postinst', True) \
% (locale, encoding, locale))
d.setVar('pkg_postrm_%s' % pkgname, d.getVar('locale_base_postrm', True) % \
diff --git a/meta/classes/license.bbclass b/meta/classes/license.bbclass
index c616a20..8ad4614 100644
--- a/meta/classes/license.bbclass
+++ b/meta/classes/license.bbclass
@@ -474,6 +474,7 @@ do_populate_lic[sstate-inputdirs] = "${LICSSTATEDIR}"
do_populate_lic[sstate-outputdirs] = "${LICENSE_DIRECTORY}/"
ROOTFS_POSTPROCESS_COMMAND_prepend = "write_package_manifest; license_create_manifest; "
+do_rootfs[recrdeptask] += "do_populate_lic"
do_populate_lic_setscene[dirs] = "${LICSSTATEDIR}/${PN}"
do_populate_lic_setscene[cleandirs] = "${LICSSTATEDIR}"
diff --git a/meta/classes/metadata_scm.bbclass b/meta/classes/metadata_scm.bbclass
index 237e618..0f7f423 100644
--- a/meta/classes/metadata_scm.bbclass
+++ b/meta/classes/metadata_scm.bbclass
@@ -65,18 +65,19 @@ def base_get_metadata_svn_revision(path, d):
return revision
def base_get_metadata_git_branch(path, d):
- branch = os.popen('cd %s; git branch 2>&1 | grep "^* " | tr -d "* "' % path).read()
+ import bb.process
- if len(branch) != 0:
- return branch
- return "<unknown>"
+ try:
+ rev, _ = bb.process.run('git rev-parse --abbrev-ref HEAD', cwd=path)
+ except bb.process.ExecutionError:
+ rev = '<unknown>'
+ return rev.strip()
def base_get_metadata_git_revision(path, d):
- f = os.popen("cd %s; git log -n 1 --pretty=oneline -- 2>&1" % path)
- data = f.read()
- if f.close() is None:
- rev = data.split(" ")[0]
- if len(rev) != 0:
- return rev
- return "<unknown>"
+ import bb.process
+ try:
+ rev, _ = bb.process.run('git rev-parse HEAD', cwd=path)
+ except bb.process.ExecutionError:
+ rev = '<unknown>'
+ return rev.strip()
diff --git a/meta/classes/multilib.bbclass b/meta/classes/multilib.bbclass
index 8f61d8d..052f911 100644
--- a/meta/classes/multilib.bbclass
+++ b/meta/classes/multilib.bbclass
@@ -26,6 +26,7 @@ python multilib_virtclass_handler () {
if bb.data.inherits_class('image', e.data):
e.data.setVar("MLPREFIX", variant + "-")
e.data.setVar("PN", variant + "-" + e.data.getVar("PN", False))
+ e.data.setVar('SDKTARGETSYSROOT', e.data.getVar('SDKTARGETSYSROOT', True))
target_vendor = e.data.getVar("TARGET_VENDOR_" + "virtclass-multilib-" + variant, False)
if target_vendor:
e.data.setVar("TARGET_VENDOR", target_vendor)
@@ -93,10 +94,6 @@ python __anonymous () {
# FIXME, we need to map this to something, not delete it!
d.setVar("PACKAGE_INSTALL_ATTEMPTONLY", "")
- if bb.data.inherits_class('populate_sdk_base', d):
- clsextend.map_depends_variable("TOOLCHAIN_TARGET_TASK")
- clsextend.map_depends_variable("TOOLCHAIN_TARGET_TASK_ATTEMPTONLY")
-
if bb.data.inherits_class('image', d):
return
diff --git a/meta/classes/multilib_global.bbclass b/meta/classes/multilib_global.bbclass
index 612cfb6..67dc72b 100644
--- a/meta/classes/multilib_global.bbclass
+++ b/meta/classes/multilib_global.bbclass
@@ -93,20 +93,38 @@ def preferred_ml_updates(d):
if prov != provexp and d.getVar(prov, False):
d.renameVar(prov, provexp)
+ def translate_provide(prefix, prov):
+ if not prov.startswith("virtual/"):
+ return prefix + "-" + prov
+ if prov == "virtual/kernel":
+ return prov
+ prov = prov.replace("virtual/", "")
+ return "virtual/" + prefix + "-" + prov
mp = (d.getVar("MULTI_PROVIDER_WHITELIST", True) or "").split()
extramp = []
for p in mp:
if p.endswith("-native") or "-crosssdk-" in p or p.startswith(("nativesdk-", "virtual/nativesdk-")) or 'cross-canadian' in p:
continue
- virt = ""
- if p.startswith("virtual/"):
- p = p.replace("virtual/", "")
- virt = "virtual/"
for pref in prefixes:
- extramp.append(virt + pref + "-" + p)
+ extramp.append(translate_provide(pref, p))
d.setVar("MULTI_PROVIDER_WHITELIST", " ".join(mp + extramp))
+ abisafe = (d.getVar("SIGGEN_EXCLUDERECIPES_ABISAFE", True) or "").split()
+ extras = []
+ for p in prefixes:
+ for a in abisafe:
+ extras.append(p + "-" + a)
+ d.appendVar("SIGGEN_EXCLUDERECIPES_ABISAFE", " " + " ".join(extras))
+
+ siggen_exclude = (d.getVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS", True) or "").split()
+ extras = []
+ for p in prefixes:
+ for a in siggen_exclude:
+ a1, a2 = a.split("->")
+ extras.append(translate_provide(p, a1) + "->" + translate_provide(p, a2))
+ d.appendVar("SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS", " " + " ".join(extras))
+
python multilib_virtclass_handler_vendor () {
if isinstance(e, bb.event.ConfigParsed):
for v in e.data.getVar("MULTILIB_VARIANTS", True).split():
diff --git a/meta/classes/package.bbclass b/meta/classes/package.bbclass
index cd92beb..a86b680 100644
--- a/meta/classes/package.bbclass
+++ b/meta/classes/package.bbclass
@@ -39,7 +39,6 @@
# packaging steps
inherit packagedata
-inherit prserv
inherit chrpath
# Need the package_qa_handle_error() in insane.bbclass
@@ -1146,7 +1145,8 @@ python populate_packages () {
else:
for f in unshipped:
msg = msg + "\n " + f
- msg = msg + "\nPlease set FILES such that these items are packaged. Alternatively if they are unneeded, avoid installing them or delete them within do_install."
+ msg = msg + "\nPlease set FILES such that these items are packaged. Alternatively if they are unneeded, avoid installing them or delete them within do_install.\n"
+ msg = msg + "%s: %d installed and not shipped files." % (pn, len(unshipped))
package_qa_handle_error("installed-vs-shipped", msg, d)
}
populate_packages[dirs] = "${D}"
diff --git a/meta/classes/pixbufcache.bbclass b/meta/classes/pixbufcache.bbclass
index 349967d..dbe11e1 100644
--- a/meta/classes/pixbufcache.bbclass
+++ b/meta/classes/pixbufcache.bbclass
@@ -15,7 +15,7 @@ if [ "x$D" != "x" ]; then
else
# Update the pixbuf loaders in case they haven't been registered yet
- GDK_PIXBUF_MODULEDIR=${libdir}/gdk-pixbuf-2.0/2.10.0/loaders gdk-pixbuf-query-loaders --update-cache
+ ${libdir}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders --update-cache
if [ -x ${bindir}/gtk-update-icon-cache ] && [ -d ${datadir}/icons ]; then
for icondir in /usr/share/icons/*; do
@@ -46,7 +46,7 @@ python populate_packages_append() {
}
gdkpixbuf_complete() {
- GDK_PIXBUF_FATAL_LOADER=1 ${STAGING_BINDIR_NATIVE}/gdk-pixbuf-query-loaders --update-cache || exit 1
+ GDK_PIXBUF_FATAL_LOADER=1 ${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders --update-cache || exit 1
}
#
diff --git a/meta/classes/populate_sdk_base.bbclass b/meta/classes/populate_sdk_base.bbclass
index aa7a9a5..35e129b 100644
--- a/meta/classes/populate_sdk_base.bbclass
+++ b/meta/classes/populate_sdk_base.bbclass
@@ -80,6 +80,7 @@ python write_host_sdk_manifest () {
POPULATE_SDK_POST_TARGET_COMMAND_append = " write_target_sdk_manifest ; "
POPULATE_SDK_POST_HOST_COMMAND_append = " write_host_sdk_manifest; "
+SDK_POSTPROCESS_COMMAND = " create_sdk_files; tar_sdk; ${SDK_PACKAGING_FUNC}; "
# Some archs override this, we need the nativesdk version
# turns out this is hard to get from the datastore due to TRANSLATED_TARGET_ARCH
@@ -108,15 +109,6 @@ fakeroot python do_populate_sdk() {
manifest_type=Manifest.MANIFEST_TYPE_SDK_TARGET)
populate_sdk(d)
-
- # Process DEFAULTTUNE
- bb.build.exec_func("create_sdk_files", d)
-
- bb.build.exec_func("tar_sdk", d)
-
- sdk_packaging_func = d.getVar("SDK_PACKAGING_FUNC", True) or ""
- if sdk_packaging_func.strip():
- bb.build.exec_func(d.getVar("SDK_PACKAGING_FUNC", True), d)
}
fakeroot create_sdk_files() {
@@ -196,7 +188,7 @@ populate_sdk_log_check() {
done
}
-do_populate_sdk[dirs] = "${TOPDIR}"
+do_populate_sdk[dirs] = "${PKGDATA_DIR} ${TOPDIR}"
do_populate_sdk[depends] += "${@' '.join([x + ':do_populate_sysroot' for x in d.getVar('SDK_DEPENDS', True).split()])} ${@d.getVarFlag('do_rootfs', 'depends', False)}"
do_populate_sdk[rdepends] = "${@' '.join([x + ':do_populate_sysroot' for x in d.getVar('SDK_RDEPENDS', True).split()])}"
do_populate_sdk[recrdeptask] += "do_packagedata do_package_write_rpm do_package_write_ipk do_package_write_deb"
diff --git a/meta/classes/populate_sdk_ext.bbclass b/meta/classes/populate_sdk_ext.bbclass
index 4ef8838..b9808bb 100644
--- a/meta/classes/populate_sdk_ext.bbclass
+++ b/meta/classes/populate_sdk_ext.bbclass
@@ -51,7 +51,7 @@ python copy_buildsystem () {
core_meta_subdir = ''
# Copy in all metadata layers + bitbake (as repositories)
- buildsystem = oe.copy_buildsystem.BuildSystem(d)
+ buildsystem = oe.copy_buildsystem.BuildSystem('extensible SDK', d)
baseoutpath = d.getVar('SDK_OUTPUT', True) + '/' + d.getVar('SDKPATH', True)
layers_copied = buildsystem.copy_bitbake_and_layers(baseoutpath + '/layers')
@@ -155,10 +155,16 @@ python copy_buildsystem () {
f.write('NATIVELSBSTRING_forcevariable = "%s"\n\n' % fixedlsbstring)
# Ensure locked sstate cache objects are re-used without error
- f.write('SIGGEN_LOCKEDSIGS_CHECK_LEVEL = "warn"\n\n')
+ f.write('SIGGEN_LOCKEDSIGS_CHECK_LEVEL = "none"\n\n')
+
+ # If you define a sdk_extraconf() function then it can contain additional config
+ extraconf = (d.getVar('sdk_extraconf', True) or '').strip()
+ if extraconf:
+ # Strip off any leading / trailing spaces
+ for line in extraconf.splitlines():
+ f.write(line.strip() + '\n')
f.write('require conf/locked-sigs.inc\n')
- f.write('require conf/work-config.inc\n')
sigfile = d.getVar('WORKDIR', True) + '/locked-sigs.inc'
oe.copy_buildsystem.generate_locked_sigs(sigfile, d)
@@ -178,17 +184,10 @@ python copy_buildsystem () {
d.getVar('SSTATE_DIR', True),
sstate_out, d,
fixedlsbstring)
-
- # Create a dummy config file for additional settings
- with open(baseoutpath + '/conf/work-config.inc', 'w') as f:
- pass
}
def extsdk_get_buildtools_filename(d):
- # This is somewhat of a hack
- localdata = bb.data.createCopy(d)
- localdata.setVar('PN', 'buildtools-tarball')
- return localdata.expand('${SDK_NAME}-buildtools-nativesdk-standalone-*.sh')
+ return '*-buildtools-nativesdk-standalone-*.sh'
install_tools() {
install -d ${SDK_OUTPUT}/${SDKPATHNATIVE}${bindir_nativesdk}
@@ -201,6 +200,8 @@ install_tools() {
install $buildtools_path ${SDK_OUTPUT}/${SDKPATH}
install ${SDK_DEPLOY}/${BUILD_ARCH}-nativesdk-libc.tar.bz2 ${SDK_OUTPUT}/${SDKPATH}
+
+ install -m 0755 ${COREBASE}/meta/files/ext-sdk-prepare.sh ${SDK_OUTPUT}/${SDKPATH}
}
# Since bitbake won't run as root it doesn't make sense to try and install
@@ -218,29 +219,37 @@ SDK_PRE_INSTALL_COMMAND_task-populate-sdk-ext = "${sdk_ext_preinst}"
sdk_ext_postinst() {
printf "\nExtracting buildtools...\n"
cd $target_sdk_dir
- printf "buildtools\ny" | ./*buildtools-nativesdk-standalone* > /dev/null
+ printf "buildtools\ny" | ./*buildtools-nativesdk-standalone* > /dev/null || ( printf 'ERROR: buildtools installation failed\n' ; exit 1 )
# Make sure when the user sets up the environment, they also get
# the buildtools-tarball tools in their path.
- echo ". $target_sdk_dir/buildtools/environment-setup*" >> $target_sdk_dir/environment-setup*
+ env_setup_script="$target_sdk_dir/environment-setup-${REAL_MULTIMACH_TARGET_SYS}"
+ echo ". $target_sdk_dir/buildtools/environment-setup*" >> $env_setup_script
# Allow bitbake environment setup to be ran as part of this sdk.
- echo "export OE_SKIP_SDK_CHECK=1" >> $target_sdk_dir/environment-setup*
+ echo "export OE_SKIP_SDK_CHECK=1" >> $env_setup_script
# A bit of another hack, but we need this in the path only for devtool
# so put it at the end of $PATH.
- echo "export PATH=\$PATH:$target_sdk_dir/sysroots/${SDK_SYS}/${bindir_nativesdk}" >> $target_sdk_dir/environment-setup*
+ echo "export PATH=\$PATH:$target_sdk_dir/sysroots/${SDK_SYS}/${bindir_nativesdk}" >> $env_setup_script
+
+ echo "printf 'SDK environment now set up; additionally you may now run devtool to perform development tasks.\nRun devtool --help for further details.\n'" >> $env_setup_script
+
+ # Warn if trying to use external bitbake and the ext SDK together
+ echo "(which bitbake > /dev/null 2>&1 && echo 'WARNING: attempting to use the extensible SDK in an environment set up to run bitbake - this may lead to unexpected results. Please source this script in a new shell session instead.') || true" >> $env_setup_script
# For now this is where uninative.bbclass expects the tarball
mv *-nativesdk-libc.tar.* $target_sdk_dir/`dirname ${oe_init_build_env_path}`
if [ "$prepare_buildsystem" != "no" ]; then
- printf "Preparing build system...\n"
- # dash which is /bin/sh on Ubuntu will not preserve the
- # current working directory when first ran, nor will it set $1 when
- # sourcing a script. That is why this has to look so ugly.
- sh -c ". buildtools/environment-setup* > preparing_build_system.log && cd $target_sdk_dir/`dirname ${oe_init_build_env_path}` && set $target_sdk_dir && . $target_sdk_dir/${oe_init_build_env_path} $target_sdk_dir >> preparing_build_system.log && bitbake ${SDK_TARGETS} >> preparing_build_system.log" || { echo "SDK preparation failed: see `pwd`/preparing_build_system.log" ; exit 1 ; }
+ printf "Preparing build system...\n"
+ # dash which is /bin/sh on Ubuntu will not preserve the
+ # current working directory when first ran, nor will it set $1 when
+ # sourcing a script. That is why this has to look so ugly.
+ LOGFILE="$target_sdk_dir/preparing_build_system.log"
+ sh -c ". buildtools/environment-setup* > $LOGFILE && cd $target_sdk_dir/`dirname ${oe_init_build_env_path}` && set $target_sdk_dir && . $target_sdk_dir/${oe_init_build_env_path} $target_sdk_dir >> $LOGFILE && $target_sdk_dir/ext-sdk-prepare.sh $target_sdk_dir '${SDK_TARGETS}' >> $LOGFILE 2>&1" || { echo "ERROR: SDK preparation failed: see $LOGFILE"; echo "printf 'ERROR: this SDK was not fully installed and needs reinstalling\n'" >> $env_setup_script ; exit 1 ; }
fi
+ rm -f $target_sdk_dir/ext-sdk-prepare.sh
echo done
}
@@ -249,6 +258,11 @@ SDK_POST_INSTALL_COMMAND_task-populate-sdk-ext = "${sdk_ext_postinst}"
SDK_POSTPROCESS_COMMAND_prepend_task-populate-sdk-ext = "copy_buildsystem; install_tools; "
fakeroot python do_populate_sdk_ext() {
+ # FIXME hopefully we can remove this restriction at some point, but uninative
+ # currently forces this upon us
+ if d.getVar('SDK_ARCH', True) != d.getVar('BUILD_ARCH', True):
+ bb.fatal('The extensible SDK can currently only be built for the same architecture as the machine being built on - SDK_ARCH is set to %s (likely via setting SDKMACHINE) which is different from the architecture of the build machine (%s). Unable to continue.' % (d.getVar('SDK_ARCH', True), d.getVar('BUILD_ARCH', True)))
+
bb.build.exec_func("do_populate_sdk", d)
}
diff --git a/meta/classes/prserv.bbclass b/meta/classes/prserv.bbclass
deleted file mode 100644
index 139597f..0000000
--- a/meta/classes/prserv.bbclass
+++ /dev/null
@@ -1,2 +0,0 @@
-
-
diff --git a/meta/classes/ptest.bbclass b/meta/classes/ptest.bbclass
index b5f470f..4dc5dbe 100644
--- a/meta/classes/ptest.bbclass
+++ b/meta/classes/ptest.bbclass
@@ -39,12 +39,12 @@ do_install_ptest() {
do_install_ptest_base() {
if [ -f ${WORKDIR}/run-ptest ]; then
install -D ${WORKDIR}/run-ptest ${D}${PTEST_PATH}/run-ptest
- if grep -q install-ptest: Makefile; then
- oe_runmake DESTDIR=${D}${PTEST_PATH} install-ptest
- fi
- do_install_ptest
- chown -R root:root ${D}${PTEST_PATH}
fi
+ if grep -q install-ptest: Makefile; then
+ oe_runmake DESTDIR=${D}${PTEST_PATH} install-ptest
+ fi
+ do_install_ptest
+ chown -R root:root ${D}${PTEST_PATH}
}
do_configure_ptest_base[dirs] = "${B}"
diff --git a/meta/classes/report-error.bbclass b/meta/classes/report-error.bbclass
index 040c29e..82b5bcd 100644
--- a/meta/classes/report-error.bbclass
+++ b/meta/classes/report-error.bbclass
@@ -9,22 +9,25 @@
ERR_REPORT_DIR ?= "${LOG_DIR}/error-report"
def errorreport_getdata(e):
+ import codecs
logpath = e.data.getVar('ERR_REPORT_DIR', True)
datafile = os.path.join(logpath, "error-report.txt")
- with open(datafile) as f:
+ with codecs.open(datafile, 'r', 'utf-8') as f:
data = f.read()
return data
def errorreport_savedata(e, newdata, file):
import json
+ import codecs
logpath = e.data.getVar('ERR_REPORT_DIR', True)
datafile = os.path.join(logpath, file)
- with open(datafile, "w") as f:
+ with codecs.open(datafile, 'w', 'utf-8') as f:
json.dump(newdata, f, indent=4, sort_keys=True)
return datafile
python errorreport_handler () {
import json
+ import codecs
logpath = e.data.getVar('ERR_REPORT_DIR', True)
datafile = os.path.join(logpath, "error-report.txt")
@@ -53,8 +56,8 @@ python errorreport_handler () {
taskdata['task'] = task
if log:
try:
- logFile = open(log, 'r')
- logdata = logFile.read().decode('utf-8')
+ logFile = codecs.open(log, 'r', 'utf-8')
+ logdata = logFile.read()
logFile.close()
except:
logdata = "Unable to read log file"
diff --git a/meta/classes/sanity.bbclass b/meta/classes/sanity.bbclass
index 2eb744f..ae86d26 100644
--- a/meta/classes/sanity.bbclass
+++ b/meta/classes/sanity.bbclass
@@ -3,7 +3,7 @@
#
SANITY_REQUIRED_UTILITIES ?= "patch diffstat makeinfo git bzip2 tar \
- gzip gawk chrpath wget cpio perl"
+ gzip gawk chrpath wget cpio perl file"
def bblayers_conf_file(d):
return os.path.join(d.getVar('TOPDIR', True), 'conf/bblayers.conf')
@@ -839,9 +839,12 @@ def check_sanity_everybuild(status, d):
else:
bb.utils.mkdirhier(tmpdir)
# Remove setuid, setgid and sticky bits from TMPDIR
- os.chmod(tmpdir, os.stat(tmpdir).st_mode & ~ stat.S_ISUID)
- os.chmod(tmpdir, os.stat(tmpdir).st_mode & ~ stat.S_ISGID)
- os.chmod(tmpdir, os.stat(tmpdir).st_mode & ~ stat.S_ISVTX)
+ try:
+ os.chmod(tmpdir, os.stat(tmpdir).st_mode & ~ stat.S_ISUID)
+ os.chmod(tmpdir, os.stat(tmpdir).st_mode & ~ stat.S_ISGID)
+ os.chmod(tmpdir, os.stat(tmpdir).st_mode & ~ stat.S_ISVTX)
+ except OSError as exc:
+ bb.warn("Unable to chmod TMPDIR: %s" % exc)
with open(checkfile, "w") as f:
f.write(tmpdir)
diff --git a/meta/classes/sign_package_feed.bbclass b/meta/classes/sign_package_feed.bbclass
new file mode 100644
index 0000000..4263810
--- /dev/null
+++ b/meta/classes/sign_package_feed.bbclass
@@ -0,0 +1,31 @@
+# Class for signing package feeds
+#
+# Related configuration variables that will be used after this class is
+# iherited:
+# PACKAGE_FEED_PASSPHRASE_FILE
+# Path to a file containing the passphrase of the signing key.
+# PACKAGE_FEED_GPG_NAME
+# Name of the key to sign with. May be key id or key name.
+# GPG_BIN
+# Optional variable for specifying the gpg binary/wrapper to use for
+# signing.
+# GPG_PATH
+# Optional variable for specifying the gnupg "home" directory:
+#
+inherit sanity
+
+PACKAGE_FEED_SIGN = '1'
+
+python () {
+ # Check sanity of configuration
+ for var in ('PACKAGE_FEED_GPG_NAME', 'PACKAGE_FEED_GPG_PASSPHRASE_FILE'):
+ if not d.getVar(var, True):
+ raise_sanity_error("You need to define %s in the config" % var, d)
+
+ # Set expected location of the public key
+ d.setVar('PACKAGE_FEED_GPG_PUBKEY',
+ os.path.join(d.getVar('STAGING_ETCDIR_NATIVE'),
+ 'PACKAGE-FEED-GPG-PUBKEY'))
+}
+
+do_package_index[depends] += "signing-keys:do_export_public_keys"
diff --git a/meta/classes/sign_rpm.bbclass b/meta/classes/sign_rpm.bbclass
index 0aa4cd8..f0c3dc9 100644
--- a/meta/classes/sign_rpm.bbclass
+++ b/meta/classes/sign_rpm.bbclass
@@ -4,23 +4,27 @@
# RPM_GPG_PASSPHRASE_FILE
# Path to a file containing the passphrase of the signing key.
# RPM_GPG_NAME
-# Name of the key to sign with. Alternatively you can define
-# %_gpg_name macro in your ~/.oerpmmacros file.
-# RPM_GPG_PUBKEY
-# Path to a file containing the public key (in "armor" format)
-# corresponding the signing key.
+# Name of the key to sign with. May be key id or key name.
# GPG_BIN
# Optional variable for specifying the gpg binary/wrapper to use for
# signing.
+# GPG_PATH
+# Optional variable for specifying the gnupg "home" directory:
#
inherit sanity
RPM_SIGN_PACKAGES='1'
-_check_gpg_name () {
- macrodef=`rpm -E '%_gpg_name'`
- [ "$macrodef" == "%_gpg_name" ] && return 1 || return 0
+python () {
+ # Check configuration
+ for var in ('RPM_GPG_NAME', 'RPM_GPG_PASSPHRASE_FILE'):
+ if not d.getVar(var, True):
+ raise_sanity_error("You need to define %s in the config" % var, d)
+
+ # Set the expected location of the public key
+ d.setVar('RPM_GPG_PUBKEY', os.path.join(d.getVar('STAGING_ETCDIR_NATIVE'),
+ 'RPM-GPG-PUBKEY'))
}
@@ -29,18 +33,11 @@ def rpmsign_wrapper(d, files, passphrase, gpg_name=None):
# Find the correct rpm binary
rpm_bin_path = d.getVar('STAGING_BINDIR_NATIVE', True) + '/rpm'
- cmd = rpm_bin_path + " --addsign "
- if gpg_name:
- cmd += "--define '%%_gpg_name %s' " % gpg_name
- else:
- try:
- bb.build.exec_func('_check_gpg_name', d)
- except bb.build.FuncFailed:
- raise_sanity_error("You need to define RPM_GPG_NAME in bitbake "
- "config or the %_gpg_name RPM macro defined "
- "(e.g. in ~/.oerpmmacros", d)
+ cmd = rpm_bin_path + " --addsign --define '_gpg_name %s' " % gpg_name
if d.getVar('GPG_BIN', True):
cmd += "--define '%%__gpg %s' " % d.getVar('GPG_BIN', True)
+ if d.getVar('GPG_PATH', True):
+ cmd += "--define '_gpg_path %s' " % d.getVar('GPG_PATH', True)
cmd += ' '.join(files)
# Need to use pexpect for feeding the passphrase
@@ -51,20 +48,19 @@ def rpmsign_wrapper(d, files, passphrase, gpg_name=None):
proc.expect(pexpect.EOF, timeout=900)
proc.close()
except pexpect.TIMEOUT as err:
- bb.debug('rpmsign timeout: %s' % err)
+ bb.warn('rpmsign timeout: %s' % err)
proc.terminate()
+ else:
+ if os.WEXITSTATUS(proc.status) or not os.WIFEXITED(proc.status):
+ bb.warn('rpmsign failed: %s' % proc.before.strip())
return proc.exitstatus
python sign_rpm () {
import glob
- rpm_gpg_pass_file = (d.getVar("RPM_GPG_PASSPHRASE_FILE", True) or "")
- if rpm_gpg_pass_file:
- with open(rpm_gpg_pass_file) as fobj:
- rpm_gpg_passphrase = fobj.readlines()[0].rstrip('\n')
- else:
- raise_sanity_error("You need to define RPM_GPG_PASSPHRASE_FILE in the config", d)
+ with open(d.getVar("RPM_GPG_PASSPHRASE_FILE", True)) as fobj:
+ rpm_gpg_passphrase = fobj.readlines()[0].rstrip('\n')
rpm_gpg_name = (d.getVar("RPM_GPG_NAME", True) or "")
@@ -73,3 +69,5 @@ python sign_rpm () {
if rpmsign_wrapper(d, rpms, rpm_gpg_passphrase, rpm_gpg_name) != 0:
raise bb.build.FuncFailed("RPM signing failed")
}
+
+do_package_index[depends] += "signing-keys:do_export_public_keys"
diff --git a/meta/classes/sstate.bbclass b/meta/classes/sstate.bbclass
index b9ad6da..d09e27a 100644
--- a/meta/classes/sstate.bbclass
+++ b/meta/classes/sstate.bbclass
@@ -61,16 +61,6 @@ SSTATE_SIG_PASSPHRASE ?= ""
# Whether to verify the GnUPG signatures when extracting sstate archives
SSTATE_VERIFY_SIG ?= "0"
-# Specify dirs in which the shell function is executed and don't use ${B}
-# as default dirs to avoid possible race about ${B} with other task.
-sstate_create_package[dirs] = "${SSTATE_BUILDDIR}"
-sstate_unpack_package[dirs] = "${SSTATE_INSTDIR}"
-
-# Do not run sstate_hardcode_path() in ${B}:
-# the ${B} maybe removed by cmake_do_configure() while
-# sstate_hardcode_path() running.
-sstate_hardcode_path[dirs] = "${SSTATE_BUILDDIR}"
-
python () {
if bb.data.inherits_class('native', d):
d.setVar('SSTATE_PKGARCH', d.getVar('BUILD_ARCH', False))
@@ -164,6 +154,8 @@ def sstate_install(ss, d):
shareddirs = []
bb.utils.mkdirhier(d.expand("${SSTATE_MANIFESTS}"))
+ sstateinst = d.expand("${WORKDIR}/sstate-install-%s/" % ss['task'])
+
manifest, d2 = oe.sstatesig.sstate_get_manifest_filename(ss['task'], d)
if os.access(manifest, os.R_OK):
@@ -267,7 +259,8 @@ def sstate_install(ss, d):
oe.path.copyhardlinktree(state[1], state[2])
for postinst in (d.getVar('SSTATEPOSTINSTFUNCS', True) or '').split():
- bb.build.exec_func(postinst, d)
+ # All hooks should run in the SSTATE_INSTDIR
+ bb.build.exec_func(postinst, d, (sstateinst,))
for lock in locks:
bb.utils.unlockfile(lock)
@@ -307,7 +300,8 @@ def sstate_installpkg(ss, d):
bb.warn("Cannot verify signature on sstate package %s" % sstatepkg)
for f in (d.getVar('SSTATEPREINSTFUNCS', True) or '').split() + ['sstate_unpack_package'] + (d.getVar('SSTATEPOSTUNPACKFUNCS', True) or '').split():
- bb.build.exec_func(f, d)
+ # All hooks should run in the SSTATE_INSTDIR
+ bb.build.exec_func(f, d, (sstateinst,))
for state in ss['dirs']:
prepdir(state[1])
@@ -579,8 +573,9 @@ def sstate_package(ss, d):
for f in (d.getVar('SSTATECREATEFUNCS', True) or '').split() + ['sstate_create_package'] + \
(d.getVar('SSTATEPOSTCREATEFUNCS', True) or '').split():
- bb.build.exec_func(f, d)
-
+ # All hooks should run in SSTATE_BUILDDIR.
+ bb.build.exec_func(f, d, (sstatebuild,))
+
bb.siggen.dump_this_task(sstatepkg + ".siginfo", d)
return
@@ -642,19 +637,22 @@ python sstate_task_prefunc () {
shared_state = sstate_state_fromvars(d)
sstate_clean(shared_state, d)
}
+sstate_task_prefunc[dirs] = "${WORKDIR}"
python sstate_task_postfunc () {
shared_state = sstate_state_fromvars(d)
+
sstate_install(shared_state, d)
for intercept in shared_state['interceptfuncs']:
- bb.build.exec_func(intercept, d)
+ bb.build.exec_func(intercept, d, (d.getVar("WORKDIR", True),))
omask = os.umask(002)
if omask != 002:
bb.note("Using umask 002 (not %0o) for sstate packaging" % omask)
sstate_package(shared_state, d)
os.umask(omask)
}
-
+sstate_task_postfunc[dirs] = "${WORKDIR}"
+
#
# Shell function to generate a sstate package from a directory
diff --git a/meta/classes/testimage.bbclass b/meta/classes/testimage.bbclass
index a1918ba..b4d4a69 100644
--- a/meta/classes/testimage.bbclass
+++ b/meta/classes/testimage.bbclass
@@ -80,11 +80,13 @@ testimage_dump_target () {
testimage_dump_host () {
top -bn1
+ iostat -x -z -N -d -p ALL 20 2
ps -ef
free
df
memstat
dmesg
+ ip -s link
netstat -an
}
@@ -146,6 +148,10 @@ def get_tests_list(d, type="runtime"):
testslist.append("oeqa." + type + "." + testname)
found = True
break
+ elif os.path.exists(os.path.join(p, 'lib', 'oeqa', type, testname.split(".")[0] + '.py')):
+ testslist.append("oeqa." + type + "." + testname)
+ found = True
+ break
if not found:
bb.fatal('Test %s specified in TEST_SUITES could not be found in lib/oeqa/runtime under BBPATH' % testname)
@@ -172,6 +178,7 @@ def exportTests(d,tc):
import json
import shutil
import pkgutil
+ import re
exportpath = d.getVar("TEST_EXPORT_DIR", True)
@@ -198,9 +205,18 @@ def exportTests(d,tc):
savedata["host_dumper"]["parent_dir"] = tc.host_dumper.parent_dir
savedata["host_dumper"]["cmds"] = tc.host_dumper.cmds
- with open(os.path.join(exportpath, "testdata.json"), "w") as f:
+ json_file = os.path.join(exportpath, "testdata.json")
+ with open(json_file, "w") as f:
json.dump(savedata, f, skipkeys=True, indent=4, sort_keys=True)
+ # Replace absolute path with relative in the file
+ exclude_path = os.path.join(d.getVar("COREBASE", True),'meta','lib','oeqa')
+ f1 = open(json_file,'r').read()
+ f2 = open(json_file,'w')
+ m = f1.replace(exclude_path,'oeqa')
+ f2.write(m)
+ f2.close()
+
# now start copying files
# we'll basically copy everything under meta/lib/oeqa, with these exceptions
# - oeqa/targetcontrol.py - not needed
@@ -214,6 +230,8 @@ def exportTests(d,tc):
bb.utils.mkdirhier(os.path.join(exportpath, "oeqa/utils"))
# copy test modules, this should cover tests in other layers too
for t in tc.testslist:
+ if re.search("\w+\.\w+\.test_\S+", t):
+ t = '.'.join(t.split('.')[:3])
mod = pkgutil.get_loader(t)
shutil.copy2(mod.filename, os.path.join(exportpath, "oeqa/runtime"))
# copy __init__.py files
@@ -279,14 +297,20 @@ def testimage_main(d):
self.imagefeatures = d.getVar("IMAGE_FEATURES", True).split()
self.distrofeatures = d.getVar("DISTRO_FEATURES", True).split()
manifest = os.path.join(d.getVar("DEPLOY_DIR_IMAGE", True), d.getVar("IMAGE_LINK_NAME", True) + ".manifest")
+ nomanifest = d.getVar("IMAGE_NO_MANIFEST", True)
+
self.sigterm = False
self.origsigtermhandler = signal.getsignal(signal.SIGTERM)
signal.signal(signal.SIGTERM, self.sigterm_exception)
- try:
- with open(manifest) as f:
- self.pkgmanifest = f.read()
- except IOError as e:
- bb.fatal("No package manifest file found. Did you build the image?\n%s" % e)
+
+ if nomanifest is None or nomanifest != "1":
+ try:
+ with open(manifest) as f:
+ self.pkgmanifest = f.read()
+ except IOError as e:
+ bb.fatal("No package manifest file found. Did you build the image?\n%s" % e)
+ else:
+ self.pkgmanifest = ""
def sigterm_exception(self, signum, stackframe):
bb.warn("TestImage received SIGTERM, shutting down...")
@@ -305,13 +329,15 @@ def testimage_main(d):
import traceback
bb.fatal("Loading tests failed:\n%s" % traceback.format_exc())
- target.deploy()
- try:
- target.start()
- if export:
- exportTests(d,tc)
- else:
+ if export:
+ signal.signal(signal.SIGTERM, tc.origsigtermhandler)
+ tc.origsigtermhandler = None
+ exportTests(d,tc)
+ else:
+ target.deploy()
+ try:
+ target.start()
starttime = time.time()
result = runTests(tc)
stoptime = time.time()
@@ -324,9 +350,9 @@ def testimage_main(d):
bb.plain(msg)
else:
raise bb.build.FuncFailed("%s - FAILED - check the task log and the ssh log" % pn )
- finally:
- signal.signal(signal.SIGTERM, tc.origsigtermhandler)
- target.stop()
+ finally:
+ signal.signal(signal.SIGTERM, tc.origsigtermhandler)
+ target.stop()
testimage_main[vardepsexclude] =+ "BB_ORIGENV"
diff --git a/meta/classes/toolchain-scripts.bbclass b/meta/classes/toolchain-scripts.bbclass
index d0b2b91..ab4feb0 100644
--- a/meta/classes/toolchain-scripts.bbclass
+++ b/meta/classes/toolchain-scripts.bbclass
@@ -32,6 +32,7 @@ toolchain_create_sdk_env_script () {
echo 'export OECORE_TARGET_SYSROOT="$SDKTARGETSYSROOT"' >> $script
echo "export OECORE_ACLOCAL_OPTS=\"-I $sdkpathnative/usr/share/aclocal\"" >> $script
echo "export PYTHONHOME=$sdkpathnative$prefix" >> $script
+ echo 'unset command_not_found_handle' >> $script
toolchain_shared_env_script
}
diff --git a/meta/classes/uninative.bbclass b/meta/classes/uninative.bbclass
index 51391db..0cd27db 100644
--- a/meta/classes/uninative.bbclass
+++ b/meta/classes/uninative.bbclass
@@ -1,6 +1,6 @@
NATIVELSBSTRING = "universal"
-UNINATIVE_LOADER = "${STAGING_DIR_NATIVE}/lib/ld-linux-x86-64.so.2"
+UNINATIVE_LOADER ?= "${@bb.utils.contains('BUILD_ARCH', 'x86_64', '${STAGING_DIR_NATIVE}/lib/ld-linux-x86-64.so.2', '${STAGING_DIR_NATIVE}/lib/ld-linux.so.2', d)}"
addhandler uninative_eventhandler
uninative_eventhandler[eventmask] = "bb.event.BuildStarted"
diff --git a/meta/classes/useradd-staticids.bbclass b/meta/classes/useradd-staticids.bbclass
index 421a70a..924d6ea 100644
--- a/meta/classes/useradd-staticids.bbclass
+++ b/meta/classes/useradd-staticids.bbclass
@@ -2,6 +2,7 @@
# we need a function to reformat the params based on a static file
def update_useradd_static_config(d):
import argparse
+ import itertools
import re
class myArgumentParser( argparse.ArgumentParser ):
@@ -16,6 +17,11 @@ def update_useradd_static_config(d):
def error(self, message):
raise bb.build.FuncFailed(message)
+ def list_extend(iterable, length, obj = None):
+ """Ensure that iterable is the specified length by extending with obj
+ and return it as a list"""
+ return list(itertools.islice(itertools.chain(iterable, itertools.repeat(obj)), length))
+
# We parse and rewrite the useradd components
def rewrite_useradd(params):
# The following comes from --help on useradd from shadow
@@ -84,7 +90,10 @@ def update_useradd_static_config(d):
for line in f:
if line.startswith('#'):
continue
- field = line.rstrip().split(":")
+ # Make sure there always are at least seven elements in
+ # the field list. This allows for leaving out trailing
+ # colons in the passwd file.
+ field = list_extend(line.rstrip().split(":"), 7)
if field[0] == uaargs.LOGIN:
if uaargs.uid and field[2] and (uaargs.uid != field[2]):
bb.warn("%s: Changing username %s's uid from (%s) to (%s), verify configuration files!" % (d.getVar('PN', True), uaargs.LOGIN, uaargs.uid, field[2]))
@@ -220,7 +229,10 @@ def update_useradd_static_config(d):
for line in f:
if line.startswith('#'):
continue
- field = line.rstrip().split(":")
+ # Make sure there always are at least four elements in
+ # the field list. This allows for leaving out trailing
+ # colons in the group file.
+ field = list_extend(line.rstrip().split(":"), 4)
if field[0] == gaargs.GROUP and field[2]:
if gaargs.gid and (gaargs.gid != field[2]):
bb.warn("%s: Changing groupname %s's gid from (%s) to (%s), verify configuration files!" % (d.getVar('PN', True), gaargs.GROUP, gaargs.gid, field[2]))
diff --git a/meta/classes/useradd_base.bbclass b/meta/classes/useradd_base.bbclass
index 802f3a1..ab3cd35 100644
--- a/meta/classes/useradd_base.bbclass
+++ b/meta/classes/useradd_base.bbclass
@@ -104,7 +104,7 @@ perform_groupmems () {
sleep $count
done
else
- bbwarn "${PN}: group $groupname already contains $username, not re-adding it"
+ bbnote "${PN}: group $groupname already contains $username, not re-adding it"
fi
if test "x$gshadow" = "xno"; then
rm -f $rootdir${sysconfdir}/gshadow
@@ -136,7 +136,7 @@ perform_groupdel () {
sleep $count
done
else
- bbwarn "${PN}: group $groupname doesn't exist, not removing it"
+ bbnote "${PN}: group $groupname doesn't exist, not removing it"
fi
}
@@ -164,7 +164,7 @@ perform_userdel () {
sleep $count
done
else
- bbwarn "${PN}: user $username doesn't exist, not removing it"
+ bbnote "${PN}: user $username doesn't exist, not removing it"
fi
}
diff --git a/meta/conf/bitbake.conf b/meta/conf/bitbake.conf
index d8a66f9..06971da 100644
--- a/meta/conf/bitbake.conf
+++ b/meta/conf/bitbake.conf
@@ -166,6 +166,7 @@ DATETIME = "${DATE}${TIME}"
ASSUME_PROVIDED = "\
bzip2-native \
chrpath-native \
+ file-native \
git-native \
grep-native \
diffstat-native \
@@ -566,7 +567,7 @@ BBLAYERS_FETCH_DIR ??= "${COREBASE}"
# Download locations and utilities.
##################################################################
-APACHE_MIRROR = "http://www.apache.org/dist"
+APACHE_MIRROR = "http://archive.apache.org/dist"
DEBIAN_MIRROR = "ftp://ftp.debian.org/debian/pool"
GENTOO_MIRROR = "http://distfiles.gentoo.org/distfiles"
GNOME_GIT = "git://git.gnome.org"
@@ -806,7 +807,7 @@ BB_SIGNATURE_EXCLUDE_FLAGS ?= "doc deps depends \
lockfiles type vardepsexclude vardeps vardepvalue vardepvalueexclude \
file-checksums python func task export unexport noexec nostamp dirs cleandirs \
sstate-lockfile-shared prefuncs postfuncs export_func deptask rdeptask \
- recrdeptask nodeprrecs stamp-base stamp-extra-info"
+ recrdeptask nodeprrecs stamp-base stamp-extra-info sstate-outputdirs"
MLPREFIX ??= ""
MULTILIB_VARIANTS ??= ""
diff --git a/meta/conf/distro/include/default-distrovars.inc b/meta/conf/distro/include/default-distrovars.inc
index 29b762b..8366904 100644
--- a/meta/conf/distro/include/default-distrovars.inc
+++ b/meta/conf/distro/include/default-distrovars.inc
@@ -47,3 +47,6 @@ DISTRO_VERSION ??= "nodistro.0"
# Missing checksums should raise an error
BB_STRICT_CHECKSUM = "1"
+
+GTK2DISTROFEATURES = "directfb x11"
+GTK3DISTROFEATURES = "x11 wayland"
diff --git a/meta/conf/distro/include/distro_alias.inc b/meta/conf/distro/include/distro_alias.inc
index bd3da9c..ca333c8 100644
--- a/meta/conf/distro/include/distro_alias.inc
+++ b/meta/conf/distro/include/distro_alias.inc
@@ -14,6 +14,7 @@ DISTRO_PN_ALIAS_pn-abiword-embedded = "Fedora=abiword Ubuntu=abiword"
DISTRO_PN_ALIAS_pn-adt-installer = "Intel"
DISTRO_PN_ALIAS_pn-alsa-state = "OE-Core"
DISTRO_PN_ALIAS_pn-alsa-utils-alsaconf = "OE-Core"
+DISTRO_PN_ALIAS_pn-alsa-utils-scripts = "OE-Core"
DISTRO_PN_ALIAS_pn-atk = "Fedora=atk OpenSuSE=atk"
DISTRO_PN_ALIAS_pn-augeas = "Ubuntu=libaugeas0 Debian=libaugeas0"
DISTRO_PN_ALIAS_pn-avahi-ui = "Ubuntu=avahi-discover Debian=avahi-discover"
@@ -43,6 +44,7 @@ DISTRO_PN_ALIAS_pn-clutter = "Fedora=clutter OpenSuse=clutter Ubuntu=clutter-1.0
DISTRO_PN_ALIAS_pn-clutter-1.8 = "Fedora=clutter OpenSuse=clutter Ubuntu=clutter-1.0 Mandriva=clutter Debian=clutter"
DISTRO_PN_ALIAS_pn-clutter-gst-1.0 = "Debian=clutter-gst Ubuntu=clutter-gst Fedora=clutter-gst"
DISTRO_PN_ALIAS_pn-clutter-gst-1.8 = "Fedora=clutter-gst Debian=libclutter-gst"
+DISTRO_PN_ALIAS_pn-clutter-gst-3.0 = "Ubuntu=libclutter-gst Debian=libclutter-gst"
DISTRO_PN_ALIAS_pn-clutter-gtk-1.0 = "Debian=clutter-gtk Ubuntu=clutter-gtk Fedora=clutter-gtk"
DISTRO_PN_ALIAS_pn-clutter-gtk-1.8 = "Fedora=clutter-gtk OpenSuSE=clutter-gtk Ubuntu=clutter-gtk-0.10 Mandriva=clutter-gtk Debian=clutter-gtk"
DISTRO_PN_ALIAS_pn-cogl-1.0 = "Debian=cogl Ubuntu=cogl Fedora=cogl"
@@ -220,6 +222,7 @@ DISTRO_PN_ALIAS_pn-libmatchbox = "Ubuntu=libmatchbox Fedora=libmatchbox"
DISTRO_PN_ALIAS_pn-libmpc = "Fedora=libmpc OpenSuse=libmpc2"
DISTRO_PN_ALIAS_pn-libnewt = "Debian=libnewt0.52 Fedora=newt"
DISTRO_PN_ALIAS_pn-libnewt-python = "Ubuntu=python-newt Fedora=newt-python"
+DISTRO_PN_ALIAS_pn-libnl = "Mandriva=libnl Fedora=libnl"
DISTRO_PN_ALIAS_pn-libnss-mdns = "Meego=nss-mdns OpenSuSE=nss-mdns Ubuntu=nss-mdns Mandriva=nss_mdns Debian=nss-mdns"
DISTRO_PN_ALIAS_pn-libomxil = "OSPDT upstream=http://omxil.sourceforge.net/"
DISTRO_PN_ALIAS_pn-libowl = "Debian=owl OpenedHand"
@@ -383,14 +386,18 @@ DISTRO_PN_ALIAS_pn-printproto = "Debian=x11proto-print-dev Ubuntu=x11proto-print
DISTRO_PN_ALIAS_pn-pseudo = "Windriver"
DISTRO_PN_ALIAS_pn-psplash = "OpenedHand"
DISTRO_PN_ALIAS_pn-ptest-runner = "OE-Core"
+DISTRO_PN_ALIAS_pn-pulseaudio-client-conf-sato = "OE-Core"
DISTRO_PN_ALIAS_pn-puzzles = "Debian=sgt-puzzles Fedora=puzzles"
DISTRO_PN_ALIAS_pn-python3 = "Fedora=python3 Debian=python3.2"
DISTRO_PN_ALIAS_pn-python3-distribute = "Debian=python3-setuptools Fedora=python3-setuptools"
+DISTRO_PN_ALIAS_pn-python3-pip = "OpenSuSE=python3-pip Debian=python3-pip"
+DISTRO_PN_ALIAS_pn-python3-setuptools = "OpenSuSE=python3-setuptools Debian=python3-setuptools"
DISTRO_PN_ALIAS_pn-python-ZSI = "OE-Core"
DISTRO_PN_ALIAS_pn-python-argparse = "Fedora=python-argparse OpenSuSE=python-argparse"
DISTRO_PN_ALIAS_pn-python-dbus = "Ubuntu=python-dbus Debian=python-dbus Mandriva=python-dbus"
DISTRO_PN_ALIAS_pn-python-distribute = "Opensuse=python-setuptools Fedora=python-setuptools"
DISTRO_PN_ALIAS_pn-python-git = "Debian=python-git Fedora=GitPython"
+DISTRO_PN_ALIAS_pn-python-imaging = "Mandriva=python-imaging Debian=python-imaging"
DISTRO_PN_ALIAS_pn-python-mako = "Fedora=python-mako Opensuse=python-Mako"
DISTRO_PN_ALIAS_pn-python-pycairo = "Meego=pycairo Fedora=pycairo Ubuntu=pycairo Debian=pycairo"
DISTRO_PN_ALIAS_pn-python-pycurl = "Debian=python-pycurl Ubuntu=python-pycurl"
@@ -436,7 +443,9 @@ DISTRO_PN_ALIAS_pn-shadow-sysroot = "Ubuntu=shadow Fedora=shadow"
DISTRO_PN_ALIAS_pn-shasum = "OE-Core"
DISTRO_PN_ALIAS_pn-shutdown-desktop = "OpenedHand"
DISTRO_PN_ALIAS_pn-signgp = "OE-Core"
+DISTRO_PN_ALIAS_pn-speexdsp = "Ubuntu=libspeexdsp1 Fedora=speexdsp"
DISTRO_PN_ALIAS_pn-stat = "Debian=coreutils Fedora=coreutils"
+DISTRO_PN_ALIAS_pn-stress = "Debian=stress Fedora=stress"
DISTRO_PN_ALIAS_pn-swabber = "OE-Core"
DISTRO_PN_ALIAS_pn-sysklogd = "Debian=sysklogd Mandriva=sysklogd"
DISTRO_PN_ALIAS_pn-sysprof = "Fedora=sysprof Debian=sysprof"
@@ -460,6 +469,7 @@ DISTRO_PN_ALIAS_pn-ttf-bitstream-vera = "Debian=ttf-bitstream-vera Ubuntu=ttf-bi
DISTRO_PN_ALIAS_pn-tzcode = "OSPDT"
DISTRO_PN_ALIAS_pn-u-boot-fw-utils = "Ubuntu=u-boot-tools Debian=u-boot-tools"
DISTRO_PN_ALIAS_pn-u-boot-mkimage = "Ubuntu=uboot-mkimage Debian=uboot-mkimage"
+DISTRO_PN_ALIAS_pn-udev = "Mandriva=udev Fedora=udev"
DISTRO_PN_ALIAS_pn-udev-extraconf = "OE-Core"
DISTRO_PN_ALIAS_pn-unfs3 = "Debian=unfs3 Fedora=unfs3"
DISTRO_PN_ALIAS_pn-unfs-server = "OE-Core"
diff --git a/meta/conf/documentation.conf b/meta/conf/documentation.conf
index 075ab6a..845559a 100644
--- a/meta/conf/documentation.conf
+++ b/meta/conf/documentation.conf
@@ -212,6 +212,8 @@ IMAGE_BOOT_FILES[doc] = "Whitespace separated list of files from ${DEPLOY_DIR_IM
IMAGE_CLASSES[doc] = "A list of classes that all images should inherit."
IMAGE_FEATURES[doc] = "The primary list of features to include in an image. Configure this variable in an image recipe."
IMAGE_FSTYPES[doc] = "Formats of root filesystem images that you want to have created."
+IMAGE_FSTYPES_DEBUGFS[doc] = "Formats of the debug root filesystem images that you want to have created."
+IMAGE_GEN_DEBUGFS[doc] = "When set to '1', generate a companion debug object/source filesystem image."
IMAGE_INSTALL[doc] = "Specifies the packages to install into an image. Image recipes set IMAGE_INSTALL to specify the packages to install into an image through image.bbclass."
IMAGE_LINGUAS[doc] = "Specifies the list of locales to install into the image during the root filesystem construction process."
IMAGE_NAME[doc] = "The name of the output image files minus the extension."
diff --git a/meta/conf/layer.conf b/meta/conf/layer.conf
index 9e80018..9773632 100644
--- a/meta/conf/layer.conf
+++ b/meta/conf/layer.conf
@@ -41,9 +41,7 @@ SIGGEN_EXCLUDERECIPES_ABISAFE += " \
"
SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS += " \
- gcc-cross-${TARGET_ARCH}->glibc \
- gcc-cross-${TARGET_ARCH}->musl \
- gcc-cross-${TARGET_ARCH}->uclibc \
+ gcc-cross-${TARGET_ARCH}->virtual/libc \
gcc-cross-${TARGET_ARCH}->linux-libc-headers \
ppp-dialin->ppp \
resolvconf->bash \
@@ -56,5 +54,6 @@ SIGGEN_EXCLUDE_SAFE_RECIPE_DEPS += " \
font-alias->font-util \
weston-init->weston \
weston-init->kbd \
+ oprofile->virtual/kernel \
"
diff --git a/meta/conf/machine/include/qemu.inc b/meta/conf/machine/include/qemu.inc
index d5c0b37..16e9469 100644
--- a/meta/conf/machine/include/qemu.inc
+++ b/meta/conf/machine/include/qemu.inc
@@ -5,7 +5,7 @@ PREFERRED_PROVIDER_virtual/libgles1 ?= "mesa"
PREFERRED_PROVIDER_virtual/libgles2 ?= "mesa"
XSERVER ?= "xserver-xorg \
- ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'mesa-driver-swrast', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'mesa-driver-swrast xserver-xorg-extension-glx', '', d)} \
xf86-input-evdev \
xf86-input-mouse \
xf86-video-fbdev \
diff --git a/meta/conf/machine/include/tune-thunderx.inc b/meta/conf/machine/include/tune-thunderx.inc
new file mode 100644
index 0000000..40de61d
--- /dev/null
+++ b/meta/conf/machine/include/tune-thunderx.inc
@@ -0,0 +1,19 @@
+require conf/machine/include/arm/arch-armv8.inc
+
+DEFAULTTUNE ?= "thunderx"
+AVAILTUNES += "thunderx thunderx_be"
+
+TUNEVALID[thunderx] = "Enable instructions for Cavium ThunderX"
+
+TUNE_CCARGS .= "${@bb.utils.contains("TUNE_FEATURES", "thunderx", " -mcpu=thunderx ", "",d)}"
+
+ARMPKGARCH_tune-thunderx ?= "thunderx"
+ARMPKGARCH_tune-thunderx_be ?= "thunderx_be"
+
+TUNE_FEATURES_tune-thunderx ?= "${TUNE_FEATURES_tune-aarch64} thunderx"
+TUNE_FEATURES_tune-thunderx_be ?= "${TUNE_FEATURES_tune-thunderx} bigendian"
+BASE_LIB_tune-thunderx = "lib64"
+BASE_LIB_tune-thunderx_be = "lib64"
+
+PACKAGE_EXTRA_ARCHS_tune-thunderx = "aarch64 thunderx"
+PACKAGE_EXTRA_ARCHS_tune-thunderx_be = "aarch64_be thunderx_be"
diff --git a/meta/conf/machine/qemux86-64.conf b/meta/conf/machine/qemux86-64.conf
index a4fd43c..489194a 100644
--- a/meta/conf/machine/qemux86-64.conf
+++ b/meta/conf/machine/qemux86-64.conf
@@ -16,7 +16,7 @@ KERNEL_IMAGETYPE = "bzImage"
SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1"
XSERVER = "xserver-xorg \
- ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'mesa-driver-swrast', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'mesa-driver-swrast xserver-xorg-extension-glx', '', d)} \
xf86-input-vmmouse \
xf86-input-keyboard \
xf86-input-evdev \
diff --git a/meta/conf/machine/qemux86.conf b/meta/conf/machine/qemux86.conf
index 96cea66..3cc8091 100644
--- a/meta/conf/machine/qemux86.conf
+++ b/meta/conf/machine/qemux86.conf
@@ -15,7 +15,7 @@ KERNEL_IMAGETYPE = "bzImage"
SERIAL_CONSOLES = "115200;ttyS0 115200;ttyS1"
XSERVER = "xserver-xorg \
- ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'mesa-driver-swrast', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'mesa-driver-swrast xserver-xorg-extension-glx', '', d)} \
xf86-input-vmmouse \
xf86-input-keyboard \
xf86-input-evdev \
diff --git a/meta/conf/multilib.conf b/meta/conf/multilib.conf
index 89a8e90..50303fb 100644
--- a/meta/conf/multilib.conf
+++ b/meta/conf/multilib.conf
@@ -2,7 +2,7 @@
baselib = "${@d.getVar('BASE_LIB_tune-' + (d.getVar('DEFAULTTUNE', True) or 'INVALID'), True) or d.getVar('BASELIB', True)}"
MULTILIB_VARIANTS = "${@extend_variants(d,'MULTILIBS','multilib')}"
-MULTILIB_SAVE_VARNAME = "DEFAULTTUNE TARGET_ARCH TARGET_SYS"
+MULTILIB_SAVE_VARNAME = "DEFAULTTUNE TARGET_ARCH TARGET_SYS TARGET_VENDOR"
MULTILIBS ??= "multilib:lib32"
@@ -24,3 +24,4 @@ OPKG_ARGS_append = " --force-maintainer --force-overwrite"
# inside the multilib sysroot. Fix this by explicitly adding the MACHINE's
# architecture-independent pkgconfig location to PKG_CONFIG_PATH.
PKG_CONFIG_PATH .= ":${STAGING_DIR}/${MACHINE}${datadir}/pkgconfig"
+PKG_CONFIG_PATH[vardepsexclude] = "MACHINE"
diff --git a/meta/files/common-licenses/GFDL-1.1 b/meta/files/common-licenses/GFDL-1.1
index 4a0fe1c..1d74223 100644
--- a/meta/files/common-licenses/GFDL-1.1
+++ b/meta/files/common-licenses/GFDL-1.1
@@ -1,8 +1,7 @@
- GNU Free Documentation License
- Version 1.2, November 2002
+ GNU Free Documentation License
+ Version 1.1, March 2000
-
- Copyright (C) 2000,2001,2002 Free Software Foundation, Inc.
+ Copyright (C) 2000 Free Software Foundation, Inc.
51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
@@ -11,12 +10,12 @@
0. PREAMBLE
The purpose of this License is to make a manual, textbook, or other
-functional and useful document "free" in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
+written document "free" in the sense of freedom: to assure everyone
+the effective freedom to copy and redistribute it, with or without
+modifying it, either commercially or noncommercially. Secondarily,
+this License preserves for the author and publisher a way to get
+credit for their work, while not being considered responsible for
+modifications made by others.
This License is a kind of "copyleft", which means that derivative
works of the document must themselves be free in the same sense. It
@@ -34,15 +33,11 @@ principally for works whose purpose is instruction or reference.
1. APPLICABILITY AND DEFINITIONS
-This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License. Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein. The "Document", below,
-refers to any such manual or work. Any member of the public is a
-licensee, and is addressed as "you". You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
+This License applies to any manual or other work that contains a
+notice placed by the copyright holder saying it can be distributed
+under the terms of this License. The "Document", below, refers to any
+such manual or work. Any member of the public is a licensee, and is
+addressed as "you".
A "Modified Version" of the Document means any work containing the
Document or a portion of it, either copied verbatim, or with
@@ -52,7 +47,7 @@ A "Secondary Section" is a named appendix or a front-matter section of
the Document that deals exclusively with the relationship of the
publishers or authors of the Document to the Document's overall subject
(or to related matters) and contains nothing that could fall directly
-within that overall subject. (Thus, if the Document is in part a
+within that overall subject. (For example, if the Document is in part a
textbook of mathematics, a Secondary Section may not explain any
mathematics.) The relationship could be a matter of historical
connection with the subject or with related matters, or of legal,
@@ -61,40 +56,33 @@ them.
The "Invariant Sections" are certain Secondary Sections whose titles
are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License. If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant. The Document may contain zero
-Invariant Sections. If the Document does not identify any Invariant
-Sections then there are none.
+that says that the Document is released under this License.
The "Cover Texts" are certain short passages of text that are listed,
as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License. A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
+the Document is released under this License.
A "Transparent" copy of the Document means a machine-readable copy,
represented in a format whose specification is available to the
-general public, that is suitable for revising the document
+general public, whose contents can be viewed and edited directly and
straightforwardly with generic text editors or (for images composed of
pixels) generic paint programs or (for drawings) some widely available
drawing editor, and that is suitable for input to text formatters or
for automatic translation to a variety of formats suitable for input
to text formatters. A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text. A copy that is not "Transparent" is called "Opaque".
+format whose markup has been designed to thwart or discourage
+subsequent modification by readers is not Transparent. A copy that is
+not "Transparent" is called "Opaque".
Examples of suitable formats for Transparent copies include plain
ASCII without markup, Texinfo input format, LaTeX input format, SGML
or XML using a publicly available DTD, and standard-conforming simple
-HTML, PostScript or PDF designed for human modification. Examples of
-transparent image formats include PNG, XCF and JPG. Opaque formats
-include proprietary formats that can be read and edited only by
-proprietary word processors, SGML or XML for which the DTD and/or
+HTML designed for human modification. Opaque formats include
+PostScript, PDF, proprietary formats that can be read and edited only
+by proprietary word processors, SGML or XML for which the DTD and/or
processing tools are not generally available, and the
-machine-generated HTML, PostScript or PDF produced by some word
-processors for output purposes only.
+machine-generated HTML produced by some word processors for output
+purposes only.
The "Title Page" means, for a printed book, the title page itself,
plus such following pages as are needed to hold, legibly, the material
@@ -103,21 +91,6 @@ formats which do not have any title page as such, "Title Page" means
the text near the most prominent appearance of the work's title,
preceding the beginning of the body of the text.
-A section "Entitled XYZ" means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language. (Here XYZ stands for a
-specific section name mentioned below, such as "Acknowledgements",
-"Dedications", "Endorsements", or "History".) To "Preserve the Title"
-of such a section when you modify the Document means that it remains a
-section "Entitled XYZ" according to this definition.
-
-The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document. These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-
2. VERBATIM COPYING
@@ -137,10 +110,9 @@ you may publicly display copies.
3. COPYING IN QUANTITY
-If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document's license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
+If you publish printed copies of the Document numbering more than 100,
+and the Document's license notice requires Cover Texts, you must enclose
+the copies in covers that carry, clearly and legibly, all these Cover
Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
the back cover. Both covers must also clearly and legibly identify
you as the publisher of these copies. The front cover must present
@@ -158,15 +130,16 @@ pages.
If you publish or distribute Opaque copies of the Document numbering
more than 100, you must either include a machine-readable Transparent
copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
+a publicly-accessible computer-network location containing a complete
+Transparent copy of the Document, free of added material, which the
+general network-using public has access to download anonymously at no
+charge using public-standard network protocols. If you use the latter
+option, you must take reasonably prudent steps, when you begin
+distribution of Opaque copies in quantity, to ensure that this
+Transparent copy will remain thus accessible at the stated location
+until at least one year after the last time you distribute an Opaque
+copy (directly or through your agents or retailers) of that edition to
+the public.
It is requested, but not required, that you contact the authors of the
Document well before redistributing any large number of copies, to give
@@ -190,8 +163,7 @@ A. Use in the Title Page (and on the covers, if any) a title distinct
B. List on the Title Page, as authors, one or more persons or entities
responsible for authorship of the modifications in the Modified
Version, together with at least five of the principal authors of the
- Document (all of its principal authors, if it has fewer than five),
- unless they release you from this requirement.
+ Document (all of its principal authors, if it has less than five).
C. State on the Title page the name of the publisher of the
Modified Version, as the publisher.
D. Preserve all the copyright notices of the Document.
@@ -203,10 +175,10 @@ F. Include, immediately after the copyright notices, a license notice
G. Preserve in that license notice the full lists of Invariant Sections
and required Cover Texts given in the Document's license notice.
H. Include an unaltered copy of this License.
-I. Preserve the section Entitled "History", Preserve its Title, and add
- to it an item stating at least the title, year, new authors, and
+I. Preserve the section entitled "History", and its title, and add to
+ it an item stating at least the title, year, new authors, and
publisher of the Modified Version as given on the Title Page. If
- there is no section Entitled "History" in the Document, create one
+ there is no section entitled "History" in the Document, create one
stating the title, year, authors, and publisher of the Document as
given on its Title Page, then add an item describing the Modified
Version as stated in the previous sentence.
@@ -217,18 +189,17 @@ J. Preserve the network location, if any, given in the Document for
You may omit a network location for a work that was published at
least four years before the Document itself, or if the original
publisher of the version it refers to gives permission.
-K. For any section Entitled "Acknowledgements" or "Dedications",
- Preserve the Title of the section, and preserve in the section all
- the substance and tone of each of the contributor acknowledgements
+K. In any section entitled "Acknowledgements" or "Dedications",
+ preserve the section's title, and preserve in the section all the
+ substance and tone of each of the contributor acknowledgements
and/or dedications given therein.
L. Preserve all the Invariant Sections of the Document,
unaltered in their text and in their titles. Section numbers
or the equivalent are not considered part of the section titles.
-M. Delete any section Entitled "Endorsements". Such a section
+M. Delete any section entitled "Endorsements". Such a section
may not be included in the Modified Version.
-N. Do not retitle any existing section to be Entitled "Endorsements"
+N. Do not retitle any existing section as "Endorsements"
or to conflict in title with any Invariant Section.
-O. Preserve any Warranty Disclaimers.
If the Modified Version includes new front-matter sections or
appendices that qualify as Secondary Sections and contain no material
@@ -237,7 +208,7 @@ of these sections as invariant. To do this, add their titles to the
list of Invariant Sections in the Modified Version's license notice.
These titles must be distinct from any other section titles.
-You may add a section Entitled "Endorsements", provided it contains
+You may add a section entitled "Endorsements", provided it contains
nothing but endorsements of your Modified Version by various
parties--for example, statements of peer review or that the text has
been approved by an organization as the authoritative definition of a
@@ -265,7 +236,7 @@ License, under the terms defined in section 4 above for modified
versions, provided that you include in the combination all of the
Invariant Sections of all of the original documents, unmodified, and
list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
+license notice.
The combined work need only contain one copy of this License, and
multiple identical Invariant Sections may be replaced with a single
@@ -276,11 +247,11 @@ author or publisher of that section if known, or else a unique number.
Make the same adjustment to the section titles in the list of
Invariant Sections in the license notice of the combined work.
-In the combination, you must combine any sections Entitled "History"
-in the various original documents, forming one section Entitled
-"History"; likewise combine any sections Entitled "Acknowledgements",
-and any sections Entitled "Dedications". You must delete all sections
-Entitled "Endorsements".
+In the combination, you must combine any sections entitled "History"
+in the various original documents, forming one section entitled
+"History"; likewise combine any sections entitled "Acknowledgements",
+and any sections entitled "Dedications". You must delete all sections
+entitled "Endorsements."
6. COLLECTIONS OF DOCUMENTS
@@ -301,20 +272,18 @@ other respects regarding verbatim copying of that document.
A compilation of the Document or its derivatives with other separate
and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an "aggregate" if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation's users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
+distribution medium, does not as a whole count as a Modified Version
+of the Document, provided no compilation copyright is claimed for the
+compilation. Such a compilation is called an "aggregate", and this
+License does not apply to the other self-contained works thus compiled
+with the Document, on account of their being thus compiled, if they
+are not themselves derivative works of the Document.
If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document's Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
+copies of the Document, then if the Document is less than one quarter
+of the entire aggregate, the Document's Cover Texts may be placed on
+covers that surround only the Document within the aggregate.
+Otherwise they must appear on covers around the whole aggregate.
8. TRANSLATION
@@ -325,17 +294,10 @@ Replacing Invariant Sections with translations requires special
permission from their copyright holders, but you may include
translations of some or all Invariant Sections in addition to the
original versions of these Invariant Sections. You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers. In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-
-If a section in the Document is Entitled "Acknowledgements",
-"Dedications", or "History", the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
+translation of this License provided that you also include the
+original English version of this License. In case of a disagreement
+between the translation and the original English version of this
+License, the original English version will prevail.
9. TERMINATION
@@ -373,23 +335,19 @@ To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and
license notices just after the title page:
- Copyright (c) YEAR YOUR NAME.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.2
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
- A copy of the license is included in the section entitled "GNU
- Free Documentation License".
-
-If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the "with...Texts." line with this:
-
- with the Invariant Sections being LIST THEIR TITLES, with the
- Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
-
-If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
+ Copyright (c) YEAR YOUR NAME.
+ Permission is granted to copy, distribute and/or modify this document
+ under the terms of the GNU Free Documentation License, Version 1.1
+ or any later version published by the Free Software Foundation;
+ with the Invariant Sections being LIST THEIR TITLES, with the
+ Front-Cover Texts being LIST, and with the Back-Cover Texts being LIST.
+ A copy of the license is included in the section entitled "GNU
+ Free Documentation License".
+
+If you have no Invariant Sections, write "with no Invariant Sections"
+instead of saying which ones are invariant. If you have no
+Front-Cover Texts, write "no Front-Cover Texts" instead of
+"Front-Cover Texts being LIST"; likewise for Back-Cover Texts.
If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of
diff --git a/meta/files/ext-sdk-prepare.sh b/meta/files/ext-sdk-prepare.sh
new file mode 100644
index 0000000..160c71e
--- /dev/null
+++ b/meta/files/ext-sdk-prepare.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+
+# Prepare the build system within the extensible SDK
+
+target_sdk_dir="$1"
+sdk_targets="$2"
+
+# Avoid actually building images during this phase, but still
+# ensure all dependencies are extracted from sstate
+# This is a hack, to be sure, but we really don't need to do this here
+for sdktarget in $sdk_targets ; do
+ bbappend=`recipetool newappend $target_sdk_dir/workspace $sdktarget`
+ printf 'python do_rootfs_forcevariable () {\n bb.utils.mkdirhier(d.getVar("IMAGE_ROOTFS", True))\n}\n' > $bbappend
+ printf 'python do_bootimg () {\n pass\n}\n' >> $bbappend
+ printf 'python do_bootdirectdisk () {\n pass\n}\n' >> $bbappend
+ printf 'python do_vmimg () {\n pass\n}\n' >> $bbappend
+ printf "Created bbappend %s\n" "$bbappend"
+done
+bitbake $sdk_targets || exit 1
+rm -rf $target_sdk_dir/workspace/appends/*
diff --git a/meta/files/toolchain-shar-extract.sh b/meta/files/toolchain-shar-extract.sh
index cd0a547..35d3c75 100644
--- a/meta/files/toolchain-shar-extract.sh
+++ b/meta/files/toolchain-shar-extract.sh
@@ -1,4 +1,4 @@
-#!/bin/bash
+#!/bin/sh
INST_ARCH=$(uname -m | sed -e "s/i[3-6]86/ix86/" -e "s/x86[-_]64/x86_64/")
SDK_ARCH=$(echo @SDK_ARCH@ | sed -e "s/i[3-6]86/ix86/" -e "s/x86[-_]64/x86_64/")
@@ -68,8 +68,9 @@ while getopts ":yd:nDRS" OPT; do
esac
done
-echo "@SDK_TITLE@ installer version @SDK_VERSION@"
-echo "==========================================================="
+titlestr="@SDK_TITLE@ installer version @SDK_VERSION@"
+printf "%s\n" "$titlestr"
+printf "%${#titlestr}s\n" | tr " " "="
if [ $verbose = 1 ] ; then
set -x
@@ -86,7 +87,7 @@ if [ "$target_sdk_dir" = "" ]; then
if [ "$answer" = "Y" ]; then
target_sdk_dir="$DEFAULT_INSTALL_DIR"
else
- read -e -p "Enter target directory for SDK (default: $DEFAULT_INSTALL_DIR): " target_sdk_dir
+ read -p "Enter target directory for SDK (default: $DEFAULT_INSTALL_DIR): " target_sdk_dir
[ "$target_sdk_dir" = "" ] && target_sdk_dir=$DEFAULT_INSTALL_DIR
fi
fi
@@ -100,9 +101,9 @@ fi
if [ "$SDK_EXTENSIBLE" = "1" ]; then
# We're going to be running the build system, additional restrictions apply
- if echo "$target_sdk_dir" | grep -q '[+\ @]'; then
+ if echo "$target_sdk_dir" | grep -q '[+\ @$]'; then
echo "The target directory path ($target_sdk_dir) contains illegal" \
- "characters such as spaces, @ or +. Abort!"
+ "characters such as spaces, @, \$ or +. Abort!"
exit 1
fi
else
@@ -163,14 +164,25 @@ fi
payload_offset=$(($(grep -na -m1 "^MARKER:$" $0|cut -d':' -f1) + 1))
printf "Extracting SDK..."
-tail -n +$payload_offset $0| $SUDO_EXEC tar xj -C $target_sdk_dir
+tail -n +$payload_offset $0| $SUDO_EXEC tar xj -C $target_sdk_dir --checkpoint=.2500
echo "done"
printf "Setting it up..."
# fix environment paths
+real_env_setup_script=""
for env_setup_script in `ls $target_sdk_dir/environment-setup-*`; do
+ if grep -q 'OECORE_NATIVE_SYSROOT=' $env_setup_script; then
+ # Handle custom env setup scripts that are only named
+ # environment-setup-* so that they have relocation
+ # applied - what we want beyond here is the main one
+ # rather than the one that simply sorts last
+ real_env_setup_script="$env_setup_script"
+ fi
$SUDO_EXEC sed -e "s:@SDKPATH@:$target_sdk_dir:g" -i $env_setup_script
done
+if [ -n "$real_env_setup_script" ] ; then
+ env_setup_script="$real_env_setup_script"
+fi
@SDK_POST_INSTALL_COMMAND@
@@ -182,7 +194,9 @@ fi
echo "SDK has been successfully set up and is ready to be used."
echo "Each time you wish to use the SDK in a new shell session, you need to source the environment setup script e.g."
-echo " \$ . $target_sdk_dir/environment-setup- at REAL_MULTIMACH_TARGET_SYS@"
+for env_setup_script in `ls $target_sdk_dir/environment-setup-*`; do
+ echo " \$ . $env_setup_script"
+done
exit 0
diff --git a/meta/files/toolchain-shar-relocate.sh b/meta/files/toolchain-shar-relocate.sh
index dfb8e16..4ef2927 100644
--- a/meta/files/toolchain-shar-relocate.sh
+++ b/meta/files/toolchain-shar-relocate.sh
@@ -26,25 +26,21 @@ if [ $relocate = 1 ] ; then
fi
fi
-# replace @SDKPATH@ with the new prefix in all text files: configs/scripts/etc
+# replace @SDKPATH@ with the new prefix in all text files: configs/scripts/etc.
+# replace the host perl with SDK perl.
for replace in "$target_sdk_dir -maxdepth 1" "$native_sysroot"; do
- $SUDO_EXEC find $replace -type f -exec file '{}' \; | \
- grep ":.*\(ASCII\|script\|source\).*text" | \
- awk -F':' '{printf "\"%s\"\n", $1}' | \
- grep -v "$target_sdk_dir/environment-setup-*" | \
- $SUDO_EXEC xargs -n32 sed -i -e "s:$DEFAULT_INSTALL_DIR:$target_sdk_dir:g"
-done
+ $SUDO_EXEC find $replace -type f
+done | xargs -n100 file | grep ":.*\(ASCII\|script\|source\).*text" | \
+ awk -F':' '{printf "\"%s\"\n", $1}' | \
+ grep -v "$target_sdk_dir/environment-setup-*" | \
+ xargs -n100 $SUDO_EXEC sed -i \
+ -e "s:$DEFAULT_INSTALL_DIR:$target_sdk_dir:g" \
+ -e "s:^#! */usr/bin/perl.*:#! /usr/bin/env perl:g" \
+ -e "s: /usr/bin/perl: /usr/bin/env perl:g"
# change all symlinks pointing to @SDKPATH@
for l in $($SUDO_EXEC find $native_sysroot -type l); do
$SUDO_EXEC ln -sfn $(readlink $l|$SUDO_EXEC sed -e "s:$DEFAULT_INSTALL_DIR:$target_sdk_dir:") $l
done
-# find out all perl scripts in $native_sysroot and modify them replacing the
-# host perl with SDK perl.
-for perl_script in $($SUDO_EXEC find $native_sysroot -type f -exec grep -l "^#!.*perl" '{}' \;); do
- $SUDO_EXEC sed -i -e "s:^#! */usr/bin/perl.*:#! /usr/bin/env perl:g" -e \
- "s: /usr/bin/perl: /usr/bin/env perl:g" $perl_script
-done
-
echo done
diff --git a/meta/lib/oe/copy_buildsystem.py b/meta/lib/oe/copy_buildsystem.py
index 979578c..c0e7541 100644
--- a/meta/lib/oe/copy_buildsystem.py
+++ b/meta/lib/oe/copy_buildsystem.py
@@ -14,8 +14,9 @@ def _smart_copy(src, dest):
shutil.copymode(src, dest)
class BuildSystem(object):
- def __init__(self, d):
+ def __init__(self, context, d):
self.d = d
+ self.context = context
self.layerdirs = d.getVar('BBLAYERS', True).split()
def copy_bitbake_and_layers(self, destdir):
@@ -38,7 +39,7 @@ class BuildSystem(object):
if os.path.exists(layerconf):
with open(layerconf, 'r') as f:
if f.readline().startswith("# ### workspace layer auto-generated by devtool ###"):
- bb.warn("Skipping local workspace layer %s" % layer)
+ bb.plain("NOTE: Excluding local workspace layer %s from %s" % (layer, self.context))
continue
# If the layer was already under corebase, leave it there
diff --git a/meta/lib/oe/distro_check.py b/meta/lib/oe/distro_check.py
index 8ed5b0e..f92cd2e 100644
--- a/meta/lib/oe/distro_check.py
+++ b/meta/lib/oe/distro_check.py
@@ -1,7 +1,23 @@
-def get_links_from_url(url):
+from contextlib import contextmanager
+ at contextmanager
+def create_socket(url, d):
+ import urllib
+ socket = urllib.urlopen(url, proxies=get_proxies(d))
+ try:
+ yield socket
+ finally:
+ socket.close()
+
+def get_proxies(d):
+ import os
+ proxykeys = ['http', 'https', 'ftp', 'ftps', 'no', 'all']
+ proxyvalues = map(lambda key: d.getVar(key+'_proxy', True), proxykeys)
+ return dict(zip(proxykeys, proxyvalues))
+
+def get_links_from_url(url, d):
"Return all the href links found on the web location"
- import urllib, sgmllib
+ import sgmllib
class LinksParser(sgmllib.SGMLParser):
def parse(self, s):
@@ -24,19 +40,18 @@ def get_links_from_url(url):
"Return the list of hyperlinks."
return self.hyperlinks
- sock = urllib.urlopen(url)
- webpage = sock.read()
- sock.close()
+ with create_socket(url,d) as sock:
+ webpage = sock.read()
linksparser = LinksParser()
linksparser.parse(webpage)
return linksparser.get_hyperlinks()
-def find_latest_numeric_release(url):
+def find_latest_numeric_release(url, d):
"Find the latest listed numeric release on the given url"
max=0
maxstr=""
- for link in get_links_from_url(url):
+ for link in get_links_from_url(url, d):
try:
release = float(link)
except:
@@ -70,7 +85,7 @@ def clean_package_list(package_list):
return set.keys()
-def get_latest_released_meego_source_package_list():
+def get_latest_released_meego_source_package_list(d):
"Returns list of all the name os packages in the latest meego distro"
package_names = []
@@ -82,11 +97,11 @@ def get_latest_released_meego_source_package_list():
package_list=clean_package_list(package_names)
return "1.0", package_list
-def get_source_package_list_from_url(url, section):
+def get_source_package_list_from_url(url, section, d):
"Return a sectioned list of package names from a URL list"
bb.note("Reading %s: %s" % (url, section))
- links = get_links_from_url(url)
+ links = get_links_from_url(url, d)
srpms = filter(is_src_rpm, links)
names_list = map(package_name_from_srpm, srpms)
@@ -96,44 +111,44 @@ def get_source_package_list_from_url(url, section):
return new_pkgs
-def get_latest_released_fedora_source_package_list():
+def get_latest_released_fedora_source_package_list(d):
"Returns list of all the name os packages in the latest fedora distro"
- latest = find_latest_numeric_release("http://archive.fedoraproject.org/pub/fedora/linux/releases/")
+ latest = find_latest_numeric_release("http://archive.fedoraproject.org/pub/fedora/linux/releases/", d)
- package_names = get_source_package_list_from_url("http://archive.fedoraproject.org/pub/fedora/linux/releases/%s/Fedora/source/SRPMS/" % latest, "main")
+ package_names = get_source_package_list_from_url("http://archive.fedoraproject.org/pub/fedora/linux/releases/%s/Fedora/source/SRPMS/" % latest, "main", d)
# package_names += get_source_package_list_from_url("http://download.fedora.redhat.com/pub/fedora/linux/releases/%s/Everything/source/SPRMS/" % latest, "everything")
- package_names += get_source_package_list_from_url("http://archive.fedoraproject.org/pub/fedora/linux/updates/%s/SRPMS/" % latest, "updates")
+ package_names += get_source_package_list_from_url("http://archive.fedoraproject.org/pub/fedora/linux/updates/%s/SRPMS/" % latest, "updates", d)
package_list=clean_package_list(package_names)
return latest, package_list
-def get_latest_released_opensuse_source_package_list():
+def get_latest_released_opensuse_source_package_list(d):
"Returns list of all the name os packages in the latest opensuse distro"
- latest = find_latest_numeric_release("http://download.opensuse.org/source/distribution/")
+ latest = find_latest_numeric_release("http://download.opensuse.org/source/distribution/",d)
- package_names = get_source_package_list_from_url("http://download.opensuse.org/source/distribution/%s/repo/oss/suse/src/" % latest, "main")
- package_names += get_source_package_list_from_url("http://download.opensuse.org/update/%s/rpm/src/" % latest, "updates")
+ package_names = get_source_package_list_from_url("http://download.opensuse.org/source/distribution/%s/repo/oss/suse/src/" % latest, "main", d)
+ package_names += get_source_package_list_from_url("http://download.opensuse.org/update/%s/rpm/src/" % latest, "updates", d)
package_list=clean_package_list(package_names)
return latest, package_list
-def get_latest_released_mandriva_source_package_list():
+def get_latest_released_mandriva_source_package_list(d):
"Returns list of all the name os packages in the latest mandriva distro"
- latest = find_latest_numeric_release("http://distrib-coffee.ipsl.jussieu.fr/pub/linux/MandrivaLinux/official/")
- package_names = get_source_package_list_from_url("http://distrib-coffee.ipsl.jussieu.fr/pub/linux/MandrivaLinux/official/%s/SRPMS/main/release/" % latest, "main")
+ latest = find_latest_numeric_release("http://distrib-coffee.ipsl.jussieu.fr/pub/linux/MandrivaLinux/official/", d)
+ package_names = get_source_package_list_from_url("http://distrib-coffee.ipsl.jussieu.fr/pub/linux/MandrivaLinux/official/%s/SRPMS/main/release/" % latest, "main", d)
# package_names += get_source_package_list_from_url("http://distrib-coffee.ipsl.jussieu.fr/pub/linux/MandrivaLinux/official/%s/SRPMS/contrib/release/" % latest, "contrib")
- package_names += get_source_package_list_from_url("http://distrib-coffee.ipsl.jussieu.fr/pub/linux/MandrivaLinux/official/%s/SRPMS/main/updates/" % latest, "updates")
+ package_names += get_source_package_list_from_url("http://distrib-coffee.ipsl.jussieu.fr/pub/linux/MandrivaLinux/official/%s/SRPMS/main/updates/" % latest, "updates", d)
package_list=clean_package_list(package_names)
return latest, package_list
-def find_latest_debian_release(url):
+def find_latest_debian_release(url, d):
"Find the latest listed debian release on the given url"
releases = []
- for link in get_links_from_url(url):
+ for link in get_links_from_url(url, d):
if link[:6] == "Debian":
if ';' not in link:
releases.append(link)
@@ -143,16 +158,15 @@ def find_latest_debian_release(url):
except:
return "_NotFound_"
-def get_debian_style_source_package_list(url, section):
+def get_debian_style_source_package_list(url, section, d):
"Return the list of package-names stored in the debian style Sources.gz file"
- import urllib
- sock = urllib.urlopen(url)
- import tempfile
- tmpfile = tempfile.NamedTemporaryFile(mode='wb', prefix='oecore.', suffix='.tmp', delete=False)
- tmpfilename=tmpfile.name
- tmpfile.write(sock.read())
- sock.close()
- tmpfile.close()
+ with create_socket(url,d) as sock:
+ webpage = sock.read()
+ import tempfile
+ tmpfile = tempfile.NamedTemporaryFile(mode='wb', prefix='oecore.', suffix='.tmp', delete=False)
+ tmpfilename=tmpfile.name
+ tmpfile.write(sock.read())
+ tmpfile.close()
import gzip
bb.note("Reading %s: %s" % (url, section))
@@ -165,41 +179,41 @@ def get_debian_style_source_package_list(url, section):
return package_names
-def get_latest_released_debian_source_package_list():
+def get_latest_released_debian_source_package_list(d):
"Returns list of all the name os packages in the latest debian distro"
- latest = find_latest_debian_release("http://ftp.debian.org/debian/dists/")
+ latest = find_latest_debian_release("http://ftp.debian.org/debian/dists/", d)
url = "http://ftp.debian.org/debian/dists/stable/main/source/Sources.gz"
- package_names = get_debian_style_source_package_list(url, "main")
+ package_names = get_debian_style_source_package_list(url, "main", d)
# url = "http://ftp.debian.org/debian/dists/stable/contrib/source/Sources.gz"
# package_names += get_debian_style_source_package_list(url, "contrib")
url = "http://ftp.debian.org/debian/dists/stable-proposed-updates/main/source/Sources.gz"
- package_names += get_debian_style_source_package_list(url, "updates")
+ package_names += get_debian_style_source_package_list(url, "updates", d)
package_list=clean_package_list(package_names)
return latest, package_list
-def find_latest_ubuntu_release(url):
+def find_latest_ubuntu_release(url, d):
"Find the latest listed ubuntu release on the given url"
url += "?C=M;O=D" # Descending Sort by Last Modified
- for link in get_links_from_url(url):
+ for link in get_links_from_url(url, d):
if link[-8:] == "-updates":
return link[:-8]
return "_NotFound_"
-def get_latest_released_ubuntu_source_package_list():
+def get_latest_released_ubuntu_source_package_list(d):
"Returns list of all the name os packages in the latest ubuntu distro"
- latest = find_latest_ubuntu_release("http://archive.ubuntu.com/ubuntu/dists/")
+ latest = find_latest_ubuntu_release("http://archive.ubuntu.com/ubuntu/dists/", d)
url = "http://archive.ubuntu.com/ubuntu/dists/%s/main/source/Sources.gz" % latest
- package_names = get_debian_style_source_package_list(url, "main")
+ package_names = get_debian_style_source_package_list(url, "main", d)
# url = "http://archive.ubuntu.com/ubuntu/dists/%s/multiverse/source/Sources.gz" % latest
# package_names += get_debian_style_source_package_list(url, "multiverse")
# url = "http://archive.ubuntu.com/ubuntu/dists/%s/universe/source/Sources.gz" % latest
# package_names += get_debian_style_source_package_list(url, "universe")
url = "http://archive.ubuntu.com/ubuntu/dists/%s-updates/main/source/Sources.gz" % latest
- package_names += get_debian_style_source_package_list(url, "updates")
+ package_names += get_debian_style_source_package_list(url, "updates", d)
package_list=clean_package_list(package_names)
return latest, package_list
-def create_distro_packages_list(distro_check_dir):
+def create_distro_packages_list(distro_check_dir, d):
pkglst_dir = os.path.join(distro_check_dir, "package_lists")
if not os.path.isdir (pkglst_dir):
os.makedirs(pkglst_dir)
@@ -220,7 +234,7 @@ def create_distro_packages_list(distro_check_dir):
begin = datetime.now()
for distro in per_distro_functions:
name = distro[0]
- release, package_list = distro[1]()
+ release, package_list = distro[1](d)
bb.note("Distro: %s, Latest Release: %s, # src packages: %d" % (name, release, len(package_list)))
package_list_file = os.path.join(pkglst_dir, name + "-" + release)
f = open(package_list_file, "w+b")
@@ -231,7 +245,7 @@ def create_distro_packages_list(distro_check_dir):
delta = end - begin
bb.note("package_list generatiosn took this much time: %d seconds" % delta.seconds)
-def update_distro_data(distro_check_dir, datetime):
+def update_distro_data(distro_check_dir, datetime, d):
"""
If distro packages list data is old then rebuild it.
The operations has to be protected by a lock so that
@@ -258,7 +272,7 @@ def update_distro_data(distro_check_dir, datetime):
if saved_datetime[0:8] != datetime[0:8]:
bb.note("The build datetime did not match: saved:%s current:%s" % (saved_datetime, datetime))
bb.note("Regenerating distro package lists")
- create_distro_packages_list(distro_check_dir)
+ create_distro_packages_list(distro_check_dir, d)
f.seek(0)
f.write(datetime)
diff --git a/meta/lib/oe/image.py b/meta/lib/oe/image.py
index f9e9bfd..b9eb3de 100644
--- a/meta/lib/oe/image.py
+++ b/meta/lib/oe/image.py
@@ -5,7 +5,7 @@ import multiprocessing
def generate_image(arg):
- (type, subimages, create_img_cmd) = arg
+ (type, subimages, create_img_cmd, sprefix) = arg
bb.note("Running image creation script for %s: %s ..." %
(type, create_img_cmd))
@@ -54,14 +54,16 @@ class ImageDepGraph(object):
base_type = self._image_base_type(node)
deps = (self.d.getVar('IMAGE_TYPEDEP_' + node, True) or "")
base_deps = (self.d.getVar('IMAGE_TYPEDEP_' + base_type, True) or "")
- if deps != "" or base_deps != "":
- graph[node] = deps
- for dep in deps.split() + base_deps.split():
- if not dep in graph:
- add_node(dep)
- else:
- graph[node] = ""
+ graph[node] = ""
+ for dep in deps.split() + base_deps.split():
+ if not dep in graph[node]:
+ if graph[node] != "":
+ graph[node] += " "
+ graph[node] += dep
+
+ if not dep in graph:
+ add_node(dep)
for fstype in image_fstypes:
add_node(fstype)
@@ -264,9 +266,9 @@ class Image(ImageDepGraph):
return (alltypes, filtered_groups, cimages)
- def _write_script(self, type, cmds):
+ def _write_script(self, type, cmds, sprefix=""):
tempdir = self.d.getVar('T', True)
- script_name = os.path.join(tempdir, "create_image." + type)
+ script_name = os.path.join(tempdir, sprefix + "create_image." + type)
rootfs_size = self._get_rootfs_size()
self.d.setVar('img_creation_func', '\n'.join(cmds))
@@ -284,7 +286,7 @@ class Image(ImageDepGraph):
return script_name
- def _get_imagecmds(self):
+ def _get_imagecmds(self, sprefix=""):
old_overrides = self.d.getVar('OVERRIDES', 0)
alltypes, fstype_groups, cimages = self._get_image_types()
@@ -320,9 +322,9 @@ class Image(ImageDepGraph):
else:
subimages.append(type)
- script_name = self._write_script(type, cmds)
+ script_name = self._write_script(type, cmds, sprefix)
- image_cmds.append((type, subimages, script_name))
+ image_cmds.append((type, subimages, script_name, sprefix))
image_cmd_groups.append(image_cmds)
@@ -355,6 +357,27 @@ class Image(ImageDepGraph):
image_cmd_groups = self._get_imagecmds()
+ # Process the debug filesystem...
+ debugfs_d = bb.data.createCopy(self.d)
+ if self.d.getVar('IMAGE_GEN_DEBUGFS', True) == "1":
+ bb.note("Processing debugfs image(s) ...")
+ orig_d = self.d
+ self.d = debugfs_d
+
+ self.d.setVar('IMAGE_ROOTFS', orig_d.getVar('IMAGE_ROOTFS', True) + '-dbg')
+ self.d.setVar('IMAGE_NAME', orig_d.getVar('IMAGE_NAME', True) + '-dbg')
+ self.d.setVar('IMAGE_LINK_NAME', orig_d.getVar('IMAGE_LINK_NAME', True) + '-dbg')
+
+ debugfs_image_fstypes = orig_d.getVar('IMAGE_FSTYPES_DEBUGFS', True)
+ if debugfs_image_fstypes:
+ self.d.setVar('IMAGE_FSTYPES', orig_d.getVar('IMAGE_FSTYPES_DEBUGFS', True))
+
+ self._remove_old_symlinks()
+
+ image_cmd_groups += self._get_imagecmds("debugfs.")
+
+ self.d = orig_d
+
self._write_wic_env()
for image_cmds in image_cmd_groups:
@@ -369,9 +392,16 @@ class Image(ImageDepGraph):
if result is not None:
bb.fatal(result)
- for image_type, subimages, script in image_cmds:
- bb.note("Creating symlinks for %s image ..." % image_type)
- self._create_symlinks(subimages)
+ for image_type, subimages, script, sprefix in image_cmds:
+ if sprefix == 'debugfs.':
+ bb.note("Creating symlinks for %s debugfs image ..." % image_type)
+ orig_d = self.d
+ self.d = debugfs_d
+ self._create_symlinks(subimages)
+ self.d = orig_d
+ else:
+ bb.note("Creating symlinks for %s image ..." % image_type)
+ self._create_symlinks(subimages)
execute_pre_post_process(self.d, post_process_cmds)
diff --git a/meta/lib/oe/package_manager.py b/meta/lib/oe/package_manager.py
index 292ed44..b9fa6d8 100644
--- a/meta/lib/oe/package_manager.py
+++ b/meta/lib/oe/package_manager.py
@@ -133,8 +133,11 @@ class RpmIndexer(Indexer):
if pkgfeed_gpg_name:
repomd_file = os.path.join(arch_dir, 'repodata', 'repomd.xml')
gpg_cmd = "%s --detach-sign --armor --batch --no-tty --yes " \
- "--passphrase-file '%s' -u '%s' %s" % (gpg_bin,
- pkgfeed_gpg_pass, pkgfeed_gpg_name, repomd_file)
+ "--passphrase-file '%s' -u '%s' " % \
+ (gpg_bin, pkgfeed_gpg_pass, pkgfeed_gpg_name)
+ if self.d.getVar('GPG_PATH', True):
+ gpg_cmd += "--homedir %s " % self.d.getVar('GPG_PATH', True)
+ gpg_cmd += repomd_file
repo_sign_cmds.append(gpg_cmd)
rpm_dirs_found = True
@@ -200,6 +203,8 @@ class OpkgIndexer(Indexer):
result = oe.utils.multiprocess_exec(index_cmds, create_index)
if result:
bb.fatal('%s' % ('\n'.join(result)))
+ if self.d.getVar('PACKAGE_FEED_SIGN', True) == '1':
+ raise NotImplementedError('Package feed signing not implementd for ipk')
@@ -275,6 +280,8 @@ class DpkgIndexer(Indexer):
result = oe.utils.multiprocess_exec(index_cmds, create_index)
if result:
bb.fatal('%s' % ('\n'.join(result)))
+ if self.d.getVar('PACKAGE_FEED_SIGN', True) == '1':
+ raise NotImplementedError('Package feed signing not implementd for dpkg')
@@ -434,24 +441,30 @@ class OpkgPkgsList(PkgsList):
(self.opkg_cmd, self.opkg_args)
try:
- output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip()
+ # bb.note(cmd)
+ tmp_output = subprocess.check_output(cmd, stderr=subprocess.STDOUT, shell=True).strip()
+
except subprocess.CalledProcessError as e:
bb.fatal("Cannot get the installed packages list. Command '%s' "
"returned %d:\n%s" % (cmd, e.returncode, e.output))
- if output and format == "file":
- tmp_output = ""
- for line in output.split('\n'):
+ output = list()
+ for line in tmp_output.split('\n'):
+ if len(line.strip()) == 0:
+ continue
+ if format == "file":
pkg, pkg_file, pkg_arch = line.split()
full_path = os.path.join(self.rootfs_dir, pkg_arch, pkg_file)
if os.path.exists(full_path):
- tmp_output += "%s %s %s\n" % (pkg, full_path, pkg_arch)
+ output.append('%s %s %s' % (pkg, full_path, pkg_arch))
else:
- tmp_output += "%s %s %s\n" % (pkg, pkg_file, pkg_arch)
+ output.append('%s %s %s' % (pkg, pkg_file, pkg_arch))
+ else:
+ output.append(line)
- output = tmp_output
+ output.sort()
- return output
+ return '\n'.join(output)
class DpkgPkgsList(PkgsList):
@@ -605,12 +618,12 @@ class PackageManager(object):
cmd.extend(['-x', exclude])
try:
bb.note("Installing complementary packages ...")
+ bb.note('Running %s' % cmd)
complementary_pkgs = subprocess.check_output(cmd, stderr=subprocess.STDOUT)
except subprocess.CalledProcessError as e:
bb.fatal("Could not compute complementary packages list. Command "
"'%s' returned %d:\n%s" %
(' '.join(cmd), e.returncode, e.output))
-
self.install(complementary_pkgs.split(), attempt_only=True)
def deploy_dir_lock(self):
@@ -1050,6 +1063,35 @@ class RpmPM(PackageManager):
def update(self):
self._invoke_smart('update rpmsys')
+ def get_rdepends_recursively(self, pkgs):
+ # pkgs will be changed during the loop, so use [:] to make a copy.
+ for pkg in pkgs[:]:
+ sub_data = oe.packagedata.read_subpkgdata(pkg, self.d)
+ sub_rdep = sub_data.get("RDEPENDS_" + pkg)
+ if not sub_rdep:
+ continue
+ done = bb.utils.explode_dep_versions2(sub_rdep).keys()
+ next = done
+ # Find all the rdepends on dependency chain
+ while next:
+ new = []
+ for sub_pkg in next:
+ sub_data = oe.packagedata.read_subpkgdata(sub_pkg, self.d)
+ sub_pkg_rdep = sub_data.get("RDEPENDS_" + sub_pkg)
+ if not sub_pkg_rdep:
+ continue
+ for p in bb.utils.explode_dep_versions2(sub_pkg_rdep):
+ # Already handled, skip it.
+ if p in done or p in pkgs:
+ continue
+ # It's a new dep
+ if oe.packagedata.has_subpkgdata(p, self.d):
+ done.append(p)
+ new.append(p)
+ next = new
+ pkgs.extend(done)
+ return pkgs
+
'''
Install pkgs with smart, the pkg name is oe format
'''
@@ -1059,8 +1101,58 @@ class RpmPM(PackageManager):
bb.note("There are no packages to install")
return
bb.note("Installing the following packages: %s" % ' '.join(pkgs))
+ if not attempt_only:
+ # Pull in multilib requires since rpm may not pull in them
+ # correctly, for example,
+ # lib32-packagegroup-core-standalone-sdk-target requires
+ # lib32-libc6, but rpm may pull in libc6 rather than lib32-libc6
+ # since it doesn't know mlprefix (lib32-), bitbake knows it and
+ # can handle it well, find out the RDEPENDS on the chain will
+ # fix the problem. Both do_rootfs and do_populate_sdk have this
+ # issue.
+ # The attempt_only packages don't need this since they are
+ # based on the installed ones.
+ #
+ # Separate pkgs into two lists, one is multilib, the other one
+ # is non-multilib.
+ ml_pkgs = []
+ non_ml_pkgs = pkgs[:]
+ for pkg in pkgs:
+ for mlib in (self.d.getVar("MULTILIB_VARIANTS", True) or "").split():
+ if pkg.startswith(mlib + '-'):
+ ml_pkgs.append(pkg)
+ non_ml_pkgs.remove(pkg)
+
+ if len(ml_pkgs) > 0 and len(non_ml_pkgs) > 0:
+ # Found both foo and lib-foo
+ ml_pkgs = self.get_rdepends_recursively(ml_pkgs)
+ non_ml_pkgs = self.get_rdepends_recursively(non_ml_pkgs)
+ # Longer list makes smart slower, so only keep the pkgs
+ # which have the same BPN, and smart can handle others
+ # correctly.
+ pkgs_new = []
+ for pkg in non_ml_pkgs:
+ for mlib in (self.d.getVar("MULTILIB_VARIANTS", True) or "").split():
+ mlib_pkg = mlib + "-" + pkg
+ if mlib_pkg in ml_pkgs:
+ pkgs_new.append(pkg)
+ pkgs_new.append(mlib_pkg)
+ for pkg in pkgs:
+ if pkg not in pkgs_new:
+ pkgs_new.append(pkg)
+ pkgs = pkgs_new
+ new_depends = {}
+ deps = bb.utils.explode_dep_versions2(" ".join(pkgs))
+ for depend in deps:
+ data = oe.packagedata.read_subpkgdata(depend, self.d)
+ key = "PKG_%s" % depend
+ if key in data:
+ new_depend = data[key]
+ else:
+ new_depend = depend
+ new_depends[new_depend] = deps[depend]
+ pkgs = bb.utils.join_deps(new_depends, commasep=True).split(', ')
pkgs = self._pkg_translate_oe_to_smart(pkgs, attempt_only)
-
if not attempt_only:
bb.note('to be installed: %s' % ' '.join(pkgs))
cmd = "%s %s install -y %s" % \
@@ -1379,6 +1471,16 @@ class OpkgPM(PackageManager):
self.d.getVar('FEED_DEPLOYDIR_BASE_URI', True),
arch))
+ if self.opkg_dir != '/var/lib/opkg':
+ # There is no command line option for this anymore, we need to add
+ # info_dir and status_file to config file, if OPKGLIBDIR doesn't have
+ # the default value of "/var/lib" as defined in opkg:
+ # libopkg/opkg_conf.h:#define OPKG_CONF_DEFAULT_INFO_DIR "/var/lib/opkg/info"
+ # libopkg/opkg_conf.h:#define OPKG_CONF_DEFAULT_STATUS_FILE "/var/lib/opkg/status"
+ cfg_file.write("option info_dir %s\n" % os.path.join(self.d.getVar('OPKGLIBDIR', True), 'opkg', 'info'))
+ cfg_file.write("option status_file %s\n" % os.path.join(self.d.getVar('OPKGLIBDIR', True), 'opkg', 'status'))
+
+
def _create_config(self):
with open(self.config_file, "w+") as config_file:
priority = 1
@@ -1394,6 +1496,15 @@ class OpkgPM(PackageManager):
config_file.write("src oe-%s file:%s\n" %
(arch, pkgs_dir))
+ if self.opkg_dir != '/var/lib/opkg':
+ # There is no command line option for this anymore, we need to add
+ # info_dir and status_file to config file, if OPKGLIBDIR doesn't have
+ # the default value of "/var/lib" as defined in opkg:
+ # libopkg/opkg_conf.h:#define OPKG_CONF_DEFAULT_INFO_DIR "/var/lib/opkg/info"
+ # libopkg/opkg_conf.h:#define OPKG_CONF_DEFAULT_STATUS_FILE "/var/lib/opkg/status"
+ config_file.write("option info_dir %s\n" % os.path.join(self.d.getVar('OPKGLIBDIR', True), 'opkg', 'info'))
+ config_file.write("option status_file %s\n" % os.path.join(self.d.getVar('OPKGLIBDIR', True), 'opkg', 'status'))
+
def insert_feeds_uris(self):
if self.feed_uris == "":
return
@@ -1433,7 +1544,7 @@ class OpkgPM(PackageManager):
self.deploy_dir_unlock()
def install(self, pkgs, attempt_only=False):
- if attempt_only and len(pkgs) == 0:
+ if not pkgs:
return
cmd = "%s %s install %s" % (self.opkg_cmd, self.opkg_args, ' '.join(pkgs))
diff --git a/meta/lib/oe/patch.py b/meta/lib/oe/patch.py
index 108bf1d..2bf501e 100644
--- a/meta/lib/oe/patch.py
+++ b/meta/lib/oe/patch.py
@@ -337,12 +337,15 @@ class GitApplyTree(PatchTree):
return (tmpfile, cmd)
@staticmethod
- def extractPatches(tree, startcommit, outdir):
+ def extractPatches(tree, startcommit, outdir, paths=None):
import tempfile
import shutil
tempdir = tempfile.mkdtemp(prefix='oepatch')
try:
shellcmd = ["git", "format-patch", startcommit, "-o", tempdir]
+ if paths:
+ shellcmd.append('--')
+ shellcmd.extend(paths)
out = runcmd(["sh", "-c", " ".join(shellcmd)], tree)
if out:
for srcfile in out.split():
@@ -407,6 +410,13 @@ class GitApplyTree(PatchTree):
runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
except CmdError:
pass
+ # git am won't always clean up after itself, sadly, so...
+ shellcmd = ["git", "--work-tree=%s" % reporoot, "reset", "--hard", "HEAD"]
+ runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
+ # Also need to take care of any stray untracked files
+ shellcmd = ["git", "--work-tree=%s" % reporoot, "clean", "-f"]
+ runcmd(["sh", "-c", " ".join(shellcmd)], self.dir)
+
# Fall back to git apply
shellcmd = ["git", "--git-dir=%s" % reporoot, "apply", "-p%s" % patch['strippath']]
try:
diff --git a/meta/lib/oe/recipeutils.py b/meta/lib/oe/recipeutils.py
index d4fa726..119a688 100644
--- a/meta/lib/oe/recipeutils.py
+++ b/meta/lib/oe/recipeutils.py
@@ -31,9 +31,13 @@ def pn_to_recipe(cooker, pn):
import bb.providers
if pn in cooker.recipecache.pkg_pn:
- filenames = cooker.recipecache.pkg_pn[pn]
best = bb.providers.findBestProvider(pn, cooker.data, cooker.recipecache, cooker.recipecache.pkg_pn)
return best[3]
+ elif pn in cooker.recipecache.providers:
+ filenames = cooker.recipecache.providers[pn]
+ eligible, foundUnique = bb.providers.filterProviders(filenames, pn, cooker.expanded_data, cooker.recipecache)
+ filename = eligible[0]
+ return filename
else:
return None
@@ -72,6 +76,8 @@ def parse_recipe_simple(cooker, pn, d, appends=True):
raise bb.providers.NoProvider('Unable to find any recipe file matching %s' % pn)
if appends:
appendfiles = cooker.collection.get_file_appends(recipefile)
+ else:
+ appendfiles = None
return parse_recipe(recipefile, appendfiles, d)
@@ -95,6 +101,63 @@ def get_var_files(fn, varlist, d):
return varfiles
+def split_var_value(value, assignment=True):
+ """
+ Split a space-separated variable's value into a list of items,
+ taking into account that some of the items might be made up of
+ expressions containing spaces that should not be split.
+ Parameters:
+ value:
+ The string value to split
+ assignment:
+ True to assume that the value represents an assignment
+ statement, False otherwise. If True, and an assignment
+ statement is passed in the first item in
+ the returned list will be the part of the assignment
+ statement up to and including the opening quote character,
+ and the last item will be the closing quote.
+ """
+ inexpr = 0
+ lastchar = None
+ out = []
+ buf = ''
+ for char in value:
+ if char == '{':
+ if lastchar == '$':
+ inexpr += 1
+ elif char == '}':
+ inexpr -= 1
+ elif assignment and char in '"\'' and inexpr == 0:
+ if buf:
+ out.append(buf)
+ out.append(char)
+ char = ''
+ buf = ''
+ elif char.isspace() and inexpr == 0:
+ char = ''
+ if buf:
+ out.append(buf)
+ buf = ''
+ buf += char
+ lastchar = char
+ if buf:
+ out.append(buf)
+
+ # Join together assignment statement and opening quote
+ outlist = out
+ if assignment:
+ assigfound = False
+ for idx, item in enumerate(out):
+ if '=' in item:
+ assigfound = True
+ if assigfound:
+ if '"' in item or "'" in item:
+ outlist = [' '.join(out[:idx+1])]
+ outlist.extend(out[idx+1:])
+ break
+ return outlist
+
+
def patch_recipe_file(fn, values, patch=False, relpath=''):
"""Update or insert variable values into a recipe file (assuming you
have already identified the exact file you want to update.)
@@ -112,7 +175,7 @@ def patch_recipe_file(fn, values, patch=False, relpath=''):
if name in nowrap_vars:
tf.write(rawtext)
elif name in list_vars:
- splitvalue = values[name].split()
+ splitvalue = split_var_value(values[name], assignment=False)
if len(splitvalue) > 1:
linesplit = ' \\\n' + (' ' * (len(name) + 4))
tf.write('%s = "%s%s"\n' % (name, linesplit.join(splitvalue), linesplit))
@@ -277,6 +340,22 @@ def copy_recipe_files(d, tgt_dir, whole_dir=False, download=True):
return remotes
+def get_recipe_local_files(d, patches=False):
+ """Get a list of local files in SRC_URI within a recipe."""
+ uris = (d.getVar('SRC_URI', True) or "").split()
+ fetch = bb.fetch2.Fetch(uris, d)
+ ret = {}
+ for uri in uris:
+ if fetch.ud[uri].type == 'file':
+ if (not patches and
+ bb.utils.exec_flat_python_func('patch_path', uri, fetch, '')):
+ continue
+ # Skip files that are referenced by absolute path
+ if not os.path.isabs(fetch.ud[uri].basepath):
+ ret[fetch.ud[uri].basepath] = fetch.localpath(uri)
+ return ret
+
+
def get_recipe_patches(d):
"""Get a list of the patches included in SRC_URI within a recipe."""
patchfiles = []
@@ -518,7 +597,7 @@ def bbappend_recipe(rd, destlayerdir, srcfiles, install=None, wildcardver=False,
instfunclines.append(line)
return (instfunclines, None, 4, False)
else:
- splitval = origvalue.split()
+ splitval = split_var_value(origvalue, assignment=False)
changed = False
removevar = varname
if varname in ['SRC_URI', 'SRC_URI_append%s' % appendoverride]:
@@ -673,11 +752,14 @@ def get_recipe_upstream_version(rd):
ru['type'] = 'U'
ru['datetime'] = ''
+ pv = rd.getVar('PV', True)
+
# XXX: If don't have SRC_URI means that don't have upstream sources so
- # returns 1.0.
+ # returns the current recipe version, so that upstream version check
+ # declares a match.
src_uris = rd.getVar('SRC_URI', True)
if not src_uris:
- ru['version'] = '1.0'
+ ru['version'] = pv
ru['type'] = 'M'
ru['datetime'] = datetime.now()
return ru
@@ -686,8 +768,6 @@ def get_recipe_upstream_version(rd):
src_uri = src_uris.split()[0]
uri_type, _, _, _, _, _ = decodeurl(src_uri)
- pv = rd.getVar('PV', True)
-
manual_upstream_version = rd.getVar("RECIPE_UPSTREAM_VERSION", True)
if manual_upstream_version:
# manual tracking of upstream version.
diff --git a/meta/lib/oe/rootfs.py b/meta/lib/oe/rootfs.py
index 3b53fce..18df22d 100644
--- a/meta/lib/oe/rootfs.py
+++ b/meta/lib/oe/rootfs.py
@@ -66,6 +66,7 @@ class Rootfs(object):
m = r.search(line)
if m:
found_error = 1
+ bb.warn('[log_check] In line: [%s]' % line)
bb.warn('[log_check] %s: found an error message in the logfile (keyword \'%s\'):\n[log_check] %s'
% (self.d.getVar('PN', True), m.group(), line))
@@ -278,6 +279,7 @@ class Rootfs(object):
bb.note("Running intercept scripts:")
os.environ['D'] = self.image_rootfs
+ os.environ['STAGING_DIR_NATIVE'] = self.d.getVar('STAGING_DIR_NATIVE', True)
for script in os.listdir(intercepts_dir):
script_full = os.path.join(intercepts_dir, script)
@@ -595,7 +597,11 @@ class DpkgOpkgRootfs(Rootfs):
pkg_list = []
- pkgs = self._get_pkgs_postinsts(status_file)
+ pkgs = None
+ if not self.d.getVar('PACKAGE_INSTALL', True).strip():
+ bb.note("Building empty image")
+ else:
+ pkgs = self._get_pkgs_postinsts(status_file)
if pkgs:
root = "__packagegroup_postinst__"
pkgs[root] = pkgs.keys()
diff --git a/meta/lib/oe/sdk.py b/meta/lib/oe/sdk.py
index 53da0f0..3103f48 100644
--- a/meta/lib/oe/sdk.py
+++ b/meta/lib/oe/sdk.py
@@ -5,6 +5,7 @@ from oe.package_manager import *
import os
import shutil
import glob
+import traceback
class Sdk(object):
@@ -25,7 +26,7 @@ class Sdk(object):
else:
self.manifest_dir = manifest_dir
- bb.utils.remove(self.sdk_output, True)
+ self.remove(self.sdk_output, True)
self.install_order = Manifest.INSTALL_ORDER
@@ -34,29 +35,56 @@ class Sdk(object):
pass
def populate(self):
- bb.utils.mkdirhier(self.sdk_output)
+ self.mkdirhier(self.sdk_output)
# call backend dependent implementation
self._populate()
# Don't ship any libGL in the SDK
- bb.utils.remove(os.path.join(self.sdk_output, self.sdk_native_path,
- self.d.getVar('libdir_nativesdk', True).strip('/'),
- "libGL*"))
+ self.remove(os.path.join(self.sdk_output, self.sdk_native_path,
+ self.d.getVar('libdir_nativesdk', True).strip('/'),
+ "libGL*"))
# Fix or remove broken .la files
- bb.utils.remove(os.path.join(self.sdk_output, self.sdk_native_path,
- self.d.getVar('libdir_nativesdk', True).strip('/'),
- "*.la"))
+ self.remove(os.path.join(self.sdk_output, self.sdk_native_path,
+ self.d.getVar('libdir_nativesdk', True).strip('/'),
+ "*.la"))
# Link the ld.so.cache file into the hosts filesystem
link_name = os.path.join(self.sdk_output, self.sdk_native_path,
self.sysconfdir, "ld.so.cache")
- bb.utils.mkdirhier(os.path.dirname(link_name))
+ self.mkdirhier(os.path.dirname(link_name))
os.symlink("/etc/ld.so.cache", link_name)
execute_pre_post_process(self.d, self.d.getVar('SDK_POSTPROCESS_COMMAND', True))
+ def movefile(self, sourcefile, destdir):
+ try:
+ # FIXME: this check of movefile's return code to None should be
+ # fixed within the function to use only exceptions to signal when
+ # something goes wrong
+ if (bb.utils.movefile(sourcefile, destdir) == None):
+ raise OSError("moving %s to %s failed"
+ %(sourcefile, destdir))
+ #FIXME: using umbrella exc catching because bb.utils method raises it
+ except Exception as e:
+ bb.debug(1, "printing the stack trace\n %s" %traceback.format_exc())
+ bb.error("unable to place %s in final SDK location" % sourcefile)
+
+ def mkdirhier(self, dirpath):
+ try:
+ bb.utils.mkdirhier(dirpath)
+ except OSError as e:
+ bb.debug(1, "printing the stack trace\n %s" %traceback.format_exc())
+ bb.fatal("cannot make dir for SDK: %s" % dirpath)
+
+ def remove(self, path, recurse=False):
+ try:
+ bb.utils.remove(path, recurse)
+ #FIXME: using umbrella exc catching because bb.utils method raises it
+ except Exception as e:
+ bb.debug(1, "printing the stack trace\n %s" %traceback.format_exc())
+ bb.warn("cannot remove SDK dir: %s" % path)
class RpmSdk(Sdk):
def __init__(self, d, manifest_dir=None):
@@ -143,15 +171,15 @@ class RpmSdk(Sdk):
"lib",
"rpm"
)
- bb.utils.mkdirhier(native_rpm_state_dir)
+ self.mkdirhier(native_rpm_state_dir)
for f in glob.glob(os.path.join(self.sdk_output,
"var",
"lib",
"rpm",
"*")):
- bb.utils.movefile(f, native_rpm_state_dir)
+ self.movefile(f, native_rpm_state_dir)
- bb.utils.remove(os.path.join(self.sdk_output, "var"), True)
+ self.remove(os.path.join(self.sdk_output, "var"), True)
# Move host sysconfig data
native_sysconf_dir = os.path.join(self.sdk_output,
@@ -159,10 +187,10 @@ class RpmSdk(Sdk):
self.d.getVar('sysconfdir',
True).strip('/'),
)
- bb.utils.mkdirhier(native_sysconf_dir)
+ self.mkdirhier(native_sysconf_dir)
for f in glob.glob(os.path.join(self.sdk_output, "etc", "*")):
- bb.utils.movefile(f, native_sysconf_dir)
- bb.utils.remove(os.path.join(self.sdk_output, "etc"), True)
+ self.movefile(f, native_sysconf_dir)
+ self.remove(os.path.join(self.sdk_output, "etc"), True)
class OpkgSdk(Sdk):
@@ -219,12 +247,12 @@ class OpkgSdk(Sdk):
target_sysconfdir = os.path.join(self.sdk_target_sysroot, self.sysconfdir)
host_sysconfdir = os.path.join(self.sdk_host_sysroot, self.sysconfdir)
- bb.utils.mkdirhier(target_sysconfdir)
+ self.mkdirhier(target_sysconfdir)
shutil.copy(self.target_conf, target_sysconfdir)
os.chmod(os.path.join(target_sysconfdir,
os.path.basename(self.target_conf)), 0644)
- bb.utils.mkdirhier(host_sysconfdir)
+ self.mkdirhier(host_sysconfdir)
shutil.copy(self.host_conf, host_sysconfdir)
os.chmod(os.path.join(host_sysconfdir,
os.path.basename(self.host_conf)), 0644)
@@ -232,11 +260,11 @@ class OpkgSdk(Sdk):
native_opkg_state_dir = os.path.join(self.sdk_output, self.sdk_native_path,
self.d.getVar('localstatedir_nativesdk', True).strip('/'),
"lib", "opkg")
- bb.utils.mkdirhier(native_opkg_state_dir)
+ self.mkdirhier(native_opkg_state_dir)
for f in glob.glob(os.path.join(self.sdk_output, "var", "lib", "opkg", "*")):
- bb.utils.movefile(f, native_opkg_state_dir)
+ self.movefile(f, native_opkg_state_dir)
- bb.utils.remove(os.path.join(self.sdk_output, "var"), True)
+ self.remove(os.path.join(self.sdk_output, "var"), True)
class DpkgSdk(Sdk):
@@ -264,7 +292,7 @@ class DpkgSdk(Sdk):
def _copy_apt_dir_to(self, dst_dir):
staging_etcdir_native = self.d.getVar("STAGING_ETCDIR_NATIVE", True)
- bb.utils.remove(dst_dir, True)
+ self.remove(dst_dir, True)
shutil.copytree(os.path.join(staging_etcdir_native, "apt"), dst_dir)
@@ -306,11 +334,11 @@ class DpkgSdk(Sdk):
native_dpkg_state_dir = os.path.join(self.sdk_output, self.sdk_native_path,
"var", "lib", "dpkg")
- bb.utils.mkdirhier(native_dpkg_state_dir)
+ self.mkdirhier(native_dpkg_state_dir)
for f in glob.glob(os.path.join(self.sdk_output, "var", "lib", "dpkg", "*")):
- bb.utils.movefile(f, native_dpkg_state_dir)
+ self.movefile(f, native_dpkg_state_dir)
+ self.remove(os.path.join(self.sdk_output, "var"), True)
- bb.utils.remove(os.path.join(self.sdk_output, "var"), True)
def sdk_list_installed_packages(d, target, format=None, rootfs_dir=None):
diff --git a/meta/lib/oe/sstatesig.py b/meta/lib/oe/sstatesig.py
index cb46712..6d1be3e 100644
--- a/meta/lib/oe/sstatesig.py
+++ b/meta/lib/oe/sstatesig.py
@@ -94,6 +94,26 @@ class SignatureGeneratorOEBasicHash(bb.siggen.SignatureGeneratorBasicHash):
self.machine = data.getVar("MACHINE", True)
self.mismatch_msgs = []
pass
+
+ def tasks_resolved(self, virtmap, virtpnmap, dataCache):
+ # Translate virtual/xxx entries to PN values
+ newabisafe = []
+ for a in self.abisaferecipes:
+ if a in virtpnmap:
+ newabisafe.append(virtpnmap[a])
+ else:
+ newabisafe.append(a)
+ self.abisaferecipes = newabisafe
+ newsafedeps = []
+ for a in self.saferecipedeps:
+ a1, a2 = a.split("->")
+ if a1 in virtpnmap:
+ a1 = virtpnmap[a1]
+ if a2 in virtpnmap:
+ a2 = virtpnmap[a2]
+ newsafedeps.append(a1 + "->" + a2)
+ self.saferecipedeps = newsafedeps
+
def rundep_check(self, fn, recipename, task, dep, depname, dataCache = None):
return sstate_rundepfilter(self, fn, recipename, task, dep, depname, dataCache)
diff --git a/meta/lib/oeqa/oetest.py b/meta/lib/oeqa/oetest.py
index a6f89b6..6f9edec 100644
--- a/meta/lib/oeqa/oetest.py
+++ b/meta/lib/oeqa/oetest.py
@@ -11,9 +11,14 @@ import os, re, mmap
import unittest
import inspect
import subprocess
-import bb
-from oeqa.utils.decorators import LogResults, gettag
-from sys import exc_info, exc_clear
+try:
+ import bb
+except ImportError:
+ pass
+import logging
+from oeqa.utils.decorators import LogResults, gettag, getResults
+
+logger = logging.getLogger("BitBake")
def getVar(obj):
#extend form dict, if a variable didn't exists, need find it in testcase
@@ -89,7 +94,7 @@ def loadTests(tc, type="runtime"):
suite.dependencies.append(dep_suite)
break
else:
- bb.warn("Test %s was declared as @skipUnlessPassed('%s') but that test is either not defined or not active. Will run the test anyway." %
+ logger.warning("Test %s was declared as @skipUnlessPassed('%s') but that test is either not defined or not active. Will run the test anyway." %
(test, depends_on))
# Use brute-force topological sort to determine ordering. Sort by
# depth (higher depth = must run later), with original ordering to
@@ -106,14 +111,34 @@ def loadTests(tc, type="runtime"):
suites.sort(cmp=lambda a,b: cmp((a.depth, a.index), (b.depth, b.index)))
return testloader.suiteClass(suites)
+_buffer = ""
+
+def custom_verbose(msg, *args, **kwargs):
+ global _buffer
+ if msg[-1] != "\n":
+ _buffer += msg
+ else:
+ _buffer += msg
+ try:
+ bb.plain(_buffer.rstrip("\n"), *args, **kwargs)
+ except NameError:
+ logger.info(_buffer.rstrip("\n"), *args, **kwargs)
+ _buffer = ""
+
def runTests(tc, type="runtime"):
suite = loadTests(tc, type)
- bb.note("Test modules %s" % tc.testslist)
+ logger.info("Test modules %s" % tc.testslist)
if hasattr(tc, "tagexp") and tc.tagexp:
- bb.note("Filter test cases by tags: %s" % tc.tagexp)
- bb.note("Found %s tests" % suite.countTestCases())
+ logger.info("Filter test cases by tags: %s" % tc.tagexp)
+ logger.info("Found %s tests" % suite.countTestCases())
runner = unittest.TextTestRunner(verbosity=2)
+ try:
+ if bb.msg.loggerDefaultVerbose:
+ runner.stream.write = custom_verbose
+ except NameError:
+ # Not in bb environment?
+ pass
result = runner.run(suite)
return result
@@ -158,17 +183,24 @@ class oeRuntimeTest(oeTest):
pass
def tearDown(self):
- # If a test fails or there is an exception
- if not exc_info() == (None, None, None):
- exc_clear()
- #Only dump for QemuTarget
- if (type(self.target).__name__ == "QemuTarget"):
- self.tc.host_dumper.create_dir(self._testMethodName)
- self.tc.host_dumper.dump_host()
- self.target.target_dumper.dump_target(
- self.tc.host_dumper.dump_dir)
- print ("%s dump data stored in %s" % (self._testMethodName,
- self.tc.host_dumper.dump_dir))
+ res = getResults()
+ # If a test fails or there is an exception dump
+ # for QemuTarget only
+ if (type(self.target).__name__ == "QemuTarget" and
+ (self.id() in res.getErrorList() or
+ self.id() in res.getFailList())):
+ self.tc.host_dumper.create_dir(self._testMethodName)
+ self.tc.host_dumper.dump_host()
+ self.target.target_dumper.dump_target(
+ self.tc.host_dumper.dump_dir)
+ print ("%s dump data stored in %s" % (self._testMethodName,
+ self.tc.host_dumper.dump_dir))
+
+ self.tearDownLocal()
+
+ # Method to be run after tearDown and implemented by child classes
+ def tearDownLocal(self):
+ pass
#TODO: use package_manager.py to install packages on any type of image
def install_packages(self, packagelist):
@@ -190,7 +222,7 @@ class oeSDKTest(oeTest):
return False
def _run(self, cmd):
- return subprocess.check_output(cmd, shell=True)
+ return subprocess.check_output(". %s; " % self.tc.sdkenv + cmd, shell=True)
def getmodule(pos=2):
# stack returns a list of tuples containg frame information
diff --git a/meta/lib/oeqa/runexported.py b/meta/lib/oeqa/runexported.py
index 96442b1..dba0d7a 100755
--- a/meta/lib/oeqa/runexported.py
+++ b/meta/lib/oeqa/runexported.py
@@ -21,7 +21,7 @@
import sys
import os
import time
-from optparse import OptionParser
+import argparse
try:
import simplejson as json
@@ -49,8 +49,8 @@ class FakeTarget(object):
def exportStart(self):
self.sshlog = os.path.join(self.testdir, "ssh_target_log.%s" % self.datetime)
sshloglink = os.path.join(self.testdir, "ssh_target_log")
- if os.path.islink(sshloglink):
- os.unlink(sshloglink)
+ if os.path.exists(sshloglink):
+ os.remove(sshloglink)
os.symlink(self.sshlog, sshloglink)
print("SSH log file: %s" % self.sshlog)
self.connection = SSHControl(self.ip, logfile=self.sshlog)
@@ -76,43 +76,41 @@ class TestContext(object):
def main():
- usage = "usage: %prog [options] <json file>"
- parser = OptionParser(usage=usage)
- parser.add_option("-t", "--target-ip", dest="ip", help="The IP address of the target machine. Use this to \
+ parser = argparse.ArgumentParser()
+ parser.add_argument("-t", "--target-ip", dest="ip", help="The IP address of the target machine. Use this to \
overwrite the value determined from TEST_TARGET_IP at build time")
- parser.add_option("-s", "--server-ip", dest="server_ip", help="The IP address of this machine. Use this to \
+ parser.add_argument("-s", "--server-ip", dest="server_ip", help="The IP address of this machine. Use this to \
overwrite the value determined from TEST_SERVER_IP at build time.")
- parser.add_option("-d", "--deploy-dir", dest="deploy_dir", help="Full path to the package feeds, that this \
+ parser.add_argument("-d", "--deploy-dir", dest="deploy_dir", help="Full path to the package feeds, that this \
the contents of what used to be DEPLOY_DIR on the build machine. If not specified it will use the value \
specified in the json if that directory actually exists or it will error out.")
- parser.add_option("-l", "--log-dir", dest="log_dir", help="This sets the path for TEST_LOG_DIR. If not specified \
+ parser.add_argument("-l", "--log-dir", dest="log_dir", help="This sets the path for TEST_LOG_DIR. If not specified \
the current dir is used. This is used for usually creating a ssh log file and a scp test file.")
+ parser.add_argument("json", help="The json file exported by the build system", default="testdata.json", nargs='?')
- (options, args) = parser.parse_args()
- if len(args) != 1:
- parser.error("Incorrect number of arguments. The one and only argument should be a json file exported by the build system")
+ args = parser.parse_args()
- with open(args[0], "r") as f:
+ with open(args.json, "r") as f:
loaded = json.load(f)
- if options.ip:
- loaded["target"]["ip"] = options.ip
- if options.server_ip:
- loaded["target"]["server_ip"] = options.server_ip
+ if args.ip:
+ loaded["target"]["ip"] = args.ip
+ if args.server_ip:
+ loaded["target"]["server_ip"] = args.server_ip
d = MyDataDict()
for key in loaded["d"].keys():
d[key] = loaded["d"][key]
- if options.log_dir:
- d["TEST_LOG_DIR"] = options.log_dir
+ if args.log_dir:
+ d["TEST_LOG_DIR"] = args.log_dir
else:
d["TEST_LOG_DIR"] = os.path.abspath(os.path.dirname(__file__))
- if options.deploy_dir:
- d["DEPLOY_DIR"] = options.deploy_dir
+ if args.deploy_dir:
+ d["DEPLOY_DIR"] = args.deploy_dir
else:
if not os.path.isdir(d["DEPLOY_DIR"]):
- raise Exception("The path to DEPLOY_DIR does not exists: %s" % d["DEPLOY_DIR"])
+ print("WARNING: The path to DEPLOY_DIR does not exist: %s" % d["DEPLOY_DIR"])
target = FakeTarget(d)
diff --git a/meta/lib/oeqa/runtime/_ptest.py b/meta/lib/oeqa/runtime/_ptest.py
index 81c9c43..0621028 100644
--- a/meta/lib/oeqa/runtime/_ptest.py
+++ b/meta/lib/oeqa/runtime/_ptest.py
@@ -98,7 +98,7 @@ class PtestRunnerTest(oeRuntimeTest):
return complementary_pkgs.split()
- def setUp(self):
+ def setUpLocal(self):
self.ptest_log = os.path.join(oeRuntimeTest.tc.d.getVar("TEST_LOG_DIR",True), "ptest-%s.log" % oeRuntimeTest.tc.d.getVar('DATETIME', True))
@skipUnlessPassed('test_ssh')
diff --git a/meta/lib/oeqa/runtime/connman.py b/meta/lib/oeqa/runtime/connman.py
index ee69e5d..bd9dba3 100644
--- a/meta/lib/oeqa/runtime/connman.py
+++ b/meta/lib/oeqa/runtime/connman.py
@@ -29,26 +29,3 @@ class ConnmanTest(oeRuntimeTest):
if status != 0:
print self.service_status("connman")
self.fail("No connmand process running")
-
- @testcase(223)
- def test_only_one_connmand_in_background(self):
- """
- Summary: Only one connmand in background
- Expected: There will be only one connmand instance in background.
- Product: BSPs
- Author: Alexandru Georgescu <alexandru.c.georgescu at intel.com>
- AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate at intel.com>
- """
-
- # Make sure that 'connmand' is running in background
- (status, output) = self.target.run(oeRuntimeTest.pscmd + ' | grep [c]onnmand')
- self.assertEqual(0, status, 'Failed to find "connmand" process running in background.')
-
- # Start a new instance of 'connmand'
- (status, output) = self.target.run('connmand')
- self.assertEqual(0, status, 'Failed to start a new "connmand" process.')
-
- # Make sure that only one 'connmand' is running in background
- (status, output) = self.target.run(oeRuntimeTest.pscmd + ' | grep [c]onnmand | wc -l')
- self.assertEqual(0, status, 'Failed to find "connmand" process running in background.')
- self.assertEqual(1, int(output), 'Found {} connmand processes running, expected 1.'.format(output))
diff --git a/meta/lib/oeqa/runtime/date.py b/meta/lib/oeqa/runtime/date.py
index 3a8fe84..447987e 100644
--- a/meta/lib/oeqa/runtime/date.py
+++ b/meta/lib/oeqa/runtime/date.py
@@ -4,11 +4,11 @@ import re
class DateTest(oeRuntimeTest):
- def setUp(self):
+ def setUpLocal(self):
if oeRuntimeTest.tc.d.getVar("VIRTUAL-RUNTIME_init_manager", True) == "systemd":
self.target.run('systemctl stop systemd-timesyncd')
- def tearDown(self):
+ def tearDownLocal(self):
if oeRuntimeTest.tc.d.getVar("VIRTUAL-RUNTIME_init_manager", True) == "systemd":
self.target.run('systemctl start systemd-timesyncd')
diff --git a/meta/lib/oeqa/runtime/files/testsdkmakefile b/meta/lib/oeqa/runtime/files/testsdkmakefile
new file mode 100644
index 0000000..fb05f82
--- /dev/null
+++ b/meta/lib/oeqa/runtime/files/testsdkmakefile
@@ -0,0 +1,5 @@
+test: test.o
+ $(CC) -o test test.o -lm
+test.o: test.c
+ $(CC) -c test.c
+
diff --git a/meta/lib/oeqa/runtime/kernelmodule.py b/meta/lib/oeqa/runtime/kernelmodule.py
index 2e81720..38ca184 100644
--- a/meta/lib/oeqa/runtime/kernelmodule.py
+++ b/meta/lib/oeqa/runtime/kernelmodule.py
@@ -10,7 +10,7 @@ def setUpModule():
class KernelModuleTest(oeRuntimeTest):
- def setUp(self):
+ def setUpLocal(self):
self.target.copy_to(os.path.join(oeRuntimeTest.tc.filesdir, "hellomod.c"), "/tmp/hellomod.c")
self.target.copy_to(os.path.join(oeRuntimeTest.tc.filesdir, "hellomod_makefile"), "/tmp/Makefile")
@@ -30,5 +30,5 @@ class KernelModuleTest(oeRuntimeTest):
(status, output) = self.target.run(cmd, 900)
self.assertEqual(status, 0, msg="\n".join([cmd, output]))
- def tearDown(self):
+ def tearDownLocal(self):
self.target.run('rm -f /tmp/Makefile /tmp/hellomod.c')
diff --git a/meta/lib/oeqa/runtime/parselogs.py b/meta/lib/oeqa/runtime/parselogs.py
index e20947b..fc2bc38 100644
--- a/meta/lib/oeqa/runtime/parselogs.py
+++ b/meta/lib/oeqa/runtime/parselogs.py
@@ -36,6 +36,8 @@ common_errors = [
'VGA arbiter: cannot open kernel arbiter, no multi-card support',
'Failed to find URL:http://ipv4.connman.net/online/status.html',
'Online check failed for',
+ 'netlink init failed',
+ 'Fast TSC calibration',
]
x86_common = [
@@ -46,7 +48,6 @@ x86_common = [
] + common_errors
qemux86_common = [
- 'Fast TSC calibration',
'wrong ELF class',
"fail to add MMCONFIG information, can't access extended PCI configuration space under this bridge.",
"can't claim BAR ",
@@ -89,7 +90,7 @@ ignore_errors = {
'(EE) open /dev/fb0: No such file or directory',
'(EE) AIGLX: reverting to software rendering',
] + x86_common,
- 'core2_32' : [
+ 'intel-core2-32' : [
'ACPI: No _BQC method, cannot determine initial brightness',
'[Firmware Bug]: ACPI: No _BQC method, cannot determine initial brightness',
'(EE) Failed to load module "psb"',
@@ -98,6 +99,7 @@ ignore_errors = {
'(EE) Failed to load module psbdrv',
'(EE) open /dev/fb0: No such file or directory',
'(EE) AIGLX: reverting to software rendering',
+ "controller can't do DEVSLP, turning off",
] + x86_common,
'intel-corei7-64' : [
"controller can't do DEVSLP, turning off",
@@ -108,13 +110,9 @@ ignore_errors = {
'edgerouter' : [
'Fatal server error:',
] + common_errors,
- 'minnow' : [
- 'netlink init failed',
- ] + common_errors,
'jasperforest' : [
'Activated service \'org.bluez\' failed:',
'Unable to find NFC netlink family',
- 'netlink init failed',
] + common_errors,
}
@@ -233,8 +231,7 @@ class ParseLogsTest(oeRuntimeTest):
#get the output of dmesg and write it in a file. This file is added to log_locations.
def write_dmesg(self):
- (status, dmesg) = self.target.run("dmesg")
- (status, dmesg2) = self.target.run("echo \""+str(dmesg)+"\" > /tmp/dmesg_output.log")
+ (status, dmesg) = self.target.run("dmesg > /tmp/dmesg_output.log")
@testcase(1059)
@skipUnlessPassed('test_ssh')
diff --git a/meta/lib/oeqa/runtime/scanelf.py b/meta/lib/oeqa/runtime/scanelf.py
index 43a024a..67e02ff 100644
--- a/meta/lib/oeqa/runtime/scanelf.py
+++ b/meta/lib/oeqa/runtime/scanelf.py
@@ -8,7 +8,7 @@ def setUpModule():
class ScanelfTest(oeRuntimeTest):
- def setUp(self):
+ def setUpLocal(self):
self.scancmd = 'scanelf --quiet --recursive --mount --ldpath --path'
@testcase(966)
diff --git a/meta/lib/oeqa/sdk/gcc.py b/meta/lib/oeqa/sdk/gcc.py
index 67994b9..8395b9b 100644
--- a/meta/lib/oeqa/sdk/gcc.py
+++ b/meta/lib/oeqa/sdk/gcc.py
@@ -14,7 +14,7 @@ class GccCompileTest(oeSDKTest):
@classmethod
def setUpClass(self):
- for f in ['test.c', 'test.cpp', 'testmakefile']:
+ for f in ['test.c', 'test.cpp', 'testsdkmakefile']:
shutil.copyfile(os.path.join(self.tc.filesdir, f), self.tc.sdktestdir + f)
def test_gcc_compile(self):
@@ -27,10 +27,10 @@ class GccCompileTest(oeSDKTest):
self._run('$CXX %s/test.cpp -o %s/test -lm' % (self.tc.sdktestdir, self.tc.sdktestdir))
def test_make(self):
- self._run('cd %s; make -f testmakefile' % self.tc.sdktestdir)
+ self._run('cd %s; make -f testsdkmakefile' % self.tc.sdktestdir)
@classmethod
def tearDownClass(self):
- files = [self.tc.sdktestdir + f for f in ['test.c', 'test.cpp', 'test.o', 'test', 'testmakefile']]
+ files = [self.tc.sdktestdir + f for f in ['test.c', 'test.cpp', 'test.o', 'test', 'testsdkmakefile']]
for f in files:
bb.utils.remove(f)
diff --git a/meta/lib/oeqa/selftest/archiver.py b/meta/lib/oeqa/selftest/archiver.py
new file mode 100644
index 0000000..f2030c4
--- /dev/null
+++ b/meta/lib/oeqa/selftest/archiver.py
@@ -0,0 +1,50 @@
+from oeqa.selftest.base import oeSelfTest
+from oeqa.utils.commands import bitbake, get_bb_var
+from oeqa.utils.decorators import testcase
+import glob
+import os
+import shutil
+
+
+class Archiver(oeSelfTest):
+
+ @testcase(1345)
+ def test_archiver_allows_to_filter_on_recipe_name(self):
+ """
+ Summary: The archiver should offer the possibility to filter on the recipe. (#6929)
+ Expected: 1. Included recipe (busybox) should be included
+ 2. Excluded recipe (zlib) should be excluded
+ Product: oe-core
+ Author: Daniel Istrate <daniel.alexandrux.istrate at intel.com>
+ AutomatedBy: Daniel Istrate <daniel.alexandrux.istrate at intel.com>
+ """
+
+ include_recipe = 'busybox'
+ exclude_recipe = 'zlib'
+
+ features = 'INHERIT += "archiver"\n'
+ features += 'ARCHIVER_MODE[src] = "original"\n'
+ features += 'COPYLEFT_PN_INCLUDE = "%s"\n' % include_recipe
+ features += 'COPYLEFT_PN_EXCLUDE = "%s"\n' % exclude_recipe
+
+ # Update local.conf
+ self.write_config(features)
+
+ tmp_dir = get_bb_var('TMPDIR')
+ deploy_dir_src = get_bb_var('DEPLOY_DIR_SRC')
+ target_sys = get_bb_var('TARGET_SYS')
+ src_path = os.path.join(deploy_dir_src, target_sys)
+
+ # Delete tmp directory
+ shutil.rmtree(tmp_dir)
+
+ # Build core-image-minimal
+ bitbake('core-image-minimal')
+
+ # Check that include_recipe was included
+ is_included = len(glob.glob(src_path + '/%s*' % include_recipe))
+ self.assertEqual(1, is_included, 'Recipe %s was not included.' % include_recipe)
+
+ # Check that exclude_recipe was excluded
+ is_excluded = len(glob.glob(src_path + '/%s*' % exclude_recipe))
+ self.assertEqual(0, is_excluded, 'Recipe %s was not excluded.' % exclude_recipe)
diff --git a/meta/lib/oeqa/selftest/base.py b/meta/lib/oeqa/selftest/base.py
index b2faa66..9bddc23 100644
--- a/meta/lib/oeqa/selftest/base.py
+++ b/meta/lib/oeqa/selftest/base.py
@@ -31,7 +31,7 @@ class oeSelfTest(unittest.TestCase):
self.testinc_bblayers_path = os.path.join(self.builddir, "conf/bblayers.inc")
self.testlayer_path = oeSelfTest.testlayer_path
self._extra_tear_down_commands = []
- self._track_for_cleanup = []
+ self._track_for_cleanup = [self.testinc_path]
super(oeSelfTest, self).__init__(methodName)
def setUp(self):
diff --git a/meta/lib/oeqa/selftest/bbtests.py b/meta/lib/oeqa/selftest/bbtests.py
index 3d6860f..94ca79c 100644
--- a/meta/lib/oeqa/selftest/bbtests.py
+++ b/meta/lib/oeqa/selftest/bbtests.py
@@ -1,8 +1,5 @@
-import unittest
import os
-import logging
import re
-import shutil
import oeqa.utils.ftools as ftools
from oeqa.selftest.base import oeSelfTest
@@ -68,15 +65,43 @@ class BitbakeTests(oeSelfTest):
bitbake('-cclean man')
self.assertTrue("ERROR: Function failed: patch_do_patch" in result.output, msg = "Though no man-1.5h1-make.patch file exists, bitbake didn't output any err. message. bitbake output: %s" % result.output)
+ @testcase(1354)
+ def test_force_task_1(self):
+ # test 1 from bug 5875
+ test_recipe = 'zlib'
+ test_data = "Microsoft Made No Profit From Anyone's Zunes Yo"
+ image_dir = get_bb_var('D', test_recipe)
+ pkgsplit_dir = get_bb_var('PKGDEST', test_recipe)
+ man_dir = get_bb_var('mandir', test_recipe)
+
+ bitbake('-c cleansstate %s' % test_recipe)
+ bitbake(test_recipe)
+ self.add_command_to_tearDown('bitbake -c clean %s' % test_recipe)
+
+ man_file = os.path.join(image_dir + man_dir, 'man3/zlib.3')
+ ftools.append_file(man_file, test_data)
+ bitbake('-c package -f %s' % test_recipe)
+
+ man_split_file = os.path.join(pkgsplit_dir, 'zlib-doc' + man_dir, 'man3/zlib.3')
+ man_split_content = ftools.read_file(man_split_file)
+ self.assertIn(test_data, man_split_content, 'The man file has not changed in packages-split.')
+
+ ret = bitbake(test_recipe)
+ self.assertIn('task do_package_write_rpm:', ret.output, 'Task do_package_write_rpm did not re-executed.')
+
@testcase(163)
- def test_force_task(self):
- bitbake('m4-native')
- self.add_command_to_tearDown('bitbake -c clean m4-native')
- result = bitbake('-C compile m4-native')
- look_for_tasks = ['do_compile', 'do_install', 'do_populate_sysroot']
+ def test_force_task_2(self):
+ # test 2 from bug 5875
+ test_recipe = 'zlib'
+
+ bitbake('-c cleansstate %s' % test_recipe)
+ bitbake(test_recipe)
+ self.add_command_to_tearDown('bitbake -c clean %s' % test_recipe)
+
+ result = bitbake('-C compile %s' % test_recipe)
+ look_for_tasks = ['do_compile:', 'do_install:', 'do_populate_sysroot:', 'do_package:']
for task in look_for_tasks:
- find_task = re.search("m4-native.*%s" % task, result.output)
- self.assertTrue(find_task, msg = "Couldn't find %s task. bitbake output %s" % (task, result.output))
+ self.assertIn(task, result.output, msg="Couldn't find %s task.")
@testcase(167)
def test_bitbake_g(self):
@@ -101,6 +126,8 @@ class BitbakeTests(oeSelfTest):
self.write_config("""DL_DIR = \"${TOPDIR}/download-selftest\"
SSTATE_DIR = \"${TOPDIR}/download-selftest\"
""")
+ self.track_for_cleanup(os.path.join(self.builddir, "download-selftest"))
+
bitbake('-ccleanall man')
result = bitbake('-c fetch man', ignore_status=True)
bitbake('-ccleanall man')
@@ -116,20 +143,20 @@ doesn't exist, yet fetcher didn't report any error. bitbake output: %s" % result
self.write_config("""DL_DIR = \"${TOPDIR}/download-selftest\"
SSTATE_DIR = \"${TOPDIR}/download-selftest\"
""")
+ self.track_for_cleanup(os.path.join(self.builddir, "download-selftest"))
+
data = 'SRC_URI_append = ";downloadfilename=test-aspell.tar.gz"'
self.write_recipeinc('aspell', data)
bitbake('-ccleanall aspell')
result = bitbake('-c fetch aspell', ignore_status=True)
self.delete_recipeinc('aspell')
- self.addCleanup(bitbake, '-ccleanall aspell')
self.assertEqual(result.status, 0, msg = "Couldn't fetch aspell. %s" % result.output)
self.assertTrue(os.path.isfile(os.path.join(get_bb_var("DL_DIR"), 'test-aspell.tar.gz')), msg = "File rename failed. No corresponding test-aspell.tar.gz file found under %s" % str(get_bb_var("DL_DIR")))
self.assertTrue(os.path.isfile(os.path.join(get_bb_var("DL_DIR"), 'test-aspell.tar.gz.done')), "File rename failed. No corresponding test-aspell.tar.gz.done file found under %s" % str(get_bb_var("DL_DIR")))
@testcase(1028)
def test_environment(self):
- self.append_config("TEST_ENV=\"localconf\"")
- self.addCleanup(self.remove_config, "TEST_ENV=\"localconf\"")
+ self.write_config("TEST_ENV=\"localconf\"")
result = runCmd('bitbake -e | grep TEST_ENV=')
self.assertTrue('localconf' in result.output, msg = "bitbake didn't report any value for TEST_ENV variable. To test, run 'bitbake -e | grep TEST_ENV='")
@@ -156,8 +183,7 @@ SSTATE_DIR = \"${TOPDIR}/download-selftest\"
ftools.write_file(preconf ,"TEST_PREFILE=\"prefile\"")
result = runCmd('bitbake -r conf/prefile.conf -e | grep TEST_PREFILE=')
self.assertTrue('prefile' in result.output, "Preconfigure file \"prefile.conf\"was not taken into consideration. ")
- self.append_config("TEST_PREFILE=\"localconf\"")
- self.addCleanup(self.remove_config, "TEST_PREFILE=\"localconf\"")
+ self.write_config("TEST_PREFILE=\"localconf\"")
result = runCmd('bitbake -r conf/prefile.conf -e | grep TEST_PREFILE=')
self.assertTrue('localconf' in result.output, "Preconfigure file \"prefile.conf\"was not taken into consideration.")
@@ -166,8 +192,7 @@ SSTATE_DIR = \"${TOPDIR}/download-selftest\"
postconf = os.path.join(self.builddir, 'conf/postfile.conf')
self.track_for_cleanup(postconf)
ftools.write_file(postconf , "TEST_POSTFILE=\"postfile\"")
- self.append_config("TEST_POSTFILE=\"localconf\"")
- self.addCleanup(self.remove_config, "TEST_POSTFILE=\"localconf\"")
+ self.write_config("TEST_POSTFILE=\"localconf\"")
result = runCmd('bitbake -R conf/postfile.conf -e | grep TEST_POSTFILE=')
self.assertTrue('postfile' in result.output, "Postconfigure file \"postfile.conf\"was not taken into consideration.")
@@ -181,6 +206,7 @@ SSTATE_DIR = \"${TOPDIR}/download-selftest\"
self.write_config("""DL_DIR = \"${TOPDIR}/download-selftest\"
SSTATE_DIR = \"${TOPDIR}/download-selftest\"
""")
+ self.track_for_cleanup(os.path.join(self.builddir, "download-selftest"))
self.write_recipeinc('man',"\ndo_fail_task () {\nexit 1 \n}\n\naddtask do_fail_task before do_fetch\n" )
runCmd('bitbake -c cleanall man xcursor-transparent-theme')
result = runCmd('bitbake man xcursor-transparent-theme -k', ignore_status=True)
diff --git a/meta/lib/oeqa/selftest/buildoptions.py b/meta/lib/oeqa/selftest/buildoptions.py
index 483803b..acf481f 100644
--- a/meta/lib/oeqa/selftest/buildoptions.py
+++ b/meta/lib/oeqa/selftest/buildoptions.py
@@ -1,9 +1,6 @@
-import unittest
import os
-import logging
import re
import glob as g
-import pexpect as p
from oeqa.selftest.base import oeSelfTest
from oeqa.selftest.buildhistory import BuildhistoryBase
@@ -42,7 +39,7 @@ class ImageOptionsTests(oeSelfTest):
for image_file in deploydir_files:
if imagename in image_file and os.path.islink(os.path.join(deploydir, image_file)):
track_original_files.append(os.path.realpath(os.path.join(deploydir, image_file)))
- self.append_config("RM_OLD_IMAGE = \"1\"")
+ self.write_config("RM_OLD_IMAGE = \"1\"")
bitbake("-C rootfs core-image-minimal")
deploydir_files = os.listdir(deploydir)
remaining_not_expected = [path for path in track_original_files if os.path.basename(path) in deploydir_files]
@@ -100,7 +97,7 @@ class SanityOptionsTest(oeSelfTest):
@testcase(278)
def test_sanity_userspace_dependency(self):
- self.append_config('WARN_QA_append = " unsafe-references-in-binaries unsafe-references-in-scripts"')
+ self.write_config('WARN_QA_append = " unsafe-references-in-binaries unsafe-references-in-scripts"')
bitbake("-ccleansstate gzip nfs-utils")
res = bitbake("gzip nfs-utils")
self.assertTrue("WARNING: QA Issue: gzip" in res.output, "WARNING: QA Issue: gzip message is not present in bitbake's output: %s" % res.output)
@@ -128,7 +125,7 @@ class BuildImagesTest(oeSelfTest):
This method is used to test the build of directfb image for arm arch.
In essence we build a coreimagedirectfb and test the exitcode of bitbake that in case of success is 0.
"""
- self.add_command_to_tearDown('cleanupworkdir')
+ self.add_command_to_tearDown('cleanup-workdir')
self.write_config("DISTRO_FEATURES_remove = \"x11\"\nDISTRO_FEATURES_append = \" directfb\"\nMACHINE ??= \"qemuarm\"")
res = bitbake("core-image-directfb", ignore_status=True)
self.assertEqual(res.status, 0, "\ncoreimagedirectfb failed to build. Please check logs for further details.\nbitbake output %s" % res.output)
@@ -139,7 +136,7 @@ class ArchiverTest(oeSelfTest):
"""
Test for archiving the work directory and exporting the source files.
"""
- self.add_command_to_tearDown('cleanupworkdir')
+ self.add_command_to_tearDown('cleanup-workdir')
self.write_config("INHERIT = \"archiver\"\nARCHIVER_MODE[src] = \"original\"\nARCHIVER_MODE[srpm] = \"1\"")
res = bitbake("xcursor-transparent-theme", ignore_status=True)
self.assertEqual(res.status, 0, "\nCouldn't build xcursortransparenttheme.\nbitbake output %s" % res.output)
diff --git a/meta/lib/oeqa/selftest/devtool.py b/meta/lib/oeqa/selftest/devtool.py
index 6e731d6..dcdef5a 100644
--- a/meta/lib/oeqa/selftest/devtool.py
+++ b/meta/lib/oeqa/selftest/devtool.py
@@ -84,11 +84,44 @@ class DevtoolBase(oeSelfTest):
class DevtoolTests(DevtoolBase):
+ def setUp(self):
+ """Test case setup function"""
+ super(DevtoolTests, self).setUp()
+ self.workspacedir = os.path.join(self.builddir, 'workspace')
+ self.assertTrue(not os.path.exists(self.workspacedir),
+ 'This test cannot be run with a workspace directory '
+ 'under the build directory')
+
+ def _check_src_repo(self, repo_dir):
+ """Check srctree git repository"""
+ self.assertTrue(os.path.isdir(os.path.join(repo_dir, '.git')),
+ 'git repository for external source tree not found')
+ result = runCmd('git status --porcelain', cwd=repo_dir)
+ self.assertEqual(result.output.strip(), "",
+ 'Created git repo is not clean')
+ result = runCmd('git symbolic-ref HEAD', cwd=repo_dir)
+ self.assertEqual(result.output.strip(), "refs/heads/devtool",
+ 'Wrong branch in git repo')
+
+ def _check_repo_status(self, repo_dir, expected_status):
+ """Check the worktree status of a repository"""
+ result = runCmd('git status . --porcelain',
+ cwd=repo_dir)
+ for line in result.output.splitlines():
+ for ind, (f_status, fn_re) in enumerate(expected_status):
+ if re.match(fn_re, line[3:]):
+ if f_status != line[:2]:
+ self.fail('Unexpected status in line: %s' % line)
+ expected_status.pop(ind)
+ break
+ else:
+ self.fail('Unexpected modified file in line: %s' % line)
+ if expected_status:
+ self.fail('Missing file changes: %s' % expected_status)
+
@testcase(1158)
def test_create_workspace(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
result = runCmd('bitbake-layers show-layers')
self.assertTrue('/workspace' not in result.output, 'This test cannot be run with a workspace layer in bblayers.conf')
# Try creating a workspace layer with a specific path
@@ -99,19 +132,16 @@ class DevtoolTests(DevtoolBase):
result = runCmd('bitbake-layers show-layers')
self.assertIn(tempdir, result.output)
# Try creating a workspace layer with the default path
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
result = runCmd('devtool create-workspace')
- self.assertTrue(os.path.isfile(os.path.join(workspacedir, 'conf', 'layer.conf')), msg = "No workspace created. devtool output: %s " % result.output)
+ self.assertTrue(os.path.isfile(os.path.join(self.workspacedir, 'conf', 'layer.conf')), msg = "No workspace created. devtool output: %s " % result.output)
result = runCmd('bitbake-layers show-layers')
self.assertNotIn(tempdir, result.output)
- self.assertIn(workspacedir, result.output)
+ self.assertIn(self.workspacedir, result.output)
@testcase(1159)
def test_devtool_add(self):
- # Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# Fetch source
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
@@ -121,11 +151,11 @@ class DevtoolTests(DevtoolBase):
srcdir = os.path.join(tempdir, 'pv-1.5.3')
self.assertTrue(os.path.isfile(os.path.join(srcdir, 'configure')), 'Unable to find configure script in source directory')
# Test devtool add
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake -c cleansstate pv')
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
result = runCmd('devtool add pv %s' % srcdir)
- self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
# Test devtool status
result = runCmd('devtool status')
self.assertIn('pv', result.output)
@@ -144,9 +174,6 @@ class DevtoolTests(DevtoolBase):
@testcase(1162)
def test_devtool_add_library(self):
- # Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# We don't have the ability to pick up this dependency automatically yet...
bitbake('libusb1')
# Fetch source
@@ -158,10 +185,10 @@ class DevtoolTests(DevtoolBase):
srcdir = os.path.join(tempdir, 'libftdi1-1.1')
self.assertTrue(os.path.isfile(os.path.join(srcdir, 'CMakeLists.txt')), 'Unable to find CMakeLists.txt in source directory')
# Test devtool add (and use -V so we test that too)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
result = runCmd('devtool add libftdi %s -V 1.1' % srcdir)
- self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
# Test devtool status
result = runCmd('devtool status')
self.assertIn('libftdi', result.output)
@@ -185,9 +212,6 @@ class DevtoolTests(DevtoolBase):
@testcase(1160)
def test_devtool_add_fetch(self):
- # Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# Fetch source
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
@@ -196,11 +220,11 @@ class DevtoolTests(DevtoolBase):
testrecipe = 'python-markupsafe'
srcdir = os.path.join(tempdir, testrecipe)
# Test devtool add
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake -c cleansstate %s' % testrecipe)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
result = runCmd('devtool add %s %s -f %s' % (testrecipe, srcdir, url))
- self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created. %s' % result.output)
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created. %s' % result.output)
self.assertTrue(os.path.isfile(os.path.join(srcdir, 'setup.py')), 'Unable to find setup.py in source directory')
# Test devtool status
result = runCmd('devtool status')
@@ -232,9 +256,6 @@ class DevtoolTests(DevtoolBase):
@testcase(1161)
def test_devtool_add_fetch_git(self):
- # Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# Fetch source
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
@@ -243,11 +264,11 @@ class DevtoolTests(DevtoolBase):
testrecipe = 'libmatchbox2'
srcdir = os.path.join(tempdir, testrecipe)
# Test devtool add
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake -c cleansstate %s' % testrecipe)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
result = runCmd('devtool add %s %s -f %s' % (testrecipe, srcdir, url))
- self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created: %s' % result.output)
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created: %s' % result.output)
self.assertTrue(os.path.isfile(os.path.join(srcdir, 'configure.ac')), 'Unable to find configure.ac in source directory')
# Test devtool status
result = runCmd('devtool status')
@@ -284,32 +305,25 @@ class DevtoolTests(DevtoolBase):
@testcase(1164)
def test_devtool_modify(self):
- # Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# Clean up anything in the workdir/sysroot/sstate cache
bitbake('mdadm -c cleansstate')
# Try modifying a recipe
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
self.add_command_to_tearDown('bitbake -c clean mdadm')
result = runCmd('devtool modify mdadm -x %s' % tempdir)
self.assertTrue(os.path.exists(os.path.join(tempdir, 'Makefile')), 'Extracted source could not be found')
- self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
- self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
- matches = glob.glob(os.path.join(workspacedir, 'appends', 'mdadm_*.bbappend'))
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
+ matches = glob.glob(os.path.join(self.workspacedir, 'appends', 'mdadm_*.bbappend'))
self.assertTrue(matches, 'bbappend not created %s' % result.output)
# Test devtool status
result = runCmd('devtool status')
self.assertIn('mdadm', result.output)
self.assertIn(tempdir, result.output)
# Check git repo
- result = runCmd('git status --porcelain', cwd=tempdir)
- self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
- result = runCmd('git symbolic-ref HEAD', cwd=tempdir)
- self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
+ self._check_src_repo(tempdir)
# Try building
bitbake('mdadm')
# Try making (minor) modifications to the source
@@ -336,13 +350,10 @@ class DevtoolTests(DevtoolBase):
@testcase(1166)
def test_devtool_modify_invalid(self):
- # Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# Try modifying some recipes
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
testrecipes = 'perf kernel-devsrc package-index core-image-minimal meta-toolchain packagegroup-core-sdk meta-ide-support'.split()
@@ -367,14 +378,14 @@ class DevtoolTests(DevtoolBase):
self.assertNotEqual(result.status, 0, 'devtool modify on %s should have failed. devtool output: %s' % (testrecipe, result.output))
self.assertIn('ERROR: ', result.output, 'devtool modify on %s should have given an ERROR' % testrecipe)
+ @testcase(1365)
def test_devtool_modify_native(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
+ self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# Try modifying some recipes
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
bbclassextended = False
@@ -400,8 +411,6 @@ class DevtoolTests(DevtoolBase):
@testcase(1165)
def test_devtool_modify_git(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
testrecipe = 'mkelfimage'
src_uri = get_bb_var('SRC_URI', testrecipe)
self.assertIn('git://', src_uri, 'This test expects the %s recipe to be a git recipe' % testrecipe)
@@ -410,32 +419,26 @@ class DevtoolTests(DevtoolBase):
# Try modifying a recipe
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe)
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
self.assertTrue(os.path.exists(os.path.join(tempdir, 'Makefile')), 'Extracted source could not be found')
- self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
- self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created. devtool output: %s' % result.output)
- matches = glob.glob(os.path.join(workspacedir, 'appends', 'mkelfimage_*.bbappend'))
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created. devtool output: %s' % result.output)
+ matches = glob.glob(os.path.join(self.workspacedir, 'appends', 'mkelfimage_*.bbappend'))
self.assertTrue(matches, 'bbappend not created')
# Test devtool status
result = runCmd('devtool status')
self.assertIn(testrecipe, result.output)
self.assertIn(tempdir, result.output)
# Check git repo
- result = runCmd('git status --porcelain', cwd=tempdir)
- self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
- result = runCmd('git symbolic-ref HEAD', cwd=tempdir)
- self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
+ self._check_src_repo(tempdir)
# Try building
bitbake(testrecipe)
@testcase(1167)
def test_devtool_modify_localfiles(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
testrecipe = 'lighttpd'
src_uri = (get_bb_var('SRC_URI', testrecipe) or '').split()
foundlocal = False
@@ -449,13 +452,13 @@ class DevtoolTests(DevtoolBase):
# Try modifying a recipe
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe)
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
self.assertTrue(os.path.exists(os.path.join(tempdir, 'configure.ac')), 'Extracted source could not be found')
- self.assertTrue(os.path.exists(os.path.join(workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
- matches = glob.glob(os.path.join(workspacedir, 'appends', '%s_*.bbappend' % testrecipe))
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
+ matches = glob.glob(os.path.join(self.workspacedir, 'appends', '%s_*.bbappend' % testrecipe))
self.assertTrue(matches, 'bbappend not created')
# Test devtool status
result = runCmd('devtool status')
@@ -464,30 +467,46 @@ class DevtoolTests(DevtoolBase):
# Try building
bitbake(testrecipe)
+ @testcase(1378)
+ def test_devtool_modify_virtual(self):
+ # Try modifying a virtual recipe
+ virtrecipe = 'virtual/libx11'
+ realrecipe = 'libx11'
+ tempdir = tempfile.mkdtemp(prefix='devtoolqa')
+ self.track_for_cleanup(tempdir)
+ self.track_for_cleanup(self.workspacedir)
+ self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+ result = runCmd('devtool modify %s -x %s' % (virtrecipe, tempdir))
+ self.assertTrue(os.path.exists(os.path.join(tempdir, 'Makefile.am')), 'Extracted source could not be found')
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir, 'conf', 'layer.conf')), 'Workspace directory not created')
+ matches = glob.glob(os.path.join(self.workspacedir, 'appends', '%s_*.bbappend' % realrecipe))
+ self.assertTrue(matches, 'bbappend not created %s' % result.output)
+ # Test devtool status
+ result = runCmd('devtool status')
+ self.assertNotIn(virtrecipe, result.output)
+ self.assertIn(realrecipe, result.output)
+ # Check git repo
+ self._check_src_repo(tempdir)
+ # This is probably sufficient
+
+
@testcase(1169)
def test_devtool_update_recipe(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
testrecipe = 'minicom'
recipefile = get_bb_var('FILE', testrecipe)
src_uri = get_bb_var('SRC_URI', testrecipe)
self.assertNotIn('git://', src_uri, 'This test expects the %s recipe to NOT be a git recipe' % testrecipe)
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
+ self._check_repo_status(os.path.dirname(recipefile), [])
# First, modify a recipe
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
# (don't bother with cleaning the recipe on teardown, we won't be building it)
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
# Check git repo
- self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
- result = runCmd('git status --porcelain', cwd=tempdir)
- self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
- result = runCmd('git symbolic-ref HEAD', cwd=tempdir)
- self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
+ self._check_src_repo(tempdir)
# Add a couple of commits
# FIXME: this only tests adding, need to also test update and remove
result = runCmd('echo "Additional line" >> README', cwd=tempdir)
@@ -497,25 +516,14 @@ class DevtoolTests(DevtoolBase):
result = runCmd('git commit -m "Add a new file"', cwd=tempdir)
self.add_command_to_tearDown('cd %s; rm %s/*.patch; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile)))
result = runCmd('devtool update-recipe %s' % testrecipe)
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- self.assertNotEqual(result.output.strip(), "", '%s recipe should be modified' % testrecipe)
- status = result.output.splitlines()
- self.assertEqual(len(status), 3, 'Less/more files modified than expected. Entire status:\n%s' % result.output)
- for line in status:
- if line.endswith('0001-Change-the-README.patch'):
- self.assertEqual(line[:3], '?? ', 'Unexpected status in line: %s' % line)
- elif line.endswith('0002-Add-a-new-file.patch'):
- self.assertEqual(line[:3], '?? ', 'Unexpected status in line: %s' % line)
- elif re.search('%s_[^_]*.bb$' % testrecipe, line):
- self.assertEqual(line[:3], ' M ', 'Unexpected status in line: %s' % line)
- else:
- raise AssertionError('Unexpected modified file in status: %s' % line)
+ expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)),
+ ('??', '.*/0001-Change-the-README.patch$'),
+ ('??', '.*/0002-Add-a-new-file.patch$')]
+ self._check_repo_status(os.path.dirname(recipefile), expected_status)
@testcase(1172)
def test_devtool_update_recipe_git(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
testrecipe = 'mtd-utils'
recipefile = get_bb_var('FILE', testrecipe)
src_uri = get_bb_var('SRC_URI', testrecipe)
@@ -525,21 +533,16 @@ class DevtoolTests(DevtoolBase):
if entry.startswith('file://') and entry.endswith('.patch'):
patches.append(entry[7:].split(';')[0])
self.assertGreater(len(patches), 0, 'The %s recipe does not appear to contain any patches, so this test will not be effective' % testrecipe)
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
+ self._check_repo_status(os.path.dirname(recipefile), [])
# First, modify a recipe
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
# (don't bother with cleaning the recipe on teardown, we won't be building it)
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
# Check git repo
- self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
- result = runCmd('git status --porcelain', cwd=tempdir)
- self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
- result = runCmd('git symbolic-ref HEAD', cwd=tempdir)
- self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
+ self._check_src_repo(tempdir)
# Add a couple of commits
# FIXME: this only tests adding, need to also test update and remove
result = runCmd('echo "# Additional line" >> Makefile', cwd=tempdir)
@@ -549,19 +552,10 @@ class DevtoolTests(DevtoolBase):
result = runCmd('git commit -m "Add a new file"', cwd=tempdir)
self.add_command_to_tearDown('cd %s; rm -rf %s; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, testrecipe, os.path.basename(recipefile)))
result = runCmd('devtool update-recipe -m srcrev %s' % testrecipe)
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- self.assertNotEqual(result.output.strip(), "", '%s recipe should be modified' % testrecipe)
- status = result.output.splitlines()
- for line in status:
- for patch in patches:
- if line.endswith(patch):
- self.assertEqual(line[:3], ' D ', 'Unexpected status in line: %s' % line)
- break
- else:
- if re.search('%s_[^_]*.bb$' % testrecipe, line):
- self.assertEqual(line[:3], ' M ', 'Unexpected status in line: %s' % line)
- else:
- raise AssertionError('Unexpected modified file in status: %s' % line)
+ expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile))] + \
+ [(' D', '.*/%s$' % patch) for patch in patches]
+ self._check_repo_status(os.path.dirname(recipefile), expected_status)
+
result = runCmd('git diff %s' % os.path.basename(recipefile), cwd=os.path.dirname(recipefile))
addlines = ['SRCREV = ".*"', 'SRC_URI = "git://git.infradead.org/mtd-utils.git"']
srcurilines = src_uri.split()
@@ -588,50 +582,33 @@ class DevtoolTests(DevtoolBase):
# Now try with auto mode
runCmd('cd %s; git checkout %s %s' % (os.path.dirname(recipefile), testrecipe, os.path.basename(recipefile)))
result = runCmd('devtool update-recipe %s' % testrecipe)
- result = runCmd('git rev-parse --show-toplevel')
+ result = runCmd('git rev-parse --show-toplevel', cwd=os.path.dirname(recipefile))
topleveldir = result.output.strip()
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- status = result.output.splitlines()
relpatchpath = os.path.join(os.path.relpath(os.path.dirname(recipefile), topleveldir), testrecipe)
- expectedstatus = [('M', os.path.relpath(recipefile, topleveldir)),
- ('??', '%s/0001-Change-the-Makefile.patch' % relpatchpath),
- ('??', '%s/0002-Add-a-new-file.patch' % relpatchpath)]
- for line in status:
- statusline = line.split(None, 1)
- for fstatus, fn in expectedstatus:
- if fn == statusline[1]:
- if fstatus != statusline[0]:
- self.fail('Unexpected status in line: %s' % line)
- break
- else:
- self.fail('Unexpected modified file in line: %s' % line)
+ expected_status = [(' M', os.path.relpath(recipefile, topleveldir)),
+ ('??', '%s/0001-Change-the-Makefile.patch' % relpatchpath),
+ ('??', '%s/0002-Add-a-new-file.patch' % relpatchpath)]
+ self._check_repo_status(os.path.dirname(recipefile), expected_status)
@testcase(1170)
def test_devtool_update_recipe_append(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
testrecipe = 'mdadm'
recipefile = get_bb_var('FILE', testrecipe)
src_uri = get_bb_var('SRC_URI', testrecipe)
self.assertNotIn('git://', src_uri, 'This test expects the %s recipe to NOT be a git recipe' % testrecipe)
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
+ self._check_repo_status(os.path.dirname(recipefile), [])
# First, modify a recipe
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
tempsrcdir = os.path.join(tempdir, 'source')
templayerdir = os.path.join(tempdir, 'layer')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
# (don't bother with cleaning the recipe on teardown, we won't be building it)
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir))
# Check git repo
- self.assertTrue(os.path.isdir(os.path.join(tempsrcdir, '.git')), 'git repository for external source tree not found')
- result = runCmd('git status --porcelain', cwd=tempsrcdir)
- self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
- result = runCmd('git symbolic-ref HEAD', cwd=tempsrcdir)
- self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
+ self._check_src_repo(tempsrcdir)
# Add a commit
result = runCmd("sed 's!\\(#define VERSION\\W*\"[^\"]*\\)\"!\\1-custom\"!' -i ReadMe.c", cwd=tempsrcdir)
result = runCmd('git commit -a -m "Add our custom version"', cwd=tempsrcdir)
@@ -642,8 +619,7 @@ class DevtoolTests(DevtoolBase):
result = runCmd('devtool update-recipe %s -a %s' % (testrecipe, templayerdir))
self.assertNotIn('WARNING:', result.output)
# Check recipe is still clean
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
+ self._check_repo_status(os.path.dirname(recipefile), [])
# Check bbappend was created
splitpath = os.path.dirname(recipefile).split(os.sep)
appenddir = os.path.join(templayerdir, splitpath[-2], splitpath[-1])
@@ -685,8 +661,6 @@ class DevtoolTests(DevtoolBase):
@testcase(1171)
def test_devtool_update_recipe_append_git(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
testrecipe = 'mtd-utils'
recipefile = get_bb_var('FILE', testrecipe)
src_uri = get_bb_var('SRC_URI', testrecipe)
@@ -695,23 +669,18 @@ class DevtoolTests(DevtoolBase):
if entry.startswith('git://'):
git_uri = entry
break
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
+ self._check_repo_status(os.path.dirname(recipefile), [])
# First, modify a recipe
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
tempsrcdir = os.path.join(tempdir, 'source')
templayerdir = os.path.join(tempdir, 'layer')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
# (don't bother with cleaning the recipe on teardown, we won't be building it)
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempsrcdir))
# Check git repo
- self.assertTrue(os.path.isdir(os.path.join(tempsrcdir, '.git')), 'git repository for external source tree not found')
- result = runCmd('git status --porcelain', cwd=tempsrcdir)
- self.assertEqual(result.output.strip(), "", 'Created git repo is not clean')
- result = runCmd('git symbolic-ref HEAD', cwd=tempsrcdir)
- self.assertEqual(result.output.strip(), "refs/heads/devtool", 'Wrong branch in git repo')
+ self._check_src_repo(tempsrcdir)
# Add a commit
result = runCmd('echo "# Additional line" >> Makefile', cwd=tempsrcdir)
result = runCmd('git commit -a -m "Change the Makefile"', cwd=tempsrcdir)
@@ -731,8 +700,7 @@ class DevtoolTests(DevtoolBase):
result = runCmd('devtool update-recipe -m srcrev %s -a %s' % (testrecipe, templayerdir))
self.assertNotIn('WARNING:', result.output)
# Check recipe is still clean
- result = runCmd('git status . --porcelain', cwd=os.path.dirname(recipefile))
- self.assertEqual(result.output.strip(), "", '%s recipe is not clean' % testrecipe)
+ self._check_repo_status(os.path.dirname(recipefile), [])
# Check bbappend was created
splitpath = os.path.dirname(recipefile).split(os.sep)
appenddir = os.path.join(templayerdir, splitpath[-2], splitpath[-1])
@@ -779,28 +747,104 @@ class DevtoolTests(DevtoolBase):
self.assertEqual(expectedlines, f.readlines())
# Deleting isn't expected to work under these circumstances
+ @testcase(1370)
+ def test_devtool_update_recipe_local_files(self):
+ """Check that local source files are copied over instead of patched"""
+ testrecipe = 'makedevs'
+ recipefile = get_bb_var('FILE', testrecipe)
+ # Setup srctree for modifying the recipe
+ tempdir = tempfile.mkdtemp(prefix='devtoolqa')
+ self.track_for_cleanup(tempdir)
+ self.track_for_cleanup(self.workspacedir)
+ self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+ # (don't bother with cleaning the recipe on teardown, we won't be
+ # building it)
+ result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
+ # Check git repo
+ self._check_src_repo(tempdir)
+ # Edit / commit local source
+ runCmd('echo "/* Foobar */" >> oe-local-files/makedevs.c', cwd=tempdir)
+ runCmd('echo "Foo" > oe-local-files/new-local', cwd=tempdir)
+ runCmd('echo "Bar" > new-file', cwd=tempdir)
+ runCmd('git add new-file', cwd=tempdir)
+ runCmd('git commit -m "Add new file"', cwd=tempdir)
+ self.add_command_to_tearDown('cd %s; git clean -fd .; git checkout .' %
+ os.path.dirname(recipefile))
+ runCmd('devtool update-recipe %s' % testrecipe)
+ expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)),
+ (' M', '.*/makedevs/makedevs.c$'),
+ ('??', '.*/makedevs/new-local$'),
+ ('??', '.*/makedevs/0001-Add-new-file.patch$')]
+ self._check_repo_status(os.path.dirname(recipefile), expected_status)
+
+ @testcase(1371)
+ def test_devtool_update_recipe_local_files_2(self):
+ """Check local source files support when oe-local-files is in Git"""
+ testrecipe = 'lzo'
+ recipefile = get_bb_var('FILE', testrecipe)
+ # Setup srctree for modifying the recipe
+ tempdir = tempfile.mkdtemp(prefix='devtoolqa')
+ self.track_for_cleanup(tempdir)
+ self.track_for_cleanup(self.workspacedir)
+ self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+ result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
+ # Check git repo
+ self._check_src_repo(tempdir)
+ # Add oe-local-files to Git
+ runCmd('rm oe-local-files/.gitignore', cwd=tempdir)
+ runCmd('git add oe-local-files', cwd=tempdir)
+ runCmd('git commit -m "Add local sources"', cwd=tempdir)
+ # Edit / commit local sources
+ runCmd('echo "# Foobar" >> oe-local-files/acinclude.m4', cwd=tempdir)
+ runCmd('git commit -am "Edit existing file"', cwd=tempdir)
+ runCmd('git rm oe-local-files/run-ptest', cwd=tempdir)
+ runCmd('git commit -m"Remove file"', cwd=tempdir)
+ runCmd('echo "Foo" > oe-local-files/new-local', cwd=tempdir)
+ runCmd('git add oe-local-files/new-local', cwd=tempdir)
+ runCmd('git commit -m "Add new local file"', cwd=tempdir)
+ runCmd('echo "Gar" > new-file', cwd=tempdir)
+ runCmd('git add new-file', cwd=tempdir)
+ runCmd('git commit -m "Add new file"', cwd=tempdir)
+ self.add_command_to_tearDown('cd %s; git clean -fd .; git checkout .' %
+ os.path.dirname(recipefile))
+ # Checkout unmodified file to working copy -> devtool should still pick
+ # the modified version from HEAD
+ runCmd('git checkout HEAD^ -- oe-local-files/acinclude.m4', cwd=tempdir)
+ runCmd('devtool update-recipe %s' % testrecipe)
+ expected_status = [(' M', '.*/%s$' % os.path.basename(recipefile)),
+ (' M', '.*/acinclude.m4$'),
+ (' D', '.*/run-ptest$'),
+ ('??', '.*/new-local$'),
+ ('??', '.*/0001-Add-new-file.patch$')]
+ self._check_repo_status(os.path.dirname(recipefile), expected_status)
+
@testcase(1163)
def test_devtool_extract(self):
- # Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
# Try devtool extract
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
result = runCmd('devtool extract remake %s' % tempdir)
self.assertTrue(os.path.exists(os.path.join(tempdir, 'Makefile.am')), 'Extracted source could not be found')
- self.assertTrue(os.path.isdir(os.path.join(tempdir, '.git')), 'git repository for external source tree not found')
+ self._check_src_repo(tempdir)
+
+ @testcase(1379)
+ def test_devtool_extract_virtual(self):
+ tempdir = tempfile.mkdtemp(prefix='devtoolqa')
+ # Try devtool extract
+ self.track_for_cleanup(tempdir)
+ self.track_for_cleanup(self.workspacedir)
+ self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+ result = runCmd('devtool extract virtual/libx11 %s' % tempdir)
+ self.assertTrue(os.path.exists(os.path.join(tempdir, 'Makefile.am')), 'Extracted source could not be found')
+ self._check_src_repo(tempdir)
@testcase(1168)
def test_devtool_reset_all(self):
- # Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
testrecipe1 = 'mdadm'
testrecipe2 = 'cronie'
@@ -823,6 +867,7 @@ class DevtoolTests(DevtoolBase):
matches2 = glob.glob(stampprefix2 + '*')
self.assertFalse(matches2, 'Stamp files exist for recipe %s that should have been cleaned' % testrecipe2)
+ @testcase(1272)
def test_devtool_deploy_target(self):
# NOTE: Whilst this test would seemingly be better placed as a runtime test,
# unfortunately the runtime tests run under bitbake and you can't run
@@ -846,8 +891,7 @@ class DevtoolTests(DevtoolBase):
break
else:
self.skipTest('No tap devices found - you must set up tap devices with scripts/runqemu-gen-tapdevs before running this test')
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
+ self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# Definitions
testrecipe = 'mdadm'
testfile = '/sbin/mdadm'
@@ -863,7 +907,7 @@ class DevtoolTests(DevtoolBase):
# Try devtool modify
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
self.add_command_to_tearDown('bitbake -c clean %s' % testrecipe)
result = runCmd('devtool modify %s -x %s' % (testrecipe, tempdir))
@@ -908,18 +952,19 @@ class DevtoolTests(DevtoolBase):
result = runCmd('ssh %s root@%s %s' % (sshargs, qemu.ip, testcommand), ignore_status=True)
self.assertNotEqual(result, 0, 'undeploy-target did not remove command as it should have')
+ @testcase(1366)
def test_devtool_build_image(self):
"""Test devtool build-image plugin"""
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
+ self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory')
image = 'core-image-minimal'
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
self.add_command_to_tearDown('bitbake -c clean %s' % image)
bitbake('%s -c clean' % image)
# Add target and native recipes to workspace
- for recipe in ('mdadm', 'parted-native'):
+ recipes = ['mdadm', 'parted-native']
+ for recipe in recipes:
tempdir = tempfile.mkdtemp(prefix='devtoolqa')
self.track_for_cleanup(tempdir)
self.add_command_to_tearDown('bitbake -c clean %s' % recipe)
@@ -927,17 +972,24 @@ class DevtoolTests(DevtoolBase):
# Try to build image
result = runCmd('devtool build-image %s' % image)
self.assertNotEqual(result, 0, 'devtool build-image failed')
- # Check if image.bbappend has required content
- bbappend = os.path.join(workspacedir, 'appends', image+'.bbappend')
- self.assertTrue(os.path.isfile(bbappend), 'bbappend not created %s' % result.output)
- # NOTE: native recipe parted-native should not be in IMAGE_INSTALL_append
- self.assertTrue('IMAGE_INSTALL_append = " mdadm"\n' in open(bbappend).readlines(),
- 'IMAGE_INSTALL_append = " mdadm" not found in %s' % bbappend)
+ # Check if image contains expected packages
+ deploy_dir_image = get_bb_var('DEPLOY_DIR_IMAGE')
+ image_link_name = get_bb_var('IMAGE_LINK_NAME', image)
+ reqpkgs = [item for item in recipes if not item.endswith('-native')]
+ with open(os.path.join(deploy_dir_image, image_link_name + '.manifest'), 'r') as f:
+ for line in f:
+ splitval = line.split()
+ if splitval:
+ pkg = splitval[0]
+ if pkg in reqpkgs:
+ reqpkgs.remove(pkg)
+ if reqpkgs:
+ self.fail('The following packages were not present in the image as expected: %s' % ', '.join(reqpkgs))
+ @testcase(1367)
def test_devtool_upgrade(self):
# Check preconditions
- workspacedir = os.path.join(self.builddir, 'workspace')
- self.assertTrue(not os.path.exists(workspacedir), 'This test cannot be run with a workspace directory under the build directory')
+ self.assertTrue(not os.path.exists(self.workspacedir), 'This test cannot be run with a workspace directory under the build directory')
# Check parameters
result = runCmd('devtool upgrade -h')
for param in 'recipename srctree --version -V --branch -b --keep-temp --no-patch'.split():
@@ -955,9 +1007,9 @@ class DevtoolTests(DevtoolBase):
# Check if srctree at least is populated
self.assertTrue(len(os.listdir(tempdir)) > 0, 'scrtree (%s) should be populated with new (%s) source code' % (tempdir, version))
# Check new recipe folder is present
- self.assertTrue(os.path.exists(os.path.join(workspacedir,'recipes',recipe)), 'Recipe folder should exist')
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir,'recipes',recipe)), 'Recipe folder should exist')
# Check new recipe file is present
- self.assertTrue(os.path.exists(os.path.join(workspacedir,'recipes',recipe,"%s_%s.bb" % (recipe,version))), 'Recipe folder should exist')
+ self.assertTrue(os.path.exists(os.path.join(self.workspacedir,'recipes',recipe,"%s_%s.bb" % (recipe,version))), 'Recipe folder should exist')
# Check devtool status and make sure recipe is present
result = runCmd('devtool status')
self.assertIn(recipe, result.output)
@@ -967,5 +1019,18 @@ class DevtoolTests(DevtoolBase):
result = runCmd('devtool status')
self.assertNotIn(recipe, result.output)
self.track_for_cleanup(tempdir)
- self.track_for_cleanup(workspacedir)
+ self.track_for_cleanup(self.workspacedir)
self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+
+ @testcase(1352)
+ def test_devtool_layer_plugins(self):
+ """Test that devtool can use plugins from other layers.
+
+ This test executes the selftest-reverse command from meta-selftest."""
+
+ self.track_for_cleanup(self.workspacedir)
+ self.add_command_to_tearDown('bitbake-layers remove-layer */workspace')
+
+ s = "Microsoft Made No Profit From Anyone's Zunes Yo"
+ result = runCmd("devtool --quiet selftest-reverse \"%s\"" % s)
+ self.assertEqual(result.output, s[::-1])
diff --git a/meta/lib/oeqa/selftest/imagefeatures.py b/meta/lib/oeqa/selftest/imagefeatures.py
index fcffc42..4efb0d9 100644
--- a/meta/lib/oeqa/selftest/imagefeatures.py
+++ b/meta/lib/oeqa/selftest/imagefeatures.py
@@ -25,9 +25,7 @@ class ImageFeatures(oeSelfTest):
features = 'EXTRA_IMAGE_FEATURES = "ssh-server-openssh empty-root-password allow-empty-password"\n'
features += 'INHERIT += "extrausers"\n'
features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(self.test_user, self.test_user)
-
- # Append 'features' to local.conf
- self.append_config(features)
+ self.write_config(features)
# Build a core-image-minimal
bitbake('core-image-minimal')
@@ -53,9 +51,7 @@ class ImageFeatures(oeSelfTest):
features = 'EXTRA_IMAGE_FEATURES = "ssh-server-openssh allow-empty-password"\n'
features += 'INHERIT += "extrausers"\n'
features += 'EXTRA_USERS_PARAMS = "useradd -p \'\' {}; usermod -s /bin/sh {};"'.format(self.test_user, self.test_user)
-
- # Append 'features' to local.conf
- self.append_config(features)
+ self.write_config(features)
# Build a core-image-minimal
bitbake('core-image-minimal')
@@ -87,9 +83,7 @@ class ImageFeatures(oeSelfTest):
features += 'IMAGE_INSTALL_append = " openssh"\n'
features += 'EXTRA_IMAGE_FEATURES = "empty-root-password allow-empty-password package-management"\n'
features += 'RPMROOTFSDEPENDS_remove = "rpmresolve-native:do_populate_sysroot"'
-
- # Append 'features' to local.conf
- self.append_config(features)
+ self.write_config(features)
# Build a core-image-minimal
bitbake('core-image-minimal')
@@ -159,9 +153,7 @@ class ImageFeatures(oeSelfTest):
features = 'DISTRO_FEATURES_append = " wayland"\n'
features += 'CORE_IMAGE_EXTRA_INSTALL += "wayland weston"'
-
- # Append 'features' to local.conf
- self.append_config(features)
+ self.write_config(features)
# Build a core-image-weston
bitbake('core-image-weston')
diff --git a/meta/lib/oeqa/selftest/layerappend.py b/meta/lib/oeqa/selftest/layerappend.py
index a82a6c8..4de5034 100644
--- a/meta/lib/oeqa/selftest/layerappend.py
+++ b/meta/lib/oeqa/selftest/layerappend.py
@@ -46,10 +46,11 @@ FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"
SRC_URI_append += "file://appendtest.txt"
"""
- layerappend = "BBLAYERS += \"COREBASE/meta-layertest0 COREBASE/meta-layertest1 COREBASE/meta-layertest2\""
+ layerappend = ''
def tearDownLocal(self):
- ftools.remove_from_file(self.builddir + "/conf/bblayers.conf", self.layerappend.replace("COREBASE", self.builddir + "/.."))
+ if self.layerappend:
+ ftools.remove_from_file(self.builddir + "/conf/bblayers.conf", self.layerappend)
@testcase(1196)
def test_layer_appends(self):
@@ -79,7 +80,9 @@ SRC_URI_append += "file://appendtest.txt"
with open(layer + "/recipes-test/layerappendtest/appendtest.txt", "w") as f:
f.write("Layer 2 test")
self.track_for_cleanup(layer)
- ftools.append_file(self.builddir + "/conf/bblayers.conf", self.layerappend.replace("COREBASE", self.builddir + "/.."))
+
+ self.layerappend = "BBLAYERS += \"{0}/meta-layertest0 {0}/meta-layertest1 {0}/meta-layertest2\"".format(corebase)
+ ftools.append_file(self.builddir + "/conf/bblayers.conf", self.layerappend)
bitbake("layerappendtest")
data = ftools.read_file(stagingdir + "/appendtest.txt")
self.assertEqual(data, "Layer 2 test")
diff --git a/meta/lib/oeqa/selftest/manifest.py b/meta/lib/oeqa/selftest/manifest.py
new file mode 100644
index 0000000..44d0404
--- /dev/null
+++ b/meta/lib/oeqa/selftest/manifest.py
@@ -0,0 +1,165 @@
+import unittest
+import os
+
+from oeqa.selftest.base import oeSelfTest
+from oeqa.utils.commands import get_bb_var, bitbake
+from oeqa.utils.decorators import testcase
+
+class ManifestEntry:
+ '''A manifest item of a collection able to list missing packages'''
+ def __init__(self, entry):
+ self.file = entry
+ self.missing = []
+
+class VerifyManifest(oeSelfTest):
+ '''Tests for the manifest files and contents of an image'''
+
+ @classmethod
+ def check_manifest_entries(self, manifest, path):
+ manifest_errors = []
+ try:
+ with open(manifest, "r") as mfile:
+ for line in mfile:
+ manifest_entry = os.path.join(path, line.split()[0])
+ self.log.debug("{}: looking for {}"\
+ .format(self.classname, manifest_entry))
+ if not os.path.isfile(manifest_entry):
+ manifest_errors.append(manifest_entry)
+ self.log.debug("{}: {} not found"\
+ .format(self.classname, manifest_entry))
+ except OSError as e:
+ self.log.debug("{}: checking of {} failed"\
+ .format(self.classname, manifest))
+ raise e
+
+ return manifest_errors
+
+ #this will possibly move from here
+ @classmethod
+ def get_dir_from_bb_var(self, bb_var, target = None):
+ target == self.buildtarget if target == None else target
+ directory = get_bb_var(bb_var, target);
+ if not directory or not os.path.isdir(directory):
+ self.log.debug("{}: {} points to {} when target = {}"\
+ .format(self.classname, bb_var, directory, target))
+ raise OSError
+ return directory
+
+ @classmethod
+ def setUpClass(self):
+
+ self.buildtarget = 'core-image-minimal'
+ self.classname = 'VerifyManifest'
+
+ self.log.info("{}: doing bitbake {} as a prerequisite of the test"\
+ .format(self.classname, self.buildtarget))
+ if bitbake(self.buildtarget).status:
+ self.log.debug("{} Failed to setup {}"\
+ .format(self.classname, self.buildtarget))
+ unittest.SkipTest("{}: Cannot setup testing scenario"\
+ .format(self.classname))
+
+ @testcase(1380)
+ def test_SDK_manifest_entries(self):
+ '''Verifying the SDK manifest entries exist, this may take a build'''
+
+ # the setup should bitbake core-image-minimal and here it is required
+ # to do an additional setup for the sdk
+ sdktask = '-c populate_sdk'
+ bbargs = sdktask + ' ' + self.buildtarget
+ self.log.debug("{}: doing bitbake {} as a prerequisite of the test"\
+ .format(self.classname, bbargs))
+ if bitbake(bbargs).status:
+ self.log.debug("{} Failed to bitbake {}"\
+ .format(self.classname, bbargs))
+ unittest.SkipTest("{}: Cannot setup testing scenario"\
+ .format(self.classname))
+
+
+ pkgdata_dir = reverse_dir = {}
+ mfilename = mpath = m_entry = {}
+ # get manifest location based on target to query about
+ d_target= dict(target = self.buildtarget,
+ host = 'nativesdk-packagegroup-sdk-host')
+ try:
+ mdir = self.get_dir_from_bb_var('SDK_DEPLOY', self.buildtarget)
+ for k in d_target.keys():
+ mfilename[k] = "{}-toolchain-{}.{}.manifest".format(
+ get_bb_var("SDK_NAME", self.buildtarget),
+ get_bb_var("SDK_VERSION", self.buildtarget),
+ k)
+ mpath[k] = os.path.join(mdir, mfilename[k])
+ if not os.path.isfile(mpath[k]):
+ self.log.debug("{}: {} does not exist".format(
+ self.classname, mpath[k]))
+ raise IOError
+ m_entry[k] = ManifestEntry(mpath[k])
+
+ pkgdata_dir[k] = self.get_dir_from_bb_var('PKGDATA_DIR',
+ d_target[k])
+ reverse_dir[k] = os.path.join(pkgdata_dir[k],
+ 'runtime-reverse')
+ if not os.path.exists(reverse_dir[k]):
+ self.log.debug("{}: {} does not exist".format(
+ self.classname, reverse_dir[k]))
+ raise IOError
+ except OSError:
+ raise unittest.SkipTest("{}: Error in obtaining manifest dirs"\
+ .format(self.classname))
+ except IOError:
+ msg = "{}: Error cannot find manifests in the specified dir:\n{}"\
+ .format(self.classname, mdir)
+ self.fail(msg)
+
+ for k in d_target.keys():
+ self.log.debug("{}: Check manifest {}".format(
+ self.classname, m_entry[k].file))
+
+ m_entry[k].missing = self.check_manifest_entries(\
+ m_entry[k].file,reverse_dir[k])
+ if m_entry[k].missing:
+ msg = '{}: {} Error has the following missing entries'\
+ .format(self.classname, m_entry[k].file)
+ logmsg = msg+':\n'+'\n'.join(m_entry[k].missing)
+ self.log.debug(logmsg)
+ self.log.info(msg)
+ self.fail(logmsg)
+
+ @testcase(1381)
+ def test_image_manifest_entries(self):
+ '''Verifying the image manifest entries exist'''
+
+ # get manifest location based on target to query about
+ try:
+ mdir = self.get_dir_from_bb_var('DEPLOY_DIR_IMAGE',
+ self.buildtarget)
+ mfilename = get_bb_var("IMAGE_LINK_NAME", self.buildtarget)\
+ + ".manifest"
+ mpath = os.path.join(mdir, mfilename)
+ if not os.path.isfile(mpath): raise IOError
+ m_entry = ManifestEntry(mpath)
+
+ pkgdata_dir = {}
+ pkgdata_dir = self.get_dir_from_bb_var('PKGDATA_DIR',
+ self.buildtarget)
+ revdir = os.path.join(pkgdata_dir, 'runtime-reverse')
+ if not os.path.exists(revdir): raise IOError
+ except OSError:
+ raise unittest.SkipTest("{}: Error in obtaining manifest dirs"\
+ .format(self.classname))
+ except IOError:
+ msg = "{}: Error cannot find manifests in dir:\n{}"\
+ .format(self.classname, mdir)
+ self.fail(msg)
+
+ self.log.debug("{}: Check manifest {}"\
+ .format(self.classname, m_entry.file))
+ m_entry.missing = self.check_manifest_entries(\
+ m_entry.file, revdir)
+ if m_entry.missing:
+ msg = '{}: {} Error has the following missing entries'\
+ .format(self.classname, m_entry.file)
+ logmsg = msg+':\n'+'\n'.join(m_entry.missing)
+ self.log.debug(logmsg)
+ self.log.info(msg)
+ self.fail(logmsg)
diff --git a/meta/lib/oeqa/selftest/recipetool.py b/meta/lib/oeqa/selftest/recipetool.py
index c34ad68..b1f1d2a 100644
--- a/meta/lib/oeqa/selftest/recipetool.py
+++ b/meta/lib/oeqa/selftest/recipetool.py
@@ -492,9 +492,12 @@ class RecipetoolAppendsrcBase(RecipetoolBase):
class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
+
+ @testcase(1273)
def test_recipetool_appendsrcfile_basic(self):
self._test_appendsrcfile('base-files', 'a-file')
+ @testcase(1274)
def test_recipetool_appendsrcfile_basic_wildcard(self):
testrecipe = 'base-files'
self._test_appendsrcfile(testrecipe, 'a-file', options='-w')
@@ -502,12 +505,15 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
bbappendfile = self._check_bbappend(testrecipe, recipefile, self.templayerdir)
self.assertEqual(os.path.basename(bbappendfile), '%s_%%.bbappend' % testrecipe)
+ @testcase(1281)
def test_recipetool_appendsrcfile_subdir_basic(self):
self._test_appendsrcfile('base-files', 'a-file', 'tmp')
+ @testcase(1282)
def test_recipetool_appendsrcfile_subdir_basic_dirdest(self):
self._test_appendsrcfile('base-files', destdir='tmp')
+ @testcase(1280)
def test_recipetool_appendsrcfile_srcdir_basic(self):
testrecipe = 'bash'
srcdir = get_bb_var('S', testrecipe)
@@ -515,12 +521,14 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
subdir = os.path.relpath(srcdir, workdir)
self._test_appendsrcfile(testrecipe, 'a-file', srcdir=subdir)
+ @testcase(1275)
def test_recipetool_appendsrcfile_existing_in_src_uri(self):
testrecipe = 'base-files'
filepath = self._get_first_file_uri(testrecipe)
self.assertTrue(filepath, 'Unable to test, no file:// uri found in SRC_URI for %s' % testrecipe)
self._test_appendsrcfile(testrecipe, filepath, has_src_uri=False)
+ @testcase(1276)
def test_recipetool_appendsrcfile_existing_in_src_uri_diff_params(self):
testrecipe = 'base-files'
subdir = 'tmp'
@@ -530,6 +538,7 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
output = self._test_appendsrcfile(testrecipe, filepath, subdir, has_src_uri=False)
self.assertTrue(any('with different parameters' in l for l in output))
+ @testcase(1277)
def test_recipetool_appendsrcfile_replace_file_srcdir(self):
testrecipe = 'bash'
filepath = 'Makefile.in'
@@ -541,6 +550,7 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
bitbake('%s:do_unpack' % testrecipe)
self.assertEqual(open(self.testfile, 'r').read(), open(os.path.join(srcdir, filepath), 'r').read())
+ @testcase(1278)
def test_recipetool_appendsrcfiles_basic(self, destdir=None):
newfiles = [self.testfile]
for i in range(1, 5):
@@ -550,5 +560,6 @@ class RecipetoolAppendsrcTests(RecipetoolAppendsrcBase):
newfiles.append(testfile)
self._test_appendsrcfiles('gcc', newfiles, destdir=destdir, options='-W')
+ @testcase(1279)
def test_recipetool_appendsrcfiles_basic_subdir(self):
self.test_recipetool_appendsrcfiles_basic(destdir='testdir')
diff --git a/meta/lib/oeqa/selftest/sstatetests.py b/meta/lib/oeqa/selftest/sstatetests.py
index c4efc47..3c23062 100644
--- a/meta/lib/oeqa/selftest/sstatetests.py
+++ b/meta/lib/oeqa/selftest/sstatetests.py
@@ -34,7 +34,7 @@ class SStateTests(SStateBase):
targetarch = get_bb_var('TUNE_ARCH')
self.run_test_sstate_creation(['binutils-cross-'+ targetarch, 'binutils-native'], distro_specific=True, distro_nonspecific=False, temp_sstate_location=True)
- @testcase(975)
+ @testcase(1374)
def test_sstate_creation_distro_specific_fail(self):
targetarch = get_bb_var('TUNE_ARCH')
self.run_test_sstate_creation(['binutils-cross-'+ targetarch, 'binutils-native'], distro_specific=False, distro_nonspecific=True, temp_sstate_location=True, should_pass=False)
@@ -43,7 +43,7 @@ class SStateTests(SStateBase):
def test_sstate_creation_distro_nonspecific_pass(self):
self.run_test_sstate_creation(['glibc-initial'], distro_specific=False, distro_nonspecific=True, temp_sstate_location=True)
- @testcase(976)
+ @testcase(1375)
def test_sstate_creation_distro_nonspecific_fail(self):
self.run_test_sstate_creation(['glibc-initial'], distro_specific=True, distro_nonspecific=False, temp_sstate_location=True, should_pass=False)
@@ -70,11 +70,11 @@ class SStateTests(SStateBase):
targetarch = get_bb_var('TUNE_ARCH')
self.run_test_cleansstate_task(['binutils-cross-' + targetarch, 'binutils-native', 'glibc-initial'], distro_specific=True, distro_nonspecific=True, temp_sstate_location=True)
- @testcase(977)
+ @testcase(1376)
def test_cleansstate_task_distro_nonspecific(self):
self.run_test_cleansstate_task(['glibc-initial'], distro_specific=False, distro_nonspecific=True, temp_sstate_location=True)
- @testcase(977)
+ @testcase(1377)
def test_cleansstate_task_distro_specific(self):
targetarch = get_bb_var('TUNE_ARCH')
self.run_test_cleansstate_task(['binutils-cross-'+ targetarch, 'binutils-native', 'glibc-initial'], distro_specific=True, distro_nonspecific=False, temp_sstate_location=True)
@@ -111,12 +111,12 @@ class SStateTests(SStateBase):
targetarch = get_bb_var('TUNE_ARCH')
self.run_test_rebuild_distro_specific_sstate(['binutils-cross-' + targetarch, 'binutils-native'], temp_sstate_location=True)
- @testcase(175)
+ @testcase(1372)
def test_rebuild_distro_specific_sstate_cross_target(self):
targetarch = get_bb_var('TUNE_ARCH')
self.run_test_rebuild_distro_specific_sstate(['binutils-cross-' + targetarch], temp_sstate_location=True)
- @testcase(175)
+ @testcase(1373)
def test_rebuild_distro_specific_sstate_native_target(self):
self.run_test_rebuild_distro_specific_sstate(['binutils-native'], temp_sstate_location=True)
@@ -211,6 +211,8 @@ class SStateTests(SStateBase):
they're built on a 32 or 64 bit system. Rather than requiring two different
build machines and running a builds, override the variables calling uname()
manually and check using bitbake -S.
+
+ Also check that SDKMACHINE changing doesn't change any of these stamps.
"""
topdir = get_bb_var('TOPDIR')
@@ -219,6 +221,7 @@ class SStateTests(SStateBase):
TMPDIR = \"${TOPDIR}/tmp-sstatesamehash\"
BUILD_ARCH = \"x86_64\"
BUILD_OS = \"linux\"
+SDKMACHINE = \"x86_64\"
""")
self.track_for_cleanup(topdir + "/tmp-sstatesamehash")
bitbake("core-image-sato -S none")
@@ -226,6 +229,7 @@ BUILD_OS = \"linux\"
TMPDIR = \"${TOPDIR}/tmp-sstatesamehash2\"
BUILD_ARCH = \"i686\"
BUILD_OS = \"linux\"
+SDKMACHINE = \"i686\"
""")
self.track_for_cleanup(topdir + "/tmp-sstatesamehash2")
bitbake("core-image-sato -S none")
@@ -233,11 +237,16 @@ BUILD_OS = \"linux\"
def get_files(d):
f = []
for root, dirs, files in os.walk(d):
+ if "core-image-sato" in root:
+ # SDKMACHINE changing will change do_rootfs/do_testimage/do_build stamps of core-image-sato itself
+ # which is safe to ignore
+ continue
f.extend(os.path.join(root, name) for name in files)
return f
files1 = get_files(topdir + "/tmp-sstatesamehash/stamps/")
files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps/")
files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash").replace("i686-linux", "x86_64-linux").replace("i686" + targetvendor + "-linux", "x86_64" + targetvendor + "-linux", ) for x in files2]
+ self.maxDiff = None
self.assertItemsEqual(files1, files2)
@@ -271,11 +280,13 @@ NATIVELSBSTRING = \"DistroB\"
files1 = get_files(topdir + "/tmp-sstatesamehash/stamps/")
files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps/")
files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash") for x in files2]
+ self.maxDiff = None
self.assertItemsEqual(files1, files2)
+ @testcase(1368)
def test_sstate_allarch_samesigs(self):
"""
- The sstate checksums off allarch packages should be independent of whichever
+ The sstate checksums of allarch packages should be independent of whichever
MACHINE is set. Check this using bitbake -S.
Also, rather than duplicate the test, check nativesdk stamps are the same between
the two MACHINE values.
@@ -319,4 +330,50 @@ MACHINE = \"qemuarm\"
files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash") for x in files2]
self.maxDiff = None
self.assertItemsEqual(files1, files2)
-
+
+ @testcase(1369)
+ def test_sstate_sametune_samesigs(self):
+ """
+ The sstate checksums of two identical machines (using the same tune) should be the
+ same, apart from changes within the machine specific stamps directory. We use the
+ qemux86copy machine to test this. Also include multilibs in the test.
+ """
+
+ topdir = get_bb_var('TOPDIR')
+ targetos = get_bb_var('TARGET_OS')
+ targetvendor = get_bb_var('TARGET_VENDOR')
+ self.write_config("""
+TMPDIR = \"${TOPDIR}/tmp-sstatesamehash\"
+MACHINE = \"qemux86\"
+require conf/multilib.conf
+MULTILIBS = "multilib:lib32"
+DEFAULTTUNE_virtclass-multilib-lib32 = "x86"
+""")
+ self.track_for_cleanup(topdir + "/tmp-sstatesamehash")
+ bitbake("world meta-toolchain -S none")
+ self.write_config("""
+TMPDIR = \"${TOPDIR}/tmp-sstatesamehash2\"
+MACHINE = \"qemux86copy\"
+require conf/multilib.conf
+MULTILIBS = "multilib:lib32"
+DEFAULTTUNE_virtclass-multilib-lib32 = "x86"
+""")
+ self.track_for_cleanup(topdir + "/tmp-sstatesamehash2")
+ bitbake("world meta-toolchain -S none")
+
+ def get_files(d):
+ f = []
+ for root, dirs, files in os.walk(d):
+ for name in files:
+ if "meta-environment" in root or "cross-canadian" in root:
+ continue
+ if "qemux86copy-" in root or "qemux86-" in root:
+ continue
+ if "do_build" not in name and "do_populate_sdk" not in name:
+ f.append(os.path.join(root, name))
+ return f
+ files1 = get_files(topdir + "/tmp-sstatesamehash/stamps")
+ files2 = get_files(topdir + "/tmp-sstatesamehash2/stamps")
+ files2 = [x.replace("tmp-sstatesamehash2", "tmp-sstatesamehash") for x in files2]
+ self.maxDiff = None
+ self.assertItemsEqual(files1, files2)
diff --git a/meta/lib/oeqa/selftest/wic.py b/meta/lib/oeqa/selftest/wic.py
index 3dc54a4..ea78e22 100644
--- a/meta/lib/oeqa/selftest/wic.py
+++ b/meta/lib/oeqa/selftest/wic.py
@@ -31,50 +31,54 @@ from shutil import rmtree
from oeqa.selftest.base import oeSelfTest
from oeqa.utils.commands import runCmd, bitbake, get_bb_var
+from oeqa.utils.decorators import testcase
+
class Wic(oeSelfTest):
"""Wic test class."""
resultdir = "/var/tmp/wic/build/"
+ image_is_ready = False
- @classmethod
- def setUpClass(cls):
- """Build wic runtime dependencies."""
- bitbake('syslinux syslinux-native parted-native gptfdisk-native '
- 'dosfstools-native mtools-native')
- Wic.image_is_ready = False
-
- def setUp(self):
+ def setUpLocal(self):
"""This code is executed before each test method."""
+ self.write_config('IMAGE_FSTYPES += " hddimg"\nMACHINE_FEATURES_append = " efi"\n')
+
+ # Do this here instead of in setUpClass as the base setUp does some
+ # clean up which can result in the native tools built earlier in
+ # setUpClass being unavailable.
if not Wic.image_is_ready:
- # build core-image-minimal with required features
- features = 'IMAGE_FSTYPES += " hddimg"\nMACHINE_FEATURES_append = " efi"\n'
- self.append_config(features)
+ bitbake('syslinux syslinux-native parted-native gptfdisk-native '
+ 'dosfstools-native mtools-native')
bitbake('core-image-minimal')
- # set this class variable to avoid buiding image many times
Wic.image_is_ready = True
rmtree(self.resultdir, ignore_errors=True)
- def test01_help(self):
+ @testcase(1208)
+ def test_help(self):
"""Test wic --help"""
self.assertEqual(0, runCmd('wic --help').status)
- def test02_createhelp(self):
+ @testcase(1209)
+ def test_createhelp(self):
"""Test wic create --help"""
self.assertEqual(0, runCmd('wic create --help').status)
- def test03_listhelp(self):
+ @testcase(1210)
+ def test_listhelp(self):
"""Test wic list --help"""
self.assertEqual(0, runCmd('wic list --help').status)
- def test04_build_image_name(self):
+ @testcase(1211)
+ def test_build_image_name(self):
"""Test wic create directdisk --image-name core-image-minimal"""
self.assertEqual(0, runCmd("wic create directdisk "
"--image-name core-image-minimal").status)
self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
- def test05_build_artifacts(self):
+ @testcase(1212)
+ def test_build_artifacts(self):
"""Test wic create directdisk providing all artifacts."""
vars = dict((var.lower(), get_bb_var(var, 'core-image-minimal')) \
for var in ('STAGING_DATADIR', 'DEPLOY_DIR_IMAGE',
@@ -87,34 +91,41 @@ class Wic(oeSelfTest):
self.assertEqual(0, status)
self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
- def test06_gpt_image(self):
+ @testcase(1157)
+ def test_gpt_image(self):
"""Test creation of core-image-minimal with gpt table and UUID boot"""
self.assertEqual(0, runCmd("wic create directdisk-gpt "
"--image-name core-image-minimal").status)
self.assertEqual(1, len(glob(self.resultdir + "directdisk-*.direct")))
- def test07_unsupported_subcommand(self):
+ @testcase(1213)
+ def test_unsupported_subcommand(self):
"""Test unsupported subcommand"""
self.assertEqual(1, runCmd('wic unsupported',
ignore_status=True).status)
- def test08_no_command(self):
+ @testcase(1214)
+ def test_no_command(self):
"""Test wic without command"""
self.assertEqual(1, runCmd('wic', ignore_status=True).status)
- def test09_help_kickstart(self):
+ @testcase(1215)
+ def test_help_overview(self):
"""Test wic help overview"""
self.assertEqual(0, runCmd('wic help overview').status)
- def test10_help_plugins(self):
+ @testcase(1216)
+ def test_help_plugins(self):
"""Test wic help plugins"""
self.assertEqual(0, runCmd('wic help plugins').status)
- def test11_help_kickstart(self):
+ @testcase(1217)
+ def test_help_kickstart(self):
"""Test wic help kickstart"""
self.assertEqual(0, runCmd('wic help kickstart').status)
- def test12_compress_gzip(self):
+ @testcase(1264)
+ def test_compress_gzip(self):
"""Test compressing an image with gzip"""
self.assertEqual(0, runCmd("wic create directdisk "
"--image-name core-image-minimal "
@@ -122,7 +133,8 @@ class Wic(oeSelfTest):
self.assertEqual(1, len(glob(self.resultdir + \
"directdisk-*.direct.gz")))
- def test13_compress_gzip(self):
+ @testcase(1265)
+ def test_compress_bzip2(self):
"""Test compressing an image with bzip2"""
self.assertEqual(0, runCmd("wic create directdisk "
"--image-name core-image-minimal "
@@ -130,7 +142,8 @@ class Wic(oeSelfTest):
self.assertEqual(1, len(glob(self.resultdir + \
"directdisk-*.direct.bz2")))
- def test14_compress_gzip(self):
+ @testcase(1266)
+ def test_compress_xz(self):
"""Test compressing an image with xz"""
self.assertEqual(0, runCmd("wic create directdisk "
"--image-name core-image-minimal "
@@ -138,13 +151,15 @@ class Wic(oeSelfTest):
self.assertEqual(1, len(glob(self.resultdir + \
"directdisk-*.direct.xz")))
- def test15_wrong_compressor(self):
+ @testcase(1267)
+ def test_wrong_compressor(self):
"""Test how wic breaks if wrong compressor is provided"""
self.assertEqual(2, runCmd("wic create directdisk "
"--image-name core-image-minimal "
"-c wrong", ignore_status=True).status)
- def test16_rootfs_indirect_recipes(self):
+ @testcase(1268)
+ def test_rootfs_indirect_recipes(self):
"""Test usage of rootfs plugin with rootfs recipes"""
wks = "directdisk-multi-rootfs"
self.assertEqual(0, runCmd("wic create %s "
@@ -154,7 +169,8 @@ class Wic(oeSelfTest):
% wks).status)
self.assertEqual(1, len(glob(self.resultdir + "%s*.direct" % wks)))
- def test17_rootfs_artifacts(self):
+ @testcase(1269)
+ def test_rootfs_artifacts(self):
"""Test usage of rootfs plugin with rootfs paths"""
vars = dict((var.lower(), get_bb_var(var, 'core-image-minimal')) \
for var in ('STAGING_DATADIR', 'DEPLOY_DIR_IMAGE',
@@ -171,14 +187,16 @@ class Wic(oeSelfTest):
self.assertEqual(1, len(glob(self.resultdir + \
"%(wks)s-*.direct" % vars)))
- def test18_iso_image(self):
- """Test creation of hybrid iso imagewith legacy and EFI boot"""
+ @testcase(1346)
+ def test_iso_image(self):
+ """Test creation of hybrid iso image with legacy and EFI boot"""
self.assertEqual(0, runCmd("wic create mkhybridiso "
"--image-name core-image-minimal").status)
self.assertEqual(1, len(glob(self.resultdir + "HYBRID_ISO_IMG-*.direct")))
self.assertEqual(1, len(glob(self.resultdir + "HYBRID_ISO_IMG-*.iso")))
- def test19_image_env(self):
+ @testcase(1347)
+ def test_image_env(self):
"""Test generation of <image>.env files."""
image = 'core-image-minimal'
stdir = get_bb_var('STAGING_DIR_TARGET', image)
@@ -200,7 +218,8 @@ class Wic(oeSelfTest):
self.assertTrue(var in content, "%s is not in .env file" % var)
self.assertTrue(content[var])
- def test20_wic_image_type(self):
+ @testcase(1351)
+ def test_wic_image_type(self):
"""Test building wic images by bitbake"""
self.assertEqual(0, bitbake('wic-image-minimal').status)
@@ -214,21 +233,24 @@ class Wic(oeSelfTest):
self.assertTrue(os.path.islink(path))
self.assertTrue(os.path.isfile(os.path.realpath(path)))
- def test21_qemux86_directdisk(self):
+ @testcase(1348)
+ def test_qemux86_directdisk(self):
"""Test creation of qemux-86-directdisk image"""
image = "qemux86-directdisk"
self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
% image).status)
self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
- def test22_mkgummidisk(self):
+ @testcase(1349)
+ def test_mkgummidisk(self):
"""Test creation of mkgummidisk image"""
image = "mkgummidisk"
self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
% image).status)
self.assertEqual(1, len(glob(self.resultdir + "%s-*direct" % image)))
- def test23_mkefidisk(self):
+ @testcase(1350)
+ def test_mkefidisk(self):
"""Test creation of mkefidisk image"""
image = "mkefidisk"
self.assertEqual(0, runCmd("wic create %s -e core-image-minimal" \
diff --git a/meta/lib/oeqa/utils/decorators.py b/meta/lib/oeqa/utils/decorators.py
index b6adcb1..0d79223 100644
--- a/meta/lib/oeqa/utils/decorators.py
+++ b/meta/lib/oeqa/utils/decorators.py
@@ -33,6 +33,10 @@ class getResults(object):
ret.append(s.replace("setUpModule (", "").replace(")",""))
else:
ret.append(s)
+ # Append also the test without the full path
+ testname = s.split('.')[-1]
+ if testname:
+ ret.append(testname)
return ret
self.faillist = handleList(upperf.f_locals['result'].failures)
self.errorlist = handleList(upperf.f_locals['result'].errors)
@@ -53,11 +57,11 @@ class skipIfFailure(object):
self.testcase = testcase
def __call__(self,f):
- def wrapped_f(*args):
+ def wrapped_f(*args, **kwargs):
res = getResults()
if self.testcase in (res.getFailList() or res.getErrorList()):
raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase)
- return f(*args)
+ return f(*args, **kwargs)
wrapped_f.__name__ = f.__name__
return wrapped_f
@@ -67,11 +71,11 @@ class skipIfSkipped(object):
self.testcase = testcase
def __call__(self,f):
- def wrapped_f(*args):
+ def wrapped_f(*args, **kwargs):
res = getResults()
if self.testcase in res.getSkipList():
raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase)
- return f(*args)
+ return f(*args, **kwargs)
wrapped_f.__name__ = f.__name__
return wrapped_f
@@ -81,13 +85,13 @@ class skipUnlessPassed(object):
self.testcase = testcase
def __call__(self,f):
- def wrapped_f(*args):
+ def wrapped_f(*args, **kwargs):
res = getResults()
if self.testcase in res.getSkipList() or \
self.testcase in res.getFailList() or \
self.testcase in res.getErrorList():
raise unittest.SkipTest("Testcase dependency not met: %s" % self.testcase)
- return f(*args)
+ return f(*args, **kwargs)
wrapped_f.__name__ = f.__name__
wrapped_f._depends_on = self.testcase
return wrapped_f
@@ -98,8 +102,8 @@ class testcase(object):
self.test_case = test_case
def __call__(self, func):
- def wrapped_f(*args):
- return func(*args)
+ def wrapped_f(*args, **kwargs):
+ return func(*args, **kwargs)
wrapped_f.test_case = self.test_case
wrapped_f.__name__ = func.__name__
return wrapped_f
@@ -111,6 +115,12 @@ class NoParsingFilter(logging.Filter):
def LogResults(original_class):
orig_method = original_class.run
+ from time import strftime, gmtime
+ caller = os.path.basename(sys.argv[0])
+ timestamp = strftime('%Y%m%d%H%M%S',gmtime())
+ logfile = os.path.join(os.getcwd(),'results-'+caller+'.'+timestamp+'.log')
+ linkfile = os.path.join(os.getcwd(),'results-'+caller+'.log')
+
#rewrite the run method of unittest.TestCase to add testcase logging
def run(self, result, *args, **kws):
orig_method(self, result, *args, **kws)
@@ -127,14 +137,13 @@ def LogResults(original_class):
#create custom logging level for filtering.
custom_log_level = 100
logging.addLevelName(custom_log_level, 'RESULTS')
- caller = os.path.basename(sys.argv[0])
def results(self, message, *args, **kws):
if self.isEnabledFor(custom_log_level):
self.log(custom_log_level, message, *args, **kws)
logging.Logger.results = results
- logging.basicConfig(filename=os.path.join(os.getcwd(),'results-'+caller+'.log'),
+ logging.basicConfig(filename=logfile,
filemode='w',
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s',
datefmt='%H:%M:%S',
@@ -162,7 +171,13 @@ def LogResults(original_class):
if passed:
local_log.results("Testcase "+str(test_case)+": PASSED")
+ # Create symlink to the current log
+ if os.path.exists(linkfile):
+ os.remove(linkfile)
+ os.symlink(logfile, linkfile)
+
original_class.run = run
+
return original_class
class TimeOut(BaseException):
diff --git a/meta/lib/oeqa/utils/dump.py b/meta/lib/oeqa/utils/dump.py
index 4ae871c..63a591d 100644
--- a/meta/lib/oeqa/utils/dump.py
+++ b/meta/lib/oeqa/utils/dump.py
@@ -16,9 +16,20 @@ class BaseDumper(object):
def __init__(self, cmds, parent_dir):
self.cmds = []
- self.parent_dir = parent_dir
+ # Some testing doesn't inherit testimage, so it is needed
+ # to set some defaults.
+ self.parent_dir = parent_dir or "/tmp/oe-saved-tests"
+ dft_cmds = """ top -bn1
+ iostat -x -z -N -d -p ALL 20 2
+ ps -ef
+ free
+ df
+ memstat
+ dmesg
+ ip -s link
+ netstat -an"""
if not cmds:
- return
+ cmds = dft_cmds
for cmd in cmds.split('\n'):
cmd = cmd.lstrip()
if not cmd or cmd[0] == '#':
diff --git a/meta/lib/oeqa/utils/ftools.py b/meta/lib/oeqa/utils/ftools.py
index 64ebe3d..1bd9a30 100644
--- a/meta/lib/oeqa/utils/ftools.py
+++ b/meta/lib/oeqa/utils/ftools.py
@@ -1,12 +1,19 @@
import os
import re
+import errno
def write_file(path, data):
+ # In case data is None, return immediately
+ if data is None:
+ return
wdata = data.rstrip() + "\n"
with open(path, "w") as f:
f.write(wdata)
def append_file(path, data):
+ # In case data is None, return immediately
+ if data is None:
+ return
wdata = data.rstrip() + "\n"
with open(path, "a") as f:
f.write(wdata)
@@ -18,7 +25,18 @@ def read_file(path):
return data
def remove_from_file(path, data):
- lines = read_file(path).splitlines()
+ # In case data is None, return immediately
+ if data is None:
+ return
+ try:
+ rdata = read_file(path)
+ except IOError as e:
+ # if file does not exit, just quit, otherwise raise an exception
+ if e.errno == errno.ENOENT:
+ return
+ else:
+ raise
+ lines = rdata.splitlines()
rmdata = data.strip().splitlines()
for l in rmdata:
for c in range(0, lines.count(l)):
diff --git a/meta/lib/oeqa/utils/qemurunner.py b/meta/lib/oeqa/utils/qemurunner.py
index d32c9db..bdc6e0a 100644
--- a/meta/lib/oeqa/utils/qemurunner.py
+++ b/meta/lib/oeqa/utils/qemurunner.py
@@ -13,12 +13,20 @@ import re
import socket
import select
import errno
+import string
import threading
+import codecs
from oeqa.utils.dump import HostDumper
import logging
logger = logging.getLogger("BitBake.QemuRunner")
+# Get Unicode non printable control chars
+control_range = range(0,32)+range(127,160)
+control_chars = [unichr(x) for x in control_range
+ if unichr(x) not in string.printable]
+re_control_char = re.compile('[%s]' % re.escape("".join(control_chars)))
+
class QemuRunner:
def __init__(self, machine, rootfs, display, tmpdir, deploy_dir_image, logfile, boottime, dump_dir, dump_host_cmds):
@@ -61,7 +69,10 @@ class QemuRunner:
def log(self, msg):
if self.logfile:
- with open(self.logfile, "a") as f:
+ # It is needed to sanitize the data received from qemu
+ # because is possible to have control characters
+ msg = re_control_char.sub('', unicode(msg, 'utf-8'))
+ with codecs.open(self.logfile, "a", encoding="utf-8") as f:
f.write("%s" % msg)
def getOutput(self, o):
@@ -170,6 +181,9 @@ class QemuRunner:
cmdline = ''
with open('/proc/%s/cmdline' % self.qemupid) as p:
cmdline = p.read()
+ # It is needed to sanitize the data received
+ # because is possible to have control characters
+ cmdline = re_control_char.sub('', cmdline)
try:
ips = re.findall("((?:[0-9]{1,3}\.){3}[0-9]{1,3})", cmdline.split("ip=")[1])
if not ips or len(ips) != 3:
@@ -186,7 +200,6 @@ class QemuRunner:
logger.info("Target IP: %s" % self.ip)
logger.info("Server IP: %s" % self.server_ip)
- logger.info("Starting logging thread")
self.thread = LoggingThread(self.log, threadsock, logger)
self.thread.start()
if not self.thread.connection_established.wait(self.boottime):
@@ -197,6 +210,7 @@ class QemuRunner:
self.stop_thread()
return False
+ logger.info("Output from runqemu:\n%s", self.getOutput(output))
logger.info("Waiting at most %d seconds for login banner" % self.boottime)
endtime = time.time() + self.boottime
socklist = [self.server_socket]
@@ -259,8 +273,9 @@ class QemuRunner:
def stop(self):
self.stop_thread()
- if self.runqemu:
+ if hasattr(self, "origchldhandler"):
signal.signal(signal.SIGCHLD, self.origchldhandler)
+ if self.runqemu:
os.kill(self.monitorpid, signal.SIGKILL)
logger.info("Sending SIGTERM to runqemu")
try:
@@ -280,7 +295,6 @@ class QemuRunner:
self.server_socket = None
self.qemupid = None
self.ip = None
- signal.signal(signal.SIGCHLD, self.origchldhandler)
def stop_thread(self):
if self.thread and self.thread.is_alive():
@@ -440,9 +454,9 @@ class LoggingThread(threading.Thread):
def eventloop(self):
poll = select.poll()
- eventmask = self.errorevents | self.readevents
+ event_read_mask = self.errorevents | self.readevents
poll.register(self.serversock.fileno())
- poll.register(self.readpipe, eventmask)
+ poll.register(self.readpipe, event_read_mask)
breakout = False
self.running = True
@@ -466,7 +480,7 @@ class LoggingThread(threading.Thread):
self.readsock, _ = self.serversock.accept()
self.readsock.setblocking(0)
poll.unregister(self.serversock.fileno())
- poll.register(self.readsock.fileno())
+ poll.register(self.readsock.fileno(), event_read_mask)
self.logger.info("Setting connection established event")
self.connection_established.set()
diff --git a/meta/recipes-bsp/gnu-efi/gnu-efi/gcc46-compatibility.patch b/meta/recipes-bsp/gnu-efi/gnu-efi/gcc46-compatibility.patch
new file mode 100644
index 0000000..0ce6d7b
--- /dev/null
+++ b/meta/recipes-bsp/gnu-efi/gnu-efi/gcc46-compatibility.patch
@@ -0,0 +1,21 @@
+don't break with old compilers and -DGNU_EFI_USE_MS_ABI
+It's entirely legitimate to request GNU_EFI_USE_MS_ABI even if the current
+compiler doesn't support it, and gnu-efi should transparently fall back to
+using legacy techniques to set the calling convention. We don't get type
+checking, but at least it will still compile.
+
+Author: Steve Langasek <steve.langasek at ubuntu.com>
+Upstream-Status: Pending
+Index: gnu-efi-3.0.3/inc/x86_64/efibind.h
+===================================================================
+--- gnu-efi-3.0.3.orig/inc/x86_64/efibind.h
++++ gnu-efi-3.0.3/inc/x86_64/efibind.h
+@@ -25,8 +25,6 @@ Revision History
+ #if defined(GNU_EFI_USE_MS_ABI)
+ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
+ #define HAVE_USE_MS_ABI 1
+- #else
+- #error Compiler is too old for GNU_EFI_USE_MS_ABI
+ #endif
+ #endif
+
diff --git a/meta/recipes-bsp/gnu-efi/gnu-efi_3.0.3.bb b/meta/recipes-bsp/gnu-efi/gnu-efi_3.0.3.bb
index 1a1ba40..eca3459 100644
--- a/meta/recipes-bsp/gnu-efi/gnu-efi_3.0.3.bb
+++ b/meta/recipes-bsp/gnu-efi/gnu-efi_3.0.3.bb
@@ -18,6 +18,7 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.bz2 \
file://parallel-make-archives.patch \
file://lib-Makefile-fix-parallel-issue.patch \
file://gnu-efi-Make-setjmp.S-portable-to-ARM.patch \
+ file://gcc46-compatibility.patch \
"
SRC_URI[md5sum] = "15a4bcbc18a9a5e8110ed955970622e6"
diff --git a/meta/recipes-bsp/grub/files/CVE-2015-8370.patch b/meta/recipes-bsp/grub/files/CVE-2015-8370.patch
new file mode 100644
index 0000000..78f514e
--- /dev/null
+++ b/meta/recipes-bsp/grub/files/CVE-2015-8370.patch
@@ -0,0 +1,59 @@
+From 451d80e52d851432e109771bb8febafca7a5f1f2 Mon Sep 17 00:00:00 2001
+From: Hector Marco-Gisbert <hecmargi at upv.es>
+Date: Wed, 16 Dec 2015 07:57:18 +0300
+Subject: [PATCH] Fix security issue when reading username and password
+
+This patch fixes two integer underflows at:
+ * grub-core/lib/crypto.c
+ * grub-core/normal/auth.c
+
+CVE-2015-8370
+
+Signed-off-by: Hector Marco-Gisbert <hecmargi at upv.es>
+Signed-off-by: Ismael Ripoll-Ripoll <iripoll at disca.upv.es>
+Also-By: Andrey Borzenkov <arvidjaar at gmail.com>
+
+Upstream-Status: Backport
+
+http://git.savannah.gnu.org/cgit/grub.git/commit/?id=451d80e52d851432e109771bb8febafca7a5f1f2
+
+CVE: CVE-2015-8370
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ grub-core/lib/crypto.c | 3 ++-
+ grub-core/normal/auth.c | 7 +++++--
+ 2 files changed, 7 insertions(+), 3 deletions(-)
+
+Index: git/grub-core/lib/crypto.c
+===================================================================
+--- git.orig/grub-core/lib/crypto.c
++++ git/grub-core/lib/crypto.c
+@@ -458,7 +458,8 @@ grub_password_get (char buf[], unsigned
+
+ if (key == '\b')
+ {
+- cur_len--;
++ if (cur_len)
++ cur_len--;
+ continue;
+ }
+
+Index: git/grub-core/normal/auth.c
+===================================================================
+--- git.orig/grub-core/normal/auth.c
++++ git/grub-core/normal/auth.c
+@@ -174,8 +174,11 @@ grub_username_get (char buf[], unsigned
+
+ if (key == '\b')
+ {
+- cur_len--;
+- grub_printf ("\b");
++ if (cur_len)
++ {
++ cur_len--;
++ grub_printf ("\b");
++ }
+ continue;
+ }
+
diff --git a/meta/recipes-bsp/grub/grub2.inc b/meta/recipes-bsp/grub/grub2.inc
index 312771b..fe2407c 100644
--- a/meta/recipes-bsp/grub/grub2.inc
+++ b/meta/recipes-bsp/grub/grub2.inc
@@ -27,6 +27,7 @@ SRC_URI = "ftp://ftp.gnu.org/gnu/grub/grub-${PV}.tar.gz \
file://0001-Unset-need_charset_alias-when-building-for-musl.patch \
file://0001-parse_dhcp_vendor-Add-missing-const-qualifiers.patch \
file://grub2-fix-initrd-size-bug.patch \
+ file://CVE-2015-8370.patch \
"
DEPENDS = "flex-native bison-native xz"
diff --git a/meta/recipes-bsp/gummiboot/gummiboot/0001-console-Fix-C-syntax-errors-for-function-declaration.patch b/meta/recipes-bsp/gummiboot/gummiboot/0001-console-Fix-C-syntax-errors-for-function-declaration.patch
new file mode 100644
index 0000000..fa50bc4
--- /dev/null
+++ b/meta/recipes-bsp/gummiboot/gummiboot/0001-console-Fix-C-syntax-errors-for-function-declaration.patch
@@ -0,0 +1,74 @@
+From 55957faf1272c8f5f304909faeebf647a78e3701 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Wed, 9 Sep 2015 07:19:45 +0000
+Subject: [PATCH] console: Fix C syntax errors for function declaration
+
+To address this, the semicolons after the function parameters should be
+replaced by commas, and the last one should be omitted
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ src/efi/console.c | 26 +++++++++++++-------------
+ 1 file changed, 13 insertions(+), 13 deletions(-)
+
+diff --git a/src/efi/console.c b/src/efi/console.c
+index 6206c80..66aa88f 100644
+--- a/src/efi/console.c
++++ b/src/efi/console.c
+@@ -27,8 +27,8 @@
+ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL;
+
+ typedef EFI_STATUS (EFIAPI *EFI_INPUT_RESET_EX)(
+- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This;
+- BOOLEAN ExtendedVerification;
++ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
++ BOOLEAN ExtendedVerification
+ );
+
+ typedef UINT8 EFI_KEY_TOGGLE_STATE;
+@@ -44,29 +44,29 @@ typedef struct {
+ } EFI_KEY_DATA;
+
+ typedef EFI_STATUS (EFIAPI *EFI_INPUT_READ_KEY_EX)(
+- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This;
+- EFI_KEY_DATA *KeyData;
++ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
++ EFI_KEY_DATA *KeyData
+ );
+
+ typedef EFI_STATUS (EFIAPI *EFI_SET_STATE)(
+- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This;
+- EFI_KEY_TOGGLE_STATE *KeyToggleState;
++ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
++ EFI_KEY_TOGGLE_STATE *KeyToggleState
+ );
+
+ typedef EFI_STATUS (EFIAPI *EFI_KEY_NOTIFY_FUNCTION)(
+- EFI_KEY_DATA *KeyData;
++ EFI_KEY_DATA *KeyData
+ );
+
+ typedef EFI_STATUS (EFIAPI *EFI_REGISTER_KEYSTROKE_NOTIFY)(
+- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This;
+- EFI_KEY_DATA KeyData;
+- EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction;
+- VOID **NotifyHandle;
++ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
++ EFI_KEY_DATA KeyData,
++ EFI_KEY_NOTIFY_FUNCTION KeyNotificationFunction,
++ VOID **NotifyHandle
+ );
+
+ typedef EFI_STATUS (EFIAPI *EFI_UNREGISTER_KEYSTROKE_NOTIFY)(
+- struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This;
+- VOID *NotificationHandle;
++ struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
++ VOID *NotificationHandle
+ );
+
+ typedef struct _EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL {
+--
+2.5.1
+
diff --git a/meta/recipes-bsp/gummiboot/gummiboot_git.bb b/meta/recipes-bsp/gummiboot/gummiboot_git.bb
index 91c3db9..376ab54 100644
--- a/meta/recipes-bsp/gummiboot/gummiboot_git.bb
+++ b/meta/recipes-bsp/gummiboot/gummiboot_git.bb
@@ -13,6 +13,7 @@ PV = "48+git${SRCPV}"
SRCREV = "2bcd919c681c952eb867ef1bdb458f1bc49c2d55"
SRC_URI = "git://anongit.freedesktop.org/gummiboot \
file://fix-objcopy.patch \
+ file://0001-console-Fix-C-syntax-errors-for-function-declaration.patch \
"
# Note: Add COMPATIBLE_HOST here is only because it depends on gnu-efi
@@ -28,6 +29,8 @@ EXTRA_OECONF = "--disable-manpages --with-efi-includedir=${STAGING_INCDIR} \
EXTRA_OEMAKE += "gummibootlibdir=${libdir}/gummiboot"
+TUNE_CCARGS_remove = "-mfpmath=sse"
+
do_deploy () {
install ${B}/gummiboot*.efi ${DEPLOYDIR}
}
diff --git a/meta/recipes-bsp/hostap/hostap-utils-0.4.7/0001-Define-_u32-__s32-__u16-__s16-__u8-in-terms-of-c99-t.patch b/meta/recipes-bsp/hostap/hostap-utils-0.4.7/0001-Define-_u32-__s32-__u16-__s16-__u8-in-terms-of-c99-t.patch
new file mode 100644
index 0000000..b44dca3
--- /dev/null
+++ b/meta/recipes-bsp/hostap/hostap-utils-0.4.7/0001-Define-_u32-__s32-__u16-__s16-__u8-in-terms-of-c99-t.patch
@@ -0,0 +1,36 @@
+From 742fb110d9841a04b3ced256b0bf80ff304dcaff Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Mon, 31 Aug 2015 05:45:08 +0000
+Subject: [PATCH] Define _u32/__s32/__u16/__s16/__u8 in terms of c99 types
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ wireless_copy.h | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/wireless_copy.h b/wireless_copy.h
+index 8208258..1171a35 100644
+--- a/wireless_copy.h
++++ b/wireless_copy.h
+@@ -86,11 +86,11 @@
+ #else
+ #include <sys/types.h>
+ #include <net/if.h>
+-typedef __uint32_t __u32;
+-typedef __int32_t __s32;
+-typedef __uint16_t __u16;
+-typedef __int16_t __s16;
+-typedef __uint8_t __u8;
++typedef u_int32_t __u32;
++typedef int32_t __s32;
++typedef u_int16_t __u16;
++typedef int16_t __s16;
++typedef u_int8_t __u8;
+ #ifndef __user
+ #define __user
+ #endif /* __user */
+--
+2.5.1
+
diff --git a/meta/recipes-bsp/hostap/hostap-utils.inc b/meta/recipes-bsp/hostap/hostap-utils.inc
index 89d977a..140321d 100644
--- a/meta/recipes-bsp/hostap/hostap-utils.inc
+++ b/meta/recipes-bsp/hostap/hostap-utils.inc
@@ -10,7 +10,9 @@ SECTION = "kernel/userland"
PR = "r4"
SRC_URI = "http://hostap.epitest.fi/releases/hostap-utils-${PV}.tar.gz \
- file://hostap-fw-load.patch"
+ file://hostap-fw-load.patch \
+ file://0001-Define-_u32-__s32-__u16-__s16-__u8-in-terms-of-c99-t.patch \
+"
S = "${WORKDIR}/hostap-utils-${PV}"
BINARIES = "hostap_crypt_conf hostap_diag hostap_fw_load hostap_io_debug \
diff --git a/meta/recipes-connectivity/avahi/avahi-ui_0.6.31.bb b/meta/recipes-connectivity/avahi/avahi-ui_0.6.31.bb
index eea4d70..0d42b90 100644
--- a/meta/recipes-connectivity/avahi/avahi-ui_0.6.31.bb
+++ b/meta/recipes-connectivity/avahi/avahi-ui_0.6.31.bb
@@ -6,7 +6,8 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=2d5025d4aa3495befef8f17206a5b0a1 \
require avahi.inc
-inherit python-dir pythonnative
+inherit python-dir pythonnative distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
PACKAGECONFIG ??= "python"
PACKAGECONFIG[python] = "--enable-python,--disable-python,python-native python"
diff --git a/meta/recipes-connectivity/bind/bind/0001-lib-dns-gen.c-fix-too-long-error.patch b/meta/recipes-connectivity/bind/bind/0001-lib-dns-gen.c-fix-too-long-error.patch
new file mode 100644
index 0000000..1ed858c
--- /dev/null
+++ b/meta/recipes-connectivity/bind/bind/0001-lib-dns-gen.c-fix-too-long-error.patch
@@ -0,0 +1,34 @@
+From 5bc3167a8b714ec0c4a3f1c7f3b9411296ec0a23 Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang at windriver.com>
+Date: Wed, 16 Sep 2015 20:23:47 -0700
+Subject: [PATCH] lib/dns/gen.c: fix too long error
+
+The 512 is a little short when build in deep dir, and cause "too long"
+error, use PATH_MAX if defined.
+
+Upstream-Status: Pending
+
+Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
+---
+ lib/dns/gen.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/lib/dns/gen.c b/lib/dns/gen.c
+index 51a0435..3d7214f 100644
+--- a/lib/dns/gen.c
++++ b/lib/dns/gen.c
+@@ -148,7 +148,11 @@ static const char copyright[] =
+ #define TYPECLASSBUF (TYPECLASSLEN + 1)
+ #define TYPECLASSFMT "%" STR(TYPECLASSLEN) "[-0-9a-z]_%d"
+ #define ATTRIBUTESIZE 256
++#ifdef PATH_MAX
++#define DIRNAMESIZE PATH_MAX
++#else
+ #define DIRNAMESIZE 512
++#endif
+
+ static struct cc {
+ struct cc *next;
+--
+1.7.9.5
+
diff --git a/meta/recipes-connectivity/bind/bind/CVE-2015-8000.patch b/meta/recipes-connectivity/bind/bind/CVE-2015-8000.patch
new file mode 100644
index 0000000..e1c8052
--- /dev/null
+++ b/meta/recipes-connectivity/bind/bind/CVE-2015-8000.patch
@@ -0,0 +1,278 @@
+From 8259daad7242ab2af8731681177ef7e948a15ece Mon Sep 17 00:00:00 2001
+From: Mark Andrews <marka at isc.org>
+Date: Mon, 16 Nov 2015 13:12:20 +1100
+Subject: [PATCH] 4260. [security] Insufficient testing when parsing a
+ message allowed records with an incorrect class to be
+ be accepted, triggering a REQUIRE failure when those
+ records were subsequently cached. (CVE-2015-8000) [RT
+ #4098]
+
+(cherry picked from commit c8821d124c532e0a65752b378f924d4259499fd3)
+(cherry picked from commit 3a4c24c4a52d4a2d21d2decbde3d4e514e27d51c)
+
+
+Upstream-Status: Backport
+
+https://source.isc.org/cgi-bin/gitweb.cgi?p=bind9.git;a=commit;h=8259daad7242ab2af8731681177ef7e948a15ece
+
+CVE: CVE-2015-8000
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ CHANGES | 5 +++++
+ bin/tests/system/start.pl | 5 ++++-
+ doc/arm/notes.xml | 9 +++++++++
+ lib/dns/include/dns/message.h | 13 +++++++++++--
+ lib/dns/message.c | 45 ++++++++++++++++++++++++++++++++++++++-----
+ lib/dns/resolver.c | 9 +++++++++
+ lib/dns/xfrin.c | 2 ++
+ 7 files changed, 80 insertions(+), 8 deletions(-)
+
+Index: bind-9.10.2-P4/bin/tests/system/start.pl
+===================================================================
+--- bind-9.10.2-P4.orig/bin/tests/system/start.pl
++++ bind-9.10.2-P4/bin/tests/system/start.pl
+@@ -68,6 +68,7 @@ my $NAMED = $ENV{'NAMED'};
+ my $LWRESD = $ENV{'LWRESD'};
+ my $DIG = $ENV{'DIG'};
+ my $PERL = $ENV{'PERL'};
++my $PYTHON = $ENV{'PYTHON'};
+
+ # Start the server(s)
+
+@@ -213,7 +214,9 @@ sub start_server {
+ $pid_file = "lwresd.pid";
+ } elsif ($server =~ /^ans/) {
+ $cleanup_files = "{ans.run}";
+- if (-e "$testdir/$server/ans.pl") {
++ if (-e "$testdir/$server/ans.py") {
++ $command = "$PYTHON ans.py 10.53.0.$' 5300";
++ } elsif (-e "$testdir/$server/ans.pl") {
+ $command = "$PERL ans.pl";
+ } else {
+ $command = "$PERL $topdir/ans.pl 10.53.0.$'";
+Index: bind-9.10.2-P4/doc/arm/notes.xml
+===================================================================
+--- bind-9.10.2-P4.orig/doc/arm/notes.xml
++++ bind-9.10.2-P4/doc/arm/notes.xml
+@@ -62,6 +62,15 @@
+ <itemizedlist>
+ <listitem>
+ <para>
++ Insufficient testing when parsing a message allowed
++ records with an incorrect class to be be accepted,
++ triggering a REQUIRE failure when those records
++ were subsequently cached. This flaw is disclosed
++ in CVE-2015-8000. [RT #4098]
++ </para>
++ </listitem>
++ <listitem>
++ <para>
+ An incorrect boundary check in the OPENPGPKEY rdatatype
+ could trigger an assertion failure. This flaw is disclosed
+ in CVE-2015-5986. [RT #40286]
+Index: bind-9.10.2-P4/lib/dns/include/dns/message.h
+===================================================================
+--- bind-9.10.2-P4.orig/lib/dns/include/dns/message.h
++++ bind-9.10.2-P4/lib/dns/include/dns/message.h
+@@ -15,8 +15,6 @@
+ * PERFORMANCE OF THIS SOFTWARE.
+ */
+
+-/* $Id$ */
+-
+ #ifndef DNS_MESSAGE_H
+ #define DNS_MESSAGE_H 1
+
+@@ -221,6 +219,8 @@ struct dns_message {
+ unsigned int free_saved : 1;
+ unsigned int sitok : 1;
+ unsigned int sitbad : 1;
++ unsigned int tkey : 1;
++ unsigned int rdclass_set : 1;
+
+ unsigned int opt_reserved;
+ unsigned int sig_reserved;
+@@ -1400,6 +1400,15 @@ dns_message_buildopt(dns_message_t *msg,
+ * \li other.
+ */
+
++void
++dns_message_setclass(dns_message_t *msg, dns_rdataclass_t rdclass);
++/*%<
++ * Set the expected class of records in the response.
++ *
++ * Requires:
++ * \li msg be a valid message with parsing intent.
++ */
++
+ ISC_LANG_ENDDECLS
+
+ #endif /* DNS_MESSAGE_H */
+Index: bind-9.10.2-P4/lib/dns/message.c
+===================================================================
+--- bind-9.10.2-P4.orig/lib/dns/message.c
++++ bind-9.10.2-P4/lib/dns/message.c
+@@ -439,6 +439,8 @@ msginit(dns_message_t *m) {
+ m->free_saved = 0;
+ m->sitok = 0;
+ m->sitbad = 0;
++ m->tkey = 0;
++ m->rdclass_set = 0;
+ m->querytsig = NULL;
+ }
+
+@@ -1091,13 +1093,19 @@ getquestions(isc_buffer_t *source, dns_m
+ * If this class is different than the one we already read,
+ * this is an error.
+ */
+- if (msg->state == DNS_SECTION_ANY) {
+- msg->state = DNS_SECTION_QUESTION;
++ if (msg->rdclass_set == 0) {
+ msg->rdclass = rdclass;
++ msg->rdclass_set = 1;
+ } else if (msg->rdclass != rdclass)
+ DO_FORMERR;
+
+ /*
++ * Is this a TKEY query?
++ */
++ if (rdtype == dns_rdatatype_tkey)
++ msg->tkey = 1;
++
++ /*
+ * Can't ask the same question twice.
+ */
+ result = dns_message_find(name, rdclass, rdtype, 0, NULL);
+@@ -1241,12 +1249,12 @@ getsection(isc_buffer_t *source, dns_mes
+ * If there was no question section, we may not yet have
+ * established a class. Do so now.
+ */
+- if (msg->state == DNS_SECTION_ANY &&
++ if (msg->rdclass_set == 0 &&
+ rdtype != dns_rdatatype_opt && /* class is UDP SIZE */
+ rdtype != dns_rdatatype_tsig && /* class is ANY */
+ rdtype != dns_rdatatype_tkey) { /* class is undefined */
+ msg->rdclass = rdclass;
+- msg->state = DNS_SECTION_QUESTION;
++ msg->rdclass_set = 1;
+ }
+
+ /*
+@@ -1256,7 +1264,7 @@ getsection(isc_buffer_t *source, dns_mes
+ if (msg->opcode != dns_opcode_update
+ && rdtype != dns_rdatatype_tsig
+ && rdtype != dns_rdatatype_opt
+- && rdtype != dns_rdatatype_dnskey /* in a TKEY query */
++ && rdtype != dns_rdatatype_key /* in a TKEY query */
+ && rdtype != dns_rdatatype_sig /* SIG(0) */
+ && rdtype != dns_rdatatype_tkey /* Win2000 TKEY */
+ && msg->rdclass != dns_rdataclass_any
+@@ -1264,6 +1272,16 @@ getsection(isc_buffer_t *source, dns_mes
+ DO_FORMERR;
+
+ /*
++ * If this is not a TKEY query/response then the KEY
++ * record's class needs to match.
++ */
++ if (msg->opcode != dns_opcode_update && !msg->tkey &&
++ rdtype == dns_rdatatype_key &&
++ msg->rdclass != dns_rdataclass_any &&
++ msg->rdclass != rdclass)
++ DO_FORMERR;
++
++ /*
+ * Special type handling for TSIG, OPT, and TKEY.
+ */
+ if (rdtype == dns_rdatatype_tsig) {
+@@ -1377,6 +1395,10 @@ getsection(isc_buffer_t *source, dns_mes
+ skip_name_search = ISC_TRUE;
+ skip_type_search = ISC_TRUE;
+ issigzero = ISC_TRUE;
++ } else {
++ if (msg->rdclass != dns_rdataclass_any &&
++ msg->rdclass != rdclass)
++ DO_FORMERR;
+ }
+ } else
+ covers = 0;
+@@ -1625,6 +1647,7 @@ dns_message_parse(dns_message_t *msg, is
+ msg->counts[DNS_SECTION_ADDITIONAL] = isc_buffer_getuint16(source);
+
+ msg->header_ok = 1;
++ msg->state = DNS_SECTION_QUESTION;
+
+ /*
+ * -1 means no EDNS.
+@@ -3706,3 +3729,15 @@ dns_message_buildopt(dns_message_t *mess
+ dns_message_puttemprdatalist(message, &rdatalist);
+ return (result);
+ }
++
++void
++dns_message_setclass(dns_message_t *msg, dns_rdataclass_t rdclass) {
++
++ REQUIRE(DNS_MESSAGE_VALID(msg));
++ REQUIRE(msg->from_to_wire == DNS_MESSAGE_INTENTPARSE);
++ REQUIRE(msg->state == DNS_SECTION_ANY);
++ REQUIRE(msg->rdclass_set == 0);
++
++ msg->rdclass = rdclass;
++ msg->rdclass_set = 1;
++}
+Index: bind-9.10.2-P4/lib/dns/resolver.c
+===================================================================
+--- bind-9.10.2-P4.orig/lib/dns/resolver.c
++++ bind-9.10.2-P4/lib/dns/resolver.c
+@@ -7309,6 +7309,8 @@ resquery_response(isc_task_t *task, isc_
+ goto done;
+ }
+
++ dns_message_setclass(message, fctx->res->rdclass);
++
+ if ((options & DNS_FETCHOPT_TCP) == 0) {
+ if ((options & DNS_FETCHOPT_NOEDNS0) == 0)
+ dns_adb_setudpsize(fctx->adb, query->addrinfo,
+@@ -7391,6 +7393,13 @@ resquery_response(isc_task_t *task, isc_
+ &dns_master_style_comment,
+ ISC_LOG_DEBUG(10),
+ fctx->res->mctx);
++
++ if (message->rdclass != fctx->res->rdclass) {
++ resend = ISC_TRUE;
++ FCTXTRACE("bad class");
++ goto done;
++ }
++
+ /*
+ * Process receive opt record.
+ */
+Index: bind-9.10.2-P4/lib/dns/xfrin.c
+===================================================================
+--- bind-9.10.2-P4.orig/lib/dns/xfrin.c
++++ bind-9.10.2-P4/lib/dns/xfrin.c
+@@ -1225,6 +1225,8 @@ xfrin_recv_done(isc_task_t *task, isc_ev
+ msg->tsigctx = xfr->tsigctx;
+ xfr->tsigctx = NULL;
+
++ dns_message_setclass(msg, xfr->rdclass);
++
+ if (xfr->nmsg > 0)
+ msg->tcp_continuation = 1;
+
+Index: bind-9.10.2-P4/CHANGES
+===================================================================
+--- bind-9.10.2-P4.orig/CHANGES
++++ bind-9.10.2-P4/CHANGES
+@@ -1,4 +1,9 @@
+- --- 9.10.2-P4 released ---
++4260. [security] Insufficient testing when parsing a message allowed
++ records with an incorrect class to be be accepted,
++ triggering a REQUIRE failure when those records
++ were subsequently cached. (CVE-2015-8000) [RT #4098]
++
++ --- 9.10.2-P4 released ---
+
+ 4170. [security] An incorrect boundary check in the OPENPGPKEY
+ rdatatype could trigger an assertion failure.
diff --git a/meta/recipes-connectivity/bind/bind/CVE-2015-8461.patch b/meta/recipes-connectivity/bind/bind/CVE-2015-8461.patch
new file mode 100644
index 0000000..88e9c83
--- /dev/null
+++ b/meta/recipes-connectivity/bind/bind/CVE-2015-8461.patch
@@ -0,0 +1,44 @@
+From adbf81335b67be0cebdcf9f1f4fcb38ef4814f4d Mon Sep 17 00:00:00 2001
+From: Mark Andrews <marka at isc.org>
+Date: Thu, 25 Jun 2015 18:36:27 +1000
+Subject: [PATCH] 4146. [bug] Address reference leak that could
+ prevent a clean shutdown. [RT #37125]
+
+Upstream-Status: Backport
+
+https://source.isc.org/cgi-bin/gitweb.cgi?p=bind9.git;a=commit;h=adbf81335b67be0cebdcf9f1f4fcb38ef4814f4d
+
+CVE: CVE-2015-8461
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+---
+ CHANGES | 3 +++
+ lib/dns/resolver.c | 5 +++++
+ 2 files changed, 8 insertions(+)
+
+Index: bind-9.10.2-P4/CHANGES
+===================================================================
+--- bind-9.10.2-P4.orig/CHANGES
++++ bind-9.10.2-P4/CHANGES
+@@ -1,3 +1,6 @@
++4146. [bug] Address reference leak that could prevent a clean
++ shutdown. [RT #37125]
++
+ 4260. [security] Insufficient testing when parsing a message allowed
+ records with an incorrect class to be be accepted,
+ triggering a REQUIRE failure when those records
+Index: bind-9.10.2-P4/lib/dns/resolver.c
+===================================================================
+--- bind-9.10.2-P4.orig/lib/dns/resolver.c
++++ bind-9.10.2-P4/lib/dns/resolver.c
+@@ -1649,6 +1649,11 @@ fctx_query(fetchctx_t *fctx, dns_adbaddr
+ if (query->dispatch != NULL)
+ dns_dispatch_detach(&query->dispatch);
+
++ LOCK(&res->buckets[fctx->bucketnum].lock);
++ INSIST(fctx->references > 1);
++ fctx->references--;
++ UNLOCK(&res->buckets[fctx->bucketnum].lock);
++
+ cleanup_query:
+ if (query->connects == 0) {
+ query->magic = 0;
diff --git a/meta/recipes-connectivity/bind/bind/CVE-2015-8704.patch b/meta/recipes-connectivity/bind/bind/CVE-2015-8704.patch
new file mode 100644
index 0000000..d5bf740
--- /dev/null
+++ b/meta/recipes-connectivity/bind/bind/CVE-2015-8704.patch
@@ -0,0 +1,28 @@
+a buffer size check can cause denial of service under certain circumstances
+
+[security]
+The following flaw in BIND was reported by ISC:
+
+A buffer size check used to guard against overflow could cause named to exit with an INSIST failure In apl_42.c.
+
+A server could exit due to an INSIST failure in apl_42.c when performing certain string formatting operations.
+
+Upstream-Status: Backport
+CVE: CVE-2015-8704
+
+[The patch is taken from BIND 9.10.3:
+https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2015-8704]
+
+Signed-off-by: Derek Straka <derek at asterius.io>
+diff --git a/lib/dns/rdata/in_1/apl_42.c b/lib/dns/rdata/in_1/apl_42.c
+index bedd38e..28eb7f2 100644
+--- a/lib/dns/rdata/in_1/apl_42.c
++++ b/lib/dns/rdata/in_1/apl_42.c
+@@ -116,7 +116,7 @@ totext_in_apl(ARGS_TOTEXT) {
+ isc_uint8_t len;
+ isc_boolean_t neg;
+ unsigned char buf[16];
+- char txt[sizeof(" !64000")];
++ char txt[sizeof(" !64000:")];
+ const char *sep = "";
+ int n;
diff --git a/meta/recipes-connectivity/bind/bind/CVE-2015-8705.patch b/meta/recipes-connectivity/bind/bind/CVE-2015-8705.patch
new file mode 100644
index 0000000..c4a052d
--- /dev/null
+++ b/meta/recipes-connectivity/bind/bind/CVE-2015-8705.patch
@@ -0,0 +1,44 @@
+a crash or assertion failure can during format processing
+
+[security]
+The following flaw in BIND was reported by ISC:
+
+In versions of BIND 9.10, errors can occur when OPT pseudo-RR data or ECS options are formatted to text. In 9.10.3 through 9.10.3-P2, the issue may result in a REQUIRE assertion failure in buffer.c.
+
+This issue can affect both authoritative and recursive servers if they are performing debug logging. (It may also crash related tools which use the same code, such as dig or delv.)
+
+A server could exit due to an INSIST failure in apl_42.c when performing certain string formatting operations.
+
+Upstream-Status: Backport
+CVE: CVE-2015-8705
+
+[The patch is taken from BIND 9.10.3:
+https://bugzilla.redhat.com/show_bug.cgi?id=CVE-2015-8705]
+
+Signed-off-by: Derek Straka <derek at asterius.io>
+diff --git a/lib/dns/message.c b/lib/dns/message.c
+index ea7b93a..810c58e 100644
+--- a/lib/dns/message.c
++++ b/lib/dns/message.c
+@@ -3310,9 +3310,19 @@
+ } else if (optcode == DNS_OPT_SIT) {
+ ADD_STRING(target, "; SIT");
+ } else if (optcode == DNS_OPT_CLIENT_SUBNET) {
++ isc_buffer_t ecsbuf;
+ ADD_STRING(target, "; CLIENT-SUBNET: ");
+- render_ecs(&optbuf, target);
+- ADD_STRING(target, "\n");
++ isc_buffer_init(&ecsbuf,
++ isc_buffer_current(&optbuf),
++ optlen);
++ isc_buffer_add(&ecsbuf, optlen);
++ result = render_ecs(&ecsbuf, target);
++ if (result == ISC_R_NOSPACE)
++ return (result);
++ if (result == ISC_R_SUCCESS) {
++ isc_buffer_forward(&optbuf, optlen);
++ ADD_STRING(target, "\n");
++ }
+ continue;
+ } else if (optcode == DNS_OPT_EXPIRE) {
+ if (optlen == 4) {
diff --git a/meta/recipes-connectivity/bind/bind_9.10.2-P4.bb b/meta/recipes-connectivity/bind/bind_9.10.2-P4.bb
index efae289..19f87d7 100644
--- a/meta/recipes-connectivity/bind/bind_9.10.2-P4.bb
+++ b/meta/recipes-connectivity/bind/bind_9.10.2-P4.bb
@@ -20,6 +20,11 @@ SRC_URI = "ftp://ftp.isc.org/isc/bind9/${PV}/${BPN}-${PV}.tar.gz \
file://0001-build-use-pkg-config-to-find-libxml2.patch \
file://bind-ensure-searching-for-json-headers-searches-sysr.patch \
file://0001-gen.c-extend-DIRNAMESIZE-from-256-to-512.patch \
+ file://0001-lib-dns-gen.c-fix-too-long-error.patch \
+ file://CVE-2015-8704.patch \
+ file://CVE-2015-8705.patch \
+ file://CVE-2015-8000.patch \
+ file://CVE-2015-8461.patch \
"
SRC_URI[md5sum] = "8b1f5064837756c938eadc1537dec5c7"
diff --git a/meta/recipes-connectivity/bluez5/bluez5.inc b/meta/recipes-connectivity/bluez5/bluez5.inc
index 039c443..df42c88 100644
--- a/meta/recipes-connectivity/bluez5/bluez5.inc
+++ b/meta/recipes-connectivity/bluez5/bluez5.inc
@@ -18,7 +18,6 @@ PACKAGECONFIG[experimental] = "--enable-experimental,--disable-experimental,"
SRC_URI = "\
${KERNELORG_MIRROR}/linux/bluetooth/bluez-${PV}.tar.xz \
- file://bluetooth.conf \
"
S = "${WORKDIR}/bluez-${PV}"
@@ -53,8 +52,8 @@ do_install_append() {
if [ -f ${S}/profiles/input/input.conf ]; then
install -m 0644 ${S}/profiles/input/input.conf ${D}/${sysconfdir}/bluetooth/
fi
- # at_console doesn't really work with the current state of OE, so punch some more holes so people can actually use BT
- install -m 0644 ${WORKDIR}/bluetooth.conf ${D}/${sysconfdir}/dbus-1/system.d/
+
+ install -m 0644 ${S}/src/bluetooth.conf ${D}/${sysconfdir}/dbus-1/system.d/
# Install desired tools that upstream leaves in build area
for f in ${NOINST_TOOLS} ; do
diff --git a/meta/recipes-connectivity/bluez5/bluez5/bluetooth.conf b/meta/recipes-connectivity/bluez5/bluez5/bluetooth.conf
deleted file mode 100644
index 26845bb..0000000
--- a/meta/recipes-connectivity/bluez5/bluez5/bluetooth.conf
+++ /dev/null
@@ -1,17 +0,0 @@
-<!-- This configuration file specifies the required security policies
- for Bluetooth core daemon to work. -->
-
-<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
- "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
-<busconfig>
-
- <!-- ../system.conf have denied everything, so we just punch some holes -->
-
- <policy context="default">
- <allow own="org.bluez"/>
- <allow send_destination="org.bluez"/>
- <allow send_interface="org.bluez.Agent1"/>
- <allow send_type="method_call"/>
- </policy>
-
-</busconfig>
diff --git a/meta/recipes-connectivity/connman/connman-conf.bb b/meta/recipes-connectivity/connman/connman-conf.bb
index bd4c28d..9254ed7 100644
--- a/meta/recipes-connectivity/connman/connman-conf.bb
+++ b/meta/recipes-connectivity/connman/connman-conf.bb
@@ -13,14 +13,14 @@ S = "${WORKDIR}"
PACKAGE_ARCH = "${MACHINE_ARCH}"
-FILES_${PN} = "${localstatedir}/* ${libdir}/*"
+FILES_${PN} = "${localstatedir}/* ${datadir}/*"
do_install() {
#Configure Wired network interface in case of qemu* machines
if test -e ${WORKDIR}/wired.config && test -e ${WORKDIR}/wired-setup; then
install -d ${D}${localstatedir}/lib/connman
install -m 0644 ${WORKDIR}/wired.config ${D}${localstatedir}/lib/connman
- install -d ${D}${libdir}/connman
- install -m 0755 ${WORKDIR}/wired-setup ${D}${libdir}/connman
+ install -d ${D}${datadir}/connman
+ install -m 0755 ${WORKDIR}/wired-setup ${D}${datadir}/connman
fi
}
diff --git a/meta/recipes-connectivity/connman/connman-gnome_0.7.bb b/meta/recipes-connectivity/connman/connman-gnome_0.7.bb
index f5575d2..7b875f0 100644
--- a/meta/recipes-connectivity/connman/connman-gnome_0.7.bb
+++ b/meta/recipes-connectivity/connman/connman-gnome_0.7.bb
@@ -6,7 +6,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=eb723b61539feef013de476e68b5c50a \
file://properties/main.c;beginline=1;endline=20;md5=50c77c81871308b033ab7a1504626afb \
file://common/connman-dbus.c;beginline=1;endline=20;md5=de6b485c0e717a0236402d220187717a"
-DEPENDS = "gtk+ dbus-glib intltool-native"
+DEPENDS = "gtk+ dbus-glib intltool-native gettext-native"
# 0.7 tag
SRCREV = "cf3c325b23dae843c5499a113591cfbc98acb143"
@@ -19,7 +19,8 @@ SRC_URI = "git://github.com/connectivity/connman-gnome.git \
S = "${WORKDIR}/git"
-inherit autotools-brokensep gtk-icon-cache pkgconfig
+inherit autotools-brokensep gtk-icon-cache pkgconfig distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
RDEPENDS_${PN} = "connman"
diff --git a/meta/recipes-connectivity/connman/connman.inc b/meta/recipes-connectivity/connman/connman.inc
index 17dc4b9..afdb3f2 100644
--- a/meta/recipes-connectivity/connman/connman.inc
+++ b/meta/recipes-connectivity/connman/connman.inc
@@ -30,6 +30,7 @@ EXTRA_OECONF += "\
--disable-polkit \
--enable-client \
"
+CFLAGS += "-D_GNU_SOURCE"
PACKAGECONFIG ??= "wispr \
${@bb.utils.contains('DISTRO_FEATURES', 'systemd','systemd', '', d)} \
@@ -67,15 +68,9 @@ python __anonymous () {
SYSTEMD_SERVICE_${PN} = "connman.service"
SYSTEMD_SERVICE_${PN}-vpn = "connman-vpn.service"
-SYSTEMD_WIRED_SETUP = "ExecStartPre=-${libdir}/connman/wired-setup"
+SYSTEMD_WIRED_SETUP = "ExecStartPre=-${datadir}/connman/wired-setup"
-# This allows *everyone* to access ConnMan over DBus, without any access
-# control. Really the at_console flag should work, which would mean that
-# both this and the xuser patch can be dropped.
do_compile_append() {
- sed -i -e s:deny:allow:g ${S}/src/connman-dbus.conf
- sed -i -e s:deny:allow:g ${S}/vpn/vpn-dbus.conf
-
sed -i "s#ExecStart=#${SYSTEMD_WIRED_SETUP}\nExecStart=#" ${B}/src/connman.service
}
@@ -83,7 +78,7 @@ do_install_append() {
if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','true','false',d)}; then
install -d ${D}${sysconfdir}/init.d
install -m 0755 ${WORKDIR}/connman ${D}${sysconfdir}/init.d/connman
- sed -i s%@LIBDIR@%${libdir}% ${D}${sysconfdir}/init.d/connman
+ sed -i s%@DATADIR@%${datadir}% ${D}${sysconfdir}/init.d/connman
fi
install -d ${D}${bindir}
@@ -112,7 +107,6 @@ RPROVIDES_${PN} = "\
RDEPENDS_${PN} = "\
dbus \
- ${@base_conditional('ROOTLESS_X', '1', 'xuser-account', '', d)} \
"
PACKAGES_DYNAMIC += "^${PN}-plugin-.*"
diff --git a/meta/recipes-connectivity/connman/connman/0001-Detect-backtrace-API-availability-before-using-it.patch b/meta/recipes-connectivity/connman/connman/0001-Detect-backtrace-API-availability-before-using-it.patch
new file mode 100644
index 0000000..5dc6fd6
--- /dev/null
+++ b/meta/recipes-connectivity/connman/connman/0001-Detect-backtrace-API-availability-before-using-it.patch
@@ -0,0 +1,55 @@
+From 00d4447395725abaa651e12ed40095081e04011e Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Sun, 13 Sep 2015 13:22:01 -0700
+Subject: [PATCH 1/3] Detect backtrace() API availability before using it
+
+C libraries besides glibc do not have backtrace() implemented
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ configure.ac | 2 ++
+ src/log.c | 5 ++---
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/configure.ac b/configure.ac
+index 69c0eeb..90099f2 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -171,6 +171,8 @@ fi
+ AM_CONDITIONAL(PPTP, test "${enable_pptp}" != "no")
+ AM_CONDITIONAL(PPTP_BUILTIN, test "${enable_pptp}" = "builtin")
+
++AC_CHECK_HEADERS([execinfo.h])
++
+ AC_CHECK_HEADERS(resolv.h, dummy=yes,
+ AC_MSG_ERROR(resolver header files are required))
+ AC_CHECK_LIB(resolv, ns_initparse, dummy=yes, [
+diff --git a/src/log.c b/src/log.c
+index a693bd0..5b40c1f 100644
+--- a/src/log.c
++++ b/src/log.c
+@@ -30,7 +30,6 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <syslog.h>
+-#include <execinfo.h>
+ #include <dlfcn.h>
+
+ #include "connman.h"
+@@ -215,9 +214,9 @@ static void print_backtrace(unsigned int offset)
+ static void signal_handler(int signo)
+ {
+ connman_error("Aborting (signal %d) [%s]", signo, program_exec);
+-
++#ifdef HAVE_EXECINFO_H
+ print_backtrace(2);
+-
++#endif /* HAVE_EXECINFO_H */
+ exit(EXIT_FAILURE);
+ }
+
+--
+2.5.1
+
diff --git a/meta/recipes-connectivity/connman/connman/0002-resolve-musl-does-not-implement-res_ninit.patch b/meta/recipes-connectivity/connman/connman/0002-resolve-musl-does-not-implement-res_ninit.patch
new file mode 100644
index 0000000..0593427
--- /dev/null
+++ b/meta/recipes-connectivity/connman/connman/0002-resolve-musl-does-not-implement-res_ninit.patch
@@ -0,0 +1,77 @@
+From 10b0d16d04b811b1ccd1f9b0cfe757bce8d876a1 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Mon, 6 Apr 2015 23:02:21 -0700
+Subject: [PATCH 2/3] resolve: musl does not implement res_ninit
+
+ported from
+http://git.alpinelinux.org/cgit/aports/plain/testing/connman/libresolv.patch
+
+Upstream-Status: Pending
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+ gweb/gresolv.c | 33 ++++++++++++---------------------
+ 1 file changed, 12 insertions(+), 21 deletions(-)
+
+diff --git a/gweb/gresolv.c b/gweb/gresolv.c
+index 5cf7a9a..3ad8e70 100644
+--- a/gweb/gresolv.c
++++ b/gweb/gresolv.c
+@@ -875,8 +875,6 @@ GResolv *g_resolv_new(int index)
+ resolv->index = index;
+ resolv->nameserver_list = NULL;
+
+- res_ninit(&resolv->res);
+-
+ return resolv;
+ }
+
+@@ -916,8 +914,6 @@ void g_resolv_unref(GResolv *resolv)
+
+ flush_nameservers(resolv);
+
+- res_nclose(&resolv->res);
+-
+ g_free(resolv);
+ }
+
+@@ -1020,24 +1016,19 @@ guint g_resolv_lookup_hostname(GResolv *resolv, const char *hostname,
+ debug(resolv, "hostname %s", hostname);
+
+ if (!resolv->nameserver_list) {
+- int i;
+-
+- for (i = 0; i < resolv->res.nscount; i++) {
+- char buf[100];
+- int family = resolv->res.nsaddr_list[i].sin_family;
+- void *sa_addr = &resolv->res.nsaddr_list[i].sin_addr;
+-
+- if (family != AF_INET &&
+- resolv->res._u._ext.nsaddrs[i]) {
+- family = AF_INET6;
+- sa_addr = &resolv->res._u._ext.nsaddrs[i]->sin6_addr;
++ FILE *f = fopen("/etc/resolv.conf", "r");
++ if (f) {
++ char line[256], *s;
++ int i;
++ while (fgets(line, sizeof(line), f)) {
++ if (strncmp(line, "nameserver", 10) || !isspace(line[10]))
++ continue;
++ for (s = &line[11]; isspace(s[0]); s++);
++ for (i = 0; s[i] && !isspace(s[i]); i++);
++ s[i] = 0;
++ g_resolv_add_nameserver(resolv, s, 53, 0);
+ }
+-
+- if (family != AF_INET && family != AF_INET6)
+- continue;
+-
+- if (inet_ntop(family, sa_addr, buf, sizeof(buf)))
+- g_resolv_add_nameserver(resolv, buf, 53, 0);
++ fclose(f);
+ }
+
+ if (!resolv->nameserver_list)
+--
+2.5.1
+
diff --git a/meta/recipes-connectivity/connman/connman/0003-Fix-header-inclusions-for-musl.patch b/meta/recipes-connectivity/connman/connman/0003-Fix-header-inclusions-for-musl.patch
new file mode 100644
index 0000000..6327aa2
--- /dev/null
+++ b/meta/recipes-connectivity/connman/connman/0003-Fix-header-inclusions-for-musl.patch
@@ -0,0 +1,85 @@
+From 67645a01a2f3f52625d8dd77f2811a9e213e1b7d Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Sun, 13 Sep 2015 13:28:20 -0700
+Subject: [PATCH] Fix header inclusions for musl
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ gweb/gresolv.c | 1 +
+ plugins/wifi.c | 3 +--
+ src/tethering.c | 2 --
+ tools/dhcp-test.c | 1 -
+ tools/dnsproxy-test.c | 1 +
+ 5 files changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/gweb/gresolv.c b/gweb/gresolv.c
+index 3ad8e70..61d6fe8 100644
+--- a/gweb/gresolv.c
++++ b/gweb/gresolv.c
+@@ -28,6 +28,7 @@
+ #include <stdarg.h>
+ #include <string.h>
+ #include <stdlib.h>
++#include <stdio.h>
+ #include <resolv.h>
+ #include <sys/types.h>
+ #include <sys/socket.h>
+diff --git a/plugins/wifi.c b/plugins/wifi.c
+index dfe849f..99cff3f 100644
+--- a/plugins/wifi.c
++++ b/plugins/wifi.c
+@@ -30,9 +30,8 @@
+ #include <string.h>
+ #include <sys/ioctl.h>
+ #include <sys/socket.h>
+-#include <linux/if_arp.h>
+-#include <linux/wireless.h>
+ #include <net/ethernet.h>
++#include <linux/wireless.h>
+
+ #ifndef IFF_LOWER_UP
+ #define IFF_LOWER_UP 0x10000
+diff --git a/src/tethering.c b/src/tethering.c
+index ceeec74..c44cb36 100644
+--- a/src/tethering.c
++++ b/src/tethering.c
+@@ -31,10 +31,8 @@
+ #include <stdio.h>
+ #include <sys/ioctl.h>
+ #include <net/if.h>
+-#include <linux/sockios.h>
+ #include <string.h>
+ #include <fcntl.h>
+-#include <linux/if_tun.h>
+ #include <netinet/in.h>
+ #include <linux/if_bridge.h>
+
+diff --git a/tools/dhcp-test.c b/tools/dhcp-test.c
+index c34e10a..eae66fc 100644
+--- a/tools/dhcp-test.c
++++ b/tools/dhcp-test.c
+@@ -33,7 +33,6 @@
+ #include <arpa/inet.h>
+ #include <net/route.h>
+ #include <net/ethernet.h>
+-#include <linux/if_arp.h>
+
+ #include <gdhcp/gdhcp.h>
+
+diff --git a/tools/dnsproxy-test.c b/tools/dnsproxy-test.c
+index 551cae9..226ba86 100644
+--- a/tools/dnsproxy-test.c
++++ b/tools/dnsproxy-test.c
+@@ -27,6 +27,7 @@
+ #include <stdlib.h>
+ #include <string.h>
+ #include <unistd.h>
++#include <stdio.h>
+ #include <arpa/inet.h>
+ #include <netinet/in.h>
+ #include <sys/types.h>
+--
+2.5.1
+
diff --git a/meta/recipes-connectivity/connman/connman/add_xuser_dbus_permission.patch b/meta/recipes-connectivity/connman/connman/add_xuser_dbus_permission.patch
deleted file mode 100644
index 707b3ca..0000000
--- a/meta/recipes-connectivity/connman/connman/add_xuser_dbus_permission.patch
+++ /dev/null
@@ -1,21 +0,0 @@
-Because Poky doesn't support at_console we need to special-case the session
-user.
-
-Upstream-Status: Inappropriate [configuration]
-
-Signed-off-by: Ross Burton <ross.burton at intel.com>
-
-diff --git a/src/connman-dbus.conf b/src/connman-dbus.conf
-index 98a773e..466809c 100644
---- a/src/connman-dbus.conf
-+++ b/src/connman-dbus.conf
-@@ -8,6 +8,9 @@
- <allow send_interface="net.connman.Counter"/>
- <allow send_interface="net.connman.Notification"/>
- </policy>
-+ <policy user="xuser">
-+ <allow send_destination="net.connman"/>
-+ </policy>
- <policy at_console="true">
- <allow send_destination="net.connman"/>
- </policy>
diff --git a/meta/recipes-connectivity/connman/connman/connman b/meta/recipes-connectivity/connman/connman/connman
index bf7a94a..c64fa0d 100644
--- a/meta/recipes-connectivity/connman/connman/connman
+++ b/meta/recipes-connectivity/connman/connman/connman
@@ -49,8 +49,8 @@ do_start() {
fi
fi
fi
- if [ -f @LIBDIR@/connman/wired-setup ] ; then
- . @LIBDIR@/connman/wired-setup
+ if [ -f @DATADIR@/connman/wired-setup ] ; then
+ . @DATADIR@/connman/wired-setup
fi
$DAEMON $EXTRA_PARAM
}
diff --git a/meta/recipes-connectivity/connman/connman_1.30.bb b/meta/recipes-connectivity/connman/connman_1.30.bb
index 8c47353..7d65ac9 100644
--- a/meta/recipes-connectivity/connman/connman_1.30.bb
+++ b/meta/recipes-connectivity/connman/connman_1.30.bb
@@ -2,7 +2,9 @@ require connman.inc
SRC_URI = "${KERNELORG_MIRROR}/linux/network/${BPN}/${BP}.tar.xz \
file://0001-plugin.h-Change-visibility-to-default-for-debug-symb.patch \
- file://add_xuser_dbus_permission.patch \
+ file://0001-Detect-backtrace-API-availability-before-using-it.patch \
+ file://0002-resolve-musl-does-not-implement-res_ninit.patch \
+ file://0003-Fix-header-inclusions-for-musl.patch \
file://connman \
"
SRC_URI[md5sum] = "4a3efdbd6796922db9c6f66da57887fa"
diff --git a/meta/recipes-connectivity/iproute2/iproute2.inc b/meta/recipes-connectivity/iproute2/iproute2.inc
index a53a4e6..29f9062 100644
--- a/meta/recipes-connectivity/iproute2/iproute2.inc
+++ b/meta/recipes-connectivity/iproute2/iproute2.inc
@@ -15,6 +15,12 @@ inherit update-alternatives
EXTRA_OEMAKE = "CC='${CC}' KERNEL_INCLUDE=${STAGING_INCDIR} DOCDIR=${docdir}/iproute2 SUBDIRS='lib tc ip' SBINDIR='${base_sbindir}' LIBDIR='${libdir}'"
+do_configure_append () {
+ sh configure ${STAGING_INCDIR}
+ # Explicitly disable ATM support
+ sed -i -e '/TC_CONFIG_ATM/d' Config
+}
+
do_install () {
oe_runmake DESTDIR=${D} install
mv ${D}${base_sbindir}/ip ${D}${base_sbindir}/ip.iproute2
diff --git a/meta/recipes-connectivity/irda-utils/irda-utils_0.9.18.bb b/meta/recipes-connectivity/irda-utils/irda-utils_0.9.18.bb
index 8ac3b18..bd2f815 100644
--- a/meta/recipes-connectivity/irda-utils/irda-utils_0.9.18.bb
+++ b/meta/recipes-connectivity/irda-utils/irda-utils_0.9.18.bb
@@ -3,7 +3,7 @@ DESCRIPTION = "Provides common files needed to use IrDA. \
IrDA allows communication over Infrared with other devices \
such as phones and laptops."
HOMEPAGE = "http://irda.sourceforge.net/"
-BUGTRACKER = "irda-users at lists.sourceforge.net"
+BUGTRACKER = "http://sourceforge.net/p/irda/bugs/"
SECTION = "base"
LICENSE = "GPLv2+"
LIC_FILES_CHKSUM = "file://irdadump/COPYING;md5=94d55d512a9ba36caa9b7df079bae19f \
diff --git a/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_2.patch b/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_2.patch
new file mode 100644
index 0000000..9fac69c
--- /dev/null
+++ b/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_2.patch
@@ -0,0 +1,65 @@
+From f98a09cacff7baad8748c9aa217afd155a4d493f Mon Sep 17 00:00:00 2001
+From: "mmcc at openbsd.org" <mmcc at openbsd.org>
+Date: Tue, 20 Oct 2015 03:36:35 +0000
+Subject: [PATCH] upstream commit
+
+Replace a function-local allocation with stack memory.
+
+ok djm@
+
+Upstream-ID: c09fbbab637053a2ab9f33ca142b4e20a4c5a17e
+Upstream-Status: Backport
+CVE: CVE-2016-1907
+
+[YOCTO #8935]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ clientloop.c | 9 ++-------
+ 1 file changed, 2 insertions(+), 7 deletions(-)
+
+diff --git a/clientloop.c b/clientloop.c
+index 87ceb3d..1e05cba 100644
+--- a/clientloop.c
++++ b/clientloop.c
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: clientloop.c,v 1.275 2015/07/10 06:21:53 markus Exp $ */
++/* $OpenBSD: clientloop.c,v 1.276 2015/10/20 03:36:35 mmcc Exp $ */
+ /*
+ * Author: Tatu Ylonen <ylo at cs.hut.fi>
+ * Copyright (c) 1995 Tatu Ylonen <ylo at cs.hut.fi>, Espoo, Finland
+@@ -311,11 +311,10 @@ client_x11_get_proto(const char *display, const char *xauth_path,
+ static char proto[512], data[512];
+ FILE *f;
+ int got_data = 0, generated = 0, do_unlink = 0, i;
+- char *xauthdir, *xauthfile;
++ char xauthdir[PATH_MAX] = "", xauthfile[PATH_MAX] = "";
+ struct stat st;
+ u_int now, x11_timeout_real;
+
+- xauthdir = xauthfile = NULL;
+ *_proto = proto;
+ *_data = data;
+ proto[0] = data[0] = '\0';
+@@ -343,8 +342,6 @@ client_x11_get_proto(const char *display, const char *xauth_path,
+ display = xdisplay;
+ }
+ if (trusted == 0) {
+- xauthdir = xmalloc(PATH_MAX);
+- xauthfile = xmalloc(PATH_MAX);
+ mktemp_proto(xauthdir, PATH_MAX);
+ /*
+ * The authentication cookie should briefly outlive
+@@ -407,8 +404,6 @@ client_x11_get_proto(const char *display, const char *xauth_path,
+ unlink(xauthfile);
+ rmdir(xauthdir);
+ }
+- free(xauthdir);
+- free(xauthfile);
+
+ /*
+ * If we didn't get authentication data, just make up some
+--
+1.9.1
+
diff --git a/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_3.patch b/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_3.patch
new file mode 100644
index 0000000..3dfc51a
--- /dev/null
+++ b/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_3.patch
@@ -0,0 +1,329 @@
+From ed4ce82dbfa8a3a3c8ea6fa0db113c71e234416c Mon Sep 17 00:00:00 2001
+From: "djm at openbsd.org" <djm at openbsd.org>
+Date: Wed, 13 Jan 2016 23:04:47 +0000
+Subject: [PATCH] upstream commit
+
+eliminate fallback from untrusted X11 forwarding to trusted
+ forwarding when the X server disables the SECURITY extension; Reported by
+ Thomas Hoger; ok deraadt@
+
+Upstream-ID: f76195bd2064615a63ef9674a0e4096b0713f938
+Upstream-Status: Backport
+CVE: CVE-2016-1907
+
+[YOCTO #8935]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ clientloop.c | 114 ++++++++++++++++++++++++++++++++++++-----------------------
+ clientloop.h | 4 +--
+ mux.c | 22 ++++++------
+ ssh.c | 23 +++++-------
+ 4 files changed, 93 insertions(+), 70 deletions(-)
+
+Index: openssh-7.1p2/clientloop.c
+===================================================================
+--- openssh-7.1p2.orig/clientloop.c
++++ openssh-7.1p2/clientloop.c
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: clientloop.c,v 1.276 2015/10/20 03:36:35 mmcc Exp $ */
++/* $OpenBSD: clientloop.c,v 1.279 2016/01/13 23:04:47 djm Exp $ */
+ /*
+ * Author: Tatu Ylonen <ylo at cs.hut.fi>
+ * Copyright (c) 1995 Tatu Ylonen <ylo at cs.hut.fi>, Espoo, Finland
+@@ -288,6 +288,9 @@ client_x11_display_valid(const char *dis
+ {
+ size_t i, dlen;
+
++ if (display == NULL)
++ return 0;
++
+ dlen = strlen(display);
+ for (i = 0; i < dlen; i++) {
+ if (!isalnum((u_char)display[i]) &&
+@@ -301,34 +304,33 @@ client_x11_display_valid(const char *dis
+
+ #define SSH_X11_PROTO "MIT-MAGIC-COOKIE-1"
+ #define X11_TIMEOUT_SLACK 60
+-void
++int
+ client_x11_get_proto(const char *display, const char *xauth_path,
+ u_int trusted, u_int timeout, char **_proto, char **_data)
+ {
+- char cmd[1024];
+- char line[512];
+- char xdisplay[512];
++ char cmd[1024], line[512], xdisplay[512];
++ char xauthfile[PATH_MAX], xauthdir[PATH_MAX];
+ static char proto[512], data[512];
+ FILE *f;
+- int got_data = 0, generated = 0, do_unlink = 0, i;
+- char xauthdir[PATH_MAX] = "", xauthfile[PATH_MAX] = "";
++ int got_data = 0, generated = 0, do_unlink = 0, i, r;
+ struct stat st;
+ u_int now, x11_timeout_real;
+
+ *_proto = proto;
+ *_data = data;
+- proto[0] = data[0] = '\0';
++ proto[0] = data[0] = xauthfile[0] = xauthdir[0] = '\0';
+
+- if (xauth_path == NULL ||(stat(xauth_path, &st) == -1)) {
+- debug("No xauth program.");
+- } else if (!client_x11_display_valid(display)) {
+- logit("DISPLAY '%s' invalid, falling back to fake xauth data",
++ if (!client_x11_display_valid(display)) {
++ logit("DISPLAY \"%s\" invalid; disabling X11 forwarding",
+ display);
+- } else {
+- if (display == NULL) {
+- debug("x11_get_proto: DISPLAY not set");
+- return;
+- }
++ return -1;
++ }
++ if (xauth_path != NULL && stat(xauth_path, &st) == -1) {
++ debug("No xauth program.");
++ xauth_path = NULL;
++ }
++
++ if (xauth_path != NULL) {
+ /*
+ * Handle FamilyLocal case where $DISPLAY does
+ * not match an authorization entry. For this we
+@@ -337,43 +339,60 @@ client_x11_get_proto(const char *display
+ * is not perfect.
+ */
+ if (strncmp(display, "localhost:", 10) == 0) {
+- snprintf(xdisplay, sizeof(xdisplay), "unix:%s",
+- display + 10);
++ if ((r = snprintf(xdisplay, sizeof(xdisplay), "unix:%s",
++ display + 10)) < 0 ||
++ (size_t)r >= sizeof(xdisplay)) {
++ error("%s: display name too long", __func__);
++ return -1;
++ }
+ display = xdisplay;
+ }
+ if (trusted == 0) {
+- mktemp_proto(xauthdir, PATH_MAX);
+ /*
++ * Generate an untrusted X11 auth cookie.
++ *
+ * The authentication cookie should briefly outlive
+ * ssh's willingness to forward X11 connections to
+ * avoid nasty fail-open behaviour in the X server.
+ */
++ mktemp_proto(xauthdir, sizeof(xauthdir));
++ if (mkdtemp(xauthdir) == NULL) {
++ error("%s: mkdtemp: %s",
++ __func__, strerror(errno));
++ return -1;
++ }
++ do_unlink = 1;
++ if ((r = snprintf(xauthfile, sizeof(xauthfile),
++ "%s/xauthfile", xauthdir)) < 0 ||
++ (size_t)r >= sizeof(xauthfile)) {
++ error("%s: xauthfile path too long", __func__);
++ unlink(xauthfile);
++ rmdir(xauthdir);
++ return -1;
++ }
++
+ if (timeout >= UINT_MAX - X11_TIMEOUT_SLACK)
+ x11_timeout_real = UINT_MAX;
+ else
+ x11_timeout_real = timeout + X11_TIMEOUT_SLACK;
+- if (mkdtemp(xauthdir) != NULL) {
+- do_unlink = 1;
+- snprintf(xauthfile, PATH_MAX, "%s/xauthfile",
+- xauthdir);
+- snprintf(cmd, sizeof(cmd),
+- "%s -f %s generate %s " SSH_X11_PROTO
+- " untrusted timeout %u 2>" _PATH_DEVNULL,
+- xauth_path, xauthfile, display,
+- x11_timeout_real);
+- debug2("x11_get_proto: %s", cmd);
+- if (x11_refuse_time == 0) {
+- now = monotime() + 1;
+- if (UINT_MAX - timeout < now)
+- x11_refuse_time = UINT_MAX;
+- else
+- x11_refuse_time = now + timeout;
+- channel_set_x11_refuse_time(
+- x11_refuse_time);
+- }
+- if (system(cmd) == 0)
+- generated = 1;
++ if ((r = snprintf(cmd, sizeof(cmd),
++ "%s -f %s generate %s " SSH_X11_PROTO
++ " untrusted timeout %u 2>" _PATH_DEVNULL,
++ xauth_path, xauthfile, display,
++ x11_timeout_real)) < 0 ||
++ (size_t)r >= sizeof(cmd))
++ fatal("%s: cmd too long", __func__);
++ debug2("%s: %s", __func__, cmd);
++ if (x11_refuse_time == 0) {
++ now = monotime() + 1;
++ if (UINT_MAX - timeout < now)
++ x11_refuse_time = UINT_MAX;
++ else
++ x11_refuse_time = now + timeout;
++ channel_set_x11_refuse_time(x11_refuse_time);
+ }
++ if (system(cmd) == 0)
++ generated = 1;
+ }
+
+ /*
+@@ -395,9 +414,7 @@ client_x11_get_proto(const char *display
+ got_data = 1;
+ if (f)
+ pclose(f);
+- } else
+- error("Warning: untrusted X11 forwarding setup failed: "
+- "xauth key data not generated");
++ }
+ }
+
+ if (do_unlink) {
+@@ -405,6 +422,13 @@ client_x11_get_proto(const char *display
+ rmdir(xauthdir);
+ }
+
++ /* Don't fall back to fake X11 data for untrusted forwarding */
++ if (!trusted && !got_data) {
++ error("Warning: untrusted X11 forwarding setup failed: "
++ "xauth key data not generated");
++ return -1;
++ }
++
+ /*
+ * If we didn't get authentication data, just make up some
+ * data. The forwarding code will check the validity of the
+@@ -427,6 +451,8 @@ client_x11_get_proto(const char *display
+ rnd >>= 8;
+ }
+ }
++
++ return 0;
+ }
+
+ /*
+Index: openssh-7.1p2/clientloop.h
+===================================================================
+--- openssh-7.1p2.orig/clientloop.h
++++ openssh-7.1p2/clientloop.h
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: clientloop.h,v 1.31 2013/06/02 23:36:29 dtucker Exp $ */
++/* $OpenBSD: clientloop.h,v 1.32 2016/01/13 23:04:47 djm Exp $ */
+
+ /*
+ * Author: Tatu Ylonen <ylo at cs.hut.fi>
+@@ -39,7 +39,7 @@
+
+ /* Client side main loop for the interactive session. */
+ int client_loop(int, int, int);
+-void client_x11_get_proto(const char *, const char *, u_int, u_int,
++int client_x11_get_proto(const char *, const char *, u_int, u_int,
+ char **, char **);
+ void client_global_request_reply_fwd(int, u_int32_t, void *);
+ void client_session2_setup(int, int, int, const char *, struct termios *,
+Index: openssh-7.1p2/mux.c
+===================================================================
+--- openssh-7.1p2.orig/mux.c
++++ openssh-7.1p2/mux.c
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: mux.c,v 1.54 2015/08/19 23:18:26 djm Exp $ */
++/* $OpenBSD: mux.c,v 1.58 2016/01/13 23:04:47 djm Exp $ */
+ /*
+ * Copyright (c) 2002-2008 Damien Miller <djm at openbsd.org>
+ *
+@@ -1354,16 +1354,18 @@ mux_session_confirm(int id, int success,
+ char *proto, *data;
+
+ /* Get reasonable local authentication information. */
+- client_x11_get_proto(display, options.xauth_location,
++ if (client_x11_get_proto(display, options.xauth_location,
+ options.forward_x11_trusted, options.forward_x11_timeout,
+- &proto, &data);
+- /* Request forwarding with authentication spoofing. */
+- debug("Requesting X11 forwarding with authentication "
+- "spoofing.");
+- x11_request_forwarding_with_spoofing(id, display, proto,
+- data, 1);
+- client_expect_confirm(id, "X11 forwarding", CONFIRM_WARN);
+- /* XXX exit_on_forward_failure */
++ &proto, &data) == 0) {
++ /* Request forwarding with authentication spoofing. */
++ debug("Requesting X11 forwarding with authentication "
++ "spoofing.");
++ x11_request_forwarding_with_spoofing(id, display, proto,
++ data, 1);
++ /* XXX exit_on_forward_failure */
++ client_expect_confirm(id, "X11 forwarding",
++ CONFIRM_WARN);
++ }
+ }
+
+ if (cctx->want_agent_fwd && options.forward_agent) {
+Index: openssh-7.1p2/ssh.c
+===================================================================
+--- openssh-7.1p2.orig/ssh.c
++++ openssh-7.1p2/ssh.c
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: ssh.c,v 1.420 2015/07/30 00:01:34 djm Exp $ */
++/* $OpenBSD: ssh.c,v 1.433 2016/01/13 23:04:47 djm Exp $ */
+ /*
+ * Author: Tatu Ylonen <ylo at cs.hut.fi>
+ * Copyright (c) 1995 Tatu Ylonen <ylo at cs.hut.fi>, Espoo, Finland
+@@ -1604,6 +1604,7 @@ ssh_session(void)
+ struct winsize ws;
+ char *cp;
+ const char *display;
++ char *proto = NULL, *data = NULL;
+
+ /* Enable compression if requested. */
+ if (options.compression) {
+@@ -1674,13 +1675,9 @@ ssh_session(void)
+ display = getenv("DISPLAY");
+ if (display == NULL && options.forward_x11)
+ debug("X11 forwarding requested but DISPLAY not set");
+- if (options.forward_x11 && display != NULL) {
+- char *proto, *data;
+- /* Get reasonable local authentication information. */
+- client_x11_get_proto(display, options.xauth_location,
+- options.forward_x11_trusted,
+- options.forward_x11_timeout,
+- &proto, &data);
++ if (options.forward_x11 && client_x11_get_proto(display,
++ options.xauth_location, options.forward_x11_trusted,
++ options.forward_x11_timeout, &proto, &data) == 0) {
+ /* Request forwarding with authentication spoofing. */
+ debug("Requesting X11 forwarding with authentication "
+ "spoofing.");
+@@ -1770,6 +1767,7 @@ ssh_session2_setup(int id, int success,
+ extern char **environ;
+ const char *display;
+ int interactive = tty_flag;
++ char *proto = NULL, *data = NULL;
+
+ if (!success)
+ return; /* No need for error message, channels code sens one */
+@@ -1777,12 +1775,9 @@ ssh_session2_setup(int id, int success,
+ display = getenv("DISPLAY");
+ if (display == NULL && options.forward_x11)
+ debug("X11 forwarding requested but DISPLAY not set");
+- if (options.forward_x11 && display != NULL) {
+- char *proto, *data;
+- /* Get reasonable local authentication information. */
+- client_x11_get_proto(display, options.xauth_location,
+- options.forward_x11_trusted,
+- options.forward_x11_timeout, &proto, &data);
++ if (options.forward_x11 && client_x11_get_proto(display,
++ options.xauth_location, options.forward_x11_trusted,
++ options.forward_x11_timeout, &proto, &data) == 0) {
+ /* Request forwarding with authentication spoofing. */
+ debug("Requesting X11 forwarding with authentication "
+ "spoofing.");
diff --git a/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_upstream_commit.patch b/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_upstream_commit.patch
new file mode 100644
index 0000000..f3d132e
--- /dev/null
+++ b/meta/recipes-connectivity/openssh/openssh/CVE-2016-1907_upstream_commit.patch
@@ -0,0 +1,33 @@
+From d77148e3a3ef6c29b26ec74331455394581aa257 Mon Sep 17 00:00:00 2001
+From: "djm at openbsd.org" <djm at openbsd.org>
+Date: Sun, 8 Nov 2015 21:59:11 +0000
+Subject: [PATCH] upstream commit
+
+fix OOB read in packet code caused by missing return
+ statement found by Ben Hawkes; ok markus@ deraadt@
+
+Upstream-ID: a3e3a85434ebfa0690d4879091959591f30efc62
+
+Upstream-Status: Backport
+CVE: CVE-2016-1907
+
+[YOCTO #8935]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ packet.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+Index: openssh-7.1p2/packet.c
+===================================================================
+--- openssh-7.1p2.orig/packet.c
++++ openssh-7.1p2/packet.c
+@@ -1855,6 +1855,7 @@ ssh_packet_process_incoming(struct ssh *
+ if (len >= state->packet_discard) {
+ if ((r = ssh_packet_stop_discard(ssh)) != 0)
+ return r;
++ return SSH_ERR_CONN_CORRUPT;
+ }
+ state->packet_discard -= len;
+ return 0;
diff --git a/meta/recipes-connectivity/openssh/openssh/sshd at .service b/meta/recipes-connectivity/openssh/openssh/sshd at .service
index bb2d68e..9d83dfb 100644
--- a/meta/recipes-connectivity/openssh/openssh/sshd at .service
+++ b/meta/recipes-connectivity/openssh/openssh/sshd at .service
@@ -4,7 +4,9 @@ Wants=sshdgenkeys.service
After=sshdgenkeys.service
[Service]
-ExecStart=- at SBINDIR@/sshd -i
+Environment="SSHD_OPTS="
+EnvironmentFile=-/etc/default/ssh
+ExecStart=- at SBINDIR@/sshd -i $SSHD_OPTS
ExecReload=@BASE_BINDIR@/kill -HUP $MAINPID
StandardInput=socket
StandardError=syslog
diff --git a/meta/recipes-connectivity/openssh/openssh/sshdgenkeys.service b/meta/recipes-connectivity/openssh/openssh/sshdgenkeys.service
index d65086f..148e6ad 100644
--- a/meta/recipes-connectivity/openssh/openssh/sshdgenkeys.service
+++ b/meta/recipes-connectivity/openssh/openssh/sshdgenkeys.service
@@ -1,11 +1,22 @@
[Unit]
Description=OpenSSH Key Generation
-ConditionPathExists=|!/etc/ssh/ssh_host_rsa_key
-ConditionPathExists=|!/etc/ssh/ssh_host_dsa_key
-ConditionPathExists=|!/etc/ssh/ssh_host_ecdsa_key
-ConditionPathExists=|!/etc/ssh/ssh_host_ed25519_key
+RequiresMountsFor=/var /run
+ConditionPathExists=!/var/run/ssh/ssh_host_rsa_key
+ConditionPathExists=!/var/run/ssh/ssh_host_dsa_key
+ConditionPathExists=!/var/run/ssh/ssh_host_ecdsa_key
+ConditionPathExists=!/var/run/ssh/ssh_host_ed25519_key
+ConditionPathExists=!/etc/ssh/ssh_host_rsa_key
+ConditionPathExists=!/etc/ssh/ssh_host_dsa_key
+ConditionPathExists=!/etc/ssh/ssh_host_ecdsa_key
+ConditionPathExists=!/etc/ssh/ssh_host_ed25519_key
[Service]
-ExecStart=@BINDIR@/ssh-keygen -A
+Environment="SYSCONFDIR=/etc/ssh"
+EnvironmentFile=-/etc/default/ssh
+ExecStart=@BASE_BINDIR@/mkdir -p $SYSCONFDIR
+ExecStart=@BINDIR@/ssh-keygen -q -f ${SYSCONFDIR}/ssh_host_rsa_key -N '' -t rsa
+ExecStart=@BINDIR@/ssh-keygen -q -f ${SYSCONFDIR}/ssh_host_dsa_key -N '' -t dsa
+ExecStart=@BINDIR@/ssh-keygen -q -f ${SYSCONFDIR}/ssh_host_ecdsa_key -N '' -t ecdsa
+ExecStart=@BINDIR@/ssh-keygen -q -f ${SYSCONFDIR}/ssh_host_ed25519_key -N '' -t ed25519
Type=oneshot
RemainAfterExit=yes
diff --git a/meta/recipes-connectivity/openssh/openssh_7.1p1.bb b/meta/recipes-connectivity/openssh/openssh_7.1p1.bb
deleted file mode 100644
index eeeb4b4..0000000
--- a/meta/recipes-connectivity/openssh/openssh_7.1p1.bb
+++ /dev/null
@@ -1,154 +0,0 @@
-SUMMARY = "Secure rlogin/rsh/rcp/telnet replacement"
-DESCRIPTION = "Secure rlogin/rsh/rcp/telnet replacement (OpenSSH) \
-Ssh (Secure Shell) is a program for logging into a remote machine \
-and for executing commands on a remote machine."
-HOMEPAGE = "http://openssh.org"
-SECTION = "console/network"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENCE;md5=e326045657e842541d3f35aada442507"
-
-DEPENDS = "zlib openssl"
-DEPENDS += "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}"
-
-SRC_URI = "ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${PV}.tar.gz \
- file://sshd_config \
- file://ssh_config \
- file://init \
- ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${PAM_SRC_URI}', '', d)} \
- file://sshd.socket \
- file://sshd@.service \
- file://sshdgenkeys.service \
- file://volatiles.99_sshd \
- file://add-test-support-for-busybox.patch \
- file://run-ptest"
-
-PAM_SRC_URI = "file://sshd"
-
-SRC_URI[md5sum] = "8709736bc8a8c253bc4eeb4829888ca5"
-SRC_URI[sha256sum] = "fc0a6d2d1d063d5c66dffd952493d0cda256cad204f681de0f84ef85b2ad8428"
-
-inherit useradd update-rc.d update-alternatives systemd
-
-USERADD_PACKAGES = "${PN}-sshd"
-USERADD_PARAM_${PN}-sshd = "--system --no-create-home --home-dir /var/run/sshd --shell /bin/false --user-group sshd"
-INITSCRIPT_PACKAGES = "${PN}-sshd"
-INITSCRIPT_NAME_${PN}-sshd = "sshd"
-INITSCRIPT_PARAMS_${PN}-sshd = "defaults 9"
-
-SYSTEMD_PACKAGES = "${PN}-sshd"
-SYSTEMD_SERVICE_${PN}-sshd = "sshd.socket"
-
-inherit autotools-brokensep ptest
-
-# LFS support:
-CFLAGS += "-D__FILE_OFFSET_BITS=64"
-
-# login path is hardcoded in sshd
-EXTRA_OECONF = "'LOGIN_PROGRAM=${base_bindir}/login' \
- ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '--with-pam', '--without-pam', d)} \
- --without-zlib-version-check \
- --with-privsep-path=/var/run/sshd \
- --sysconfdir=${sysconfdir}/ssh \
- --with-xauth=/usr/bin/xauth \
- --disable-strip \
- "
-
-# Since we do not depend on libbsd, we do not want configure to use it
-# just because it finds libutil.h. But, specifying --disable-libutil
-# causes compile errors, so...
-CACHED_CONFIGUREVARS += "ac_cv_header_bsd_libutil_h=no ac_cv_header_libutil_h=no"
-
-# passwd path is hardcoded in sshd
-CACHED_CONFIGUREVARS += "ac_cv_path_PATH_PASSWD_PROG=${bindir}/passwd"
-
-# We don't want to depend on libblockfile
-CACHED_CONFIGUREVARS += "ac_cv_header_maillock_h=no"
-
-# This is a workaround for uclibc because including stdio.h
-# pulls in pthreads.h and causes conflicts in function prototypes.
-# This results in compilation failure, so unless this is fixed,
-# disable pam for uclibc.
-EXTRA_OECONF_append_libc-uclibc=" --without-pam"
-
-do_configure_prepend () {
- export LD="${CC}"
- install -m 0644 ${WORKDIR}/sshd_config ${B}/
- install -m 0644 ${WORKDIR}/ssh_config ${B}/
- if [ ! -e acinclude.m4 -a -e aclocal.m4 ]; then
- cp aclocal.m4 acinclude.m4
- fi
-}
-
-do_compile_ptest() {
- # skip regress/unittests/ binaries: this will silently skip
- # unittests in run-ptests which is good because they are so slow.
- oe_runmake regress/modpipe regress/setuid-allowed regress/netcat
-}
-
-do_install_append () {
- if [ "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}" = "pam" ]; then
- install -D -m 0755 ${WORKDIR}/sshd ${D}${sysconfdir}/pam.d/sshd
- sed -i -e 's:#UsePAM no:UsePAM yes:' ${WORKDIR}/sshd_config ${D}${sysconfdir}/ssh/sshd_config
- fi
-
- install -d ${D}${sysconfdir}/init.d
- install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/sshd
- rm -f ${D}${bindir}/slogin ${D}${datadir}/Ssh.bin
- rmdir ${D}${localstatedir}/run/sshd ${D}${localstatedir}/run ${D}${localstatedir}
- install -d ${D}/${sysconfdir}/default/volatiles
- install -m 644 ${WORKDIR}/volatiles.99_sshd ${D}/${sysconfdir}/default/volatiles/99_sshd
- install -m 0755 ${S}/contrib/ssh-copy-id ${D}${bindir}
-
- # Create config files for read-only rootfs
- install -d ${D}${sysconfdir}/ssh
- install -m 644 ${D}${sysconfdir}/ssh/sshd_config ${D}${sysconfdir}/ssh/sshd_config_readonly
- sed -i '/HostKey/d' ${D}${sysconfdir}/ssh/sshd_config_readonly
- echo "HostKey /var/run/ssh/ssh_host_rsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
- echo "HostKey /var/run/ssh/ssh_host_dsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
- echo "HostKey /var/run/ssh/ssh_host_ecdsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
-
- install -d ${D}${systemd_unitdir}/system
- install -c -m 0644 ${WORKDIR}/sshd.socket ${D}${systemd_unitdir}/system
- install -c -m 0644 ${WORKDIR}/sshd at .service ${D}${systemd_unitdir}/system
- install -c -m 0644 ${WORKDIR}/sshdgenkeys.service ${D}${systemd_unitdir}/system
- sed -i -e 's, at BASE_BINDIR@,${base_bindir},g' \
- -e 's, at SBINDIR@,${sbindir},g' \
- -e 's, at BINDIR@,${bindir},g' \
- ${D}${systemd_unitdir}/system/sshd.socket ${D}${systemd_unitdir}/system/*.service
-}
-
-do_install_ptest () {
- sed -i -e "s|^SFTPSERVER=.*|SFTPSERVER=${libdir}/${PN}/sftp-server|" regress/test-exec.sh
- cp -r regress ${D}${PTEST_PATH}
-}
-
-ALLOW_EMPTY_${PN} = "1"
-
-PACKAGES =+ "${PN}-keygen ${PN}-scp ${PN}-ssh ${PN}-sshd ${PN}-sftp ${PN}-misc ${PN}-sftp-server"
-FILES_${PN}-scp = "${bindir}/scp.${BPN}"
-FILES_${PN}-ssh = "${bindir}/ssh.${BPN} ${sysconfdir}/ssh/ssh_config"
-FILES_${PN}-sshd = "${sbindir}/sshd ${sysconfdir}/init.d/sshd ${systemd_unitdir}/system"
-FILES_${PN}-sshd += "${sysconfdir}/ssh/moduli ${sysconfdir}/ssh/sshd_config ${sysconfdir}/ssh/sshd_config_readonly ${sysconfdir}/default/volatiles/99_sshd ${sysconfdir}/pam.d/sshd"
-FILES_${PN}-sftp = "${bindir}/sftp"
-FILES_${PN}-sftp-server = "${libexecdir}/sftp-server"
-FILES_${PN}-misc = "${bindir}/ssh* ${libexecdir}/ssh*"
-FILES_${PN}-keygen = "${bindir}/ssh-keygen"
-
-RDEPENDS_${PN} += "${PN}-scp ${PN}-ssh ${PN}-sshd ${PN}-keygen"
-RDEPENDS_${PN}-sshd += "${PN}-keygen ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam-plugin-keyinit pam-plugin-loginuid', '', d)}"
-RDEPENDS_${PN}-ptest += "${PN}-sftp ${PN}-misc ${PN}-sftp-server make"
-
-RPROVIDES_${PN}-ssh = "ssh"
-RPROVIDES_${PN}-sshd = "sshd"
-
-RCONFLICTS_${PN} = "dropbear"
-RCONFLICTS_${PN}-sshd = "dropbear"
-RCONFLICTS_${PN}-keygen = "ssh-keygen"
-
-CONFFILES_${PN}-sshd = "${sysconfdir}/ssh/sshd_config"
-CONFFILES_${PN}-ssh = "${sysconfdir}/ssh/ssh_config"
-
-ALTERNATIVE_PRIORITY = "90"
-ALTERNATIVE_${PN}-scp = "scp"
-ALTERNATIVE_${PN}-ssh = "ssh"
-
diff --git a/meta/recipes-connectivity/openssh/openssh_7.1p2.bb b/meta/recipes-connectivity/openssh/openssh_7.1p2.bb
new file mode 100644
index 0000000..714c391
--- /dev/null
+++ b/meta/recipes-connectivity/openssh/openssh_7.1p2.bb
@@ -0,0 +1,157 @@
+SUMMARY = "Secure rlogin/rsh/rcp/telnet replacement"
+DESCRIPTION = "Secure rlogin/rsh/rcp/telnet replacement (OpenSSH) \
+Ssh (Secure Shell) is a program for logging into a remote machine \
+and for executing commands on a remote machine."
+HOMEPAGE = "http://openssh.org"
+SECTION = "console/network"
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=e326045657e842541d3f35aada442507"
+
+DEPENDS = "zlib openssl"
+DEPENDS += "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'libpam', '', d)}"
+
+SRC_URI = "ftp://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-${PV}.tar.gz \
+ file://sshd_config \
+ file://ssh_config \
+ file://init \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '${PAM_SRC_URI}', '', d)} \
+ file://sshd.socket \
+ file://sshd@.service \
+ file://sshdgenkeys.service \
+ file://volatiles.99_sshd \
+ file://add-test-support-for-busybox.patch \
+ file://run-ptest \
+ file://CVE-2016-1907_upstream_commit.patch \
+ file://CVE-2016-1907_2.patch \
+ file://CVE-2016-1907_3.patch "
+
+PAM_SRC_URI = "file://sshd"
+
+SRC_URI[md5sum] = "4d8547670e2a220d5ef805ad9e47acf2"
+SRC_URI[sha256sum] = "dd75f024dcf21e06a0d6421d582690bf987a1f6323e32ad6619392f3bfde6bbd"
+
+inherit useradd update-rc.d update-alternatives systemd
+
+USERADD_PACKAGES = "${PN}-sshd"
+USERADD_PARAM_${PN}-sshd = "--system --no-create-home --home-dir /var/run/sshd --shell /bin/false --user-group sshd"
+INITSCRIPT_PACKAGES = "${PN}-sshd"
+INITSCRIPT_NAME_${PN}-sshd = "sshd"
+INITSCRIPT_PARAMS_${PN}-sshd = "defaults 9"
+
+SYSTEMD_PACKAGES = "${PN}-sshd"
+SYSTEMD_SERVICE_${PN}-sshd = "sshd.socket"
+
+inherit autotools-brokensep ptest
+
+# LFS support:
+CFLAGS += "-D__FILE_OFFSET_BITS=64"
+
+# login path is hardcoded in sshd
+EXTRA_OECONF = "'LOGIN_PROGRAM=${base_bindir}/login' \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'pam', '--with-pam', '--without-pam', d)} \
+ --without-zlib-version-check \
+ --with-privsep-path=/var/run/sshd \
+ --sysconfdir=${sysconfdir}/ssh \
+ --with-xauth=/usr/bin/xauth \
+ --disable-strip \
+ "
+
+# Since we do not depend on libbsd, we do not want configure to use it
+# just because it finds libutil.h. But, specifying --disable-libutil
+# causes compile errors, so...
+CACHED_CONFIGUREVARS += "ac_cv_header_bsd_libutil_h=no ac_cv_header_libutil_h=no"
+
+# passwd path is hardcoded in sshd
+CACHED_CONFIGUREVARS += "ac_cv_path_PATH_PASSWD_PROG=${bindir}/passwd"
+
+# We don't want to depend on libblockfile
+CACHED_CONFIGUREVARS += "ac_cv_header_maillock_h=no"
+
+# This is a workaround for uclibc because including stdio.h
+# pulls in pthreads.h and causes conflicts in function prototypes.
+# This results in compilation failure, so unless this is fixed,
+# disable pam for uclibc.
+EXTRA_OECONF_append_libc-uclibc=" --without-pam"
+
+do_configure_prepend () {
+ export LD="${CC}"
+ install -m 0644 ${WORKDIR}/sshd_config ${B}/
+ install -m 0644 ${WORKDIR}/ssh_config ${B}/
+ if [ ! -e acinclude.m4 -a -e aclocal.m4 ]; then
+ cp aclocal.m4 acinclude.m4
+ fi
+}
+
+do_compile_ptest() {
+ # skip regress/unittests/ binaries: this will silently skip
+ # unittests in run-ptests which is good because they are so slow.
+ oe_runmake regress/modpipe regress/setuid-allowed regress/netcat
+}
+
+do_install_append () {
+ if [ "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}" = "pam" ]; then
+ install -D -m 0644 ${WORKDIR}/sshd ${D}${sysconfdir}/pam.d/sshd
+ sed -i -e 's:#UsePAM no:UsePAM yes:' ${WORKDIR}/sshd_config ${D}${sysconfdir}/ssh/sshd_config
+ fi
+
+ install -d ${D}${sysconfdir}/init.d
+ install -m 0755 ${WORKDIR}/init ${D}${sysconfdir}/init.d/sshd
+ rm -f ${D}${bindir}/slogin ${D}${datadir}/Ssh.bin
+ rmdir ${D}${localstatedir}/run/sshd ${D}${localstatedir}/run ${D}${localstatedir}
+ install -d ${D}/${sysconfdir}/default/volatiles
+ install -m 644 ${WORKDIR}/volatiles.99_sshd ${D}/${sysconfdir}/default/volatiles/99_sshd
+ install -m 0755 ${S}/contrib/ssh-copy-id ${D}${bindir}
+
+ # Create config files for read-only rootfs
+ install -d ${D}${sysconfdir}/ssh
+ install -m 644 ${D}${sysconfdir}/ssh/sshd_config ${D}${sysconfdir}/ssh/sshd_config_readonly
+ sed -i '/HostKey/d' ${D}${sysconfdir}/ssh/sshd_config_readonly
+ echo "HostKey /var/run/ssh/ssh_host_rsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
+ echo "HostKey /var/run/ssh/ssh_host_dsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
+ echo "HostKey /var/run/ssh/ssh_host_ecdsa_key" >> ${D}${sysconfdir}/ssh/sshd_config_readonly
+
+ install -d ${D}${systemd_unitdir}/system
+ install -c -m 0644 ${WORKDIR}/sshd.socket ${D}${systemd_unitdir}/system
+ install -c -m 0644 ${WORKDIR}/sshd at .service ${D}${systemd_unitdir}/system
+ install -c -m 0644 ${WORKDIR}/sshdgenkeys.service ${D}${systemd_unitdir}/system
+ sed -i -e 's, at BASE_BINDIR@,${base_bindir},g' \
+ -e 's, at SBINDIR@,${sbindir},g' \
+ -e 's, at BINDIR@,${bindir},g' \
+ ${D}${systemd_unitdir}/system/sshd.socket ${D}${systemd_unitdir}/system/*.service
+}
+
+do_install_ptest () {
+ sed -i -e "s|^SFTPSERVER=.*|SFTPSERVER=${libdir}/${PN}/sftp-server|" regress/test-exec.sh
+ cp -r regress ${D}${PTEST_PATH}
+}
+
+ALLOW_EMPTY_${PN} = "1"
+
+PACKAGES =+ "${PN}-keygen ${PN}-scp ${PN}-ssh ${PN}-sshd ${PN}-sftp ${PN}-misc ${PN}-sftp-server"
+FILES_${PN}-scp = "${bindir}/scp.${BPN}"
+FILES_${PN}-ssh = "${bindir}/ssh.${BPN} ${sysconfdir}/ssh/ssh_config"
+FILES_${PN}-sshd = "${sbindir}/sshd ${sysconfdir}/init.d/sshd ${systemd_unitdir}/system"
+FILES_${PN}-sshd += "${sysconfdir}/ssh/moduli ${sysconfdir}/ssh/sshd_config ${sysconfdir}/ssh/sshd_config_readonly ${sysconfdir}/default/volatiles/99_sshd ${sysconfdir}/pam.d/sshd"
+FILES_${PN}-sftp = "${bindir}/sftp"
+FILES_${PN}-sftp-server = "${libexecdir}/sftp-server"
+FILES_${PN}-misc = "${bindir}/ssh* ${libexecdir}/ssh*"
+FILES_${PN}-keygen = "${bindir}/ssh-keygen"
+
+RDEPENDS_${PN} += "${PN}-scp ${PN}-ssh ${PN}-sshd ${PN}-keygen"
+RDEPENDS_${PN}-sshd += "${PN}-keygen ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam-plugin-keyinit pam-plugin-loginuid', '', d)}"
+RDEPENDS_${PN}-ptest += "${PN}-sftp ${PN}-misc ${PN}-sftp-server make"
+
+RPROVIDES_${PN}-ssh = "ssh"
+RPROVIDES_${PN}-sshd = "sshd"
+
+RCONFLICTS_${PN} = "dropbear"
+RCONFLICTS_${PN}-sshd = "dropbear"
+RCONFLICTS_${PN}-keygen = "ssh-keygen"
+
+CONFFILES_${PN}-sshd = "${sysconfdir}/ssh/sshd_config"
+CONFFILES_${PN}-ssh = "${sysconfdir}/ssh/ssh_config"
+
+ALTERNATIVE_PRIORITY = "90"
+ALTERNATIVE_${PN}-scp = "scp"
+ALTERNATIVE_${PN}-ssh = "ssh"
+
diff --git a/meta/recipes-connectivity/openssl/openssl.inc b/meta/recipes-connectivity/openssl/openssl.inc
index 53dcfd9..8af423f 100644
--- a/meta/recipes-connectivity/openssl/openssl.inc
+++ b/meta/recipes-connectivity/openssl/openssl.inc
@@ -118,7 +118,7 @@ do_configure () {
linux-*-mips64)
target=linux-mips
;;
- linux-microblaze*)
+ linux-microblaze*|linux-nios2*)
target=linux-generic32
;;
linux-powerpc)
diff --git a/meta/recipes-connectivity/openssl/openssl/0001-Add-test-for-CVE-2015-3194.patch b/meta/recipes-connectivity/openssl/openssl/0001-Add-test-for-CVE-2015-3194.patch
new file mode 100644
index 0000000..39a2e5a
--- /dev/null
+++ b/meta/recipes-connectivity/openssl/openssl/0001-Add-test-for-CVE-2015-3194.patch
@@ -0,0 +1,66 @@
+From 00456fded43eadd4bb94bf675ae4ea5d158a764f Mon Sep 17 00:00:00 2001
+From: "Dr. Stephen Henson" <steve at openssl.org>
+Date: Wed, 4 Nov 2015 13:30:03 +0000
+Subject: [PATCH] Add test for CVE-2015-3194
+
+Reviewed-by: Richard Levitte <levitte at openssl.org>
+
+Upstream-Status: Backport
+
+This patch was imported from
+https://git.openssl.org/?p=openssl.git;a=commit;h=00456fded43eadd4bb94bf675ae4ea5d158a764f
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ test/certs/pss1.pem | 21 +++++++++++++++++++++
+ test/tx509 | 7 +++++++
+ 2 files changed, 28 insertions(+)
+ create mode 100644 test/certs/pss1.pem
+
+diff --git a/test/certs/pss1.pem b/test/certs/pss1.pem
+new file mode 100644
+index 0000000..29da71d
+--- /dev/null
++++ b/test/certs/pss1.pem
+@@ -0,0 +1,21 @@
++-----BEGIN CERTIFICATE-----
++MIIDdjCCAjqgAwIBAgIJANcwZLyfEv7DMD4GCSqGSIb3DQEBCjAxoA0wCwYJYIZI
++AWUDBAIBoRowGAYJKoZIhvcNAQEIMAsGCWCGSAFlAwQCAaIEAgIA3jAnMSUwIwYD
++VQQDDBxUZXN0IEludmFsaWQgUFNTIGNlcnRpZmljYXRlMB4XDTE1MTEwNDE2MDIz
++NVoXDTE1MTIwNDE2MDIzNVowJzElMCMGA1UEAwwcVGVzdCBJbnZhbGlkIFBTUyBj
++ZXJ0aWZpY2F0ZTCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAMTaM7WH
++qVCAGAIA+zL1KWvvASTrhlq+1ePdO7wsrWX2KiYoTYrJYTnxhLnn0wrHqApt79nL
++IBG7cfShyZqFHOY/IzlYPMVt+gPo293gw96Fds5JBsjhjkyGnOyr9OUntFqvxDbT
++IIFU7o9IdxD4edaqjRv+fegVE+B79pDk4s0ujsk6dULtCg9Rst0ucGFo19mr+b7k
++dbfn8pZ72ZNDJPueVdrUAWw9oll61UcYfk75XdrLk6JlL41GrYHc8KlfXf43gGQq
++QfrpHkg4Ih2cI6Wt2nhFGAzrlcorzLliQIUJRIhM8h4IgDfpBpaPdVQLqS2pFbXa
++5eQjqiyJwak2vJ8CAwEAAaNQME4wHQYDVR0OBBYEFCt180N4oGUt5LbzBwQ4Ia+2
++4V97MB8GA1UdIwQYMBaAFCt180N4oGUt5LbzBwQ4Ia+24V97MAwGA1UdEwQFMAMB
++Af8wMQYJKoZIhvcNAQEKMCSgDTALBglghkgBZQMEAgGhDTALBgkqhkiG9w0BAQii
++BAICAN4DggEBAAjBtm90lGxgddjc4Xu/nbXXFHVs2zVcHv/mqOZoQkGB9r/BVgLb
++xhHrFZ2pHGElbUYPfifdS9ztB73e1d4J+P29o0yBqfd4/wGAc/JA8qgn6AAEO/Xn
++plhFeTRJQtLZVl75CkHXgUGUd3h+ADvKtcBuW9dSUncaUrgNKR8u/h/2sMG38RWY
++DzBddC/66YTa3r7KkVUfW7yqRQfELiGKdcm+bjlTEMsvS+EhHup9CzbpoCx2Fx9p
++NPtFY3yEObQhmL1JyoCRWqBE75GzFPbRaiux5UpEkns+i3trkGssZzsOuVqHNTNZ
++lC9+9hPHIoc9UMmAQNo1vGIW3NWVoeGbaJ8=
++-----END CERTIFICATE-----
+diff --git a/test/tx509 b/test/tx509
+index 0ce3b52..77f5cac 100644
+--- a/test/tx509
++++ b/test/tx509
+@@ -74,5 +74,12 @@ if [ $? != 0 ]; then exit 1; fi
+ cmp x509-f.p x509-ff.p3
+ if [ $? != 0 ]; then exit 1; fi
+
++echo "Parsing test certificates"
++
++$cmd -in certs/pss1.pem -text -noout >/dev/null
++if [ $? != 0 ]; then exit 1; fi
++
++echo OK
++
+ /bin/rm -f x509-f.* x509-ff.* x509-fff.*
+ exit 0
+--
+2.3.5
+
diff --git a/meta/recipes-connectivity/openssl/openssl/CVE-2015-3193-bn-asm-x86_64-mont5.pl-fix-carry-propagating-bug-CVE.patch b/meta/recipes-connectivity/openssl/openssl/CVE-2015-3193-bn-asm-x86_64-mont5.pl-fix-carry-propagating-bug-CVE.patch
new file mode 100644
index 0000000..125016a
--- /dev/null
+++ b/meta/recipes-connectivity/openssl/openssl/CVE-2015-3193-bn-asm-x86_64-mont5.pl-fix-carry-propagating-bug-CVE.patch
@@ -0,0 +1,101 @@
+From d73cc256c8e256c32ed959456101b73ba9842f72 Mon Sep 17 00:00:00 2001
+From: Andy Polyakov <appro at openssl.org>
+Date: Tue, 1 Dec 2015 09:00:32 +0100
+Subject: [PATCH] bn/asm/x86_64-mont5.pl: fix carry propagating bug
+ (CVE-2015-3193).
+
+Reviewed-by: Richard Levitte <levitte at openssl.org>
+(cherry picked from commit e7c078db57908cbf16074c68034977565ffaf107)
+
+Upstream-Status: Backport
+
+This patch was imported from
+https://git.openssl.org/?p=openssl.git;a=commit;h=d73cc256c8e256c32ed959456101b73ba9842f72
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ crypto/bn/asm/x86_64-mont5.pl | 22 +++++++++++++++++++---
+ crypto/bn/bntest.c | 18 ++++++++++++++++++
+ 2 files changed, 37 insertions(+), 3 deletions(-)
+
+Index: openssl-1.0.2d/crypto/bn/asm/x86_64-mont5.pl
+===================================================================
+--- openssl-1.0.2d.orig/crypto/bn/asm/x86_64-mont5.pl
++++ openssl-1.0.2d/crypto/bn/asm/x86_64-mont5.pl
+@@ -1779,6 +1779,15 @@ sqr8x_reduction:
+ .align 32
+ .L8x_tail_done:
+ add (%rdx),%r8 # can this overflow?
++ adc \$0,%r9
++ adc \$0,%r10
++ adc \$0,%r11
++ adc \$0,%r12
++ adc \$0,%r13
++ adc \$0,%r14
++ adc \$0,%r15 # can't overflow, because we
++ # started with "overhung" part
++ # of multiplication
+ xor %rax,%rax
+
+ neg $carry
+@@ -3125,6 +3134,15 @@ sqrx8x_reduction:
+ .align 32
+ .Lsqrx8x_tail_done:
+ add 24+8(%rsp),%r8 # can this overflow?
++ adc \$0,%r9
++ adc \$0,%r10
++ adc \$0,%r11
++ adc \$0,%r12
++ adc \$0,%r13
++ adc \$0,%r14
++ adc \$0,%r15 # can't overflow, because we
++ # started with "overhung" part
++ # of multiplication
+ mov $carry,%rax # xor %rax,%rax
+
+ sub 16+8(%rsp),$carry # mov 16(%rsp),%cf
+@@ -3168,13 +3186,11 @@ my ($rptr,$nptr)=("%rdx","%rbp");
+ my @ri=map("%r$_",(10..13));
+ my @ni=map("%r$_",(14..15));
+ $code.=<<___;
+- xor %rbx,%rbx
++ xor %ebx,%ebx
+ sub %r15,%rsi # compare top-most words
+ adc %rbx,%rbx
+ mov %rcx,%r10 # -$num
+- .byte 0x67
+ or %rbx,%rax
+- .byte 0x67
+ mov %rcx,%r9 # -$num
+ xor \$1,%rax
+ sar \$3+2,%rcx # cf=0
+Index: openssl-1.0.2d/crypto/bn/bntest.c
+===================================================================
+--- openssl-1.0.2d.orig/crypto/bn/bntest.c
++++ openssl-1.0.2d/crypto/bn/bntest.c
+@@ -1027,6 +1027,24 @@ int test_mod_exp_mont_consttime(BIO *bp,
+ return 0;
+ }
+ }
++
++ /* Regression test for carry propagation bug in sqr8x_reduction */
++ BN_hex2bn(&a, "050505050505");
++ BN_hex2bn(&b, "02");
++ BN_hex2bn(&c,
++ "4141414141414141414141274141414141414141414141414141414141414141"
++ "4141414141414141414141414141414141414141414141414141414141414141"
++ "4141414141414141414141800000000000000000000000000000000000000000"
++ "0000000000000000000000000000000000000000000000000000000000000000"
++ "0000000000000000000000000000000000000000000000000000000000000000"
++ "0000000000000000000000000000000000000000000000000000000001");
++ BN_mod_exp(d, a, b, c, ctx);
++ BN_mul(e, a, a, ctx);
++ if (BN_cmp(d, e)) {
++ fprintf(stderr, "BN_mod_exp and BN_mul produce different results!\n");
++ return 0;
++ }
++
+ BN_free(a);
+ BN_free(b);
+ BN_free(c);
diff --git a/meta/recipes-connectivity/openssl/openssl/CVE-2015-3194-1-Add-PSS-parameter-check.patch b/meta/recipes-connectivity/openssl/openssl/CVE-2015-3194-1-Add-PSS-parameter-check.patch
new file mode 100644
index 0000000..13d4891
--- /dev/null
+++ b/meta/recipes-connectivity/openssl/openssl/CVE-2015-3194-1-Add-PSS-parameter-check.patch
@@ -0,0 +1,45 @@
+From c394a488942387246653833359a5c94b5832674e Mon Sep 17 00:00:00 2001
+From: "Dr. Stephen Henson" <steve at openssl.org>
+Date: Fri, 2 Oct 2015 12:35:19 +0100
+Subject: [PATCH] Add PSS parameter check.
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+Avoid seg fault by checking mgf1 parameter is not NULL. This can be
+triggered during certificate verification so could be a DoS attack
+against a client or a server enabling client authentication.
+
+Thanks to Loïc Jonas Etienne (Qnective AG) for discovering this bug.
+
+CVE-2015-3194
+
+Reviewed-by: Richard Levitte <levitte at openssl.org>
+
+Upstream-Status: Backport
+
+This patch was imported from
+https://git.openssl.org/?p=openssl.git;a=commit;h=c394a488942387246653833359a5c94b5832674e
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ crypto/rsa/rsa_ameth.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/crypto/rsa/rsa_ameth.c b/crypto/rsa/rsa_ameth.c
+index ca3922e..4e06218 100644
+--- a/crypto/rsa/rsa_ameth.c
++++ b/crypto/rsa/rsa_ameth.c
+@@ -268,7 +268,7 @@ static X509_ALGOR *rsa_mgf1_decode(X509_ALGOR *alg)
+ {
+ const unsigned char *p;
+ int plen;
+- if (alg == NULL)
++ if (alg == NULL || alg->parameter == NULL)
+ return NULL;
+ if (OBJ_obj2nid(alg->algorithm) != NID_mgf1)
+ return NULL;
+--
+2.3.5
+
diff --git a/meta/recipes-connectivity/openssl/openssl/CVE-2015-3195-Fix-leak-with-ASN.1-combine.patch b/meta/recipes-connectivity/openssl/openssl/CVE-2015-3195-Fix-leak-with-ASN.1-combine.patch
new file mode 100644
index 0000000..6fc4d0e
--- /dev/null
+++ b/meta/recipes-connectivity/openssl/openssl/CVE-2015-3195-Fix-leak-with-ASN.1-combine.patch
@@ -0,0 +1,66 @@
+From cc598f321fbac9c04da5766243ed55d55948637d Mon Sep 17 00:00:00 2001
+From: "Dr. Stephen Henson" <steve at openssl.org>
+Date: Tue, 10 Nov 2015 19:03:07 +0000
+Subject: [PATCH] Fix leak with ASN.1 combine.
+
+When parsing a combined structure pass a flag to the decode routine
+so on error a pointer to the parent structure is not zeroed as
+this will leak any additional components in the parent.
+
+This can leak memory in any application parsing PKCS#7 or CMS structures.
+
+CVE-2015-3195.
+
+Thanks to Adam Langley (Google/BoringSSL) for discovering this bug using
+libFuzzer.
+
+PR#4131
+
+Reviewed-by: Richard Levitte <levitte at openssl.org>
+
+Upstream-Status: Backport
+
+This patch was imported from
+https://git.openssl.org/?p=openssl.git;a=commit;h=cc598f321fbac9c04da5766243ed55d55948637d
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ crypto/asn1/tasn_dec.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/crypto/asn1/tasn_dec.c b/crypto/asn1/tasn_dec.c
+index febf605..9256049 100644
+--- a/crypto/asn1/tasn_dec.c
++++ b/crypto/asn1/tasn_dec.c
+@@ -180,6 +180,8 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
+ int otag;
+ int ret = 0;
+ ASN1_VALUE **pchptr, *ptmpval;
++ int combine = aclass & ASN1_TFLG_COMBINE;
++ aclass &= ~ASN1_TFLG_COMBINE;
+ if (!pval)
+ return 0;
+ if (aux && aux->asn1_cb)
+@@ -500,7 +502,8 @@ int ASN1_item_ex_d2i(ASN1_VALUE **pval, const unsigned char **in, long len,
+ auxerr:
+ ASN1err(ASN1_F_ASN1_ITEM_EX_D2I, ASN1_R_AUX_ERROR);
+ err:
+- ASN1_item_ex_free(pval, it);
++ if (combine == 0)
++ ASN1_item_ex_free(pval, it);
+ if (errtt)
+ ERR_add_error_data(4, "Field=", errtt->field_name,
+ ", Type=", it->sname);
+@@ -689,7 +692,7 @@ static int asn1_template_noexp_d2i(ASN1_VALUE **val,
+ } else {
+ /* Nothing special */
+ ret = ASN1_item_ex_d2i(val, &p, len, ASN1_ITEM_ptr(tt->item),
+- -1, 0, opt, ctx);
++ -1, tt->flags & ASN1_TFLG_COMBINE, opt, ctx);
+ if (!ret) {
+ ASN1err(ASN1_F_ASN1_TEMPLATE_NOEXP_D2I, ERR_R_NESTED_ASN1_ERROR);
+ goto err;
+--
+2.3.5
+
diff --git a/meta/recipes-connectivity/openssl/openssl/CVE-2015-3197.patch b/meta/recipes-connectivity/openssl/openssl/CVE-2015-3197.patch
new file mode 100644
index 0000000..dd288c9
--- /dev/null
+++ b/meta/recipes-connectivity/openssl/openssl/CVE-2015-3197.patch
@@ -0,0 +1,63 @@
+From d81a1600588b726c2bdccda7efad3cc7a87d6245 Mon Sep 17 00:00:00 2001
+From: Viktor Dukhovni <openssl-users at dukhovni.org>
+Date: Wed, 30 Dec 2015 22:44:51 -0500
+Subject: [PATCH] Better SSLv2 cipher-suite enforcement
+
+Based on patch by: Nimrod Aviram <nimrod.aviram at gmail.com>
+
+CVE-2015-3197
+
+Reviewed-by: Tim Hudson <tjh at openssl.org>
+Reviewed-by: Richard Levitte <levitte at openssl.org>
+
+Upstream-Status: Backport
+https://github.com/openssl/openssl/commit/d81a1600588b726c2bdccda7efad3cc7a87d6245
+
+CVE: CVE-2015-3197
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ssl/s2_srvr.c | 15 +++++++++++++--
+ 1 file changed, 13 insertions(+), 2 deletions(-)
+
+Index: openssl-1.0.2d/ssl/s2_srvr.c
+===================================================================
+--- openssl-1.0.2d.orig/ssl/s2_srvr.c
++++ openssl-1.0.2d/ssl/s2_srvr.c
+@@ -402,7 +402,7 @@ static int get_client_master_key(SSL *s)
+ }
+
+ cp = ssl2_get_cipher_by_char(p);
+- if (cp == NULL) {
++ if (cp == NULL || sk_SSL_CIPHER_find(s->session->ciphers, cp) < 0) {
+ ssl2_return_error(s, SSL2_PE_NO_CIPHER);
+ SSLerr(SSL_F_GET_CLIENT_MASTER_KEY, SSL_R_NO_CIPHER_MATCH);
+ return (-1);
+@@ -687,8 +687,12 @@ static int get_client_hello(SSL *s)
+ prio = cs;
+ allow = cl;
+ }
++
++ /* Generate list of SSLv2 ciphers shared between client and server */
+ for (z = 0; z < sk_SSL_CIPHER_num(prio); z++) {
+- if (sk_SSL_CIPHER_find(allow, sk_SSL_CIPHER_value(prio, z)) < 0) {
++ const SSL_CIPHER *cp = sk_SSL_CIPHER_value(prio, z);
++ if ((cp->algorithm_ssl & SSL_SSLV2) == 0 ||
++ sk_SSL_CIPHER_find(allow, cp) < 0) {
+ (void)sk_SSL_CIPHER_delete(prio, z);
+ z--;
+ }
+@@ -697,6 +701,13 @@ static int get_client_hello(SSL *s)
+ sk_SSL_CIPHER_free(s->session->ciphers);
+ s->session->ciphers = prio;
+ }
++
++ /* Make sure we have at least one cipher in common */
++ if (sk_SSL_CIPHER_num(s->session->ciphers) == 0) {
++ ssl2_return_error(s, SSL2_PE_NO_CIPHER);
++ SSLerr(SSL_F_GET_CLIENT_HELLO, SSL_R_NO_CIPHER_MATCH);
++ return -1;
++ }
+ /*
+ * s->session->ciphers should now have a list of ciphers that are on
+ * both the client and server. This list is ordered by the order the
diff --git a/meta/recipes-connectivity/openssl/openssl/CVE-2016-0701_1.patch b/meta/recipes-connectivity/openssl/openssl/CVE-2016-0701_1.patch
new file mode 100644
index 0000000..cf2d9a7
--- /dev/null
+++ b/meta/recipes-connectivity/openssl/openssl/CVE-2016-0701_1.patch
@@ -0,0 +1,102 @@
+From 878e2c5b13010329c203f309ed0c8f2113f85648 Mon Sep 17 00:00:00 2001
+From: Matt Caswell <matt at openssl.org>
+Date: Mon, 18 Jan 2016 11:31:58 +0000
+Subject: [PATCH] Prevent small subgroup attacks on DH/DHE
+
+Historically OpenSSL only ever generated DH parameters based on "safe"
+primes. More recently (in version 1.0.2) support was provided for
+generating X9.42 style parameter files such as those required for RFC
+5114 support. The primes used in such files may not be "safe". Where an
+application is using DH configured with parameters based on primes that
+are not "safe" then an attacker could use this fact to find a peer's
+private DH exponent. This attack requires that the attacker complete
+multiple handshakes in which the peer uses the same DH exponent.
+
+A simple mitigation is to ensure that y^q (mod p) == 1
+
+CVE-2016-0701 (fix part 1 of 2)
+
+Issue reported by Antonio Sanso.
+
+Reviewed-by: Viktor Dukhovni <viktor at openssl.org>
+
+Upstream-Status: Backport
+
+https://github.com/openssl/openssl/commit/878e2c5b13010329c203f309ed0c8f2113f85648
+
+CVE: CVE-2016-0701
+Signed-of-by: Armin Kuster <akuster at mvisa.com>
+
+---
+ crypto/dh/dh.h | 1 +
+ crypto/dh/dh_check.c | 35 +++++++++++++++++++++++++----------
+ 2 files changed, 26 insertions(+), 10 deletions(-)
+
+diff --git a/crypto/dh/dh.h b/crypto/dh/dh.h
+index b177673..5498a9d 100644
+--- a/crypto/dh/dh.h
++++ b/crypto/dh/dh.h
+@@ -174,6 +174,7 @@ struct dh_st {
+ /* DH_check_pub_key error codes */
+ # define DH_CHECK_PUBKEY_TOO_SMALL 0x01
+ # define DH_CHECK_PUBKEY_TOO_LARGE 0x02
++# define DH_CHECK_PUBKEY_INVALID 0x03
+
+ /*
+ * primes p where (p-1)/2 is prime too are called "safe"; we define this for
+diff --git a/crypto/dh/dh_check.c b/crypto/dh/dh_check.c
+index 347467c..5adedc0 100644
+--- a/crypto/dh/dh_check.c
++++ b/crypto/dh/dh_check.c
+@@ -151,23 +151,38 @@ int DH_check(const DH *dh, int *ret)
+ int DH_check_pub_key(const DH *dh, const BIGNUM *pub_key, int *ret)
+ {
+ int ok = 0;
+- BIGNUM *q = NULL;
++ BIGNUM *tmp = NULL;
++ BN_CTX *ctx = NULL;
+
+ *ret = 0;
+- q = BN_new();
+- if (q == NULL)
++ ctx = BN_CTX_new();
++ if (ctx == NULL)
+ goto err;
+- BN_set_word(q, 1);
+- if (BN_cmp(pub_key, q) <= 0)
++ BN_CTX_start(ctx);
++ tmp = BN_CTX_get(ctx);
++ if (tmp == NULL)
++ goto err;
++ BN_set_word(tmp, 1);
++ if (BN_cmp(pub_key, tmp) <= 0)
+ *ret |= DH_CHECK_PUBKEY_TOO_SMALL;
+- BN_copy(q, dh->p);
+- BN_sub_word(q, 1);
+- if (BN_cmp(pub_key, q) >= 0)
++ BN_copy(tmp, dh->p);
++ BN_sub_word(tmp, 1);
++ if (BN_cmp(pub_key, tmp) >= 0)
+ *ret |= DH_CHECK_PUBKEY_TOO_LARGE;
+
++ if (dh->q != NULL) {
++ /* Check pub_key^q == 1 mod p */
++ if (!BN_mod_exp(tmp, pub_key, dh->q, dh->p, ctx))
++ goto err;
++ if (!BN_is_one(tmp))
++ *ret |= DH_CHECK_PUBKEY_INVALID;
++ }
++
+ ok = 1;
+ err:
+- if (q != NULL)
+- BN_free(q);
++ if (ctx != NULL) {
++ BN_CTX_end(ctx);
++ BN_CTX_free(ctx);
++ }
+ return (ok);
+ }
+--
+2.3.5
+
diff --git a/meta/recipes-connectivity/openssl/openssl/CVE-2016-0701_2.patch b/meta/recipes-connectivity/openssl/openssl/CVE-2016-0701_2.patch
new file mode 100644
index 0000000..05caf0a
--- /dev/null
+++ b/meta/recipes-connectivity/openssl/openssl/CVE-2016-0701_2.patch
@@ -0,0 +1,156 @@
+From c5b831f21d0d29d1e517d139d9d101763f60c9a2 Mon Sep 17 00:00:00 2001
+From: Matt Caswell <matt at openssl.org>
+Date: Thu, 17 Dec 2015 02:57:20 +0000
+Subject: [PATCH] Always generate DH keys for ephemeral DH cipher suites
+
+Modified version of the commit ffaef3f15 in the master branch by Stephen
+Henson. This makes the SSL_OP_SINGLE_DH_USE option a no-op and always
+generates a new DH key for every handshake regardless.
+
+CVE-2016-0701 (fix part 2 or 2)
+
+Issue reported by Antonio Sanso
+
+Reviewed-by: Viktor Dukhovni <viktor at openssl.org>
+
+Upstream-Status: Backport
+
+https://github.com/openssl/openssl/commit/c5b831f21d0d29d1e517d139d9d101763f60c9a2
+
+CVE: CVE-2016-0701 #2
+Signed-of-by: Armin Kuster <akuster at mvisa.com>
+
+---
+ doc/ssl/SSL_CTX_set_tmp_dh_callback.pod | 29 +++++------------------------
+ ssl/s3_lib.c | 14 --------------
+ ssl/s3_srvr.c | 17 +++--------------
+ ssl/ssl.h | 2 +-
+ 4 files changed, 9 insertions(+), 53 deletions(-)
+
+Index: openssl-1.0.2d/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod
+===================================================================
+--- openssl-1.0.2d.orig/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod
++++ openssl-1.0.2d/doc/ssl/SSL_CTX_set_tmp_dh_callback.pod
+@@ -48,25 +48,8 @@ even if he gets hold of the normal (cert
+ only used for signing.
+
+ In order to perform a DH key exchange the server must use a DH group
+-(DH parameters) and generate a DH key.
+-The server will always generate a new DH key during the negotiation
+-if either the DH parameters are supplied via callback or the
+-SSL_OP_SINGLE_DH_USE option of SSL_CTX_set_options(3) is set (or both).
+-It will immediately create a DH key if DH parameters are supplied via
+-SSL_CTX_set_tmp_dh() and SSL_OP_SINGLE_DH_USE is not set.
+-In this case,
+-it may happen that a key is generated on initialization without later
+-being needed, while on the other hand the computer time during the
+-negotiation is being saved.
+-
+-If "strong" primes were used to generate the DH parameters, it is not strictly
+-necessary to generate a new key for each handshake but it does improve forward
+-secrecy. If it is not assured that "strong" primes were used,
+-SSL_OP_SINGLE_DH_USE must be used in order to prevent small subgroup
+-attacks. Always using SSL_OP_SINGLE_DH_USE has an impact on the
+-computer time needed during negotiation, but it is not very large, so
+-application authors/users should consider always enabling this option.
+-The option is required to implement perfect forward secrecy (PFS).
++(DH parameters) and generate a DH key. The server will always generate
++a new DH key during the negotiation.
+
+ As generating DH parameters is extremely time consuming, an application
+ should not generate the parameters on the fly but supply the parameters.
+@@ -93,10 +76,9 @@ can supply the DH parameters via a callb
+ Previous versions of the callback used B<is_export> and B<keylength>
+ parameters to control parameter generation for export and non-export
+ cipher suites. Modern servers that do not support export ciphersuites
+-are advised to either use SSL_CTX_set_tmp_dh() in combination with
+-SSL_OP_SINGLE_DH_USE, or alternatively, use the callback but ignore
+-B<keylength> and B<is_export> and simply supply at least 2048-bit
+-parameters in the callback.
++are advised to either use SSL_CTX_set_tmp_dh() or alternatively, use
++the callback but ignore B<keylength> and B<is_export> and simply
++supply at least 2048-bit parameters in the callback.
+
+ =head1 EXAMPLES
+
+@@ -128,7 +110,6 @@ partly left out.)
+ if (SSL_CTX_set_tmp_dh(ctx, dh_2048) != 1) {
+ /* Error. */
+ }
+- SSL_CTX_set_options(ctx, SSL_OP_SINGLE_DH_USE);
+ ...
+
+ =head1 RETURN VALUES
+Index: openssl-1.0.2d/ssl/s3_lib.c
+===================================================================
+--- openssl-1.0.2d.orig/ssl/s3_lib.c
++++ openssl-1.0.2d/ssl/s3_lib.c
+@@ -3206,13 +3206,6 @@ long ssl3_ctrl(SSL *s, int cmd, long lar
+ SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
+ return (ret);
+ }
+- if (!(s->options & SSL_OP_SINGLE_DH_USE)) {
+- if (!DH_generate_key(dh)) {
+- DH_free(dh);
+- SSLerr(SSL_F_SSL3_CTRL, ERR_R_DH_LIB);
+- return (ret);
+- }
+- }
+ if (s->cert->dh_tmp != NULL)
+ DH_free(s->cert->dh_tmp);
+ s->cert->dh_tmp = dh;
+@@ -3710,13 +3703,6 @@ long ssl3_ctx_ctrl(SSL_CTX *ctx, int cmd
+ SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_DH_LIB);
+ return 0;
+ }
+- if (!(ctx->options & SSL_OP_SINGLE_DH_USE)) {
+- if (!DH_generate_key(new)) {
+- SSLerr(SSL_F_SSL3_CTX_CTRL, ERR_R_DH_LIB);
+- DH_free(new);
+- return 0;
+- }
+- }
+ if (cert->dh_tmp != NULL)
+ DH_free(cert->dh_tmp);
+ cert->dh_tmp = new;
+Index: openssl-1.0.2d/ssl/s3_srvr.c
+===================================================================
+--- openssl-1.0.2d.orig/ssl/s3_srvr.c
++++ openssl-1.0.2d/ssl/s3_srvr.c
+@@ -1684,20 +1684,9 @@ int ssl3_send_server_key_exchange(SSL *s
+ }
+
+ s->s3->tmp.dh = dh;
+- if ((dhp->pub_key == NULL ||
+- dhp->priv_key == NULL ||
+- (s->options & SSL_OP_SINGLE_DH_USE))) {
+- if (!DH_generate_key(dh)) {
+- SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_DH_LIB);
+- goto err;
+- }
+- } else {
+- dh->pub_key = BN_dup(dhp->pub_key);
+- dh->priv_key = BN_dup(dhp->priv_key);
+- if ((dh->pub_key == NULL) || (dh->priv_key == NULL)) {
+- SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_DH_LIB);
+- goto err;
+- }
++ if (!DH_generate_key(dh)) {
++ SSLerr(SSL_F_SSL3_SEND_SERVER_KEY_EXCHANGE, ERR_R_DH_LIB);
++ goto err;
+ }
+ r[0] = dh->p;
+ r[1] = dh->g;
+Index: openssl-1.0.2d/ssl/ssl.h
+===================================================================
+--- openssl-1.0.2d.orig/ssl/ssl.h
++++ openssl-1.0.2d/ssl/ssl.h
+@@ -625,7 +625,7 @@ struct ssl_session_st {
+ # define SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION 0x00040000L
+ /* If set, always create a new key when using tmp_ecdh parameters */
+ # define SSL_OP_SINGLE_ECDH_USE 0x00080000L
+-/* If set, always create a new key when using tmp_dh parameters */
++/* Does nothing: retained for compatibility */
+ # define SSL_OP_SINGLE_DH_USE 0x00100000L
+ /* Does nothing: retained for compatibiity */
+ # define SSL_OP_EPHEMERAL_RSA 0x0
diff --git a/meta/recipes-connectivity/openssl/openssl/ptest_makefile_deps.patch b/meta/recipes-connectivity/openssl/openssl/ptest_makefile_deps.patch
new file mode 100644
index 0000000..4202e61
--- /dev/null
+++ b/meta/recipes-connectivity/openssl/openssl/ptest_makefile_deps.patch
@@ -0,0 +1,248 @@
+Additional Makefile dependencies removal for test targets
+
+Removing the dependency check for test targets as these tests are
+causing a number of failures and "noise" during ptest execution.
+
+Upstream-Status: Inappropriate [config]
+
+Signed-off-by: Maxin B. John <maxin.john at intel.com>
+
+diff -Naur openssl-1.0.2d-orig/test/Makefile openssl-1.0.2d/test/Makefile
+--- openssl-1.0.2d-orig/test/Makefile 2015-09-28 12:50:41.530022979 +0300
++++ openssl-1.0.2d/test/Makefile 2015-09-28 12:57:45.930717240 +0300
+@@ -155,67 +155,67 @@
+ ( $(MAKE) $$i && echo "PASS: $$i" ) || echo "FAIL: $$i"; \
+ done)
+
+-test_evp: $(EVPTEST)$(EXE_EXT) evptests.txt
++test_evp:
+ ../util/shlib_wrap.sh ./$(EVPTEST) evptests.txt
+
+-test_evp_extra: $(EVPEXTRATEST)$(EXE_EXT)
++test_evp_extra:
+ ../util/shlib_wrap.sh ./$(EVPEXTRATEST)
+
+-test_des: $(DESTEST)$(EXE_EXT)
++test_des:
+ ../util/shlib_wrap.sh ./$(DESTEST)
+
+-test_idea: $(IDEATEST)$(EXE_EXT)
++test_idea:
+ ../util/shlib_wrap.sh ./$(IDEATEST)
+
+-test_sha: $(SHATEST)$(EXE_EXT) $(SHA1TEST)$(EXE_EXT) $(SHA256TEST)$(EXE_EXT) $(SHA512TEST)$(EXE_EXT)
++test_sha:
+ ../util/shlib_wrap.sh ./$(SHATEST)
+ ../util/shlib_wrap.sh ./$(SHA1TEST)
+ ../util/shlib_wrap.sh ./$(SHA256TEST)
+ ../util/shlib_wrap.sh ./$(SHA512TEST)
+
+-test_mdc2: $(MDC2TEST)$(EXE_EXT)
++test_mdc2:
+ ../util/shlib_wrap.sh ./$(MDC2TEST)
+
+-test_md5: $(MD5TEST)$(EXE_EXT)
++test_md5:
+ ../util/shlib_wrap.sh ./$(MD5TEST)
+
+-test_md4: $(MD4TEST)$(EXE_EXT)
++test_md4:
+ ../util/shlib_wrap.sh ./$(MD4TEST)
+
+-test_hmac: $(HMACTEST)$(EXE_EXT)
++test_hmac:
+ ../util/shlib_wrap.sh ./$(HMACTEST)
+
+-test_wp: $(WPTEST)$(EXE_EXT)
++test_wp:
+ ../util/shlib_wrap.sh ./$(WPTEST)
+
+-test_md2: $(MD2TEST)$(EXE_EXT)
++test_md2:
+ ../util/shlib_wrap.sh ./$(MD2TEST)
+
+-test_rmd: $(RMDTEST)$(EXE_EXT)
++test_rmd:
+ ../util/shlib_wrap.sh ./$(RMDTEST)
+
+-test_bf: $(BFTEST)$(EXE_EXT)
++test_bf:
+ ../util/shlib_wrap.sh ./$(BFTEST)
+
+-test_cast: $(CASTTEST)$(EXE_EXT)
++test_cast:
+ ../util/shlib_wrap.sh ./$(CASTTEST)
+
+-test_rc2: $(RC2TEST)$(EXE_EXT)
++test_rc2:
+ ../util/shlib_wrap.sh ./$(RC2TEST)
+
+-test_rc4: $(RC4TEST)$(EXE_EXT)
++test_rc4:
+ ../util/shlib_wrap.sh ./$(RC4TEST)
+
+-test_rc5: $(RC5TEST)$(EXE_EXT)
++test_rc5:
+ ../util/shlib_wrap.sh ./$(RC5TEST)
+
+-test_rand: $(RANDTEST)$(EXE_EXT)
++test_rand:
+ ../util/shlib_wrap.sh ./$(RANDTEST)
+
+-test_enc: ../apps/openssl$(EXE_EXT) testenc
++test_enc:
+ @sh ./testenc
+
+-test_x509: ../apps/openssl$(EXE_EXT) tx509 testx509.pem v3-cert1.pem v3-cert2.pem
++test_x509:
+ echo test normal x509v1 certificate
+ sh ./tx509 2>/dev/null
+ echo test first x509v3 certificate
+@@ -223,25 +223,25 @@
+ echo test second x509v3 certificate
+ sh ./tx509 v3-cert2.pem 2>/dev/null
+
+-test_rsa: ../apps/openssl$(EXE_EXT) trsa testrsa.pem
++test_rsa:
+ @sh ./trsa 2>/dev/null
+ ../util/shlib_wrap.sh ./$(RSATEST)
+
+-test_crl: ../apps/openssl$(EXE_EXT) tcrl testcrl.pem
++test_crl:
+ @sh ./tcrl 2>/dev/null
+
+-test_sid: ../apps/openssl$(EXE_EXT) tsid testsid.pem
++test_sid:
+ @sh ./tsid 2>/dev/null
+
+-test_req: ../apps/openssl$(EXE_EXT) treq testreq.pem testreq2.pem
++test_req:
+ @sh ./treq 2>/dev/null
+ @sh ./treq testreq2.pem 2>/dev/null
+
+-test_pkcs7: ../apps/openssl$(EXE_EXT) tpkcs7 tpkcs7d testp7.pem pkcs7-1.pem
++test_pkcs7:
+ @sh ./tpkcs7 2>/dev/null
+ @sh ./tpkcs7d 2>/dev/null
+
+-test_bn: $(BNTEST)$(EXE_EXT) $(EXPTEST)$(EXE_EXT) bctest
++test_bn:
+ @echo starting big number library test, could take a while...
+ @../util/shlib_wrap.sh ./$(BNTEST) >tmp.bntest
+ @echo quit >>tmp.bntest
+@@ -250,33 +250,33 @@
+ @echo 'test a^b%c implementations'
+ ../util/shlib_wrap.sh ./$(EXPTEST)
+
+-test_ec: $(ECTEST)$(EXE_EXT)
++test_ec:
+ @echo 'test elliptic curves'
+ ../util/shlib_wrap.sh ./$(ECTEST)
+
+-test_ecdsa: $(ECDSATEST)$(EXE_EXT)
++test_ecdsa:
+ @echo 'test ecdsa'
+ ../util/shlib_wrap.sh ./$(ECDSATEST)
+
+-test_ecdh: $(ECDHTEST)$(EXE_EXT)
++test_ecdh:
+ @echo 'test ecdh'
+ ../util/shlib_wrap.sh ./$(ECDHTEST)
+
+-test_verify: ../apps/openssl$(EXE_EXT)
++test_verify:
+ @echo "The following command should have some OK's and some failures"
+ @echo "There are definitly a few expired certificates"
+ ../util/shlib_wrap.sh ../apps/openssl verify -CApath ../certs/demo ../certs/demo/*.pem
+
+-test_dh: $(DHTEST)$(EXE_EXT)
++test_dh:
+ @echo "Generate a set of DH parameters"
+ ../util/shlib_wrap.sh ./$(DHTEST)
+
+-test_dsa: $(DSATEST)$(EXE_EXT)
++test_dsa:
+ @echo "Generate a set of DSA parameters"
+ ../util/shlib_wrap.sh ./$(DSATEST)
+ ../util/shlib_wrap.sh ./$(DSATEST) -app2_1
+
+-test_gen testreq.pem: ../apps/openssl$(EXE_EXT) testgen test.cnf
++test_gen testreq.pem:
+ @echo "Generate and verify a certificate request"
+ @sh ./testgen
+
+@@ -288,13 +288,11 @@
+ @cat certCA.ss certU.ss > intP1.ss
+ @cat certCA.ss certU.ss certP1.ss > intP2.ss
+
+-test_engine: $(ENGINETEST)$(EXE_EXT)
++test_engine:
+ @echo "Manipulate the ENGINE structures"
+ ../util/shlib_wrap.sh ./$(ENGINETEST)
+
+-test_ssl: keyU.ss certU.ss certCA.ss certP1.ss keyP1.ss certP2.ss keyP2.ss \
+- intP1.ss intP2.ss $(SSLTEST)$(EXE_EXT) testssl testsslproxy \
+- ../apps/server2.pem serverinfo.pem
++test_ssl:
+ @echo "test SSL protocol"
+ @if [ -n "$(FIPSCANLIB)" ]; then \
+ sh ./testfipsssl keyU.ss certU.ss certCA.ss; \
+@@ -304,7 +302,7 @@
+ @sh ./testsslproxy keyP1.ss certP1.ss intP1.ss
+ @sh ./testsslproxy keyP2.ss certP2.ss intP2.ss
+
+-test_ca: ../apps/openssl$(EXE_EXT) testca CAss.cnf Uss.cnf
++test_ca:
+ @if ../util/shlib_wrap.sh ../apps/openssl no-rsa; then \
+ echo "skipping CA.sh test -- requires RSA"; \
+ else \
+@@ -312,11 +310,11 @@
+ sh ./testca; \
+ fi
+
+-test_aes: #$(AESTEST)
++test_aes:
+ # @echo "test Rijndael"
+ # ../util/shlib_wrap.sh ./$(AESTEST)
+
+-test_tsa: ../apps/openssl$(EXE_EXT) testtsa CAtsa.cnf ../util/shlib_wrap.sh
++test_tsa:
+ @if ../util/shlib_wrap.sh ../apps/openssl no-rsa; then \
+ echo "skipping testtsa test -- requires RSA"; \
+ else \
+@@ -331,7 +329,7 @@
+ @echo "Test JPAKE"
+ ../util/shlib_wrap.sh ./$(JPAKETEST)
+
+-test_cms: ../apps/openssl$(EXE_EXT) cms-test.pl smcont.txt
++test_cms:
+ @echo "CMS consistency test"
+ $(PERL) cms-test.pl
+
+@@ -339,22 +337,22 @@
+ @echo "Test SRP"
+ ../util/shlib_wrap.sh ./srptest
+
+-test_ocsp: ../apps/openssl$(EXE_EXT) tocsp
++test_ocsp:
+ @echo "Test OCSP"
+ @sh ./tocsp
+
+-test_v3name: $(V3NAMETEST)$(EXE_EXT)
++test_v3name:
+ @echo "Test X509v3_check_*"
+ ../util/shlib_wrap.sh ./$(V3NAMETEST)
+
+ test_heartbeat:
+ ../util/shlib_wrap.sh ./$(HEARTBEATTEST)
+
+-test_constant_time: $(CONSTTIMETEST)$(EXE_EXT)
++test_constant_time:
+ @echo "Test constant time utilites"
+ ../util/shlib_wrap.sh ./$(CONSTTIMETEST)
+
+-test_verify_extra: $(VERIFYEXTRATEST)$(EXE_EXT)
++test_verify_extra:
+ @echo $(START) $@
+ ../util/shlib_wrap.sh ./$(VERIFYEXTRATEST)
+
diff --git a/meta/recipes-connectivity/openssl/openssl_1.0.2d.bb b/meta/recipes-connectivity/openssl/openssl_1.0.2d.bb
index 32d8dce..8defa5b 100644
--- a/meta/recipes-connectivity/openssl/openssl_1.0.2d.bb
+++ b/meta/recipes-connectivity/openssl/openssl_1.0.2d.bb
@@ -36,6 +36,14 @@ SRC_URI += "file://configure-targets.patch \
file://run-ptest \
file://crypto_use_bigint_in_x86-64_perl.patch \
file://openssl-1.0.2a-x32-asm.patch \
+ file://ptest_makefile_deps.patch \
+ file://CVE-2015-3193-bn-asm-x86_64-mont5.pl-fix-carry-propagating-bug-CVE.patch \
+ file://CVE-2015-3194-1-Add-PSS-parameter-check.patch \
+ file://0001-Add-test-for-CVE-2015-3194.patch \
+ file://CVE-2015-3195-Fix-leak-with-ASN.1-combine.patch \
+ file://CVE-2015-3197.patch \
+ file://CVE-2016-0701_1.patch \
+ file://CVE-2016-0701_2.patch \
"
SRC_URI[md5sum] = "38dd619b2e77cbac69b99f52a053d25a"
@@ -55,3 +63,13 @@ PARALLEL_MAKEINST = ""
do_configure_prepend() {
cp ${WORKDIR}/find.pl ${S}/util/find.pl
}
+
+# The crypto_use_bigint patch means that perl's bignum module needs to be
+# installed, but some distributions (for example Fedora 23) don't ship it by
+# default. As the resulting error is very misleading check for bignum before
+# building.
+do_configure_prepend() {
+ if ! perl -Mbigint -e true; then
+ bbfatal "The perl module 'bignum' was not found but this is required to build openssl. Please install this module (often packaged as perl-bignum) and re-run bitbake."
+ fi
+}
diff --git a/meta/recipes-connectivity/socat/socat/CVE-2016-2217.patch b/meta/recipes-connectivity/socat/socat/CVE-2016-2217.patch
new file mode 100644
index 0000000..0cd4179
--- /dev/null
+++ b/meta/recipes-connectivity/socat/socat/CVE-2016-2217.patch
@@ -0,0 +1,372 @@
+Upstream-Status: Backport
+
+http://www.dest-unreach.org/socat/download/socat-1.7.3.1.patch
+
+CVE: CVE-2016-2217
+[Yocto # 9024]
+Singed-off-by: Armin Kuster <akuster at mvista.com>
+
+Index: socat-1.7.3.0/CHANGES
+===================================================================
+--- socat-1.7.3.0.orig/CHANGES
++++ socat-1.7.3.0/CHANGES
+@@ -1,8 +1,39 @@
+
++####################### V 1.7.3.1:
++
++security:
++ Socat security advisory 8
++ A stack overflow in vulnerability was found that can be triggered when
++ command line arguments (complete address specifications, host names,
++ file names) are longer than 512 bytes.
++ Successful exploitation might allow an attacker to execute arbitrary
++ code with the privileges of the socat process.
++ This vulnerability can only be exploited when an attacker is able to
++ inject data into socat's command line.
++ A vulnerable scenario would be a CGI script that reads data from clients
++ and uses (parts of) this data as hostname for a Socat invocation.
++ Test: NESTEDOVFL
++ Credits to Takumi Akiyama for finding and reporting this issue.
++
++ Socat security advisory 7
++ MSVR-1499
++ In the OpenSSL address implementation the hard coded 1024 bit DH p
++ parameter was not prime. The effective cryptographic strength of a key
++ exchange using these parameters was weaker than the one one could get by
++ using a prime p. Moreover, since there is no indication of how these
++ parameters were chosen, the existence of a trapdoor that makes possible
++ for an eavesdropper to recover the shared secret from a key exchange
++ that uses them cannot be ruled out.
++ Futhermore, 1024bit is not considered sufficiently secure.
++ Fix: generated a new 2048bit prime.
++ Thanks to Santiago Zanella-Beguelin and Microsoft Vulnerability
++ Research (MSVR) for finding and reporting this issue.
++
+ ####################### V 1.7.3.0:
+
+ security:
+- (CVE Id pending)
++ Socat security advisory 6
++ CVE-2015-1379: Possible DoS with fork
+ Fixed problems with signal handling caused by use of not async signal
+ safe functions in signal handlers that could freeze socat, allowing
+ denial of service attacks.
+@@ -240,6 +271,7 @@ docu:
+ ####################### V 1.7.2.3:
+
+ security:
++ Socat security advisory 5
+ CVE-2014-0019: socats PROXY-CONNECT address was vulnerable to a buffer
+ overflow with data from command line (see socat-secadv5.txt)
+ Credits to Florian Weimer of the Red Hat Product Security Team
+@@ -247,6 +279,7 @@ security:
+ ####################### V 1.7.2.2:
+
+ security:
++ Socat security advisory 4
+ CVE-2013-3571:
+ after refusing a client connection due to bad source address or source
+ port socat shutdown() the socket but did not close() it, resulting in
+@@ -258,6 +291,7 @@ security:
+ ####################### V 1.7.2.1:
+
+ security:
++ Socat security advisory 3
+ CVE-2012-0219:
+ fixed a possible heap buffer overflow in the readline address. This bug
+ could be exploited when all of the following conditions were met:
+@@ -391,6 +425,7 @@ docu:
+ ####################### V 1.7.1.3:
+
+ security:
++ Socat security advisory 2
+ CVE-2010-2799:
+ fixed a stack overflow vulnerability that occurred when command
+ line arguments (whole addresses, host names, file names) were longer
+@@ -892,6 +927,7 @@ further corrections:
+ ####################### V 1.4.0.3:
+
+ security:
++ Socat security advisory 1
+ CVE-2004-1484:
+ fix to a syslog() based format string vulnerability that can lead to
+ remote code execution. See advisory socat-adv-1.txt
+Index: socat-1.7.3.0/VERSION
+===================================================================
+--- socat-1.7.3.0.orig/VERSION
++++ socat-1.7.3.0/VERSION
+@@ -1 +1 @@
+-"1.7.3.0"
++"1.7.3.1"
+Index: socat-1.7.3.0/nestlex.c
+===================================================================
+--- socat-1.7.3.0.orig/nestlex.c
++++ socat-1.7.3.0/nestlex.c
+@@ -1,5 +1,5 @@
+ /* source: nestlex.c */
+-/* Copyright Gerhard Rieger 2006-2010 */
++/* Copyright Gerhard Rieger */
+ /* Published under the GNU General Public License V.2, see file COPYING */
+
+ /* a function for lexical scanning of nested character patterns */
+@@ -9,6 +9,17 @@
+
+ #include "sysincludes.h"
+
++static int _nestlex(const char **addr,
++ char **token,
++ ptrdiff_t *len,
++ const char *ends[],
++ const char *hquotes[],
++ const char *squotes[],
++ const char *nests[],
++ bool dropquotes,
++ bool c_esc,
++ bool html_esc
++ );
+
+ /* sub: scan a string and copy its value to output string
+ end scanning when an unescaped, unnested string from ends array is found
+@@ -33,6 +44,22 @@ int nestlex(const char **addr, /* input
+ bool c_esc, /* solve C char escapes: \n \t \0 etc */
+ bool html_esc /* solve HTML char escapes: %0d %08 etc */
+ ) {
++ return
++ _nestlex(addr, token, (ptrdiff_t *)len, ends, hquotes, squotes, nests,
++ dropquotes, c_esc, html_esc);
++}
++
++static int _nestlex(const char **addr,
++ char **token,
++ ptrdiff_t *len,
++ const char *ends[],
++ const char *hquotes[],
++ const char *squotes[],
++ const char *nests[],
++ bool dropquotes,
++ bool c_esc,
++ bool html_esc
++ ) {
+ const char *in = *addr; /* pointer into input string */
+ const char **endx; /* loops over end patterns */
+ const char **quotx; /* loops over quote patterns */
+@@ -77,16 +104,18 @@ int nestlex(const char **addr, /* input
+ if (--*len <= 0) { *addr = in; *token = out; return -1; }
+ }
+ }
+- /* we call nestlex recursively */
++ /* we call _nestlex recursively */
+ endnest[0] = *quotx;
+ endnest[1] = NULL;
+ result =
+- nestlex(&in, &out, len, endnest, NULL/*hquotes*/,
++ _nestlex(&in, &out, len, endnest, NULL/*hquotes*/,
+ NULL/*squotes*/, NULL/*nests*/,
+ false, c_esc, html_esc);
+ if (result == 0 && dropquotes) {
+ /* we strip this quote */
+ in += strlen(*quotx);
++ } else if (result < 0) {
++ *addr = in; *token = out; return result;
+ } else {
+ /* we copy the trailing quote */
+ for (i = strlen(*quotx); i > 0; --i) {
+@@ -110,7 +139,7 @@ int nestlex(const char **addr, /* input
+ if (!strncmp(in, *quotx, strlen(*quotx))) {
+ /* this quote pattern matches */
+ /* we strip this quote */
+- /* we call nestlex recursively */
++ /* we call _nestlex recursively */
+ const char *endnest[2];
+ if (dropquotes) {
+ /* we strip this quote */
+@@ -124,13 +153,15 @@ int nestlex(const char **addr, /* input
+ endnest[0] = *quotx;
+ endnest[1] = NULL;
+ result =
+- nestlex(&in, &out, len, endnest, hquotes,
++ _nestlex(&in, &out, len, endnest, hquotes,
+ squotes, nests,
+ false, c_esc, html_esc);
+
+ if (result == 0 && dropquotes) {
+ /* we strip the trailing quote */
+ in += strlen(*quotx);
++ } else if (result < 0) {
++ *addr = in; *token = out; return result;
+ } else {
+ /* we copy the trailing quote */
+ for (i = strlen(*quotx); i > 0; --i) {
+@@ -162,7 +193,7 @@ int nestlex(const char **addr, /* input
+ }
+
+ result =
+- nestlex(&in, &out, len, endnest, hquotes, squotes, nests,
++ _nestlex(&in, &out, len, endnest, hquotes, squotes, nests,
+ false, c_esc, html_esc);
+ if (result == 0) {
+ /* copy endnest */
+@@ -175,6 +206,8 @@ int nestlex(const char **addr, /* input
+ }
+ --i;
+ }
++ } else if (result < 0) {
++ *addr = in; *token = out; return result;
+ }
+ break;
+ }
+@@ -211,7 +244,7 @@ int nestlex(const char **addr, /* input
+ }
+ *out++ = c;
+ --*len;
+- if (*len == 0) {
++ if (*len <= 0) {
+ *addr = in;
+ *token = out;
+ return -1; /* output overflow */
+@@ -222,7 +255,7 @@ int nestlex(const char **addr, /* input
+ /* just a simple char */
+ *out++ = c;
+ --*len;
+- if (*len == 0) {
++ if (*len <= 0) {
+ *addr = in;
+ *token = out;
+ return -1; /* output overflow */
+Index: socat-1.7.3.0/nestlex.h
+===================================================================
+--- socat-1.7.3.0.orig/nestlex.h
++++ socat-1.7.3.0/nestlex.h
+@@ -1,5 +1,5 @@
+ /* source: nestlex.h */
+-/* Copyright Gerhard Rieger 2006 */
++/* Copyright Gerhard Rieger */
+ /* Published under the GNU General Public License V.2, see file COPYING */
+
+ #ifndef __nestlex_h_included
+Index: socat-1.7.3.0/socat.spec
+===================================================================
+--- socat-1.7.3.0.orig/socat.spec
++++ socat-1.7.3.0/socat.spec
+@@ -1,6 +1,6 @@
+
+ %define majorver 1.7
+-%define minorver 3.0
++%define minorver 3.1
+
+ Summary: socat - multipurpose relay
+ Name: socat
+Index: socat-1.7.3.0/test.sh
+===================================================================
+--- socat-1.7.3.0.orig/test.sh
++++ socat-1.7.3.0/test.sh
+@@ -2266,8 +2266,8 @@ gentestcert () {
+ gentestdsacert () {
+ local name="$1"
+ if [ -s $name.key -a -s $name.crt -a -s $name.pem ]; then return; fi
+- openssl dsaparam -out $name-dsa.pem 512 >/dev/null 2>&1
+- openssl dhparam -dsaparam -out $name-dh.pem 512 >/dev/null 2>&1
++ openssl dsaparam -out $name-dsa.pem 1024 >/dev/null 2>&1
++ openssl dhparam -dsaparam -out $name-dh.pem 1024 >/dev/null 2>&1
+ openssl req -newkey dsa:$name-dsa.pem -keyout $name.key -nodes -x509 -config $TESTCERT_CONF -out $name.crt -days 3653 >/dev/null 2>&1
+ cat $name-dsa.pem $name-dh.pem $name.key $name.crt >$name.pem
+ }
+@@ -10973,6 +10973,42 @@ CMD0="$TRACE $SOCAT $opts OPENSSL:localh
+ printf "test $F_n $TEST... " $N
+ $CMD0 </dev/null 1>&0 2>"${te}0"
+ rc0=$?
++if [ $rc0 -lt 128 ] || [ $rc0 -eq 255 ]; then
++ $PRINTF "$OK\n"
++ numOK=$((numOK+1))
++else
++ $PRINTF "$FAILED\n"
++ echo "$CMD0"
++ cat "${te}0"
++ numFAIL=$((numFAIL+1))
++ listFAIL="$listFAIL $N"
++fi
++fi # NUMCOND
++ ;;
++esac
++PORT=$((PORT+1))
++N=$((N+1))
++
++# socat up to 1.7.3.0 had a stack overflow vulnerability that occurred when
++# command line arguments (whole addresses, host names, file names) were longer
++# than 512 bytes and specially crafted.
++NAME=NESTEDOVFL
++case "$TESTS" in
++*%$N%*|*%functions%*|*%bugs%*|*%security%*|*%exec%*|*%$NAME%*)
++TEST="$NAME: stack overflow on overly long nested arg"
++# provide a long host name to TCP-CONNECT and check socats exit code
++if ! eval $NUMCOND; then :; else
++tf="$td/test$N.stdout"
++te="$td/test$N.stderr"
++tdiff="$td/test$N.diff"
++da="test$N $(date) $RANDOM"
++# prepare long data - perl might not be installed
++rm -f "$td/test$N.dat"
++i=0; while [ $i -lt 64 ]; do echo -n "AAAAAAAAAAAAAAAA" >>"$td/test$N.dat"; i=$((i+1)); done
++CMD0="$TRACE $SOCAT $opts EXEC:[$(cat "$td/test$N.dat")] STDIO"
++printf "test $F_n $TEST... " $N
++$CMD0 </dev/null 1>&0 2>"${te}0"
++rc0=$?
+ if [ $rc0 -lt 128 ] || [ $rc0 -eq 255 ]; then
+ $PRINTF "$OK\n"
+ numOK=$((numOK+1))
+Index: socat-1.7.3.0/xio-openssl.c
+===================================================================
+--- socat-1.7.3.0.orig/xio-openssl.c
++++ socat-1.7.3.0/xio-openssl.c
+@@ -912,20 +912,27 @@ int
+ }
+
+ {
+- static unsigned char dh1024_p[] = {
+- 0xCC,0x17,0xF2,0xDC,0x96,0xDF,0x59,0xA4,0x46,0xC5,0x3E,0x0E,
+- 0xB8,0x26,0x55,0x0C,0xE3,0x88,0xC1,0xCE,0xA7,0xBC,0xB3,0xBF,
+- 0x16,0x94,0xD8,0xA9,0x45,0xA2,0xCE,0xA9,0x5B,0x22,0x25,0x5F,
+- 0x92,0x59,0x94,0x1C,0x22,0xBF,0xCB,0xC8,0xC8,0x57,0xCB,0xBF,
+- 0xBC,0x0E,0xE8,0x40,0xF9,0x87,0x03,0xBF,0x60,0x9B,0x08,0xC6,
+- 0x8E,0x99,0xC6,0x05,0xFC,0x00,0xD6,0x6D,0x90,0xA8,0xF5,0xF8,
+- 0xD3,0x8D,0x43,0xC8,0x8F,0x7A,0xBD,0xBB,0x28,0xAC,0x04,0x69,
+- 0x4A,0x0B,0x86,0x73,0x37,0xF0,0x6D,0x4F,0x04,0xF6,0xF5,0xAF,
+- 0xBF,0xAB,0x8E,0xCE,0x75,0x53,0x4D,0x7F,0x7D,0x17,0x78,0x0E,
+- 0x12,0x46,0x4A,0xAF,0x95,0x99,0xEF,0xBC,0xA6,0xC5,0x41,0x77,
+- 0x43,0x7A,0xB9,0xEC,0x8E,0x07,0x3C,0x6D,
++ static unsigned char dh2048_p[] = {
++ 0x00,0xdc,0x21,0x64,0x56,0xbd,0x9c,0xb2,0xac,0xbe,0xc9,0x98,0xef,0x95,0x3e,
++ 0x26,0xfa,0xb5,0x57,0xbc,0xd9,0xe6,0x75,0xc0,0x43,0xa2,0x1c,0x7a,0x85,0xdf,
++ 0x34,0xab,0x57,0xa8,0xf6,0xbc,0xf6,0x84,0x7d,0x05,0x69,0x04,0x83,0x4c,0xd5,
++ 0x56,0xd3,0x85,0x09,0x0a,0x08,0xff,0xb5,0x37,0xa1,0xa3,0x8a,0x37,0x04,0x46,
++ 0xd2,0x93,0x31,0x96,0xf4,0xe4,0x0d,0x9f,0xbd,0x3e,0x7f,0x9e,0x4d,0xaf,0x08,
++ 0xe2,0xe8,0x03,0x94,0x73,0xc4,0xdc,0x06,0x87,0xbb,0x6d,0xae,0x66,0x2d,0x18,
++ 0x1f,0xd8,0x47,0x06,0x5c,0xcf,0x8a,0xb5,0x00,0x51,0x57,0x9b,0xea,0x1e,0xd8,
++ 0xdb,0x8e,0x3c,0x1f,0xd3,0x2f,0xba,0x1f,0x5f,0x3d,0x15,0xc1,0x3b,0x2c,0x82,
++ 0x42,0xc8,0x8c,0x87,0x79,0x5b,0x38,0x86,0x3a,0xeb,0xfd,0x81,0xa9,0xba,0xf7,
++ 0x26,0x5b,0x93,0xc5,0x3e,0x03,0x30,0x4b,0x00,0x5c,0xb6,0x23,0x3e,0xea,0x94,
++ 0xc3,0xb4,0x71,0xc7,0x6e,0x64,0x3b,0xf8,0x92,0x65,0xad,0x60,0x6c,0xd4,0x7b,
++ 0xa9,0x67,0x26,0x04,0xa8,0x0a,0xb2,0x06,0xeb,0xe0,0x7d,0x90,0xdd,0xdd,0xf5,
++ 0xcf,0xb4,0x11,0x7c,0xab,0xc1,0xa3,0x84,0xbe,0x27,0x77,0xc7,0xde,0x20,0x57,
++ 0x66,0x47,0xa7,0x35,0xfe,0x0d,0x6a,0x1c,0x52,0xb8,0x58,0xbf,0x26,0x33,0x81,
++ 0x5e,0xb7,0xa9,0xc0,0xee,0x58,0x11,0x74,0x86,0x19,0x08,0x89,0x1c,0x37,0x0d,
++ 0x52,0x47,0x70,0x75,0x8b,0xa8,0x8b,0x30,0x11,0x71,0x36,0x62,0xf0,0x73,0x41,
++ 0xee,0x34,0x9d,0x0a,0x2b,0x67,0x4e,0x6a,0xa3,0xe2,0x99,0x92,0x1b,0xf5,0x32,
++ 0x73,0x63
+ };
+- static unsigned char dh1024_g[] = {
++ static unsigned char dh2048_g[] = {
+ 0x02,
+ };
+ DH *dh;
+@@ -938,8 +945,8 @@ int
+ }
+ Error("DH_new() failed");
+ } else {
+- dh->p = BN_bin2bn(dh1024_p, sizeof(dh1024_p), NULL);
+- dh->g = BN_bin2bn(dh1024_g, sizeof(dh1024_g), NULL);
++ dh->p = BN_bin2bn(dh2048_p, sizeof(dh2048_p), NULL);
++ dh->g = BN_bin2bn(dh2048_g, sizeof(dh2048_g), NULL);
+ if ((dh->p == NULL) || (dh->g == NULL)) {
+ while (err = ERR_get_error()) {
+ Warn1("BN_bin2bn(): %s",
diff --git a/meta/recipes-connectivity/socat/socat_1.7.3.0.bb b/meta/recipes-connectivity/socat/socat_1.7.3.0.bb
index b58e0a7..6d76d0f 100644
--- a/meta/recipes-connectivity/socat/socat_1.7.3.0.bb
+++ b/meta/recipes-connectivity/socat/socat_1.7.3.0.bb
@@ -14,6 +14,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=b234ee4d69f5fce4486a80fdaf4a4263 \
SRC_URI = "http://www.dest-unreach.org/socat/download/socat-${PV}.tar.bz2 \
file://Makefile.in-fix-for-parallel-build.patch \
+ file://CVE-2016-2217.patch \
"
SRC_URI[md5sum] = "b607edb65bc6c57f4a43f06247504274"
diff --git a/meta/recipes-core/busybox/busybox.inc b/meta/recipes-core/busybox/busybox.inc
index ed8f9fe..4d4709a 100644
--- a/meta/recipes-core/busybox/busybox.inc
+++ b/meta/recipes-core/busybox/busybox.inc
@@ -103,9 +103,8 @@ python () {
}
do_prepare_config () {
- sed -e 's#@DATADIR@#${datadir}#g' \
+ sed -e '/CONFIG_STATIC/d' \
< ${WORKDIR}/defconfig > ${S}/.config
- sed -i -e '/CONFIG_STATIC/d' .config
echo "# CONFIG_STATIC is not set" >> .config
for i in 'CROSS' 'DISTRO FEATURES'; do echo "### $i"; done >> \
${S}/.config
diff --git a/meta/recipes-core/busybox/busybox/0001-Switch-to-POSIX-utmpx-API.patch b/meta/recipes-core/busybox/busybox/0001-Switch-to-POSIX-utmpx-API.patch
new file mode 100644
index 0000000..1d299ee
--- /dev/null
+++ b/meta/recipes-core/busybox/busybox/0001-Switch-to-POSIX-utmpx-API.patch
@@ -0,0 +1,388 @@
+From 86a7f18f211af1abda5c855d2674b0fcb53de524 Mon Sep 17 00:00:00 2001
+From: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
+Date: Thu, 2 Apr 2015 23:03:46 +0200
+Subject: [PATCH] *: Switch to POSIX utmpx API
+
+UTMP is SVID legacy, UTMPX is mandated by POSIX.
+
+Glibc and uClibc have identical layout of UTMP and UTMPX, both of these
+libc treat _PATH_UTMPX as _PATH_UTMP so from a user-perspective nothing
+changes except the names of the API entrypoints.
+
+Signed-off-by: Bernhard Reutner-Fischer <rep.dot.nop at gmail.com>
+---
+Upstream-Status: Backport
+
+ coreutils/who.c | 8 ++++----
+ include/libbb.h | 2 +-
+ init/halt.c | 4 ++--
+ libbb/utmp.c | 44 ++++++++++++++++++++++----------------------
+ miscutils/last.c | 8 ++++----
+ miscutils/last_fancy.c | 16 ++++++++++------
+ miscutils/runlevel.c | 12 ++++++------
+ miscutils/wall.c | 8 ++++----
+ procps/uptime.c | 6 +++---
+ 9 files changed, 56 insertions(+), 52 deletions(-)
+
+diff --git a/coreutils/who.c b/coreutils/who.c
+index f955ce6..8337212 100644
+--- a/coreutils/who.c
++++ b/coreutils/who.c
+@@ -73,7 +73,7 @@ static void idle_string(char *str6, time_t t)
+ int who_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int who_main(int argc UNUSED_PARAM, char **argv)
+ {
+- struct utmp *ut;
++ struct utmpx *ut;
+ unsigned opt;
+ int do_users = (ENABLE_USERS && (!ENABLE_WHO || applet_name[0] == 'u'));
+ const char *fmt = "%s";
+@@ -83,8 +83,8 @@ int who_main(int argc UNUSED_PARAM, char **argv)
+ if (opt & 2) // -H
+ printf("USER\t\tTTY\t\tIDLE\tTIME\t\t HOST\n");
+
+- setutent();
+- while ((ut = getutent()) != NULL) {
++ setutxent();
++ while ((ut = getutxent()) != NULL) {
+ if (ut->ut_user[0]
+ && ((opt & 1) || ut->ut_type == USER_PROCESS)
+ ) {
+@@ -126,6 +126,6 @@ int who_main(int argc UNUSED_PARAM, char **argv)
+ if (do_users)
+ bb_putchar('\n');
+ if (ENABLE_FEATURE_CLEAN_UP)
+- endutent();
++ endutxent();
+ return EXIT_SUCCESS;
+ }
+diff --git a/include/libbb.h b/include/libbb.h
+index 26b6868..0f8363b 100644
+--- a/include/libbb.h
++++ b/include/libbb.h
+@@ -84,7 +84,7 @@
+ # include <selinux/av_permissions.h>
+ #endif
+ #if ENABLE_FEATURE_UTMP
+-# include <utmp.h>
++# include <utmpx.h>
+ #endif
+ #if ENABLE_LOCALE_SUPPORT
+ # include <locale.h>
+diff --git a/init/halt.c b/init/halt.c
+index 7974adb..ad12d91 100644
+--- a/init/halt.c
++++ b/init/halt.c
+@@ -74,7 +74,7 @@
+
+ static void write_wtmp(void)
+ {
+- struct utmp utmp;
++ struct utmpx utmp;
+ struct utsname uts;
+ /* "man utmp" says wtmp file should *not* be created automagically */
+ /*if (access(bb_path_wtmp_file, R_OK|W_OK) == -1) {
+@@ -88,7 +88,7 @@ static void write_wtmp(void)
+ utmp.ut_line[0] = '~'; utmp.ut_line[1] = '~'; /* = strcpy(utmp.ut_line, "~~"); */
+ uname(&uts);
+ safe_strncpy(utmp.ut_host, uts.release, sizeof(utmp.ut_host));
+- updwtmp(bb_path_wtmp_file, &utmp);
++ updwtmpx(bb_path_wtmp_file, &utmp);
+ }
+ #else
+ #define write_wtmp() ((void)0)
+diff --git a/libbb/utmp.c b/libbb/utmp.c
+index 8ad9ba2..bd07670 100644
+--- a/libbb/utmp.c
++++ b/libbb/utmp.c
+@@ -16,7 +16,7 @@ static void touch(const char *filename)
+
+ void FAST_FUNC write_new_utmp(pid_t pid, int new_type, const char *tty_name, const char *username, const char *hostname)
+ {
+- struct utmp utent;
++ struct utmpx utent;
+ char *id;
+ unsigned width;
+
+@@ -45,17 +45,17 @@ void FAST_FUNC write_new_utmp(pid_t pid, int new_type, const char *tty_name, con
+ tty_name += 3;
+ strncpy(id, tty_name, width);
+
+- touch(_PATH_UTMP);
+- //utmpname(_PATH_UTMP);
+- setutent();
++ touch(_PATH_UTMPX);
++ //utmpxname(_PATH_UTMPX);
++ setutxent();
+ /* Append new one (hopefully, unless we collide on ut_id) */
+- pututline(&utent);
+- endutent();
++ pututxline(&utent);
++ endutxent();
+
+ #if ENABLE_FEATURE_WTMP
+ /* "man utmp" says wtmp file should *not* be created automagically */
+ /*touch(bb_path_wtmp_file);*/
+- updwtmp(bb_path_wtmp_file, &utent);
++ updwtmpx(bb_path_wtmp_file, &utent);
+ #endif
+ }
+
+@@ -64,17 +64,17 @@ void FAST_FUNC write_new_utmp(pid_t pid, int new_type, const char *tty_name, con
+ */
+ void FAST_FUNC update_utmp(pid_t pid, int new_type, const char *tty_name, const char *username, const char *hostname)
+ {
+- struct utmp utent;
+- struct utmp *utp;
++ struct utmpx utent;
++ struct utmpx *utp;
+
+- touch(_PATH_UTMP);
+- //utmpname(_PATH_UTMP);
+- setutent();
++ touch(_PATH_UTMPX);
++ //utmpxname(_PATH_UTMPX);
++ setutxent();
+
+ /* Did init/getty/telnetd/sshd/... create an entry for us?
+ * It should be (new_type-1), but we'd also reuse
+ * any other potentially stale xxx_PROCESS entry */
+- while ((utp = getutent()) != NULL) {
++ while ((utp = getutxent()) != NULL) {
+ if (utp->ut_pid == pid
+ // && ut->ut_line[0]
+ && utp->ut_id[0] /* must have nonzero id */
+@@ -88,25 +88,25 @@ void FAST_FUNC update_utmp(pid_t pid, int new_type, const char *tty_name, const
+ /* Stale record. Nuke hostname */
+ memset(utp->ut_host, 0, sizeof(utp->ut_host));
+ }
+- /* NB: pututline (see later) searches for matching utent
+- * using getutid(utent) - we must not change ut_id
++ /* NB: pututxline (see later) searches for matching utxent
++ * using getutxid(utent) - we must not change ut_id
+ * if we want *exactly this* record to be overwritten!
+ */
+ break;
+ }
+ }
+- //endutent(); - no need, pututline can deal with (and actually likes)
++ //endutxent(); - no need, pututxline can deal with (and actually likes)
+ //the situation when utmp file is positioned on found record
+
+ if (!utp) {
+ if (new_type != DEAD_PROCESS)
+ write_new_utmp(pid, new_type, tty_name, username, hostname);
+ else
+- endutent();
++ endutxent();
+ return;
+ }
+
+- /* Make a copy. We can't use *utp, pututline's internal getutid
++ /* Make a copy. We can't use *utp, pututxline's internal getutxid
+ * will overwrite it before it is used! */
+ utent = *utp;
+
+@@ -120,14 +120,14 @@ void FAST_FUNC update_utmp(pid_t pid, int new_type, const char *tty_name, const
+ utent.ut_tv.tv_sec = time(NULL);
+
+ /* Update, or append new one */
+- //setutent();
+- pututline(&utent);
+- endutent();
++ //setutxent();
++ pututxline(&utent);
++ endutxent();
+
+ #if ENABLE_FEATURE_WTMP
+ /* "man utmp" says wtmp file should *not* be created automagically */
+ /*touch(bb_path_wtmp_file);*/
+- updwtmp(bb_path_wtmp_file, &utent);
++ updwtmpx(bb_path_wtmp_file, &utent);
+ #endif
+ }
+
+diff --git a/miscutils/last.c b/miscutils/last.c
+index a144c7e..6d8b584 100644
+--- a/miscutils/last.c
++++ b/miscutils/last.c
+@@ -32,21 +32,21 @@
+
+ #if defined UT_LINESIZE \
+ && ((UT_LINESIZE != 32) || (UT_NAMESIZE != 32) || (UT_HOSTSIZE != 256))
+-#error struct utmp member char[] size(s) have changed!
++#error struct utmpx member char[] size(s) have changed!
+ #elif defined __UT_LINESIZE \
+ && ((__UT_LINESIZE != 32) || (__UT_NAMESIZE != 64) || (__UT_HOSTSIZE != 256))
+-#error struct utmp member char[] size(s) have changed!
++#error struct utmpx member char[] size(s) have changed!
+ #endif
+
+ #if EMPTY != 0 || RUN_LVL != 1 || BOOT_TIME != 2 || NEW_TIME != 3 || \
+ OLD_TIME != 4
+-#error Values for the ut_type field of struct utmp changed
++#error Values for the ut_type field of struct utmpx changed
+ #endif
+
+ int last_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int last_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
+ {
+- struct utmp ut;
++ struct utmpx ut;
+ int n, file = STDIN_FILENO;
+ time_t t_tmp;
+ off_t pos;
+diff --git a/miscutils/last_fancy.c b/miscutils/last_fancy.c
+index 16ed9e9..8194e31 100644
+--- a/miscutils/last_fancy.c
++++ b/miscutils/last_fancy.c
+@@ -22,6 +22,10 @@
+ #define HEADER_LINE_WIDE "USER", "TTY", \
+ INET6_ADDRSTRLEN, INET6_ADDRSTRLEN, "HOST", "LOGIN", " TIME", ""
+
++#if !defined __UT_LINESIZE && defined UT_LINESIZE
++# define __UT_LINESIZE UT_LINESIZE
++#endif
++
+ enum {
+ NORMAL,
+ LOGGED,
+@@ -39,7 +43,7 @@ enum {
+
+ #define show_wide (option_mask32 & LAST_OPT_W)
+
+-static void show_entry(struct utmp *ut, int state, time_t dur_secs)
++static void show_entry(struct utmpx *ut, int state, time_t dur_secs)
+ {
+ unsigned days, hours, mins;
+ char duration[sizeof("(%u+02:02)") + sizeof(int)*3];
+@@ -104,7 +108,7 @@ static void show_entry(struct utmp *ut, int state, time_t dur_secs)
+ duration_str);
+ }
+
+-static int get_ut_type(struct utmp *ut)
++static int get_ut_type(struct utmpx *ut)
+ {
+ if (ut->ut_line[0] == '~') {
+ if (strcmp(ut->ut_user, "shutdown") == 0) {
+@@ -142,7 +146,7 @@ static int get_ut_type(struct utmp *ut)
+ return ut->ut_type;
+ }
+
+-static int is_runlevel_shutdown(struct utmp *ut)
++static int is_runlevel_shutdown(struct utmpx *ut)
+ {
+ if (((ut->ut_pid & 255) == '0') || ((ut->ut_pid & 255) == '6')) {
+ return 1;
+@@ -154,7 +158,7 @@ static int is_runlevel_shutdown(struct utmp *ut)
+ int last_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int last_main(int argc UNUSED_PARAM, char **argv)
+ {
+- struct utmp ut;
++ struct utmpx ut;
+ const char *filename = _PATH_WTMP;
+ llist_t *zlist;
+ off_t pos;
+@@ -242,9 +246,9 @@ int last_main(int argc UNUSED_PARAM, char **argv)
+ {
+ llist_t *el, *next;
+ for (el = zlist; el; el = next) {
+- struct utmp *up = (struct utmp *)el->data;
++ struct utmpx *up = (struct utmpx *)el->data;
+ next = el->link;
+- if (strncmp(up->ut_line, ut.ut_line, UT_LINESIZE) == 0) {
++ if (strncmp(up->ut_line, ut.ut_line, __UT_LINESIZE) == 0) {
+ if (show) {
+ show_entry(&ut, NORMAL, up->ut_tv.tv_sec);
+ show = 0;
+diff --git a/miscutils/runlevel.c b/miscutils/runlevel.c
+index 76231df..8558db8 100644
+--- a/miscutils/runlevel.c
++++ b/miscutils/runlevel.c
+@@ -29,19 +29,19 @@
+ int runlevel_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int runlevel_main(int argc UNUSED_PARAM, char **argv)
+ {
+- struct utmp *ut;
++ struct utmpx *ut;
+ char prev;
+
+- if (argv[1]) utmpname(argv[1]);
++ if (argv[1]) utmpxname(argv[1]);
+
+- setutent();
+- while ((ut = getutent()) != NULL) {
++ setutxent();
++ while ((ut = getutxent()) != NULL) {
+ if (ut->ut_type == RUN_LVL) {
+ prev = ut->ut_pid / 256;
+ if (prev == 0) prev = 'N';
+ printf("%c %c\n", prev, ut->ut_pid % 256);
+ if (ENABLE_FEATURE_CLEAN_UP)
+- endutent();
++ endutxent();
+ return 0;
+ }
+ }
+@@ -49,6 +49,6 @@ int runlevel_main(int argc UNUSED_PARAM, char **argv)
+ puts("unknown");
+
+ if (ENABLE_FEATURE_CLEAN_UP)
+- endutent();
++ endutxent();
+ return 1;
+ }
+diff --git a/miscutils/wall.c b/miscutils/wall.c
+index bb709ee..50658f4 100644
+--- a/miscutils/wall.c
++++ b/miscutils/wall.c
+@@ -32,7 +32,7 @@
+ int wall_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
+ int wall_main(int argc UNUSED_PARAM, char **argv)
+ {
+- struct utmp *ut;
++ struct utmpx *ut;
+ char *msg;
+ int fd;
+
+@@ -46,8 +46,8 @@ int wall_main(int argc UNUSED_PARAM, char **argv)
+ msg = xmalloc_read(fd, NULL);
+ if (ENABLE_FEATURE_CLEAN_UP && argv[1])
+ close(fd);
+- setutent();
+- while ((ut = getutent()) != NULL) {
++ setutxent();
++ while ((ut = getutxent()) != NULL) {
+ char *line;
+ if (ut->ut_type != USER_PROCESS)
+ continue;
+@@ -56,7 +56,7 @@ int wall_main(int argc UNUSED_PARAM, char **argv)
+ free(line);
+ }
+ if (ENABLE_FEATURE_CLEAN_UP) {
+- endutent();
++ endutxent();
+ free(msg);
+ }
+ return EXIT_SUCCESS;
+diff --git a/procps/uptime.c b/procps/uptime.c
+index 778812a..149bae6 100644
+--- a/procps/uptime.c
++++ b/procps/uptime.c
+@@ -81,10 +81,10 @@ int uptime_main(int argc UNUSED_PARAM, char **argv UNUSED_PARAM)
+
+ #if ENABLE_FEATURE_UPTIME_UTMP_SUPPORT
+ {
+- struct utmp *ut;
++ struct utmpx *ut;
+ unsigned users = 0;
+- while ((ut = getutent()) != NULL) {
+- if ((ut->ut_type == USER_PROCESS) && (ut->ut_name[0] != '\0'))
++ while ((ut = getutxent()) != NULL) {
++ if ((ut->ut_type == USER_PROCESS) && (ut->ut_user[0] != '\0'))
+ users++;
+ }
+ printf(", %u users", users);
+--
+2.5.1
+
diff --git a/meta/recipes-core/busybox/busybox/0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch b/meta/recipes-core/busybox/busybox/0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch
new file mode 100644
index 0000000..2bf2b91
--- /dev/null
+++ b/meta/recipes-core/busybox/busybox/0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch
@@ -0,0 +1,114 @@
+From a9333eb6a7b8dbda735947cd5bc981ff9352a2c9 Mon Sep 17 00:00:00 2001
+From: Nathan Phillip Brink <ohnobinki at ohnopublishing.net>
+Date: Thu, 10 Mar 2011 00:27:08 -0500
+Subject: [PATCH 1/2] Use $(CC) when linking instead of $(LD) and use $(CFLAGS)
+ and $(EXTRA_CFLAGS) when linking.
+
+This fixes the issue where LDFLAGS escaped with -Wl are ignored during
+compilation. It also simplifies using CFLAGS or EXTRA_CFLAGS (such as
+-m32 on x86_64 or -flto) which apply to both compilation and linking
+situations.
+
+Signed-off-by: Nathan Phillip Brink <ohnobinki at ohnopublishing.net>
+---
+Upstream-Status: Pending
+
+ Makefile | 7 ++++---
+ scripts/Makefile.build | 8 ++++----
+ scripts/Makefile.lib | 13 +++----------
+ 3 files changed, 11 insertions(+), 17 deletions(-)
+
+Index: busybox-1.23.2/Makefile
+===================================================================
+--- busybox-1.23.2.orig/Makefile
++++ busybox-1.23.2/Makefile
+@@ -309,7 +309,8 @@ CHECKFLAGS := -D__linux__ -Dlinux -D
+ MODFLAGS = -DMODULE
+ CFLAGS_MODULE = $(MODFLAGS)
+ AFLAGS_MODULE = $(MODFLAGS)
+-LDFLAGS_MODULE = -r
++LDFLAGS_RELOCATABLE = -r -nostdlib
++LDFLAGS_MODULE = $(LDFLAGS_RELOCATABLE)
+ CFLAGS_KERNEL =
+ AFLAGS_KERNEL =
+
+@@ -331,7 +332,7 @@ KERNELVERSION = $(VERSION).$(PATCHLEVEL)
+ export VERSION PATCHLEVEL SUBLEVEL KERNELRELEASE KERNELVERSION \
+ ARCH CONFIG_SHELL HOSTCC HOSTCFLAGS CROSS_COMPILE AS LD CC \
+ CPP AR NM STRIP OBJCOPY OBJDUMP MAKE AWK GENKSYMS PERL UTS_MACHINE \
+- HOSTCXX HOSTCXXFLAGS LDFLAGS_MODULE CHECK CHECKFLAGS
++ HOSTCXX HOSTCXXFLAGS LDFLAGS_RELOCATABLE LDFLAGS_MODULE CHECK CHECKFLAGS
+
+ export CPPFLAGS NOSTDINC_FLAGS LINUXINCLUDE OBJCOPYFLAGS LDFLAGS
+ export CFLAGS CFLAGS_KERNEL CFLAGS_MODULE
+@@ -610,7 +611,7 @@ quiet_cmd_busybox__ ?= LINK $@
+ cmd_busybox__ ?= $(srctree)/scripts/trylink \
+ "$@" \
+ "$(CC)" \
+- "$(CFLAGS) $(CFLAGS_busybox)" \
++ "$(CFLAGS) $(CFLAGS_busybox) $(EXTRA_CFLAGS)" \
+ "$(LDFLAGS) $(EXTRA_LDFLAGS)" \
+ "$(core-y)" \
+ "$(libs-y)" \
+Index: busybox-1.23.2/scripts/Makefile.build
+===================================================================
+--- busybox-1.23.2.orig/scripts/Makefile.build
++++ busybox-1.23.2/scripts/Makefile.build
+@@ -174,7 +174,7 @@ cmd_modversions = \
+ | $(GENKSYMS) -a $(ARCH) \
+ > $(@D)/.tmp_$(@F:.o=.ver); \
+ \
+- $(LD) $(LDFLAGS) -r -o $@ $(@D)/.tmp_$(@F) \
++ $(CC) $(ld_flags_partial) $(LDFLAGS_RELOCATABLE) -o $@ $(@D)/.tmp_$(@F) \
+ -T $(@D)/.tmp_$(@F:.o=.ver); \
+ rm -f $(@D)/.tmp_$(@F) $(@D)/.tmp_$(@F:.o=.ver); \
+ else \
+@@ -257,7 +257,7 @@ quiet_cmd_link_o_target = LD $@
+ # If the list of objects to link is empty, just create an empty built-in.o
+ # -nostdlib is added to make "make LD=gcc ..." work (some people use that)
+ cmd_link_o_target = $(if $(strip $(obj-y)),\
+- $(LD) -nostdlib $(ld_flags) -r -o $@ $(filter $(obj-y), $^),\
++ $(CC) $(ld_flags_partial) $(LDFLAGS_RELOCATABLE) -o $@ $(filter $(obj-y), $^),\
+ rm -f $@; $(AR) rcs $@)
+
+ $(builtin-target): $(obj-y) FORCE
+@@ -292,10 +292,10 @@ $($(subst $(obj)/,,$(@:.o=-objs))) \
+ $($(subst $(obj)/,,$(@:.o=-y)))), $^)
+
+ quiet_cmd_link_multi-y = LD $@
+-cmd_link_multi-y = $(LD) $(ld_flags) -r -o $@ $(link_multi_deps)
++cmd_link_multi-y = $(CC) $(ld_flags_partial) $(LDFLAGS_RELOCATABLE) -o $@ $(link_multi_deps)
+
+ quiet_cmd_link_multi-m = LD [M] $@
+-cmd_link_multi-m = $(LD) $(ld_flags) $(LDFLAGS_MODULE) -o $@ $(link_multi_deps)
++cmd_link_multi-m = $(CC) $(ld_flags) $(LDFLAGS_MODULE) -o $@ $(link_multi_deps)
+
+ # We would rather have a list of rules like
+ # foo.o: $(foo-objs)
+Index: busybox-1.23.2/scripts/Makefile.lib
+===================================================================
+--- busybox-1.23.2.orig/scripts/Makefile.lib
++++ busybox-1.23.2/scripts/Makefile.lib
+@@ -121,7 +121,8 @@ cpp_flags = -Wp,-MD,$(depfile) $(NO
+ # yet ld_flags is fed to ld.
+ #ld_flags = $(LDFLAGS) $(EXTRA_LDFLAGS)
+ # Remove the -Wl, prefix from linker options normally passed through gcc
+-ld_flags = $(filter-out -Wl$(comma)%,$(LDFLAGS) $(EXTRA_LDFLAGS))
++ld_flags = $(filter-out -Wl$(comma)%,$(LDFLAGS) $(EXTRA_LDFLAGS) $(CFLAGS) $(EXTRA_CFLAGS))
++ld_flags_partial = $($(filter-out -shared%, $(filter-out -pie%,$(ld_flags))))
+
+
+ # Finds the multi-part object the current object will be linked into
+@@ -151,10 +152,8 @@ $(obj)/%:: $(src)/%_shipped
+ # Linking
+ # ---------------------------------------------------------------------------
+
+-# TODO: LDFLAGS usually is supposed to contain gcc's flags, not ld's.
+-# but here we feed them to ld!
+-quiet_cmd_ld = LD $@
+-cmd_ld = $(LD) $(LDFLAGS) $(EXTRA_LDFLAGS) $(LDFLAGS_$(@F)) \
++quiet_cmd_ld = CC $@
++cmd_ld = $(CC) $(ld_flags) $(LDFLAGS_$(@F)) \
+ $(filter-out FORCE,$^) -o $@
+
+ # Objcopy
diff --git a/meta/recipes-core/busybox/busybox/0001-randconfig-fix.patch b/meta/recipes-core/busybox/busybox/0001-randconfig-fix.patch
new file mode 100644
index 0000000..415ec34
--- /dev/null
+++ b/meta/recipes-core/busybox/busybox/0001-randconfig-fix.patch
@@ -0,0 +1,33 @@
+If CONFIG_FEATURE_LAST_SMALL is enabled the build fails because of a broken
+__UT_NAMESIZE test.
+
+Upstream-Status: Backport
+Signed-off-by: Ross Burton <ross.burton at intel.com>
+
+From 932302666b0354ede63504d1bef8393cab28db8b Mon Sep 17 00:00:00 2001
+From: Denys Vlasenko <vda.linux at googlemail.com>
+Date: Sun, 11 Oct 2015 16:58:18 +0200
+Subject: [PATCH] randconfig fix
+
+Signed-off-by: Denys Vlasenko <vda.linux at googlemail.com>
+---
+ miscutils/last.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/miscutils/last.c b/miscutils/last.c
+index 6d8b584..f8f3437 100644
+--- a/miscutils/last.c
++++ b/miscutils/last.c
+@@ -34,7 +34,8 @@
+ && ((UT_LINESIZE != 32) || (UT_NAMESIZE != 32) || (UT_HOSTSIZE != 256))
+ #error struct utmpx member char[] size(s) have changed!
+ #elif defined __UT_LINESIZE \
+- && ((__UT_LINESIZE != 32) || (__UT_NAMESIZE != 64) || (__UT_HOSTSIZE != 256))
++ && ((__UT_LINESIZE != 32) || (__UT_NAMESIZE != 32) || (__UT_HOSTSIZE != 256))
++/* __UT_NAMESIZE was checked with 64 above, but glibc-2.11 definitely uses 32! */
+ #error struct utmpx member char[] size(s) have changed!
+ #endif
+
+--
+2.6.4
+
diff --git a/meta/recipes-core/busybox/busybox/0002-Passthrough-r-to-linker.patch b/meta/recipes-core/busybox/busybox/0002-Passthrough-r-to-linker.patch
new file mode 100644
index 0000000..de286fb
--- /dev/null
+++ b/meta/recipes-core/busybox/busybox/0002-Passthrough-r-to-linker.patch
@@ -0,0 +1,32 @@
+From df2cc76cdebc4773361477f3db203790f6986e3b Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Sat, 22 Aug 2015 23:42:40 -0700
+Subject: [PATCH 2/2] Passthrough -r to linker
+
+clang does not have -r switch and it does not pass it down to linker
+either, LDFLAGS_RELOCATABLE is used when CC is used for LD, so this
+should not cause side effects
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/Makefile b/Makefile
+index 9da02cb..10dd4a9 100644
+--- a/Makefile
++++ b/Makefile
+@@ -309,7 +309,7 @@ CHECKFLAGS := -D__linux__ -Dlinux -D__STDC__ -Dunix -D__unix__ -Wbitwise $(C
+ MODFLAGS = -DMODULE
+ CFLAGS_MODULE = $(MODFLAGS)
+ AFLAGS_MODULE = $(MODFLAGS)
+-LDFLAGS_RELOCATABLE = -r -nostdlib
++LDFLAGS_RELOCATABLE = -Xlinker -r -nostdlib
+ LDFLAGS_MODULE = $(LDFLAGS_RELOCATABLE)
+ CFLAGS_KERNEL =
+ AFLAGS_KERNEL =
+--
+2.1.4
+
diff --git a/meta/recipes-core/busybox/busybox_1.23.2.bb b/meta/recipes-core/busybox/busybox_1.23.2.bb
index e4d9f97..7258df0 100644
--- a/meta/recipes-core/busybox/busybox_1.23.2.bb
+++ b/meta/recipes-core/busybox/busybox_1.23.2.bb
@@ -30,8 +30,12 @@ SRC_URI = "http://www.busybox.net/downloads/busybox-${PV}.tar.bz2;name=tarball \
file://login-utilities.cfg \
file://recognize_connmand.patch \
file://busybox-cross-menuconfig.patch \
+ file://0001-Switch-to-POSIX-utmpx-API.patch \
file://0001-ifconfig-fix-double-free-fatal-error-in-INET_sprint.patch \
file://0001-chown-fix-help-text.patch \
+ file://0001-Use-CC-when-linking-instead-of-LD-and-use-CFLAGS-and.patch \
+ file://0002-Passthrough-r-to-linker.patch \
+ file://0001-randconfig-fix.patch \
file://mount-via-label.cfg \
file://sha1sum.cfg \
file://sha256sum.cfg \
diff --git a/meta/recipes-core/coreutils/coreutils-6.9/loadavg.patch b/meta/recipes-core/coreutils/coreutils-6.9/loadavg.patch
new file mode 100644
index 0000000..c72efd4
--- /dev/null
+++ b/meta/recipes-core/coreutils/coreutils-6.9/loadavg.patch
@@ -0,0 +1,18 @@
+Remove hardcoded paths so OE's configure QA does not detect it and fail the builds
+For cross compilation is less interesting to look into host paths for target libraries anyway
+
+Upstream-Status: Inappropriate [OE Specific]
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+
+Index: coreutils-6.9/m4/getloadavg.m4
+===================================================================
+--- coreutils-6.9.orig/m4/getloadavg.m4
++++ coreutils-6.9/m4/getloadavg.m4
+@@ -49,7 +49,6 @@ if test $gl_have_func = no; then
+ # There is a commonly available library for RS/6000 AIX.
+ # Since it is not a standard part of AIX, it might be installed locally.
+ gl_getloadavg_LIBS=$LIBS
+- LIBS="-L/usr/local/lib $LIBS"
+ AC_CHECK_LIB(getloadavg, getloadavg,
+ [LIBS="-lgetloadavg $LIBS"], [LIBS=$gl_getloadavg_LIBS])
+ fi
diff --git a/meta/recipes-core/coreutils/coreutils_6.9.bb b/meta/recipes-core/coreutils/coreutils_6.9.bb
index 4ff1d50..e9f82ab 100644
--- a/meta/recipes-core/coreutils/coreutils_6.9.bb
+++ b/meta/recipes-core/coreutils/coreutils_6.9.bb
@@ -9,6 +9,7 @@ LICENSE = "GPLv2+"
LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe \
file://src/ls.c;beginline=4;endline=16;md5=15ed60f67b1db5fedd5dbc37cf8a9543"
PR = "r5"
+DEPENDS = "virtual/libiconv"
inherit autotools gettext texinfo
@@ -25,6 +26,7 @@ SRC_URI = "${GNU_MIRROR}/coreutils/${BP}.tar.bz2 \
file://coreutils-build-with-acl.patch \
file://coreutils-fix-texinfo.patch \
file://fix_for_manpage_building.patch \
+ file://loadavg.patch \
"
SRC_URI[md5sum] = "c9607d8495f16e98906e7ed2d9751a06"
diff --git a/meta/recipes-core/coreutils/coreutils_8.24.bb b/meta/recipes-core/coreutils/coreutils_8.24.bb
index 034ebcd..f042346 100644
--- a/meta/recipes-core/coreutils/coreutils_8.24.bb
+++ b/meta/recipes-core/coreutils/coreutils_8.24.bb
@@ -62,7 +62,7 @@ do_compile_prepend () {
mkdir -p ${B}/src
}
-do_install_append() {
+do_install_append_class-target() {
for i in df mktemp base64; do mv ${D}${bindir}/$i ${D}${bindir}/$i.${BPN}; done
install -d ${D}${base_bindir}
diff --git a/meta/recipes-core/dropbear/dropbear/dropbear at .service b/meta/recipes-core/dropbear/dropbear/dropbear at .service
index 6fe9942..b420bcd 100644
--- a/meta/recipes-core/dropbear/dropbear/dropbear at .service
+++ b/meta/recipes-core/dropbear/dropbear/dropbear at .service
@@ -4,8 +4,9 @@ Wants=dropbearkey.service
After=syslog.target dropbearkey.service
[Service]
+Environment="DROPBEAR_RSAKEY_DIR=/etc/dropbear"
EnvironmentFile=-/etc/default/dropbear
-ExecStart=- at SBINDIR@/dropbear -i -r /etc/dropbear/dropbear_rsa_host_key $DROPBEAR_EXTRA_ARGS
+ExecStart=- at SBINDIR@/dropbear -i -r ${DROPBEAR_RSAKEY_DIR}/dropbear_rsa_host_key $DROPBEAR_EXTRA_ARGS
ExecReload=@BASE_BINDIR@/kill -HUP $MAINPID
StandardInput=socket
KillMode=process
diff --git a/meta/recipes-core/dropbear/dropbear/dropbearkey.service b/meta/recipes-core/dropbear/dropbear/dropbearkey.service
index ccc21d5..c49053d 100644
--- a/meta/recipes-core/dropbear/dropbear/dropbearkey.service
+++ b/meta/recipes-core/dropbear/dropbear/dropbearkey.service
@@ -1,8 +1,13 @@
[Unit]
Description=SSH Key Generation
-ConditionPathExists=|!/etc/dropbear/dropbear_rsa_host_key
+RequiresMountsFor=/var /var/lib
+ConditionPathExists=!/etc/dropbear/dropbear_rsa_host_key
+ConditionPathExists=!/var/lib/dropbear/dropbear_rsa_host_key
[Service]
+Environment="DROPBEAR_RSAKEY_DIR=/etc/dropbear"
+EnvironmentFile=-/etc/default/dropbear
Type=oneshot
-ExecStart=@SBINDIR@/dropbearkey -t rsa -f /etc/dropbear/dropbear_rsa_host_key
+ExecStart=@BASE_BINDIR@/mkdir -p ${DROPBEAR_RSAKEY_DIR}
+ExecStart=@SBINDIR@/dropbearkey -t rsa -f ${DROPBEAR_RSAKEY_DIR}/dropbear_rsa_host_key
RemainAfterExit=yes
diff --git a/meta/recipes-core/glibc/cross-localedef-native_2.22.bb b/meta/recipes-core/glibc/cross-localedef-native_2.22.bb
index 2153ece..3aefe74 100644
--- a/meta/recipes-core/glibc/cross-localedef-native_2.22.bb
+++ b/meta/recipes-core/glibc/cross-localedef-native_2.22.bb
@@ -14,12 +14,13 @@ inherit autotools
FILESEXTRAPATHS =. "${FILE_DIRNAME}/${PN}:${FILE_DIRNAME}/glibc:"
-BRANCH ?= "release/${PV}/master"
+SRCBRANCH ?= "release/${PV}/master"
GLIBC_GIT_URI ?= "git://sourceware.org/git/glibc.git"
-SRC_URI = "${GLIBC_GIT_URI};branch=${BRANCH};name=glibc \
+SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
git://github.com/kraj/localedef;branch=master;name=localedef;destsuffix=git/localedef \
file://fix_for_centos_5.8.patch \
+ file://strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch \
${EGLIBCPATCHES} \
"
EGLIBCPATCHES = "\
diff --git a/meta/recipes-core/glibc/glibc-locale.inc b/meta/recipes-core/glibc/glibc-locale.inc
index df6d073..2352bd0 100644
--- a/meta/recipes-core/glibc/glibc-locale.inc
+++ b/meta/recipes-core/glibc/glibc-locale.inc
@@ -87,7 +87,7 @@ do_install () {
if [ -e ${LOCALETREESRC}/${datadir}/locale ]; then
cp -fpPR ${LOCALETREESRC}/${datadir}/locale ${D}${datadir}
fi
- chown root.root -R ${D}
+ chown root:root -R ${D}
cp -fpPR ${LOCALETREESRC}/SUPPORTED ${WORKDIR}
}
diff --git a/meta/recipes-core/glibc/glibc/0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch b/meta/recipes-core/glibc/glibc/0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch
new file mode 100644
index 0000000..3455df1
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch
@@ -0,0 +1,84 @@
+From cadaf1336332ca7bcdfe4a400776e5782a20e26d Mon Sep 17 00:00:00 2001
+From: "H.J. Lu" <hjl.tools at gmail.com>
+Date: Wed, 28 Oct 2015 07:49:44 -0700
+Subject: [PATCH] Keep only ELF_RTYPE_CLASS_{PLT|COPY} bits for prelink
+
+prelink runs ld.so with the environment variable LD_TRACE_PRELINKING
+set to dump the relocation type class from _dl_debug_bindings. prelink
+has the following relocation type classes:
+
+ #define RTYPE_CLASS_VALID 8
+ #define RTYPE_CLASS_PLT (8|1)
+ #define RTYPE_CLASS_COPY (8|2)
+ #define RTYPE_CLASS_TLS (8|4)
+
+where ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA has a conflict with
+RTYPE_CLASS_TLS.
+
+Since prelink only uses ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY
+bits, we should clear the other bits when the DL_DEBUG_PRELINK bit is
+set.
+
+ [BZ #19178]
+ * elf/dl-lookup.c (RTYPE_CLASS_VALID): New.
+ (RTYPE_CLASS_PLT): Likewise.
+ (RTYPE_CLASS_COPY): Likewise.
+ (RTYPE_CLASS_TLS): Likewise.
+ (_dl_debug_bindings): Use RTYPE_CLASS_TLS and RTYPE_CLASS_VALID
+ to set relocation type class for DL_DEBUG_PRELINK. Keep only
+ ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY bits for
+ DL_DEBUG_PRELINK.
+
+Upstream-Status: submitted (https://sourceware.org/bugzilla/show_bug.cgi?id=19178)
+
+Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
+---
+ elf/dl-lookup.c | 21 +++++++++++++++++++--
+ 1 file changed, 19 insertions(+), 2 deletions(-)
+
+diff --git a/elf/dl-lookup.c b/elf/dl-lookup.c
+index 581fb20..6ae6cc3 100644
+--- a/elf/dl-lookup.c
++++ b/elf/dl-lookup.c
+@@ -1016,6 +1016,18 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
+ #ifdef SHARED
+ if (GLRO(dl_debug_mask) & DL_DEBUG_PRELINK)
+ {
++/* ELF_RTYPE_CLASS_XXX must match RTYPE_CLASS_XXX used by prelink with
++ LD_TRACE_PRELINKING. */
++#define RTYPE_CLASS_VALID 8
++#define RTYPE_CLASS_PLT (8|1)
++#define RTYPE_CLASS_COPY (8|2)
++#define RTYPE_CLASS_TLS (8|4)
++#if ELF_RTYPE_CLASS_PLT != 0 && ELF_RTYPE_CLASS_PLT != 1
++# error ELF_RTYPE_CLASS_PLT must be 0 or 1!
++#endif
++#if ELF_RTYPE_CLASS_COPY != 0 && ELF_RTYPE_CLASS_COPY != 2
++# error ELF_RTYPE_CLASS_COPY must be 0 or 2!
++#endif
+ int conflict = 0;
+ struct sym_val val = { NULL, NULL };
+
+@@ -1071,12 +1083,17 @@ _dl_debug_bindings (const char *undef_name, struct link_map *undef_map,
+
+ if (value->s)
+ {
++ /* Keep only ELF_RTYPE_CLASS_PLT and ELF_RTYPE_CLASS_COPY
++ bits since since prelink only uses them. */
++ type_class &= ELF_RTYPE_CLASS_PLT | ELF_RTYPE_CLASS_COPY;
+ if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
+ == STT_TLS))
+- type_class = 4;
++ /* Clear the RTYPE_CLASS_VALID bit in RTYPE_CLASS_TLS. */
++ type_class = RTYPE_CLASS_TLS & ~RTYPE_CLASS_VALID;
+ else if (__glibc_unlikely (ELFW(ST_TYPE) (value->s->st_info)
+ == STT_GNU_IFUNC))
+- type_class |= 8;
++ /* Set the RTYPE_CLASS_VALID bit. */
++ type_class |= RTYPE_CLASS_VALID;
+ }
+
+ if (conflict
+--
+1.9.3
+
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-7547.patch b/meta/recipes-core/glibc/glibc/CVE-2015-7547.patch
new file mode 100644
index 0000000..4e539f8
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/CVE-2015-7547.patch
@@ -0,0 +1,642 @@
+From e9db92d3acfe1822d56d11abcea5bfc4c41cf6ca Mon Sep 17 00:00:00 2001
+From: Carlos O'Donell <carlos at systemhalted.org>
+Date: Tue, 16 Feb 2016 21:26:37 -0500
+Subject: [PATCH] CVE-2015-7547: getaddrinfo() stack-based buffer overflow (Bug
+ 18665).
+
+* A stack-based buffer overflow was found in libresolv when invoked from
+ libnss_dns, allowing specially crafted DNS responses to seize control
+ of execution flow in the DNS client. The buffer overflow occurs in
+ the functions send_dg (send datagram) and send_vc (send TCP) for the
+ NSS module libnss_dns.so.2 when calling getaddrinfo with AF_UNSPEC
+ family. The use of AF_UNSPEC triggers the low-level resolver code to
+ send out two parallel queries for A and AAAA. A mismanagement of the
+ buffers used for those queries could result in the response of a query
+ writing beyond the alloca allocated buffer created by
+ _nss_dns_gethostbyname4_r. Buffer management is simplified to remove
+ the overflow. Thanks to the Google Security Team and Red Hat for
+ reporting the security impact of this issue, and Robert Holiday of
+ Ciena for reporting the related bug 18665. (CVE-2015-7547)
+
+See also:
+https://sourceware.org/ml/libc-alpha/2016-02/msg00416.html
+https://sourceware.org/ml/libc-alpha/2016-02/msg00418.html
+
+Upstream-Status: Backport
+CVE: CVE-2015-7547
+
+https://sourceware.org/git/?p=glibc.git;a=commit;h=e9db92d3acfe1822d56d11abcea5bfc4c41cf6ca
+minor tweeking to apply to Changelog and res_send.c
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ChangeLog | 17 ++-
+ NEWS | 14 +++
+ resolv/nss_dns/dns-host.c | 111 +++++++++++++++++++-
+ resolv/res_query.c | 3 +
+ resolv/res_send.c | 260 +++++++++++++++++++++++++++++++++++-----------
+ 5 files changed, 339 insertions(+), 66 deletions(-)
+
+Index: git/NEWS
+===================================================================
+--- git.orig/NEWS
++++ git/NEWS
+@@ -105,6 +105,20 @@ Security related changes:
+ depending on the length of the string passed as an argument to the
+ functions. Reported by Joseph Myers.
+
++* A stack-based buffer overflow was found in libresolv when invoked from
++ libnss_dns, allowing specially crafted DNS responses to seize control
++ of execution flow in the DNS client. The buffer overflow occurs in
++ the functions send_dg (send datagram) and send_vc (send TCP) for the
++ NSS module libnss_dns.so.2 when calling getaddrinfo with AF_UNSPEC
++ family. The use of AF_UNSPEC triggers the low-level resolver code to
++ send out two parallel queries for A and AAAA. A mismanagement of the
++ buffers used for those queries could result in the response of a query
++ writing beyond the alloca allocated buffer created by
++ _nss_dns_gethostbyname4_r. Buffer management is simplified to remove
++ the overflow. Thanks to the Google Security Team and Red Hat for
++ reporting the security impact of this issue, and Robert Holiday of
++ Ciena for reporting the related bug 18665. (CVE-2015-7547)
++
+ * The following bugs are resolved with this release:
+
+ 6652, 10672, 12674, 12847, 12926, 13862, 14132, 14138, 14171, 14498,
+Index: git/resolv/nss_dns/dns-host.c
+===================================================================
+--- git.orig/resolv/nss_dns/dns-host.c
++++ git/resolv/nss_dns/dns-host.c
+@@ -1031,7 +1031,10 @@ gaih_getanswer_slice (const querybuf *an
+ int h_namelen = 0;
+
+ if (ancount == 0)
+- return NSS_STATUS_NOTFOUND;
++ {
++ *h_errnop = HOST_NOT_FOUND;
++ return NSS_STATUS_NOTFOUND;
++ }
+
+ while (ancount-- > 0 && cp < end_of_message && had_error == 0)
+ {
+@@ -1208,7 +1211,14 @@ gaih_getanswer_slice (const querybuf *an
+ /* Special case here: if the resolver sent a result but it only
+ contains a CNAME while we are looking for a T_A or T_AAAA record,
+ we fail with NOTFOUND instead of TRYAGAIN. */
+- return canon == NULL ? NSS_STATUS_TRYAGAIN : NSS_STATUS_NOTFOUND;
++ if (canon != NULL)
++ {
++ *h_errnop = HOST_NOT_FOUND;
++ return NSS_STATUS_NOTFOUND;
++ }
++
++ *h_errnop = NETDB_INTERNAL;
++ return NSS_STATUS_TRYAGAIN;
+ }
+
+
+@@ -1222,11 +1232,101 @@ gaih_getanswer (const querybuf *answer1,
+
+ enum nss_status status = NSS_STATUS_NOTFOUND;
+
++ /* Combining the NSS status of two distinct queries requires some
++ compromise and attention to symmetry (A or AAAA queries can be
++ returned in any order). What follows is a breakdown of how this
++ code is expected to work and why. We discuss only SUCCESS,
++ TRYAGAIN, NOTFOUND and UNAVAIL, since they are the only returns
++ that apply (though RETURN and MERGE exist). We make a distinction
++ between TRYAGAIN (recoverable) and TRYAGAIN' (not-recoverable).
++ A recoverable TRYAGAIN is almost always due to buffer size issues
++ and returns ERANGE in errno and the caller is expected to retry
++ with a larger buffer.
++
++ Lastly, you may be tempted to make significant changes to the
++ conditions in this code to bring about symmetry between responses.
++ Please don't change anything without due consideration for
++ expected application behaviour. Some of the synthesized responses
++ aren't very well thought out and sometimes appear to imply that
++ IPv4 responses are always answer 1, and IPv6 responses are always
++ answer 2, but that's not true (see the implementation of send_dg
++ and send_vc to see response can arrive in any order, particularly
++ for UDP). However, we expect it holds roughly enough of the time
++ that this code works, but certainly needs to be fixed to make this
++ a more robust implementation.
++
++ ----------------------------------------------
++ | Answer 1 Status / | Synthesized | Reason |
++ | Answer 2 Status | Status | |
++ |--------------------------------------------|
++ | SUCCESS/SUCCESS | SUCCESS | [1] |
++ | SUCCESS/TRYAGAIN | TRYAGAIN | [5] |
++ | SUCCESS/TRYAGAIN' | SUCCESS | [1] |
++ | SUCCESS/NOTFOUND | SUCCESS | [1] |
++ | SUCCESS/UNAVAIL | SUCCESS | [1] |
++ | TRYAGAIN/SUCCESS | TRYAGAIN | [2] |
++ | TRYAGAIN/TRYAGAIN | TRYAGAIN | [2] |
++ | TRYAGAIN/TRYAGAIN' | TRYAGAIN | [2] |
++ | TRYAGAIN/NOTFOUND | TRYAGAIN | [2] |
++ | TRYAGAIN/UNAVAIL | TRYAGAIN | [2] |
++ | TRYAGAIN'/SUCCESS | SUCCESS | [3] |
++ | TRYAGAIN'/TRYAGAIN | TRYAGAIN | [3] |
++ | TRYAGAIN'/TRYAGAIN' | TRYAGAIN' | [3] |
++ | TRYAGAIN'/NOTFOUND | TRYAGAIN' | [3] |
++ | TRYAGAIN'/UNAVAIL | UNAVAIL | [3] |
++ | NOTFOUND/SUCCESS | SUCCESS | [3] |
++ | NOTFOUND/TRYAGAIN | TRYAGAIN | [3] |
++ | NOTFOUND/TRYAGAIN' | TRYAGAIN' | [3] |
++ | NOTFOUND/NOTFOUND | NOTFOUND | [3] |
++ | NOTFOUND/UNAVAIL | UNAVAIL | [3] |
++ | UNAVAIL/SUCCESS | UNAVAIL | [4] |
++ | UNAVAIL/TRYAGAIN | UNAVAIL | [4] |
++ | UNAVAIL/TRYAGAIN' | UNAVAIL | [4] |
++ | UNAVAIL/NOTFOUND | UNAVAIL | [4] |
++ | UNAVAIL/UNAVAIL | UNAVAIL | [4] |
++ ----------------------------------------------
++
++ [1] If the first response is a success we return success.
++ This ignores the state of the second answer and in fact
++ incorrectly sets errno and h_errno to that of the second
++ answer. However because the response is a success we ignore
++ *errnop and *h_errnop (though that means you touched errno on
++ success). We are being conservative here and returning the
++ likely IPv4 response in the first answer as a success.
++
++ [2] If the first response is a recoverable TRYAGAIN we return
++ that instead of looking at the second response. The
++ expectation here is that we have failed to get an IPv4 response
++ and should retry both queries.
++
++ [3] If the first response was not a SUCCESS and the second
++ response is not NOTFOUND (had a SUCCESS, need to TRYAGAIN,
++ or failed entirely e.g. TRYAGAIN' and UNAVAIL) then use the
++ result from the second response, otherwise the first responses
++ status is used. Again we have some odd side-effects when the
++ second response is NOTFOUND because we overwrite *errnop and
++ *h_errnop that means that a first answer of NOTFOUND might see
++ its *errnop and *h_errnop values altered. Whether it matters
++ in practice that a first response NOTFOUND has the wrong
++ *errnop and *h_errnop is undecided.
++
++ [4] If the first response is UNAVAIL we return that instead of
++ looking at the second response. The expectation here is that
++ it will have failed similarly e.g. configuration failure.
++
++ [5] Testing this code is complicated by the fact that truncated
++ second response buffers might be returned as SUCCESS if the
++ first answer is a SUCCESS. To fix this we add symmetry to
++ TRYAGAIN with the second response. If the second response
++ is a recoverable error we now return TRYAGIN even if the first
++ response was SUCCESS. */
++
+ if (anslen1 > 0)
+ status = gaih_getanswer_slice(answer1, anslen1, qname,
+ &pat, &buffer, &buflen,
+ errnop, h_errnop, ttlp,
+ &first);
++
+ if ((status == NSS_STATUS_SUCCESS || status == NSS_STATUS_NOTFOUND
+ || (status == NSS_STATUS_TRYAGAIN
+ /* We want to look at the second answer in case of an
+@@ -1242,8 +1342,15 @@ gaih_getanswer (const querybuf *answer1,
+ &pat, &buffer, &buflen,
+ errnop, h_errnop, ttlp,
+ &first);
++ /* Use the second response status in some cases. */
+ if (status != NSS_STATUS_SUCCESS && status2 != NSS_STATUS_NOTFOUND)
+ status = status2;
++ /* Do not return a truncated second response (unless it was
++ unavoidable e.g. unrecoverable TRYAGAIN). */
++ if (status == NSS_STATUS_SUCCESS
++ && (status2 == NSS_STATUS_TRYAGAIN
++ && *errnop == ERANGE && *h_errnop != NO_RECOVERY))
++ status = NSS_STATUS_TRYAGAIN;
+ }
+
+ return status;
+Index: git/resolv/res_query.c
+===================================================================
+--- git.orig/resolv/res_query.c
++++ git/resolv/res_query.c
+@@ -396,6 +396,7 @@ __libc_res_nsearch(res_state statp,
+ {
+ free (*answerp2);
+ *answerp2 = NULL;
++ *nanswerp2 = 0;
+ *answerp2_malloced = 0;
+ }
+ }
+@@ -447,6 +448,7 @@ __libc_res_nsearch(res_state statp,
+ {
+ free (*answerp2);
+ *answerp2 = NULL;
++ *nanswerp2 = 0;
+ *answerp2_malloced = 0;
+ }
+
+@@ -521,6 +523,7 @@ __libc_res_nsearch(res_state statp,
+ {
+ free (*answerp2);
+ *answerp2 = NULL;
++ *nanswerp2 = 0;
+ *answerp2_malloced = 0;
+ }
+ if (saved_herrno != -1)
+Index: git/resolv/res_send.c
+===================================================================
+--- git.orig/resolv/res_send.c
++++ git/resolv/res_send.c
+@@ -1,3 +1,20 @@
++/* Copyright (C) 2016 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
+ /*
+ * Copyright (c) 1985, 1989, 1993
+ * The Regents of the University of California. All rights reserved.
+@@ -363,6 +380,8 @@ __libc_res_nsend(res_state statp, const
+ #ifdef USE_HOOKS
+ if (__glibc_unlikely (statp->qhook || statp->rhook)) {
+ if (anssiz < MAXPACKET && ansp) {
++ /* Always allocate MAXPACKET, callers expect
++ this specific size. */
+ u_char *buf = malloc (MAXPACKET);
+ if (buf == NULL)
+ return (-1);
+@@ -638,6 +657,77 @@ get_nsaddr (res_state statp, int n)
+ return (struct sockaddr *) (void *) &statp->nsaddr_list[n];
+ }
+
++/* The send_vc function is responsible for sending a DNS query over TCP
++ to the nameserver numbered NS from the res_state STATP i.e.
++ EXT(statp).nssocks[ns]. The function supports sending both IPv4 and
++ IPv6 queries at the same serially on the same socket.
++
++ Please note that for TCP there is no way to disable sending both
++ queries, unlike UDP, which honours RES_SNGLKUP and RES_SNGLKUPREOP
++ and sends the queries serially and waits for the result after each
++ sent query. This implemetnation should be corrected to honour these
++ options.
++
++ Please also note that for TCP we send both queries over the same
++ socket one after another. This technically violates best practice
++ since the server is allowed to read the first query, respond, and
++ then close the socket (to service another client). If the server
++ does this, then the remaining second query in the socket data buffer
++ will cause the server to send the client an RST which will arrive
++ asynchronously and the client's OS will likely tear down the socket
++ receive buffer resulting in a potentially short read and lost
++ response data. This will force the client to retry the query again,
++ and this process may repeat until all servers and connection resets
++ are exhausted and then the query will fail. It's not known if this
++ happens with any frequency in real DNS server implementations. This
++ implementation should be corrected to use two sockets by default for
++ parallel queries.
++
++ The query stored in BUF of BUFLEN length is sent first followed by
++ the query stored in BUF2 of BUFLEN2 length. Queries are sent
++ serially on the same socket.
++
++ Answers to the query are stored firstly in *ANSP up to a max of
++ *ANSSIZP bytes. If more than *ANSSIZP bytes are needed and ANSCP
++ is non-NULL (to indicate that modifying the answer buffer is allowed)
++ then malloc is used to allocate a new response buffer and ANSCP and
++ ANSP will both point to the new buffer. If more than *ANSSIZP bytes
++ are needed but ANSCP is NULL, then as much of the response as
++ possible is read into the buffer, but the results will be truncated.
++ When truncation happens because of a small answer buffer the DNS
++ packets header field TC will bet set to 1, indicating a truncated
++ message and the rest of the socket data will be read and discarded.
++
++ Answers to the query are stored secondly in *ANSP2 up to a max of
++ *ANSSIZP2 bytes, with the actual response length stored in
++ *RESPLEN2. If more than *ANSSIZP bytes are needed and ANSP2
++ is non-NULL (required for a second query) then malloc is used to
++ allocate a new response buffer, *ANSSIZP2 is set to the new buffer
++ size and *ANSP2_MALLOCED is set to 1.
++
++ The ANSP2_MALLOCED argument will eventually be removed as the
++ change in buffer pointer can be used to detect the buffer has
++ changed and that the caller should use free on the new buffer.
++
++ Note that the answers may arrive in any order from the server and
++ therefore the first and second answer buffers may not correspond to
++ the first and second queries.
++
++ It is not supported to call this function with a non-NULL ANSP2
++ but a NULL ANSCP. Put another way, you can call send_vc with a
++ single unmodifiable buffer or two modifiable buffers, but no other
++ combination is supported.
++
++ It is the caller's responsibility to free the malloc allocated
++ buffers by detecting that the pointers have changed from their
++ original values i.e. *ANSCP or *ANSP2 has changed.
++
++ If errors are encountered then *TERRNO is set to an appropriate
++ errno value and a zero result is returned for a recoverable error,
++ and a less-than zero result is returned for a non-recoverable error.
++
++ If no errors are encountered then *TERRNO is left unmodified and
++ a the length of the first response in bytes is returned. */
+ static int
+ send_vc(res_state statp,
+ const u_char *buf, int buflen, const u_char *buf2, int buflen2,
+@@ -647,11 +737,7 @@ send_vc(res_state statp,
+ {
+ const HEADER *hp = (HEADER *) buf;
+ const HEADER *hp2 = (HEADER *) buf2;
+- u_char *ans = *ansp;
+- int orig_anssizp = *anssizp;
+- // XXX REMOVE
+- // int anssiz = *anssizp;
+- HEADER *anhp = (HEADER *) ans;
++ HEADER *anhp = (HEADER *) *ansp;
+ struct sockaddr *nsap = get_nsaddr (statp, ns);
+ int truncating, connreset, n;
+ /* On some architectures compiler might emit a warning indicating
+@@ -743,6 +829,8 @@ send_vc(res_state statp,
+ * Receive length & response
+ */
+ int recvresp1 = 0;
++ /* Skip the second response if there is no second query.
++ To do that we mark the second response as received. */
+ int recvresp2 = buf2 == NULL;
+ uint16_t rlen16;
+ read_len:
+@@ -779,40 +867,14 @@ send_vc(res_state statp,
+ u_char **thisansp;
+ int *thisresplenp;
+ if ((recvresp1 | recvresp2) == 0 || buf2 == NULL) {
++ /* We have not received any responses
++ yet or we only have one response to
++ receive. */
+ thisanssizp = anssizp;
+ thisansp = anscp ?: ansp;
+ assert (anscp != NULL || ansp2 == NULL);
+ thisresplenp = &resplen;
+ } else {
+- if (*anssizp != MAXPACKET) {
+- /* No buffer allocated for the first
+- reply. We can try to use the rest
+- of the user-provided buffer. */
+-#if __GNUC_PREREQ (4, 7)
+- DIAG_PUSH_NEEDS_COMMENT;
+- DIAG_IGNORE_NEEDS_COMMENT (5, "-Wmaybe-uninitialized");
+-#endif
+-#if _STRING_ARCH_unaligned
+- *anssizp2 = orig_anssizp - resplen;
+- *ansp2 = *ansp + resplen;
+-#else
+- int aligned_resplen
+- = ((resplen + __alignof__ (HEADER) - 1)
+- & ~(__alignof__ (HEADER) - 1));
+- *anssizp2 = orig_anssizp - aligned_resplen;
+- *ansp2 = *ansp + aligned_resplen;
+-#endif
+-#if __GNUC_PREREQ (4, 7)
+- DIAG_POP_NEEDS_COMMENT;
+-#endif
+- } else {
+- /* The first reply did not fit into the
+- user-provided buffer. Maybe the second
+- answer will. */
+- *anssizp2 = orig_anssizp;
+- *ansp2 = *ansp;
+- }
+-
+ thisanssizp = anssizp2;
+ thisansp = ansp2;
+ thisresplenp = resplen2;
+@@ -820,10 +882,14 @@ send_vc(res_state statp,
+ anhp = (HEADER *) *thisansp;
+
+ *thisresplenp = rlen;
+- if (rlen > *thisanssizp) {
+- /* Yes, we test ANSCP here. If we have two buffers
+- both will be allocatable. */
+- if (__glibc_likely (anscp != NULL)) {
++ /* Is the answer buffer too small? */
++ if (*thisanssizp < rlen) {
++ /* If the current buffer is not the the static
++ user-supplied buffer then we can reallocate
++ it. */
++ if (thisansp != NULL && thisansp != ansp) {
++ /* Always allocate MAXPACKET, callers expect
++ this specific size. */
+ u_char *newp = malloc (MAXPACKET);
+ if (newp == NULL) {
+ *terrno = ENOMEM;
+@@ -835,6 +901,9 @@ send_vc(res_state statp,
+ if (thisansp == ansp2)
+ *ansp2_malloced = 1;
+ anhp = (HEADER *) newp;
++ /* A uint16_t can't be larger than MAXPACKET
++ thus it's safe to allocate MAXPACKET but
++ read RLEN bytes instead. */
+ len = rlen;
+ } else {
+ Dprint(statp->options & RES_DEBUG,
+@@ -997,6 +1066,66 @@ reopen (res_state statp, int *terrno, in
+ return 1;
+ }
+
++/* The send_dg function is responsible for sending a DNS query over UDP
++ to the nameserver numbered NS from the res_state STATP i.e.
++ EXT(statp).nssocks[ns]. The function supports IPv4 and IPv6 queries
++ along with the ability to send the query in parallel for both stacks
++ (default) or serially (RES_SINGLKUP). It also supports serial lookup
++ with a close and reopen of the socket used to talk to the server
++ (RES_SNGLKUPREOP) to work around broken name servers.
++
++ The query stored in BUF of BUFLEN length is sent first followed by
++ the query stored in BUF2 of BUFLEN2 length. Queries are sent
++ in parallel (default) or serially (RES_SINGLKUP or RES_SNGLKUPREOP).
++
++ Answers to the query are stored firstly in *ANSP up to a max of
++ *ANSSIZP bytes. If more than *ANSSIZP bytes are needed and ANSCP
++ is non-NULL (to indicate that modifying the answer buffer is allowed)
++ then malloc is used to allocate a new response buffer and ANSCP and
++ ANSP will both point to the new buffer. If more than *ANSSIZP bytes
++ are needed but ANSCP is NULL, then as much of the response as
++ possible is read into the buffer, but the results will be truncated.
++ When truncation happens because of a small answer buffer the DNS
++ packets header field TC will bet set to 1, indicating a truncated
++ message, while the rest of the UDP packet is discarded.
++
++ Answers to the query are stored secondly in *ANSP2 up to a max of
++ *ANSSIZP2 bytes, with the actual response length stored in
++ *RESPLEN2. If more than *ANSSIZP bytes are needed and ANSP2
++ is non-NULL (required for a second query) then malloc is used to
++ allocate a new response buffer, *ANSSIZP2 is set to the new buffer
++ size and *ANSP2_MALLOCED is set to 1.
++
++ The ANSP2_MALLOCED argument will eventually be removed as the
++ change in buffer pointer can be used to detect the buffer has
++ changed and that the caller should use free on the new buffer.
++
++ Note that the answers may arrive in any order from the server and
++ therefore the first and second answer buffers may not correspond to
++ the first and second queries.
++
++ It is not supported to call this function with a non-NULL ANSP2
++ but a NULL ANSCP. Put another way, you can call send_vc with a
++ single unmodifiable buffer or two modifiable buffers, but no other
++ combination is supported.
++
++ It is the caller's responsibility to free the malloc allocated
++ buffers by detecting that the pointers have changed from their
++ original values i.e. *ANSCP or *ANSP2 has changed.
++
++ If an answer is truncated because of UDP datagram DNS limits then
++ *V_CIRCUIT is set to 1 and the return value non-zero to indicate to
++ the caller to retry with TCP. The value *GOTSOMEWHERE is set to 1
++ if any progress was made reading a response from the nameserver and
++ is used by the caller to distinguish between ECONNREFUSED and
++ ETIMEDOUT (the latter if *GOTSOMEWHERE is 1).
++
++ If errors are encountered then *TERRNO is set to an appropriate
++ errno value and a zero result is returned for a recoverable error,
++ and a less-than zero result is returned for a non-recoverable error.
++
++ If no errors are encountered then *TERRNO is left unmodified and
++ a the length of the first response in bytes is returned. */
+ static int
+ send_dg(res_state statp,
+ const u_char *buf, int buflen, const u_char *buf2, int buflen2,
+@@ -1006,8 +1135,6 @@ send_dg(res_state statp,
+ {
+ const HEADER *hp = (HEADER *) buf;
+ const HEADER *hp2 = (HEADER *) buf2;
+- u_char *ans = *ansp;
+- int orig_anssizp = *anssizp;
+ struct timespec now, timeout, finish;
+ struct pollfd pfd[1];
+ int ptimeout;
+@@ -1040,6 +1167,8 @@ send_dg(res_state statp,
+ int need_recompute = 0;
+ int nwritten = 0;
+ int recvresp1 = 0;
++ /* Skip the second response if there is no second query.
++ To do that we mark the second response as received. */
+ int recvresp2 = buf2 == NULL;
+ pfd[0].fd = EXT(statp).nssocks[ns];
+ pfd[0].events = POLLOUT;
+@@ -1203,55 +1332,56 @@ send_dg(res_state statp,
+ int *thisresplenp;
+
+ if ((recvresp1 | recvresp2) == 0 || buf2 == NULL) {
++ /* We have not received any responses
++ yet or we only have one response to
++ receive. */
+ thisanssizp = anssizp;
+ thisansp = anscp ?: ansp;
+ assert (anscp != NULL || ansp2 == NULL);
+ thisresplenp = &resplen;
+ } else {
+- if (*anssizp != MAXPACKET) {
+- /* No buffer allocated for the first
+- reply. We can try to use the rest
+- of the user-provided buffer. */
+-#if _STRING_ARCH_unaligned
+- *anssizp2 = orig_anssizp - resplen;
+- *ansp2 = *ansp + resplen;
+-#else
+- int aligned_resplen
+- = ((resplen + __alignof__ (HEADER) - 1)
+- & ~(__alignof__ (HEADER) - 1));
+- *anssizp2 = orig_anssizp - aligned_resplen;
+- *ansp2 = *ansp + aligned_resplen;
+-#endif
+- } else {
+- /* The first reply did not fit into the
+- user-provided buffer. Maybe the second
+- answer will. */
+- *anssizp2 = orig_anssizp;
+- *ansp2 = *ansp;
+- }
+-
+ thisanssizp = anssizp2;
+ thisansp = ansp2;
+ thisresplenp = resplen2;
+ }
+
+ if (*thisanssizp < MAXPACKET
+- /* Yes, we test ANSCP here. If we have two buffers
+- both will be allocatable. */
+- && anscp
++ /* If the current buffer is not the the static
++ user-supplied buffer then we can reallocate
++ it. */
++ && (thisansp != NULL && thisansp != ansp)
+ #ifdef FIONREAD
++ /* Is the size too small? */
+ && (ioctl (pfd[0].fd, FIONREAD, thisresplenp) < 0
+ || *thisanssizp < *thisresplenp)
+ #endif
+ ) {
++ /* Always allocate MAXPACKET, callers expect
++ this specific size. */
+ u_char *newp = malloc (MAXPACKET);
+ if (newp != NULL) {
+- *anssizp = MAXPACKET;
+- *thisansp = ans = newp;
++ *thisanssizp = MAXPACKET;
++ *thisansp = newp;
+ if (thisansp == ansp2)
+ *ansp2_malloced = 1;
+ }
+ }
++ /* We could end up with truncation if anscp was NULL
++ (not allowed to change caller's buffer) and the
++ response buffer size is too small. This isn't a
++ reliable way to detect truncation because the ioctl
++ may be an inaccurate report of the UDP message size.
++ Therefore we use this only to issue debug output.
++ To do truncation accurately with UDP we need
++ MSG_TRUNC which is only available on Linux. We
++ can abstract out the Linux-specific feature in the
++ future to detect truncation. */
++ if (__glibc_unlikely (*thisanssizp < *thisresplenp)) {
++ Dprint(statp->options & RES_DEBUG,
++ (stdout, ";; response may be truncated (UDP)\n")
++ );
++ }
++
+ HEADER *anhp = (HEADER *) *thisansp;
+ socklen_t fromlen = sizeof(struct sockaddr_in6);
+ assert (sizeof(from) <= fromlen);
+Index: git/ChangeLog
+===================================================================
+--- git.orig/ChangeLog
++++ git/ChangeLog
+@@ -1,3 +1,18 @@
++2016-02-15 Carlos O'Donell <carlos at redhat.com>
++
++ [BZ #18665]
++ * resolv/nss_dns/dns-host.c (gaih_getanswer_slice): Always set
++ *herrno_p.
++ (gaih_getanswer): Document functional behviour. Return tryagain
++ if any result is tryagain.
++ * resolv/res_query.c (__libc_res_nsearch): Set buffer size to zero
++ when freed.
++ * resolv/res_send.c: Add copyright text.
++ (__libc_res_nsend): Document that MAXPACKET is expected.
++ (send_vc): Document. Remove buffer reuse.
++ (send_dg): Document. Remove buffer reuse. Set *thisanssizp to set the
++ size of the buffer. Add Dprint for truncated UDP buffer.
++
+ 2015-09-26 Paul Pluzhnikov <ppluzhnikov at google.com>
+
+ [BZ #18985]
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch b/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch
new file mode 100644
index 0000000..684f344
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/CVE-2015-8776.patch
@@ -0,0 +1,155 @@
+From d36c75fc0d44deec29635dd239b0fbd206ca49b7 Mon Sep 17 00:00:00 2001
+From: Paul Pluzhnikov <ppluzhnikov at google.com>
+Date: Sat, 26 Sep 2015 13:27:48 -0700
+Subject: [PATCH] Fix BZ #18985 -- out of range data to strftime() causes a
+ segfault
+
+Upstream-Status: Backport
+CVE: CVE-2015-8776
+[Yocto # 8980]
+
+https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=d36c75fc0d44deec29635dd239b0fbd206ca49b7
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ChangeLog | 8 ++++++++
+ NEWS | 2 +-
+ time/strftime_l.c | 20 +++++++++++++-------
+ time/tst-strftime.c | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++-
+ 4 files changed, 73 insertions(+), 9 deletions(-)
+
+Index: git/ChangeLog
+===================================================================
+--- git.orig/ChangeLog
++++ git/ChangeLog
+@@ -1,3 +1,11 @@
++2015-09-26 Paul Pluzhnikov <ppluzhnikov at google.com>
++
++ [BZ #18985]
++ * time/strftime_l.c (a_wkday, f_wkday, a_month, f_month): Range check.
++ (__strftime_internal): Likewise.
++ * time/tst-strftime.c (do_bz18985): New test.
++ (do_test): Call it.
++
+ 2015-12-04 Joseph Myers <joseph at codesourcery.com>
+
+ [BZ #16961]
+Index: git/time/strftime_l.c
+===================================================================
+--- git.orig/time/strftime_l.c
++++ git/time/strftime_l.c
+@@ -514,13 +514,17 @@ __strftime_internal (s, maxsize, format,
+ only a few elements. Dereference the pointers only if the format
+ requires this. Then it is ok to fail if the pointers are invalid. */
+ # define a_wkday \
+- ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday))
++ ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \
++ ? "?" : _NL_CURRENT (LC_TIME, NLW(ABDAY_1) + tp->tm_wday)))
+ # define f_wkday \
+- ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday))
++ ((const CHAR_T *) (tp->tm_wday < 0 || tp->tm_wday > 6 \
++ ? "?" : _NL_CURRENT (LC_TIME, NLW(DAY_1) + tp->tm_wday)))
+ # define a_month \
+- ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon))
++ ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \
++ ? "?" : _NL_CURRENT (LC_TIME, NLW(ABMON_1) + tp->tm_mon)))
+ # define f_month \
+- ((const CHAR_T *) _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon))
++ ((const CHAR_T *) (tp->tm_mon < 0 || tp->tm_mon > 11 \
++ ? "?" : _NL_CURRENT (LC_TIME, NLW(MON_1) + tp->tm_mon)))
+ # define ampm \
+ ((const CHAR_T *) _NL_CURRENT (LC_TIME, tp->tm_hour > 11 \
+ ? NLW(PM_STR) : NLW(AM_STR)))
+@@ -530,8 +534,10 @@ __strftime_internal (s, maxsize, format,
+ # define ap_len STRLEN (ampm)
+ #else
+ # if !HAVE_STRFTIME
+-# define f_wkday (weekday_name[tp->tm_wday])
+-# define f_month (month_name[tp->tm_mon])
++# define f_wkday (tp->tm_wday < 0 || tp->tm_wday > 6 \
++ ? "?" : weekday_name[tp->tm_wday])
++# define f_month (tp->tm_mon < 0 || tp->tm_mon > 11 \
++ ? "?" : month_name[tp->tm_mon])
+ # define a_wkday f_wkday
+ # define a_month f_month
+ # define ampm (L_("AMPM") + 2 * (tp->tm_hour > 11))
+@@ -1325,7 +1331,7 @@ __strftime_internal (s, maxsize, format,
+ *tzset_called = true;
+ }
+ # endif
+- zone = tzname[tp->tm_isdst];
++ zone = tp->tm_isdst <= 1 ? tzname[tp->tm_isdst] : "?";
+ }
+ #endif
+ if (! zone)
+Index: git/time/tst-strftime.c
+===================================================================
+--- git.orig/time/tst-strftime.c
++++ git/time/tst-strftime.c
+@@ -4,6 +4,56 @@
+ #include <time.h>
+
+
++static int
++do_bz18985 (void)
++{
++ char buf[1000];
++ struct tm ttm;
++ int rc, ret = 0;
++
++ memset (&ttm, 1, sizeof (ttm));
++ ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */
++ rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm);
++
++ if (rc == 66)
++ {
++ const char expected[]
++ = "? ? ? ? ? ? 16843009 16843009:16843009:16843009 16844909 +467836 ?";
++ if (0 != strcmp (buf, expected))
++ {
++ printf ("expected:\n %s\ngot:\n %s\n", expected, buf);
++ ret += 1;
++ }
++ }
++ else
++ {
++ printf ("expected 66, got %d\n", rc);
++ ret += 1;
++ }
++
++ /* Check negative values as well. */
++ memset (&ttm, 0xFF, sizeof (ttm));
++ ttm.tm_zone = NULL; /* Dereferenced directly if non-NULL. */
++ rc = strftime (buf, sizeof (buf), "%a %A %b %B %c %z %Z", &ttm);
++
++ if (rc == 30)
++ {
++ const char expected[] = "? ? ? ? ? ? -1 -1:-1:-1 1899 ";
++ if (0 != strcmp (buf, expected))
++ {
++ printf ("expected:\n %s\ngot:\n %s\n", expected, buf);
++ ret += 1;
++ }
++ }
++ else
++ {
++ printf ("expected 30, got %d\n", rc);
++ ret += 1;
++ }
++
++ return ret;
++}
++
+ static struct
+ {
+ const char *fmt;
+@@ -104,7 +154,7 @@ do_test (void)
+ }
+ }
+
+- return result;
++ return result + do_bz18985 ();
+ }
+
+ #define TEST_FUNCTION do_test ()
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch b/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch
new file mode 100644
index 0000000..eeab72d
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/CVE-2015-8777.patch
@@ -0,0 +1,123 @@
+From a014cecd82b71b70a6a843e250e06b541ad524f7 Mon Sep 17 00:00:00 2001
+From: Florian Weimer <fweimer at redhat.com>
+Date: Thu, 15 Oct 2015 09:23:07 +0200
+Subject: [PATCH] Always enable pointer guard [BZ #18928]
+
+Honoring the LD_POINTER_GUARD environment variable in AT_SECURE mode
+has security implications. This commit enables pointer guard
+unconditionally, and the environment variable is now ignored.
+
+ [BZ #18928]
+ * sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove
+ _dl_pointer_guard member.
+ * elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard
+ initializer.
+ (security_init): Always set up pointer guard.
+ (process_envvars): Do not process LD_POINTER_GUARD.
+
+Upstream-Status: Backport
+CVE: CVE-2015-8777
+[Yocto # 8980]
+
+https://sourceware.org/git/gitweb.cgi?p=glibc.git;a=commit;h=a014cecd82b71b70a6a843e250e06b541ad524f7
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ChangeLog | 10 ++++++++++
+ NEWS | 13 ++++++++-----
+ elf/rtld.c | 15 ++++-----------
+ sysdeps/generic/ldsodefs.h | 3 ---
+ 4 files changed, 22 insertions(+), 19 deletions(-)
+
+Index: git/ChangeLog
+===================================================================
+--- git.orig/ChangeLog
++++ git/ChangeLog
+@@ -1,3 +1,14 @@
++2015-10-15 Florian Weimer <fweimer at redhat.com>
++
++ [BZ #18928]
++ * sysdeps/generic/ldsodefs.h (struct rtld_global_ro): Remove
++ _dl_pointer_guard member.
++ * elf/rtld.c (_rtld_global_ro): Remove _dl_pointer_guard
++ initializer.
++ (security_init): Always set up pointer guard.
++ (process_envvars): Do not process LD_POINTER_GUARD.
++
++
+ 2015-08-10 Maxim Ostapenko <m.ostapenko at partner.samsung.com>
+
+ [BZ #18778]
+Index: git/NEWS
+===================================================================
+--- git.orig/NEWS
++++ git/NEWS
+@@ -34,7 +34,10 @@ Version 2.22
+ 18533, 18534, 18536, 18539, 18540, 18542, 18544, 18545, 18546, 18547,
+ 18549, 18553, 18557, 18558, 18569, 18583, 18585, 18586, 18592, 18593,
+ 18594, 18602, 18612, 18613, 18619, 18633, 18635, 18641, 18643, 18648,
+- 18657, 18676, 18694, 18696.
++ 18657, 18676, 18694, 18696, 18928.
++
++* The LD_POINTER_GUARD environment variable can no longer be used to
++ disable the pointer guard feature. It is always enabled.
+
+ * Cache information can be queried via sysconf() function on s390 e.g. with
+ _SC_LEVEL1_ICACHE_SIZE as argument.
+Index: git/elf/rtld.c
+===================================================================
+--- git.orig/elf/rtld.c
++++ git/elf/rtld.c
+@@ -163,7 +163,6 @@ struct rtld_global_ro _rtld_global_ro at
+ ._dl_hwcap_mask = HWCAP_IMPORTANT,
+ ._dl_lazy = 1,
+ ._dl_fpu_control = _FPU_DEFAULT,
+- ._dl_pointer_guard = 1,
+ ._dl_pagesize = EXEC_PAGESIZE,
+ ._dl_inhibit_cache = 0,
+
+@@ -710,15 +709,12 @@ security_init (void)
+ #endif
+
+ /* Set up the pointer guard as well, if necessary. */
+- if (GLRO(dl_pointer_guard))
+- {
+- uintptr_t pointer_chk_guard = _dl_setup_pointer_guard (_dl_random,
+- stack_chk_guard);
++ uintptr_t pointer_chk_guard
++ = _dl_setup_pointer_guard (_dl_random, stack_chk_guard);
+ #ifdef THREAD_SET_POINTER_GUARD
+- THREAD_SET_POINTER_GUARD (pointer_chk_guard);
++ THREAD_SET_POINTER_GUARD (pointer_chk_guard);
+ #endif
+- __pointer_chk_guard_local = pointer_chk_guard;
+- }
++ __pointer_chk_guard_local = pointer_chk_guard;
+
+ /* We do not need the _dl_random value anymore. The less
+ information we leave behind, the better, so clear the
+@@ -2478,9 +2474,6 @@ process_envvars (enum mode *modep)
+ GLRO(dl_use_load_bias) = envline[14] == '1' ? -1 : 0;
+ break;
+ }
+-
+- if (memcmp (envline, "POINTER_GUARD", 13) == 0)
+- GLRO(dl_pointer_guard) = envline[14] != '0';
+ break;
+
+ case 14:
+Index: git/sysdeps/generic/ldsodefs.h
+===================================================================
+--- git.orig/sysdeps/generic/ldsodefs.h
++++ git/sysdeps/generic/ldsodefs.h
+@@ -600,9 +600,6 @@ struct rtld_global_ro
+ /* List of auditing interfaces. */
+ struct audit_ifaces *_dl_audit;
+ unsigned int _dl_naudit;
+-
+- /* 0 if internal pointer values should not be guarded, 1 if they should. */
+- EXTERN int _dl_pointer_guard;
+ };
+ # define __rtld_global_attribute__
+ # if IS_IN (rtld)
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch b/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch
new file mode 100644
index 0000000..4dc93c7
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/CVE-2015-8779.patch
@@ -0,0 +1,262 @@
+From 0f58539030e436449f79189b6edab17d7479796e Mon Sep 17 00:00:00 2001
+From: Paul Pluzhnikov <ppluzhnikov at google.com>
+Date: Sat, 8 Aug 2015 15:53:03 -0700
+Subject: [PATCH] Fix BZ #17905
+
+Upstream-Status: Backport
+CVE: CVE-2015-8779
+[Yocto # 8980]
+
+https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=0f58539030e436449f79189b6edab17d7479796e
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ChangeLog | 8 ++++++++
+ NEWS | 2 +-
+ catgets/Makefile | 9 ++++++++-
+ catgets/catgets.c | 19 ++++++++++++-------
+ catgets/open_catalog.c | 23 ++++++++++++++---------
+ catgets/tst-catgets.c | 31 +++++++++++++++++++++++++++++++
+ 6 files changed, 74 insertions(+), 18 deletions(-)
+
+Index: git/catgets/Makefile
+===================================================================
+--- git.orig/catgets/Makefile
++++ git/catgets/Makefile
+@@ -37,6 +37,7 @@ ifeq (y,$(OPTION_EGLIBC_CATGETS))
+ ifeq ($(run-built-tests),yes)
+ tests-special += $(objpfx)de/libc.cat $(objpfx)test1.cat $(objpfx)test2.cat \
+ $(objpfx)sample.SJIS.cat $(objpfx)test-gencat.out
++tests-special += $(objpfx)tst-catgets-mem.out
+ endif
+ endif
+ gencat-modules = xmalloc
+@@ -53,9 +54,11 @@ catgets-CPPFLAGS := -DNLSPATH='"$(msgcat
+
+ generated += de.msg test1.cat test1.h test2.cat test2.h sample.SJIS.cat \
+ test-gencat.h
++generated += tst-catgets.mtrace tst-catgets-mem.out
++
+ generated-dirs += de
+
+-tst-catgets-ENV = NLSPATH="$(objpfx)%l/%N.cat" LANG=de
++tst-catgets-ENV = NLSPATH="$(objpfx)%l/%N.cat" LANG=de MALLOC_TRACE=$(objpfx)tst-catgets.mtrace
+
+ ifeq ($(run-built-tests),yes)
+ # This test just checks whether the program produces any error or not.
+@@ -89,4 +92,8 @@ $(objpfx)test-gencat.out: test-gencat.sh
+ $(objpfx)sample.SJIS.cat: sample.SJIS $(objpfx)gencat
+ $(built-program-cmd) -H $(objpfx)test-gencat.h < $(word 1,$^) > $@; \
+ $(evaluate-test)
++
++$(objpfx)tst-catgets-mem.out: $(objpfx)tst-catgets.out
++ $(common-objpfx)malloc/mtrace $(objpfx)tst-catgets.mtrace > $@; \
++ $(evaluate-test)
+ endif
+Index: git/catgets/catgets.c
+===================================================================
+--- git.orig/catgets/catgets.c
++++ git/catgets/catgets.c
+@@ -16,7 +16,6 @@
+ License along with the GNU C Library; if not, see
+ <http://www.gnu.org/licenses/>. */
+
+-#include <alloca.h>
+ #include <errno.h>
+ #include <locale.h>
+ #include <nl_types.h>
+@@ -35,6 +34,7 @@ catopen (const char *cat_name, int flag)
+ __nl_catd result;
+ const char *env_var = NULL;
+ const char *nlspath = NULL;
++ char *tmp = NULL;
+
+ if (strchr (cat_name, '/') == NULL)
+ {
+@@ -54,7 +54,10 @@ catopen (const char *cat_name, int flag)
+ {
+ /* Append the system dependent directory. */
+ size_t len = strlen (nlspath) + 1 + sizeof NLSPATH;
+- char *tmp = alloca (len);
++ tmp = malloc (len);
++
++ if (__glibc_unlikely (tmp == NULL))
++ return (nl_catd) -1;
+
+ __stpcpy (__stpcpy (__stpcpy (tmp, nlspath), ":"), NLSPATH);
+ nlspath = tmp;
+@@ -65,16 +68,18 @@ catopen (const char *cat_name, int flag)
+
+ result = (__nl_catd) malloc (sizeof (*result));
+ if (result == NULL)
+- /* We cannot get enough memory. */
+- return (nl_catd) -1;
+-
+- if (__open_catalog (cat_name, nlspath, env_var, result) != 0)
++ {
++ /* We cannot get enough memory. */
++ result = (nl_catd) -1;
++ }
++ else if (__open_catalog (cat_name, nlspath, env_var, result) != 0)
+ {
+ /* Couldn't open the file. */
+ free ((void *) result);
+- return (nl_catd) -1;
++ result = (nl_catd) -1;
+ }
+
++ free (tmp);
+ return (nl_catd) result;
+ }
+
+Index: git/catgets/open_catalog.c
+===================================================================
+--- git.orig/catgets/open_catalog.c
++++ git/catgets/open_catalog.c
+@@ -47,6 +47,7 @@ __open_catalog (const char *cat_name, co
+ size_t tab_size;
+ const char *lastp;
+ int result = -1;
++ char *buf = NULL;
+
+ if (strchr (cat_name, '/') != NULL || nlspath == NULL)
+ fd = open_not_cancel_2 (cat_name, O_RDONLY);
+@@ -57,23 +58,23 @@ __open_catalog (const char *cat_name, co
+ if (__glibc_unlikely (bufact + (n) >= bufmax)) \
+ { \
+ char *old_buf = buf; \
+- bufmax += 256 + (n); \
+- buf = (char *) alloca (bufmax); \
+- memcpy (buf, old_buf, bufact); \
++ bufmax += (bufmax < 256 + (n)) ? 256 + (n) : bufmax; \
++ buf = realloc (buf, bufmax); \
++ if (__glibc_unlikely (buf == NULL)) \
++ { \
++ free (old_buf); \
++ return -1; \
++ } \
+ }
+
+ /* The RUN_NLSPATH variable contains a colon separated list of
+ descriptions where we expect to find catalogs. We have to
+ recognize certain % substitutions and stop when we found the
+ first existing file. */
+- char *buf;
+ size_t bufact;
+- size_t bufmax;
++ size_t bufmax = 0;
+ size_t len;
+
+- buf = NULL;
+- bufmax = 0;
+-
+ fd = -1;
+ while (*run_nlspath != '\0')
+ {
+@@ -188,7 +189,10 @@ __open_catalog (const char *cat_name, co
+
+ /* Avoid dealing with directories and block devices */
+ if (__builtin_expect (fd, 0) < 0)
+- return -1;
++ {
++ free (buf);
++ return -1;
++ }
+
+ if (__builtin_expect (__fxstat64 (_STAT_VER, fd, &st), 0) < 0)
+ goto close_unlock_return;
+@@ -325,6 +329,7 @@ __open_catalog (const char *cat_name, co
+ /* Release the lock again. */
+ close_unlock_return:
+ close_not_cancel_no_status (fd);
++ free (buf);
+
+ return result;
+ }
+Index: git/catgets/tst-catgets.c
+===================================================================
+--- git.orig/catgets/tst-catgets.c
++++ git/catgets/tst-catgets.c
+@@ -1,7 +1,10 @@
++#include <assert.h>
+ #include <mcheck.h>
+ #include <nl_types.h>
+ #include <stdio.h>
++#include <stdlib.h>
+ #include <string.h>
++#include <sys/resource.h>
+
+
+ static const char *msgs[] =
+@@ -12,6 +15,33 @@ static const char *msgs[] =
+ };
+ #define nmsgs (sizeof (msgs) / sizeof (msgs[0]))
+
++
++/* Test for unbounded alloca. */
++static int
++do_bz17905 (void)
++{
++ char *buf;
++ struct rlimit rl;
++ nl_catd result;
++
++ const int sz = 1024 * 1024;
++
++ getrlimit (RLIMIT_STACK, &rl);
++ rl.rlim_cur = sz;
++ setrlimit (RLIMIT_STACK, &rl);
++
++ buf = malloc (sz + 1);
++ memset (buf, 'A', sz);
++ buf[sz] = '\0';
++ setenv ("NLSPATH", buf, 1);
++
++ result = catopen (buf, NL_CAT_LOCALE);
++ assert (result == (nl_catd) -1);
++
++ free (buf);
++ return 0;
++}
++
+ #define ROUNDS 5
+
+ static int
+@@ -62,6 +92,7 @@ do_test (void)
+ }
+ }
+
++ result += do_bz17905 ();
+ return result;
+ }
+
+Index: git/ChangeLog
+===================================================================
+--- git.orig/ChangeLog
++++ git/ChangeLog
+@@ -1,3 +1,11 @@
++2015-08-08 Paul Pluzhnikov <ppluzhnikov at google.com>
++
++ [BZ #17905]
++ * catgets/Makefile (tst-catgets-mem): New test.
++ * catgets/catgets.c (catopen): Don't use unbounded alloca.
++ * catgets/open_catalog.c (__open_catalog): Likewise.
++ * catgets/tst-catgets.c (do_bz17905): Test unbounded alloca.
++
+ 2015-10-15 Florian Weimer <fweimer at redhat.com>
+
+ [BZ #18928]
+Index: git/NEWS
+===================================================================
+--- git.orig/NEWS
++++ git/NEWS
+@@ -9,7 +9,7 @@ Version 2.22.1
+
+ * The following bugs are resolved with this release:
+
+- 18778, 18781, 18787.
++ 18778, 18781, 18787, 17905.
+
+ Version 2.22
+
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch b/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch
new file mode 100644
index 0000000..3aca913
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/CVE-2015-9761_1.patch
@@ -0,0 +1,1039 @@
+From e02cabecf0d025ec4f4ddee290bdf7aadb873bb3 Mon Sep 17 00:00:00 2001
+From: Joseph Myers <joseph at codesourcery.com>
+Date: Tue, 24 Nov 2015 22:24:52 +0000
+Subject: [PATCH] Refactor strtod parsing of NaN payloads.
+
+The nan* functions handle their string argument by constructing a
+NAN(...) string on the stack as a VLA and passing it to strtod
+functions.
+
+This approach has problems discussed in bug 16961 and bug 16962: the
+stack usage is unbounded, and it gives incorrect results in certain
+cases where the argument is not a valid n-char-sequence.
+
+The natural fix for both issues is to refactor the NaN payload parsing
+out of strtod into a separate function that the nan* functions can
+call directly, so that no temporary string needs constructing on the
+stack at all. This patch does that refactoring in preparation for
+fixing those bugs (but without actually using the new functions from
+nan* - which will also require exporting them from libc at version
+GLIBC_PRIVATE). This patch is not intended to change any user-visible
+behavior, so no tests are added (fixes for the above bugs will of
+course add tests for them).
+
+This patch builds on my recent fixes for strtol and strtod issues in
+Turkish locales. Given those fixes, the parsing of NaN payloads is
+locale-independent; thus, the new functions do not need to take a
+locale_t argument.
+
+Tested for x86_64, x86, mips64 and powerpc.
+
+ * stdlib/strtod_nan.c: New file.
+ * stdlib/strtod_nan_double.h: Likewise.
+ * stdlib/strtod_nan_float.h: Likewise.
+ * stdlib/strtod_nan_main.c: Likewise.
+ * stdlib/strtod_nan_narrow.h: Likewise.
+ * stdlib/strtod_nan_wide.h: Likewise.
+ * stdlib/strtof_nan.c: Likewise.
+ * stdlib/strtold_nan.c: Likewise.
+ * sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise.
+ * sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise.
+ * sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise.
+ * wcsmbs/wcstod_nan.c: Likewise.
+ * wcsmbs/wcstof_nan.c: Likewise.
+ * wcsmbs/wcstold_nan.c: Likewise.
+ * stdlib/Makefile (routines): Add strtof_nan, strtod_nan and
+ strtold_nan.
+ * wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and
+ wcstof_nan.
+ * include/stdlib.h (__strtof_nan): Declare and use
+ libc_hidden_proto.
+ (__strtod_nan): Likewise.
+ (__strtold_nan): Likewise.
+ (__wcstof_nan): Likewise.
+ (__wcstod_nan): Likewise.
+ (__wcstold_nan): Likewise.
+ * include/wchar.h (____wcstoull_l_internal): Declare.
+ * stdlib/strtod_l.c: Do not include <ieee754.h>.
+ (____strtoull_l_internal): Remove declaration.
+ (STRTOF_NAN): Define macro.
+ (SET_MANTISSA): Remove macro.
+ (STRTOULL): Likewise.
+ (____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload.
+ * stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration.
+ (STRTOF_NAN): Define macro.
+ (SET_MANTISSA): Remove macro.
+ * sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro.
+ (SET_MANTISSA): Remove macro.
+ * sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define
+ macro.
+ (SET_MANTISSA): Remove macro.
+ * sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define
+ macro.
+ (SET_MANTISSA): Remove macro.
+ * sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro.
+ (SET_MANTISSA): Remove macro.
+ * wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration.
+ * wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise.
+ * wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise.
+
+Upstream-Status: Backport
+CVE: CVE-2015-9761 patch #1
+[Yocto # 8980]
+
+https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=e02cabecf0d025ec4f4ddee290bdf7aadb873bb3
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ChangeLog | 49 ++++++++++++++++++
+ include/stdlib.h | 18 +++++++
+ include/wchar.h | 3 ++
+ stdlib/Makefile | 1 +
+ stdlib/strtod_l.c | 48 ++++--------------
+ stdlib/strtod_nan.c | 24 +++++++++
+ stdlib/strtod_nan_double.h | 30 +++++++++++
+ stdlib/strtod_nan_float.h | 29 +++++++++++
+ stdlib/strtod_nan_main.c | 63 ++++++++++++++++++++++++
+ stdlib/strtod_nan_narrow.h | 22 +++++++++
+ stdlib/strtod_nan_wide.h | 22 +++++++++
+ stdlib/strtof_l.c | 11 +----
+ stdlib/strtof_nan.c | 24 +++++++++
+ stdlib/strtold_nan.c | 30 +++++++++++
+ sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h | 33 +++++++++++++
+ sysdeps/ieee754/ldbl-128/strtold_l.c | 13 +----
+ sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h | 30 +++++++++++
+ sysdeps/ieee754/ldbl-128ibm/strtold_l.c | 10 +---
+ sysdeps/ieee754/ldbl-64-128/strtold_l.c | 13 +----
+ sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h | 30 +++++++++++
+ sysdeps/ieee754/ldbl-96/strtold_l.c | 10 +---
+ wcsmbs/Makefile | 1 +
+ wcsmbs/wcstod_l.c | 3 --
+ wcsmbs/wcstod_nan.c | 23 +++++++++
+ wcsmbs/wcstof_l.c | 3 --
+ wcsmbs/wcstof_nan.c | 23 +++++++++
+ wcsmbs/wcstold_l.c | 3 --
+ wcsmbs/wcstold_nan.c | 30 +++++++++++
+ 28 files changed, 504 insertions(+), 95 deletions(-)
+ create mode 100644 stdlib/strtod_nan.c
+ create mode 100644 stdlib/strtod_nan_double.h
+ create mode 100644 stdlib/strtod_nan_float.h
+ create mode 100644 stdlib/strtod_nan_main.c
+ create mode 100644 stdlib/strtod_nan_narrow.h
+ create mode 100644 stdlib/strtod_nan_wide.h
+ create mode 100644 stdlib/strtof_nan.c
+ create mode 100644 stdlib/strtold_nan.c
+ create mode 100644 sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h
+ create mode 100644 sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h
+ create mode 100644 sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h
+ create mode 100644 wcsmbs/wcstod_nan.c
+ create mode 100644 wcsmbs/wcstof_nan.c
+ create mode 100644 wcsmbs/wcstold_nan.c
+
+Index: git/include/stdlib.h
+===================================================================
+--- git.orig/include/stdlib.h
++++ git/include/stdlib.h
+@@ -203,6 +203,24 @@ libc_hidden_proto (strtoll)
+ libc_hidden_proto (strtoul)
+ libc_hidden_proto (strtoull)
+
++extern float __strtof_nan (const char *, char **, char) internal_function;
++extern double __strtod_nan (const char *, char **, char) internal_function;
++extern long double __strtold_nan (const char *, char **, char)
++ internal_function;
++extern float __wcstof_nan (const wchar_t *, wchar_t **, wchar_t)
++ internal_function;
++extern double __wcstod_nan (const wchar_t *, wchar_t **, wchar_t)
++ internal_function;
++extern long double __wcstold_nan (const wchar_t *, wchar_t **, wchar_t)
++ internal_function;
++
++libc_hidden_proto (__strtof_nan)
++libc_hidden_proto (__strtod_nan)
++libc_hidden_proto (__strtold_nan)
++libc_hidden_proto (__wcstof_nan)
++libc_hidden_proto (__wcstod_nan)
++libc_hidden_proto (__wcstold_nan)
++
+ extern char *__ecvt (double __value, int __ndigit, int *__restrict __decpt,
+ int *__restrict __sign);
+ extern char *__fcvt (double __value, int __ndigit, int *__restrict __decpt,
+Index: git/include/wchar.h
+===================================================================
+--- git.orig/include/wchar.h
++++ git/include/wchar.h
+@@ -52,6 +52,9 @@ extern unsigned long long int __wcstoull
+ __restrict __endptr,
+ int __base,
+ int __group) __THROW;
++extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
++ wchar_t **, int, int,
++ __locale_t);
+ libc_hidden_proto (__wcstof_internal)
+ libc_hidden_proto (__wcstod_internal)
+ libc_hidden_proto (__wcstold_internal)
+Index: git/stdlib/Makefile
+===================================================================
+--- git.orig/stdlib/Makefile
++++ git/stdlib/Makefile
+@@ -51,6 +51,7 @@ routines-y := \
+ strtol_l strtoul_l strtoll_l strtoull_l \
+ strtof strtod strtold \
+ strtof_l strtod_l strtold_l \
++ strtof_nan strtod_nan strtold_nan \
+ system canonicalize \
+ a64l l64a \
+ getsubopt xpg_basename \
+Index: git/stdlib/strtod_l.c
+===================================================================
+--- git.orig/stdlib/strtod_l.c
++++ git/stdlib/strtod_l.c
+@@ -21,8 +21,6 @@
+ #include <xlocale.h>
+
+ extern double ____strtod_l_internal (const char *, char **, int, __locale_t);
+-extern unsigned long long int ____strtoull_l_internal (const char *, char **,
+- int, int, __locale_t);
+
+ /* Configuration part. These macros are defined by `strtold.c',
+ `strtof.c', `wcstod.c', `wcstold.c', and `wcstof.c' to produce the
+@@ -34,27 +32,20 @@ extern unsigned long long int ____strtou
+ # ifdef USE_WIDE_CHAR
+ # define STRTOF wcstod_l
+ # define __STRTOF __wcstod_l
++# define STRTOF_NAN __wcstod_nan
+ # else
+ # define STRTOF strtod_l
+ # define __STRTOF __strtod_l
++# define STRTOF_NAN __strtod_nan
+ # endif
+ # define MPN2FLOAT __mpn_construct_double
+ # define FLOAT_HUGE_VAL HUGE_VAL
+-# define SET_MANTISSA(flt, mant) \
+- do { union ieee754_double u; \
+- u.d = (flt); \
+- u.ieee_nan.mantissa0 = (mant) >> 32; \
+- u.ieee_nan.mantissa1 = (mant); \
+- if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \
+- (flt) = u.d; \
+- } while (0)
+ #endif
+ /* End of configuration part. */
+
+ #include <ctype.h>
+ #include <errno.h>
+ #include <float.h>
+-#include <ieee754.h>
+ #include "../locale/localeinfo.h"
+ #include <locale.h>
+ #include <math.h>
+@@ -105,7 +96,6 @@ extern unsigned long long int ____strtou
+ # define TOLOWER_C(Ch) __towlower_l ((Ch), _nl_C_locobj_ptr)
+ # define STRNCASECMP(S1, S2, N) \
+ __wcsncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr)
+-# define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, loc)
+ #else
+ # define STRING_TYPE char
+ # define CHAR_TYPE char
+@@ -117,7 +107,6 @@ extern unsigned long long int ____strtou
+ # define TOLOWER_C(Ch) __tolower_l ((Ch), _nl_C_locobj_ptr)
+ # define STRNCASECMP(S1, S2, N) \
+ __strncasecmp_l ((S1), (S2), (N), _nl_C_locobj_ptr)
+-# define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, loc)
+ #endif
+
+
+@@ -668,33 +657,14 @@ ____STRTOF_INTERNAL (nptr, endptr, group
+ if (*cp == L_('('))
+ {
+ const STRING_TYPE *startp = cp;
+- do
+- ++cp;
+- while ((*cp >= L_('0') && *cp <= L_('9'))
+- || ({ CHAR_TYPE lo = TOLOWER (*cp);
+- lo >= L_('a') && lo <= L_('z'); })
+- || *cp == L_('_'));
+-
+- if (*cp != L_(')'))
+- /* The closing brace is missing. Only match the NAN
+- part. */
+- cp = startp;
++ STRING_TYPE *endp;
++ retval = STRTOF_NAN (cp + 1, &endp, L_(')'));
++ if (*endp == L_(')'))
++ /* Consume the closing parenthesis. */
++ cp = endp + 1;
+ else
+- {
+- /* This is a system-dependent way to specify the
+- bitmask used for the NaN. We expect it to be
+- a number which is put in the mantissa of the
+- number. */
+- STRING_TYPE *endp;
+- unsigned long long int mant;
+-
+- mant = STRTOULL (startp + 1, &endp, 0);
+- if (endp == cp)
+- SET_MANTISSA (retval, mant);
+-
+- /* Consume the closing brace. */
+- ++cp;
+- }
++ /* Only match the NAN part. */
++ cp = startp;
+ }
+
+ if (endptr != NULL)
+Index: git/stdlib/strtod_nan.c
+===================================================================
+--- /dev/null
++++ git/stdlib/strtod_nan.c
+@@ -0,0 +1,24 @@
++/* Convert string for NaN payload to corresponding NaN. Narrow
++ strings, double.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include <strtod_nan_narrow.h>
++#include <strtod_nan_double.h>
++
++#define STRTOD_NAN __strtod_nan
++#include <strtod_nan_main.c>
+Index: git/stdlib/strtod_nan_double.h
+===================================================================
+--- /dev/null
++++ git/stdlib/strtod_nan_double.h
+@@ -0,0 +1,30 @@
++/* Convert string for NaN payload to corresponding NaN. For double.
++ Copyright (C) 1997-2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define FLOAT double
++#define SET_MANTISSA(flt, mant) \
++ do \
++ { \
++ union ieee754_double u; \
++ u.d = (flt); \
++ u.ieee_nan.mantissa0 = (mant) >> 32; \
++ u.ieee_nan.mantissa1 = (mant); \
++ if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \
++ (flt) = u.d; \
++ } \
++ while (0)
+Index: git/stdlib/strtod_nan_float.h
+===================================================================
+--- /dev/null
++++ git/stdlib/strtod_nan_float.h
+@@ -0,0 +1,29 @@
++/* Convert string for NaN payload to corresponding NaN. For float.
++ Copyright (C) 1997-2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define FLOAT float
++#define SET_MANTISSA(flt, mant) \
++ do \
++ { \
++ union ieee754_float u; \
++ u.f = (flt); \
++ u.ieee_nan.mantissa = (mant); \
++ if (u.ieee.mantissa != 0) \
++ (flt) = u.f; \
++ } \
++ while (0)
+Index: git/stdlib/strtod_nan_main.c
+===================================================================
+--- /dev/null
++++ git/stdlib/strtod_nan_main.c
+@@ -0,0 +1,63 @@
++/* Convert string for NaN payload to corresponding NaN.
++ Copyright (C) 1997-2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include <ieee754.h>
++#include <locale.h>
++#include <math.h>
++#include <stdlib.h>
++#include <wchar.h>
++
++
++/* If STR starts with an optional n-char-sequence as defined by ISO C
++ (a sequence of ASCII letters, digits and underscores), followed by
++ ENDC, return a NaN whose payload is set based on STR. Otherwise,
++ return a default NAN. If ENDPTR is not NULL, set *ENDPTR to point
++ to the character after the initial n-char-sequence. */
++
++internal_function
++FLOAT
++STRTOD_NAN (const STRING_TYPE *str, STRING_TYPE **endptr, STRING_TYPE endc)
++{
++ const STRING_TYPE *cp = str;
++
++ while ((*cp >= L_('0') && *cp <= L_('9'))
++ || (*cp >= L_('A') && *cp <= L_('Z'))
++ || (*cp >= L_('a') && *cp <= L_('z'))
++ || *cp == L_('_'))
++ ++cp;
++
++ FLOAT retval = NAN;
++ if (*cp != endc)
++ goto out;
++
++ /* This is a system-dependent way to specify the bitmask used for
++ the NaN. We expect it to be a number which is put in the
++ mantissa of the number. */
++ STRING_TYPE *endp;
++ unsigned long long int mant;
++
++ mant = STRTOULL (str, &endp, 0);
++ if (endp == cp)
++ SET_MANTISSA (retval, mant);
++
++ out:
++ if (endptr != NULL)
++ *endptr = (STRING_TYPE *) cp;
++ return retval;
++}
++libc_hidden_def (STRTOD_NAN)
+Index: git/stdlib/strtod_nan_narrow.h
+===================================================================
+--- /dev/null
++++ git/stdlib/strtod_nan_narrow.h
+@@ -0,0 +1,22 @@
++/* Convert string for NaN payload to corresponding NaN. Narrow strings.
++ Copyright (C) 1997-2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define STRING_TYPE char
++#define L_(Ch) Ch
++#define STRTOULL(S, E, B) ____strtoull_l_internal ((S), (E), (B), 0, \
++ _nl_C_locobj_ptr)
+Index: git/stdlib/strtod_nan_wide.h
+===================================================================
+--- /dev/null
++++ git/stdlib/strtod_nan_wide.h
+@@ -0,0 +1,22 @@
++/* Convert string for NaN payload to corresponding NaN. Wide strings.
++ Copyright (C) 1997-2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define STRING_TYPE wchar_t
++#define L_(Ch) L##Ch
++#define STRTOULL(S, E, B) ____wcstoull_l_internal ((S), (E), (B), 0, \
++ _nl_C_locobj_ptr)
+Index: git/stdlib/strtof_l.c
+===================================================================
+--- git.orig/stdlib/strtof_l.c
++++ git/stdlib/strtof_l.c
+@@ -20,26 +20,19 @@
+ #include <xlocale.h>
+
+ extern float ____strtof_l_internal (const char *, char **, int, __locale_t);
+-extern unsigned long long int ____strtoull_l_internal (const char *, char **,
+- int, int, __locale_t);
+
+ #define FLOAT float
+ #define FLT FLT
+ #ifdef USE_WIDE_CHAR
+ # define STRTOF wcstof_l
+ # define __STRTOF __wcstof_l
++# define STRTOF_NAN __wcstof_nan
+ #else
+ # define STRTOF strtof_l
+ # define __STRTOF __strtof_l
++# define STRTOF_NAN __strtof_nan
+ #endif
+ #define MPN2FLOAT __mpn_construct_float
+ #define FLOAT_HUGE_VAL HUGE_VALF
+-#define SET_MANTISSA(flt, mant) \
+- do { union ieee754_float u; \
+- u.f = (flt); \
+- u.ieee_nan.mantissa = (mant); \
+- if (u.ieee.mantissa != 0) \
+- (flt) = u.f; \
+- } while (0)
+
+ #include "strtod_l.c"
+Index: git/stdlib/strtof_nan.c
+===================================================================
+--- /dev/null
++++ git/stdlib/strtof_nan.c
+@@ -0,0 +1,24 @@
++/* Convert string for NaN payload to corresponding NaN. Narrow
++ strings, float.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include <strtod_nan_narrow.h>
++#include <strtod_nan_float.h>
++
++#define STRTOD_NAN __strtof_nan
++#include <strtod_nan_main.c>
+Index: git/stdlib/strtold_nan.c
+===================================================================
+--- /dev/null
++++ git/stdlib/strtold_nan.c
+@@ -0,0 +1,30 @@
++/* Convert string for NaN payload to corresponding NaN. Narrow
++ strings, long double.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include <math.h>
++
++/* This function is unused if long double and double have the same
++ representation. */
++#ifndef __NO_LONG_DOUBLE_MATH
++# include <strtod_nan_narrow.h>
++# include <strtod_nan_ldouble.h>
++
++# define STRTOD_NAN __strtold_nan
++# include <strtod_nan_main.c>
++#endif
+Index: git/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h
+===================================================================
+--- /dev/null
++++ git/sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h
+@@ -0,0 +1,33 @@
++/* Convert string for NaN payload to corresponding NaN. For ldbl-128.
++ Copyright (C) 1997-2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define FLOAT long double
++#define SET_MANTISSA(flt, mant) \
++ do \
++ { \
++ union ieee854_long_double u; \
++ u.d = (flt); \
++ u.ieee_nan.mantissa0 = 0; \
++ u.ieee_nan.mantissa1 = 0; \
++ u.ieee_nan.mantissa2 = (mant) >> 32; \
++ u.ieee_nan.mantissa3 = (mant); \
++ if ((u.ieee.mantissa0 | u.ieee.mantissa1 \
++ | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \
++ (flt) = u.d; \
++ } \
++ while (0)
+Index: git/sysdeps/ieee754/ldbl-128/strtold_l.c
+===================================================================
+--- git.orig/sysdeps/ieee754/ldbl-128/strtold_l.c
++++ git/sysdeps/ieee754/ldbl-128/strtold_l.c
+@@ -25,22 +25,13 @@
+ #ifdef USE_WIDE_CHAR
+ # define STRTOF wcstold_l
+ # define __STRTOF __wcstold_l
++# define STRTOF_NAN __wcstold_nan
+ #else
+ # define STRTOF strtold_l
+ # define __STRTOF __strtold_l
++# define STRTOF_NAN __strtold_nan
+ #endif
+ #define MPN2FLOAT __mpn_construct_long_double
+ #define FLOAT_HUGE_VAL HUGE_VALL
+-#define SET_MANTISSA(flt, mant) \
+- do { union ieee854_long_double u; \
+- u.d = (flt); \
+- u.ieee_nan.mantissa0 = 0; \
+- u.ieee_nan.mantissa1 = 0; \
+- u.ieee_nan.mantissa2 = (mant) >> 32; \
+- u.ieee_nan.mantissa3 = (mant); \
+- if ((u.ieee.mantissa0 | u.ieee.mantissa1 \
+- | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \
+- (flt) = u.d; \
+- } while (0)
+
+ #include <strtod_l.c>
+Index: git/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h
+===================================================================
+--- /dev/null
++++ git/sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h
+@@ -0,0 +1,30 @@
++/* Convert string for NaN payload to corresponding NaN. For ldbl-128ibm.
++ Copyright (C) 1997-2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define FLOAT long double
++#define SET_MANTISSA(flt, mant) \
++ do \
++ { \
++ union ibm_extended_long_double u; \
++ u.ld = (flt); \
++ u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \
++ u.d[0].ieee_nan.mantissa1 = (mant); \
++ if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \
++ (flt) = u.ld; \
++ } \
++ while (0)
+Index: git/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
+===================================================================
+--- git.orig/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
++++ git/sysdeps/ieee754/ldbl-128ibm/strtold_l.c
+@@ -30,25 +30,19 @@ extern long double ____new_wcstold_l (co
+ # define STRTOF __new_wcstold_l
+ # define __STRTOF ____new_wcstold_l
+ # define ____STRTOF_INTERNAL ____wcstold_l_internal
++# define STRTOF_NAN __wcstold_nan
+ #else
+ extern long double ____new_strtold_l (const char *, char **, __locale_t);
+ # define STRTOF __new_strtold_l
+ # define __STRTOF ____new_strtold_l
+ # define ____STRTOF_INTERNAL ____strtold_l_internal
++# define STRTOF_NAN __strtold_nan
+ #endif
+ extern __typeof (__STRTOF) STRTOF;
+ libc_hidden_proto (__STRTOF)
+ libc_hidden_proto (STRTOF)
+ #define MPN2FLOAT __mpn_construct_long_double
+ #define FLOAT_HUGE_VAL HUGE_VALL
+-# define SET_MANTISSA(flt, mant) \
+- do { union ibm_extended_long_double u; \
+- u.ld = (flt); \
+- u.d[0].ieee_nan.mantissa0 = (mant) >> 32; \
+- u.d[0].ieee_nan.mantissa1 = (mant); \
+- if ((u.d[0].ieee.mantissa0 | u.d[0].ieee.mantissa1) != 0) \
+- (flt) = u.ld; \
+- } while (0)
+
+ #include <strtod_l.c>
+
+Index: git/sysdeps/ieee754/ldbl-64-128/strtold_l.c
+===================================================================
+--- git.orig/sysdeps/ieee754/ldbl-64-128/strtold_l.c
++++ git/sysdeps/ieee754/ldbl-64-128/strtold_l.c
+@@ -30,28 +30,19 @@ extern long double ____new_wcstold_l (co
+ # define STRTOF __new_wcstold_l
+ # define __STRTOF ____new_wcstold_l
+ # define ____STRTOF_INTERNAL ____wcstold_l_internal
++# define STRTOF_NAN __wcstold_nan
+ #else
+ extern long double ____new_strtold_l (const char *, char **, __locale_t);
+ # define STRTOF __new_strtold_l
+ # define __STRTOF ____new_strtold_l
+ # define ____STRTOF_INTERNAL ____strtold_l_internal
++# define STRTOF_NAN __strtold_nan
+ #endif
+ extern __typeof (__STRTOF) STRTOF;
+ libc_hidden_proto (__STRTOF)
+ libc_hidden_proto (STRTOF)
+ #define MPN2FLOAT __mpn_construct_long_double
+ #define FLOAT_HUGE_VAL HUGE_VALL
+-#define SET_MANTISSA(flt, mant) \
+- do { union ieee854_long_double u; \
+- u.d = (flt); \
+- u.ieee_nan.mantissa0 = 0; \
+- u.ieee_nan.mantissa1 = 0; \
+- u.ieee_nan.mantissa2 = (mant) >> 32; \
+- u.ieee_nan.mantissa3 = (mant); \
+- if ((u.ieee.mantissa0 | u.ieee.mantissa1 \
+- | u.ieee.mantissa2 | u.ieee.mantissa3) != 0) \
+- (flt) = u.d; \
+- } while (0)
+
+ #include <strtod_l.c>
+
+Index: git/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h
+===================================================================
+--- /dev/null
++++ git/sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h
+@@ -0,0 +1,30 @@
++/* Convert string for NaN payload to corresponding NaN. For ldbl-96.
++ Copyright (C) 1997-2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#define FLOAT long double
++#define SET_MANTISSA(flt, mant) \
++ do \
++ { \
++ union ieee854_long_double u; \
++ u.d = (flt); \
++ u.ieee_nan.mantissa0 = (mant) >> 32; \
++ u.ieee_nan.mantissa1 = (mant); \
++ if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \
++ (flt) = u.d; \
++ } \
++ while (0)
+Index: git/sysdeps/ieee754/ldbl-96/strtold_l.c
+===================================================================
+--- git.orig/sysdeps/ieee754/ldbl-96/strtold_l.c
++++ git/sysdeps/ieee754/ldbl-96/strtold_l.c
+@@ -25,19 +25,13 @@
+ #ifdef USE_WIDE_CHAR
+ # define STRTOF wcstold_l
+ # define __STRTOF __wcstold_l
++# define STRTOF_NAN __wcstold_nan
+ #else
+ # define STRTOF strtold_l
+ # define __STRTOF __strtold_l
++# define STRTOF_NAN __strtold_nan
+ #endif
+ #define MPN2FLOAT __mpn_construct_long_double
+ #define FLOAT_HUGE_VAL HUGE_VALL
+-#define SET_MANTISSA(flt, mant) \
+- do { union ieee854_long_double u; \
+- u.d = (flt); \
+- u.ieee_nan.mantissa0 = (mant) >> 32; \
+- u.ieee_nan.mantissa1 = (mant); \
+- if ((u.ieee.mantissa0 | u.ieee.mantissa1) != 0) \
+- (flt) = u.d; \
+- } while (0)
+
+ #include <stdlib/strtod_l.c>
+Index: git/wcsmbs/Makefile
+===================================================================
+--- git.orig/wcsmbs/Makefile
++++ git/wcsmbs/Makefile
+@@ -39,6 +39,7 @@ routines-$(OPTION_POSIX_C_LANG_WIDE_CHAR
+ wcstol wcstoul wcstoll wcstoull wcstod wcstold wcstof \
+ wcstol_l wcstoul_l wcstoll_l wcstoull_l \
+ wcstod_l wcstold_l wcstof_l \
++ wcstod_nan wcstold_nan wcstof_nan \
+ wcscoll wcsxfrm \
+ wcwidth wcswidth \
+ wcscoll_l wcsxfrm_l \
+Index: git/wcsmbs/wcstod_l.c
+===================================================================
+--- git.orig/wcsmbs/wcstod_l.c
++++ git/wcsmbs/wcstod_l.c
+@@ -23,9 +23,6 @@
+
+ extern double ____wcstod_l_internal (const wchar_t *, wchar_t **, int,
+ __locale_t);
+-extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
+- wchar_t **, int, int,
+- __locale_t);
+
+ #define USE_WIDE_CHAR 1
+
+Index: git/wcsmbs/wcstod_nan.c
+===================================================================
+--- /dev/null
++++ git/wcsmbs/wcstod_nan.c
+@@ -0,0 +1,23 @@
++/* Convert string for NaN payload to corresponding NaN. Wide strings, double.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include "../stdlib/strtod_nan_wide.h"
++#include "../stdlib/strtod_nan_double.h"
++
++#define STRTOD_NAN __wcstod_nan
++#include "../stdlib/strtod_nan_main.c"
+Index: git/wcsmbs/wcstof_l.c
+===================================================================
+--- git.orig/wcsmbs/wcstof_l.c
++++ git/wcsmbs/wcstof_l.c
+@@ -25,8 +25,5 @@
+
+ extern float ____wcstof_l_internal (const wchar_t *, wchar_t **, int,
+ __locale_t);
+-extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
+- wchar_t **, int, int,
+- __locale_t);
+
+ #include <stdlib/strtof_l.c>
+Index: git/wcsmbs/wcstof_nan.c
+===================================================================
+--- /dev/null
++++ git/wcsmbs/wcstof_nan.c
+@@ -0,0 +1,23 @@
++/* Convert string for NaN payload to corresponding NaN. Wide strings, float.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include "../stdlib/strtod_nan_wide.h"
++#include "../stdlib/strtod_nan_float.h"
++
++#define STRTOD_NAN __wcstof_nan
++#include "../stdlib/strtod_nan_main.c"
+Index: git/wcsmbs/wcstold_l.c
+===================================================================
+--- git.orig/wcsmbs/wcstold_l.c
++++ git/wcsmbs/wcstold_l.c
+@@ -24,8 +24,5 @@
+
+ extern long double ____wcstold_l_internal (const wchar_t *, wchar_t **, int,
+ __locale_t);
+-extern unsigned long long int ____wcstoull_l_internal (const wchar_t *,
+- wchar_t **, int, int,
+- __locale_t);
+
+ #include <strtold_l.c>
+Index: git/wcsmbs/wcstold_nan.c
+===================================================================
+--- /dev/null
++++ git/wcsmbs/wcstold_nan.c
+@@ -0,0 +1,30 @@
++/* Convert string for NaN payload to corresponding NaN. Wide strings,
++ long double.
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include <math.h>
++
++/* This function is unused if long double and double have the same
++ representation. */
++#ifndef __NO_LONG_DOUBLE_MATH
++# include "../stdlib/strtod_nan_wide.h"
++# include <strtod_nan_ldouble.h>
++
++# define STRTOD_NAN __wcstold_nan
++# include "../stdlib/strtod_nan_main.c"
++#endif
+Index: git/ChangeLog
+===================================================================
+--- git.orig/ChangeLog
++++ git/ChangeLog
+@@ -1,3 +1,57 @@
++2015-11-24 Joseph Myers <joseph at codesourcery.com>
++
++ * stdlib/strtod_nan.c: New file.
++ * stdlib/strtod_nan_double.h: Likewise.
++ * stdlib/strtod_nan_float.h: Likewise.
++ * stdlib/strtod_nan_main.c: Likewise.
++ * stdlib/strtod_nan_narrow.h: Likewise.
++ * stdlib/strtod_nan_wide.h: Likewise.
++ * stdlib/strtof_nan.c: Likewise.
++ * stdlib/strtold_nan.c: Likewise.
++ * sysdeps/ieee754/ldbl-128/strtod_nan_ldouble.h: Likewise.
++ * sysdeps/ieee754/ldbl-128ibm/strtod_nan_ldouble.h: Likewise.
++ * sysdeps/ieee754/ldbl-96/strtod_nan_ldouble.h: Likewise.
++ * wcsmbs/wcstod_nan.c: Likewise.
++ * wcsmbs/wcstof_nan.c: Likewise.
++ * wcsmbs/wcstold_nan.c: Likewise.
++ * stdlib/Makefile (routines): Add strtof_nan, strtod_nan and
++ strtold_nan.
++ * wcsmbs/Makefile (routines): Add wcstod_nan, wcstold_nan and
++ wcstof_nan.
++ * include/stdlib.h (__strtof_nan): Declare and use
++ libc_hidden_proto.
++ (__strtod_nan): Likewise.
++ (__strtold_nan): Likewise.
++ (__wcstof_nan): Likewise.
++ (__wcstod_nan): Likewise.
++ (__wcstold_nan): Likewise.
++ * include/wchar.h (____wcstoull_l_internal): Declare.
++ * stdlib/strtod_l.c: Do not include <ieee754.h>.
++ (____strtoull_l_internal): Remove declaration.
++ (STRTOF_NAN): Define macro.
++ (SET_MANTISSA): Remove macro.
++ (STRTOULL): Likewise.
++ (____STRTOF_INTERNAL): Use STRTOF_NAN to parse NaN payload.
++ * stdlib/strtof_l.c (____strtoull_l_internal): Remove declaration.
++ (STRTOF_NAN): Define macro.
++ (SET_MANTISSA): Remove macro.
++ * sysdeps/ieee754/ldbl-128/strtold_l.c (STRTOF_NAN): Define macro.
++ (SET_MANTISSA): Remove macro.
++ * sysdeps/ieee754/ldbl-128ibm/strtold_l.c (STRTOF_NAN): Define
++ macro.
++ (SET_MANTISSA): Remove macro.
++ * sysdeps/ieee754/ldbl-64-128/strtold_l.c (STRTOF_NAN): Define
++ macro.
++ (SET_MANTISSA): Remove macro.
++ * sysdeps/ieee754/ldbl-96/strtold_l.c (STRTOF_NAN): Define macro.
++ (SET_MANTISSA): Remove macro.
++ * wcsmbs/wcstod_l.c (____wcstoull_l_internal): Remove declaration.
++ * wcsmbs/wcstof_l.c (____wcstoull_l_internal): Likewise.
++ * wcsmbs/wcstold_l.c (____wcstoull_l_internal): Likewise.
++
++ [BZ #19266]
++ * stdlib/strtod_l.c (____STRTOF_INTERNAL): Check directly for
++ upper case and lower case letters inside NAN(), not using TOLOWER.
+ 2015-08-08 Paul Pluzhnikov <ppluzhnikov at google.com>
+
+ [BZ #17905]
diff --git a/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch b/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch
new file mode 100644
index 0000000..e30307f
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/CVE-2015-9761_2.patch
@@ -0,0 +1,385 @@
+From 8f5e8b01a1da2a207228f2072c934fa5918554b8 Mon Sep 17 00:00:00 2001
+From: Joseph Myers <joseph at codesourcery.com>
+Date: Fri, 4 Dec 2015 20:36:28 +0000
+Subject: [PATCH] Fix nan functions handling of payload strings (bug 16961, bug
+ 16962).
+
+The nan, nanf and nanl functions handle payload strings by doing e.g.:
+
+ if (tagp[0] != '\0')
+ {
+ char buf[6 + strlen (tagp)];
+ sprintf (buf, "NAN(%s)", tagp);
+ return strtod (buf, NULL);
+ }
+
+This is an unbounded stack allocation based on the length of the
+argument. Furthermore, if the argument starts with an n-char-sequence
+followed by ')', that n-char-sequence is wrongly treated as
+significant for determining the payload of the resulting NaN, when ISO
+C says the call should be equivalent to strtod ("NAN", NULL), without
+being affected by that initial n-char-sequence. This patch fixes both
+those problems by using the __strtod_nan etc. functions recently
+factored out of strtod etc. for that purpose, with those functions
+being exported from libc at version GLIBC_PRIVATE.
+
+Tested for x86_64, x86, mips64 and powerpc.
+
+ [BZ #16961]
+ [BZ #16962]
+ * math/s_nan.c (__nan): Use __strtod_nan instead of constructing a
+ string on the stack for strtod.
+ * math/s_nanf.c (__nanf): Use __strtof_nan instead of constructing
+ a string on the stack for strtof.
+ * math/s_nanl.c (__nanl): Use __strtold_nan instead of
+ constructing a string on the stack for strtold.
+ * stdlib/Versions (libc): Add __strtof_nan, __strtod_nan and
+ __strtold_nan to GLIBC_PRIVATE.
+ * math/test-nan-overflow.c: New file.
+ * math/test-nan-payload.c: Likewise.
+ * math/Makefile (tests): Add test-nan-overflow and
+ test-nan-payload.
+
+Upstream-Status: Backport
+CVE: CVE-2015-9761 patch #2
+[Yocto # 8980]
+
+https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=8f5e8b01a1da2a207228f2072c934fa5918554b8
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ChangeLog | 17 +++++++
+ NEWS | 6 +++
+ math/Makefile | 3 +-
+ math/s_nan.c | 9 +---
+ math/s_nanf.c | 9 +---
+ math/s_nanl.c | 9 +---
+ math/test-nan-overflow.c | 66 +++++++++++++++++++++++++
+ math/test-nan-payload.c | 122 +++++++++++++++++++++++++++++++++++++++++++++++
+ stdlib/Versions | 1 +
+ 9 files changed, 217 insertions(+), 25 deletions(-)
+ create mode 100644 math/test-nan-overflow.c
+ create mode 100644 math/test-nan-payload.c
+
+Index: git/ChangeLog
+===================================================================
+--- git.orig/ChangeLog
++++ git/ChangeLog
+@@ -1,3 +1,20 @@
++2015-12-04 Joseph Myers <joseph at codesourcery.com>
++
++ [BZ #16961]
++ [BZ #16962]
++ * math/s_nan.c (__nan): Use __strtod_nan instead of constructing a
++ string on the stack for strtod.
++ * math/s_nanf.c (__nanf): Use __strtof_nan instead of constructing
++ a string on the stack for strtof.
++ * math/s_nanl.c (__nanl): Use __strtold_nan instead of
++ constructing a string on the stack for strtold.
++ * stdlib/Versions (libc): Add __strtof_nan, __strtod_nan and
++ __strtold_nan to GLIBC_PRIVATE.
++ * math/test-nan-overflow.c: New file.
++ * math/test-nan-payload.c: Likewise.
++ * math/Makefile (tests): Add test-nan-overflow and
++ test-nan-payload.
++
+ 2015-11-24 Joseph Myers <joseph at codesourcery.com>
+
+ * stdlib/strtod_nan.c: New file.
+Index: git/NEWS
+===================================================================
+--- git.orig/NEWS
++++ git/NEWS
+@@ -99,6 +99,12 @@ Version 2.22
+
+ Version 2.21
+
++Security related changes:
++
++* The nan, nanf and nanl functions no longer have unbounded stack usage
++ depending on the length of the string passed as an argument to the
++ functions. Reported by Joseph Myers.
++
+ * The following bugs are resolved with this release:
+
+ 6652, 10672, 12674, 12847, 12926, 13862, 14132, 14138, 14171, 14498,
+Index: git/math/Makefile
+===================================================================
+--- git.orig/math/Makefile
++++ git/math/Makefile
+@@ -110,6 +110,7 @@ tests = test-matherr test-fenv atest-exp
+ test-tgmath-ret bug-nextafter bug-nexttoward bug-tgmath1 \
+ test-tgmath-int test-tgmath2 test-powl tst-CMPLX tst-CMPLX2 test-snan \
+ test-fenv-tls test-fenv-preserve test-fenv-return test-fenvinline \
++ test-nan-overflow test-nan-payload \
+ $(tests-static)
+ tests-static = test-fpucw-static test-fpucw-ieee-static
+ # We do the `long double' tests only if this data type is available and
+Index: git/math/s_nan.c
+===================================================================
+--- git.orig/math/s_nan.c
++++ git/math/s_nan.c
+@@ -28,14 +28,7 @@
+ double
+ __nan (const char *tagp)
+ {
+- if (tagp[0] != '\0')
+- {
+- char buf[6 + strlen (tagp)];
+- sprintf (buf, "NAN(%s)", tagp);
+- return strtod (buf, NULL);
+- }
+-
+- return NAN;
++ return __strtod_nan (tagp, NULL, 0);
+ }
+ weak_alias (__nan, nan)
+ #ifdef NO_LONG_DOUBLE
+Index: git/math/s_nanf.c
+===================================================================
+--- git.orig/math/s_nanf.c
++++ git/math/s_nanf.c
+@@ -28,13 +28,6 @@
+ float
+ __nanf (const char *tagp)
+ {
+- if (tagp[0] != '\0')
+- {
+- char buf[6 + strlen (tagp)];
+- sprintf (buf, "NAN(%s)", tagp);
+- return strtof (buf, NULL);
+- }
+-
+- return NAN;
++ return __strtof_nan (tagp, NULL, 0);
+ }
+ weak_alias (__nanf, nanf)
+Index: git/math/s_nanl.c
+===================================================================
+--- git.orig/math/s_nanl.c
++++ git/math/s_nanl.c
+@@ -28,13 +28,6 @@
+ long double
+ __nanl (const char *tagp)
+ {
+- if (tagp[0] != '\0')
+- {
+- char buf[6 + strlen (tagp)];
+- sprintf (buf, "NAN(%s)", tagp);
+- return strtold (buf, NULL);
+- }
+-
+- return NAN;
++ return __strtold_nan (tagp, NULL, 0);
+ }
+ weak_alias (__nanl, nanl)
+Index: git/math/test-nan-overflow.c
+===================================================================
+--- /dev/null
++++ git/math/test-nan-overflow.c
+@@ -0,0 +1,66 @@
++/* Test nan functions stack overflow (bug 16962).
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include <math.h>
++#include <stdio.h>
++#include <string.h>
++#include <sys/resource.h>
++
++#define STACK_LIM 1048576
++#define STRING_SIZE (2 * STACK_LIM)
++
++static int
++do_test (void)
++{
++ int result = 0;
++ struct rlimit lim;
++ getrlimit (RLIMIT_STACK, &lim);
++ lim.rlim_cur = STACK_LIM;
++ setrlimit (RLIMIT_STACK, &lim);
++ char *nanstr = malloc (STRING_SIZE);
++ if (nanstr == NULL)
++ {
++ puts ("malloc failed, cannot test");
++ return 77;
++ }
++ memset (nanstr, '0', STRING_SIZE - 1);
++ nanstr[STRING_SIZE - 1] = 0;
++#define NAN_TEST(TYPE, FUNC) \
++ do \
++ { \
++ char *volatile p = nanstr; \
++ volatile TYPE v = FUNC (p); \
++ if (isnan (v)) \
++ puts ("PASS: " #FUNC); \
++ else \
++ { \
++ puts ("FAIL: " #FUNC); \
++ result = 1; \
++ } \
++ } \
++ while (0)
++ NAN_TEST (float, nanf);
++ NAN_TEST (double, nan);
++#ifndef NO_LONG_DOUBLE
++ NAN_TEST (long double, nanl);
++#endif
++ return result;
++}
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+Index: git/math/test-nan-payload.c
+===================================================================
+--- /dev/null
++++ git/math/test-nan-payload.c
+@@ -0,0 +1,122 @@
++/* Test nan functions payload handling (bug 16961).
++ Copyright (C) 2015 Free Software Foundation, Inc.
++ This file is part of the GNU C Library.
++
++ The GNU C Library is free software; you can redistribute it and/or
++ modify it under the terms of the GNU Lesser General Public
++ License as published by the Free Software Foundation; either
++ version 2.1 of the License, or (at your option) any later version.
++
++ The GNU C Library is distributed in the hope that it will be useful,
++ but WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ Lesser General Public License for more details.
++
++ You should have received a copy of the GNU Lesser General Public
++ License along with the GNU C Library; if not, see
++ <http://www.gnu.org/licenses/>. */
++
++#include <float.h>
++#include <math.h>
++#include <stdio.h>
++#include <stdlib.h>
++#include <string.h>
++
++/* Avoid built-in functions. */
++#define WRAP_NAN(FUNC, STR) \
++ ({ const char *volatile wns = (STR); FUNC (wns); })
++#define WRAP_STRTO(FUNC, STR) \
++ ({ const char *volatile wss = (STR); FUNC (wss, NULL); })
++
++#define CHECK_IS_NAN(TYPE, A) \
++ do \
++ { \
++ if (isnan (A)) \
++ puts ("PASS: " #TYPE " " #A); \
++ else \
++ { \
++ puts ("FAIL: " #TYPE " " #A); \
++ result = 1; \
++ } \
++ } \
++ while (0)
++
++#define CHECK_SAME_NAN(TYPE, A, B) \
++ do \
++ { \
++ if (memcmp (&(A), &(B), sizeof (A)) == 0) \
++ puts ("PASS: " #TYPE " " #A " = " #B); \
++ else \
++ { \
++ puts ("FAIL: " #TYPE " " #A " = " #B); \
++ result = 1; \
++ } \
++ } \
++ while (0)
++
++#define CHECK_DIFF_NAN(TYPE, A, B) \
++ do \
++ { \
++ if (memcmp (&(A), &(B), sizeof (A)) != 0) \
++ puts ("PASS: " #TYPE " " #A " != " #B); \
++ else \
++ { \
++ puts ("FAIL: " #TYPE " " #A " != " #B); \
++ result = 1; \
++ } \
++ } \
++ while (0)
++
++/* Cannot test payloads by memcmp for formats where NaNs have padding
++ bits. */
++#define CAN_TEST_EQ(MANT_DIG) ((MANT_DIG) != 64 && (MANT_DIG) != 106)
++
++#define RUN_TESTS(TYPE, SFUNC, FUNC, MANT_DIG) \
++ do \
++ { \
++ TYPE n123 = WRAP_NAN (FUNC, "123"); \
++ CHECK_IS_NAN (TYPE, n123); \
++ TYPE s123 = WRAP_STRTO (SFUNC, "NAN(123)"); \
++ CHECK_IS_NAN (TYPE, s123); \
++ TYPE n456 = WRAP_NAN (FUNC, "456"); \
++ CHECK_IS_NAN (TYPE, n456); \
++ TYPE s456 = WRAP_STRTO (SFUNC, "NAN(456)"); \
++ CHECK_IS_NAN (TYPE, s456); \
++ TYPE n123x = WRAP_NAN (FUNC, "123)"); \
++ CHECK_IS_NAN (TYPE, n123x); \
++ TYPE nemp = WRAP_NAN (FUNC, ""); \
++ CHECK_IS_NAN (TYPE, nemp); \
++ TYPE semp = WRAP_STRTO (SFUNC, "NAN()"); \
++ CHECK_IS_NAN (TYPE, semp); \
++ TYPE sx = WRAP_STRTO (SFUNC, "NAN"); \
++ CHECK_IS_NAN (TYPE, sx); \
++ if (CAN_TEST_EQ (MANT_DIG)) \
++ CHECK_SAME_NAN (TYPE, n123, s123); \
++ if (CAN_TEST_EQ (MANT_DIG)) \
++ CHECK_SAME_NAN (TYPE, n456, s456); \
++ if (CAN_TEST_EQ (MANT_DIG)) \
++ CHECK_SAME_NAN (TYPE, nemp, semp); \
++ if (CAN_TEST_EQ (MANT_DIG)) \
++ CHECK_SAME_NAN (TYPE, n123x, sx); \
++ CHECK_DIFF_NAN (TYPE, n123, n456); \
++ CHECK_DIFF_NAN (TYPE, n123, nemp); \
++ CHECK_DIFF_NAN (TYPE, n123, n123x); \
++ CHECK_DIFF_NAN (TYPE, n456, nemp); \
++ CHECK_DIFF_NAN (TYPE, n456, n123x); \
++ } \
++ while (0)
++
++static int
++do_test (void)
++{
++ int result = 0;
++ RUN_TESTS (float, strtof, nanf, FLT_MANT_DIG);
++ RUN_TESTS (double, strtod, nan, DBL_MANT_DIG);
++#ifndef NO_LONG_DOUBLE
++ RUN_TESTS (long double, strtold, nanl, LDBL_MANT_DIG);
++#endif
++ return result;
++}
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
+Index: git/stdlib/Versions
+===================================================================
+--- git.orig/stdlib/Versions
++++ git/stdlib/Versions
+@@ -118,5 +118,6 @@ libc {
+ # Used from other libraries
+ __libc_secure_getenv;
+ __call_tls_dtors;
++ __strtof_nan; __strtod_nan; __strtold_nan;
+ }
+ }
diff --git a/meta/recipes-core/glibc/glibc/strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch b/meta/recipes-core/glibc/glibc/strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch
new file mode 100644
index 0000000..8ce255f
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch
@@ -0,0 +1,323 @@
+Upstream-Status: Backport
+
+Signed-off-by: Li Xin <lixin.fnst at cn.fujitsu.com>
+
+From https://sourceware.org/git/gitweb.cgi?p=glibc.git;h=6c84109cfa26f35c3dfed3acb97d347361bd5849
+Author: Carlos O'Donell <carlos at systemhalted.org>
+Date: Thu Oct 8 16:34:53 2015 -0400
+
+ strcoll: Remove incorrect STRDIFF-based optimization (Bug 18589).
+
+ The optimization introduced in commit
+ f13c2a8dff2329c6692a80176262ceaaf8a6f74e, causes regressions in
+ sorting for languages that have digraphs that change sort order, like
+ cs_CZ which sorts ch between h and i.
+
+ My analysis shows the fast-forwarding optimization in STRCOLL advances
+ through a digraph while possibly stopping in the middle which results
+ in a subsequent skipping of the digraph and incorrect sorting. The
+ optimization is incorrect as implemented and because of that I'm
+ removing it for 2.23, and I will also commit this fix for 2.22 where
+ it was originally introduced.
+
+ This patch reverts the optimization, introduces a new bug-strcoll2.c
+ regression test that tests both cs_CZ.UTF-8 and da_DK.ISO-8859-1 and
+ ensures they sort one digraph each correctly. The optimization can't be
+ applied without regressing this test.
+
+ Checked on x86_64, bug-strcoll2.c fails without this patch and passes
+ after. This will also get a fix on 2.22 which has the same bug.
+
+ (cherry picked from commit 87701a58e291bd7ac3b407d10a829dac52c9c16e)
+---
+ locale/C-collate.c | 4 +-
+ locale/categories.def | 1 -
+ locale/langinfo.h | 1 -
+ locale/localeinfo.h | 7 ----
+ locale/programs/ld-collate.c | 9 -----
+ string/bug-strcoll2.c | 95 ++++++++++++++++++++++++++++++++++++++++++++
+ string/strcoll_l.c | 39 +-----------------
+ wcsmbs/wcscoll_l.c | 1 -
+ 8 files changed, 98 insertions(+), 59 deletions(-)
+ create mode 100644 string/bug-strcoll2.c
+
+diff --git a/locale/C-collate.c b/locale/C-collate.c
+index d7f3c55..06dfdfa 100644
+--- a/locale/C-collate.c
++++ b/locale/C-collate.c
+@@ -144,8 +144,6 @@ const struct __locale_data _nl_C_LC_COLLATE attribute_hidden =
+ /* _NL_COLLATE_COLLSEQWC */
+ { .string = (const char *) collseqwc },
+ /* _NL_COLLATE_CODESET */
+- { .string = _nl_C_codeset },
+- /* _NL_COLLATE_ENCODING_TYPE */
+- { .word = __cet_8bit }
++ { .string = _nl_C_codeset }
+ }
+ };
+diff --git a/locale/categories.def b/locale/categories.def
+index 045489d..a8dda53 100644
+--- a/locale/categories.def
++++ b/locale/categories.def
+@@ -58,7 +58,6 @@ DEFINE_CATEGORY
+ DEFINE_ELEMENT (_NL_COLLATE_COLLSEQMB, "collate-collseqmb", std, wstring)
+ DEFINE_ELEMENT (_NL_COLLATE_COLLSEQWC, "collate-collseqwc", std, wstring)
+ DEFINE_ELEMENT (_NL_COLLATE_CODESET, "collate-codeset", std, string)
+- DEFINE_ELEMENT (_NL_COLLATE_ENCODING_TYPE, "collate-encoding-type", std, word)
+ ), NO_POSTLOAD)
+
+
+diff --git a/locale/langinfo.h b/locale/langinfo.h
+index ffc5c7f..a565d9d 100644
+--- a/locale/langinfo.h
++++ b/locale/langinfo.h
+@@ -255,7 +255,6 @@ enum
+ _NL_COLLATE_COLLSEQMB,
+ _NL_COLLATE_COLLSEQWC,
+ _NL_COLLATE_CODESET,
+- _NL_COLLATE_ENCODING_TYPE,
+ _NL_NUM_LC_COLLATE,
+
+ /* LC_CTYPE category: character classification.
+diff --git a/locale/localeinfo.h b/locale/localeinfo.h
+index a7516c0..c076d8e 100644
+--- a/locale/localeinfo.h
++++ b/locale/localeinfo.h
+@@ -110,13 +110,6 @@ enum coll_sort_rule
+ sort_mask
+ };
+
+-/* Collation encoding type. */
+-enum collation_encoding_type
+-{
+- __cet_other,
+- __cet_8bit,
+- __cet_utf8
+-};
+
+ /* We can map the types of the entries into a few categories. */
+ enum value_type
+diff --git a/locale/programs/ld-collate.c b/locale/programs/ld-collate.c
+index 16e9039..3c88c6d 100644
+--- a/locale/programs/ld-collate.c
++++ b/locale/programs/ld-collate.c
+@@ -32,7 +32,6 @@
+ #include "linereader.h"
+ #include "locfile.h"
+ #include "elem-hash.h"
+-#include "../localeinfo.h"
+
+ /* Uncomment the following line in the production version. */
+ /* #define NDEBUG 1 */
+@@ -2130,8 +2129,6 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
+ /* The words have to be handled specially. */
+ if (idx == _NL_ITEM_INDEX (_NL_COLLATE_SYMB_HASH_SIZEMB))
+ add_locale_uint32 (&file, 0);
+- else if (idx == _NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE))
+- add_locale_uint32 (&file, __cet_other);
+ else
+ add_locale_empty (&file);
+ }
+@@ -2495,12 +2492,6 @@ collate_output (struct localedef_t *locale, const struct charmap_t *charmap,
+ add_locale_raw_data (&file, collate->mbseqorder, 256);
+ add_locale_collseq_table (&file, &collate->wcseqorder);
+ add_locale_string (&file, charmap->code_set_name);
+- if (strcmp (charmap->code_set_name, "UTF-8") == 0)
+- add_locale_uint32 (&file, __cet_utf8);
+- else if (charmap->mb_cur_max == 1)
+- add_locale_uint32 (&file, __cet_8bit);
+- else
+- add_locale_uint32 (&file, __cet_other);
+ write_locale_data (output_path, LC_COLLATE, "LC_COLLATE", &file);
+
+ obstack_free (&weightpool, NULL);
+diff --git a/string/bug-strcoll2.c b/string/bug-strcoll2.c
+new file mode 100644
+index 0000000..950b090
+--- /dev/null
++++ b/string/bug-strcoll2.c
+@@ -0,0 +1,95 @@
++/* Bug 18589: sort-test.sh fails at random.
++ * Copyright (C) 1998-2015 Free Software Foundation, Inc.
++ * This file is part of the GNU C Library.
++ * Contributed by Ulrich Drepper <drepper at cygnus.com>, 1998.
++ *
++ * The GNU C Library is free software; you can redistribute it and/or
++ * modify it under the terms of the GNU Lesser General Public
++ * License as published by the Free Software Foundation; either
++ * version 2.1 of the License, or (at your option) any later version.
++ *
++ * The GNU C Library is distributed in the hope that it will be useful,
++ * but WITHOUT ANY WARRANTY; without even the implied warranty of
++ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ * Lesser General Public License for more details.
++ *
++ * You should have received a copy of the GNU Lesser General Public
++ * License along with the GNU C Library; if not, see
++ * <http://www.gnu.org/licenses/>. */
++
++#include <stdio.h>
++#include <string.h>
++#include <locale.h>
++
++/* An incorrect strcoll optimization resulted in incorrect
++ * results from strcoll for cs_CZ and da_DK. */
++
++int
++test_cs_CZ (void)
++{
++ const char t1[] = "config";
++ const char t2[] = "choose";
++ if (setlocale (LC_ALL, "cs_CZ.UTF-8") == NULL)
++ {
++ perror ("setlocale");
++ return 1;
++ }
++ /* In Czech the digraph ch sorts after c, therefore we expect
++ * config to sort before choose. */
++ int a = strcoll (t1, t2);
++ int b = strcoll (t2, t1);
++ printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a);
++ printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b);
++ if (a < 0 && b > 0)
++ {
++ puts ("PASS: config < choose");
++ return 0;
++ }
++ else
++ {
++ puts ("FAIL: Wrong sorting in cz_CZ.UTF-8.");
++ return 1;
++ }
++}
++
++int
++test_da_DK (void)
++{
++ const char t1[] = "AS";
++ const char t2[] = "AA";
++ if (setlocale (LC_ALL, "da_DK.ISO-8859-1") == NULL)
++ {
++ perror ("setlocale");
++ return 1;
++ }
++ /* AA should be treated as the last letter of the Danish alphabet,
++ * hence sorting after AS. */
++ int a = strcoll (t1, t2);
++ int b = strcoll (t2, t1);
++ printf ("strcoll (\"%s\", \"%s\") = %d\n", t1, t2, a);
++ printf ("strcoll (\"%s\", \"%s\") = %d\n", t2, t1, b);
++ if (a < 0 && b > 0)
++ {
++ puts ("PASS: AS < AA");
++ return 0;
++ }
++ else
++ {
++ puts ("FAIL: Wrong sorting in da_DK.ISO-8859-1");
++ return 1;
++ }
++}
++
++static int
++do_test (void)
++{
++ int err = 0;
++ err |= test_cs_CZ ();
++ err |= test_da_DK ();
++ return err;
++}
++
++#define TEST_FUNCTION do_test ()
++#include "../test-skeleton.c"
++
++
+diff --git a/string/strcoll_l.c b/string/strcoll_l.c
+index b36b18c..a18b65e 100644
+--- a/string/strcoll_l.c
++++ b/string/strcoll_l.c
+@@ -30,7 +30,6 @@
+ # define STRING_TYPE char
+ # define USTRING_TYPE unsigned char
+ # define STRCOLL __strcoll_l
+-# define STRDIFF __strdiff
+ # define STRCMP strcmp
+ # define WEIGHT_H "../locale/weight.h"
+ # define SUFFIX MB
+@@ -43,19 +42,6 @@
+ #include "../locale/localeinfo.h"
+ #include WEIGHT_H
+
+-#define MASK_UTF8_7BIT (1 << 7)
+-#define MASK_UTF8_START (3 << 6)
+-
+-size_t
+-STRDIFF (const STRING_TYPE *s, const STRING_TYPE *t)
+-{
+- size_t n;
+-
+- for (n = 0; *s != '\0' && *s++ == *t++; ++n)
+- continue;
+-
+- return n;
+-}
+
+ /* Track status while looking for sequences in a string. */
+ typedef struct
+@@ -274,29 +260,9 @@ STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l)
+ const USTRING_TYPE *extra;
+ const int32_t *indirect;
+
+- /* In case there is no locale specific sort order (C / POSIX). */
+ if (nrules == 0)
+ return STRCMP (s1, s2);
+
+- /* Fast forward to the position of the first difference. Needs to be
+- encoding aware as the byte-by-byte comparison can stop in the middle
+- of a char sequence for multibyte encodings like UTF-8. */
+- uint_fast32_t encoding =
+- current->values[_NL_ITEM_INDEX (_NL_COLLATE_ENCODING_TYPE)].word;
+- if (encoding != __cet_other)
+- {
+- size_t diff = STRDIFF (s1, s2);
+- if (diff > 0)
+- {
+- if (encoding == __cet_utf8 && (*(s1 + diff) & MASK_UTF8_7BIT) != 0)
+- do
+- diff--;
+- while (diff > 0 && (*(s1 + diff) & MASK_UTF8_START) != MASK_UTF8_START);
+- s1 += diff;
+- s2 += diff;
+- }
+- }
+-
+ /* Catch empty strings. */
+ if (__glibc_unlikely (*s1 == '\0') || __glibc_unlikely (*s2 == '\0'))
+ return (*s1 != '\0') - (*s2 != '\0');
+@@ -363,9 +329,8 @@ STRCOLL (const STRING_TYPE *s1, const STRING_TYPE *s2, __locale_t l)
+ byte-level comparison to ensure that we don't waste time
+ going through multiple passes for totally equal strings
+ before proceeding to subsequent passes. */
+- if (pass == 0 && encoding == __cet_other &&
+- STRCMP (s1, s2) == 0)
+- return result;
++ if (pass == 0 && STRCMP (s1, s2) == 0)
++ return result;
+ else
+ break;
+ }
+diff --git a/wcsmbs/wcscoll_l.c b/wcsmbs/wcscoll_l.c
+index 6d9384a..87f240d 100644
+--- a/wcsmbs/wcscoll_l.c
++++ b/wcsmbs/wcscoll_l.c
+@@ -23,7 +23,6 @@
+ #define STRING_TYPE wchar_t
+ #define USTRING_TYPE wint_t
+ #define STRCOLL __wcscoll_l
+-#define STRDIFF __wcsdiff
+ #define STRCMP __wcscmp
+ #define WEIGHT_H "../locale/weightwc.h"
+ #define SUFFIX WC
+--
+1.8.4.2
+
diff --git a/meta/recipes-core/glibc/glibc/use_64bit_atomics.patch b/meta/recipes-core/glibc/glibc/use_64bit_atomics.patch
new file mode 100644
index 0000000..eb7f2b2
--- /dev/null
+++ b/meta/recipes-core/glibc/glibc/use_64bit_atomics.patch
@@ -0,0 +1,24 @@
+This patch alows using 64 bit atomic instructions on a
+32 bit platform. This is safe, providing x86 is Pentium or
+later (would not work on i386, i486). Using 64 bit atomic
+instructions bypasses code containing a bug as documented in
+https://bugzilla.yoctoproject.org/show_bug.cgi?id=8140
+
+Upstream-Status: TBD
+
+Signed-off-by: Juro Bystricky <juro.bystricky at intel.com>
+
+
+Index: libc/sysdeps/i386/i486/bits/atomic.h
+===================================================================
+--- libc.orig/sysdeps/i386/i486/bits/atomic.h
++++ libc/sysdeps/i386/i486/bits/atomic.h
+@@ -54,7 +54,7 @@ typedef uintmax_t uatomic_max_t;
+ # endif
+ #endif
+
+-#define __HAVE_64B_ATOMICS 0
++#define __HAVE_64B_ATOMICS 1
+ #define USE_ATOMIC_COMPILER_BUILTINS 0
+
+
diff --git a/meta/recipes-core/glibc/glibc_2.22.bb b/meta/recipes-core/glibc/glibc_2.22.bb
index 09f0428..a13b7f9 100644
--- a/meta/recipes-core/glibc/glibc_2.22.bb
+++ b/meta/recipes-core/glibc/glibc_2.22.bb
@@ -9,11 +9,11 @@ DEPENDS += "gperf-native kconfig-frontends-native"
SRCREV ?= "a34d1c6afc86521d6ad17662a3b5362d8481514c"
-BRANCH ?= "release/${PV}/master"
+SRCBRANCH ?= "release/${PV}/master"
GLIBC_GIT_URI ?= "git://sourceware.org/git/glibc.git"
-SRC_URI = "${GLIBC_GIT_URI};branch=${BRANCH};name=glibc \
+SRC_URI = "${GLIBC_GIT_URI};branch=${SRCBRANCH};name=glibc \
file://0004-Backport-https-sourceware.org-ml-libc-ports-2007-12-.patch \
file://0005-fsl-e500-e5500-e6500-603e-fsqrt-implementation.patch \
file://0006-readlib-Add-OECORE_KNOWN_INTERPRETER_NAMES-to-known-.patch \
@@ -39,6 +39,14 @@ SRC_URI = "${GLIBC_GIT_URI};branch=${BRANCH};name=glibc \
file://0026-eglibc-dl_debug_mask-is-controlled-by-__OPTION_EGLIB.patch \
file://0027-eglibc-use-option-groups-Conditionally-exclude-c-tes.patch \
file://nscd-no-bash.patch \
+ file://strcoll-Remove-incorrect-STRDIFF-based-optimization-.patch \
+ file://0028-Clear-ELF_RTYPE_CLASS_EXTERN_PROTECTED_DATA-for-prel.patch \
+ file://CVE-2015-8777.patch \
+ file://CVE-2015-8779.patch \
+ file://CVE-2015-9761_1.patch \
+ file://CVE-2015-9761_2.patch \
+ file://CVE-2015-8776.patch \
+ file://CVE-2015-7547.patch \
"
SRC_URI += "\
@@ -50,6 +58,7 @@ SRC_URI_append_class-nativesdk = "\
file://0001-nativesdk-glibc-Look-for-host-system-ld.so.cache-as-.patch \
file://0002-nativesdk-glibc-Fix-buffer-overrun-with-a-relocated-.patch \
file://0003-nativesdk-glibc-Raise-the-size-of-arrays-containing-.patch \
+ file://use_64bit_atomics.patch \
"
S = "${WORKDIR}/git"
diff --git a/meta/recipes-core/images/build-appliance-image_12.0.1.bb b/meta/recipes-core/images/build-appliance-image_12.0.1.bb
index 0a86ba4..fdeadb6 100644
--- a/meta/recipes-core/images/build-appliance-image_12.0.1.bb
+++ b/meta/recipes-core/images/build-appliance-image_12.0.1.bb
@@ -21,8 +21,8 @@ IMAGE_FSTYPES = "vmdk"
inherit core-image
-SRCREV ?= "d01cd53429b1c20f01dac97f1b9b659cb9dc9812"
-SRC_URI = "git://git.yoctoproject.org/poky \
+SRCREV ?= "7fe17a2942ff03e2ec47d566fd5393f52b2eb736"
+SRC_URI = "git://git.yoctoproject.org/poky;branch=jethro \
file://Yocto_Build_Appliance.vmx \
file://Yocto_Build_Appliance.vmxf \
"
diff --git a/meta/recipes-core/initrdscripts/files/init-install-efi.sh b/meta/recipes-core/initrdscripts/files/init-install-efi.sh
index fc4908e..0443a9d 100644
--- a/meta/recipes-core/initrdscripts/files/init-install-efi.sh
+++ b/meta/recipes-core/initrdscripts/files/init-install-efi.sh
@@ -134,7 +134,7 @@ swap_start=$((rootfs_end))
# 2) they are detected asynchronously (need rootwait)
rootwait=""
part_prefix=""
-if [ ! "${device#mmcblk}" = "${device}" ]; then
+if [ ! "${device#/dev/mmcblk}" = "${device}" ]; then
part_prefix="p"
rootwait="rootwait"
fi
@@ -184,8 +184,8 @@ mount -o rw,loop,noatime,nodiratime /run/media/$1/$2 /src_root
echo "Copying rootfs files..."
cp -a /src_root/* /tgt_root
if [ -d /tgt_root/etc/ ] ; then
- boot_uuid=$(blkid -o value -s UUID ${device}1)
- swap_part_uuid=$(blkid -o value -s PARTUUID ${device}3)
+ boot_uuid=$(blkid -o value -s UUID ${bootfs})
+ swap_part_uuid=$(blkid -o value -s PARTUUID ${swap})
echo "/dev/disk/by-partuuid/$swap_part_uuid swap swap defaults 0 0" >> /tgt_root/etc/fstab
echo "UUID=$boot_uuid /boot vfat defaults 1 2" >> /tgt_root/etc/fstab
# We dont want udev to mount our root device while we're booting...
@@ -206,7 +206,7 @@ mkdir -p $EFIDIR
cp /run/media/$1/EFI/BOOT/*.efi $EFIDIR
if [ -f /run/media/$1/EFI/BOOT/grub.cfg ]; then
- root_part_uuid=$(blkid -o value -s PARTUUID ${device}2)
+ root_part_uuid=$(blkid -o value -s PARTUUID ${rootfs})
GRUBCFG="$EFIDIR/grub.cfg"
cp /run/media/$1/EFI/BOOT/grub.cfg $GRUBCFG
# Update grub config for the installed image
@@ -223,6 +223,7 @@ if [ -f /run/media/$1/EFI/BOOT/grub.cfg ]; then
fi
if [ -d /run/media/$1/loader ]; then
+ rootuuid=$(blkid -o value -s PARTUUID ${rootfs})
GUMMIBOOT_CFGS="/boot/loader/entries/*.conf"
# copy config files for gummiboot
cp -dr /run/media/$1/loader /boot
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/finish b/meta/recipes-core/initrdscripts/initramfs-framework/finish
index e712ff0..d09bbb8 100755
--- a/meta/recipes-core/initrdscripts/initramfs-framework/finish
+++ b/meta/recipes-core/initrdscripts/initramfs-framework/finish
@@ -37,7 +37,7 @@ finish_run() {
fi
mount $flags $bootparam_root $ROOTFS_DIR
else
- debug "root '$bootparam_root' doesn't exist."
+ msg "root '$bootparam_root' doesn't exist."
fi
fi
diff --git a/meta/recipes-core/initrdscripts/initramfs-framework/init b/meta/recipes-core/initrdscripts/initramfs-framework/init
index 9291ad5..204f237 100755
--- a/meta/recipes-core/initrdscripts/initramfs-framework/init
+++ b/meta/recipes-core/initrdscripts/initramfs-framework/init
@@ -58,7 +58,7 @@ fatal() {
echo $1 >/dev/console
echo >/dev/console
- if [ -n "bootparam_init_fatal_sh" ]; then
+ if [ -n "$bootparam_init_fatal_sh" ]; then
sh
else
while [ "true" ]; do
diff --git a/meta/recipes-core/initscripts/initscripts-1.0/sysfs.sh b/meta/recipes-core/initscripts/initscripts-1.0/sysfs.sh
index 0cfe76e..0a52c90 100644
--- a/meta/recipes-core/initscripts/initscripts-1.0/sysfs.sh
+++ b/meta/recipes-core/initscripts/initscripts-1.0/sysfs.sh
@@ -21,3 +21,7 @@ fi
if [ -e /sys/kernel/debug ] && grep -q debugfs /proc/filesystems; then
mount -t debugfs debugfs /sys/kernel/debug
fi
+
+if ! [ -e /dev/zero ] && [ -e /dev ] && grep -q devtmpfs /proc/filesystems; then
+ mount -n -t devtmpfs devtmpfs /dev
+fi
diff --git a/meta/recipes-core/kbd/kbd_2.0.2.bb b/meta/recipes-core/kbd/kbd_2.0.2.bb
index 136dc7a..49bb6c9 100644
--- a/meta/recipes-core/kbd/kbd_2.0.2.bb
+++ b/meta/recipes-core/kbd/kbd_2.0.2.bb
@@ -34,3 +34,4 @@ ALTERNATIVE_${PN} = "chvt deallocvt fgconsole openvt"
ALTERNATIVE_PRIORITY = "100"
BBCLASSEXTEND = "native"
+PARALLEL_MAKEINST = ""
diff --git a/meta/recipes-core/libxml/libxml2.inc b/meta/recipes-core/libxml/libxml2.inc
index 1c3c37d..310d5bb 100644
--- a/meta/recipes-core/libxml/libxml2.inc
+++ b/meta/recipes-core/libxml/libxml2.inc
@@ -21,6 +21,22 @@ SRC_URI = "ftp://xmlsoft.org/libxml2/libxml2-${PV}.tar.gz;name=libtar \
file://libxml-m4-use-pkgconfig.patch \
file://configure.ac-fix-cross-compiling-warning.patch \
file://0001-CVE-2015-1819-Enforce-the-reader-to-run-in-constant-.patch \
+ file://CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch \
+ file://CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch \
+ file://CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch \
+ file://CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch \
+ file://CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch \
+ file://0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch \
+ file://CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch \
+ file://0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch \
+ file://CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch \
+ file://CVE-2015-7499-2-Detect-incoherency-on-GROW.patch \
+ file://0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch \
+ file://0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch \
+ file://0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch \
+ file://0001-CVE-2015-5312-Another-entity-expansion-issue.patch \
+ file://CVE-2015-8241.patch \
+ file://CVE-2015-8710.patch \
"
BINCONFIG = "${bindir}/xml2-config"
diff --git a/meta/recipes-core/libxml/libxml2/0001-CVE-2015-5312-Another-entity-expansion-issue.patch b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-5312-Another-entity-expansion-issue.patch
new file mode 100644
index 0000000..979618d
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-5312-Another-entity-expansion-issue.patch
@@ -0,0 +1,39 @@
+From 69030714cde66d525a8884bda01b9e8f0abf8e1e Mon Sep 17 00:00:00 2001
+From: David Drysdale <drysdale at google.com>
+Date: Fri, 20 Nov 2015 11:13:45 +0800
+Subject: [PATCH] CVE-2015-5312 Another entity expansion issue
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=756733
+It is one case where the code in place to detect entities expansions
+failed to exit when the situation was detected, leading to DoS
+Problem reported by Kostya Serebryany @ Google
+Patch provided by David Drysdale @ Google
+
+Upstream-Status: Backport
+
+CVE-2015-5312
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/parser.c b/parser.c
+index b7b6668..da6e729 100644
+--- a/parser.c
++++ b/parser.c
+@@ -2806,6 +2806,10 @@ xmlStringLenDecodeEntities(xmlParserCtxtPtr ctxt, const xmlChar *str, int len,
+ 0, 0, 0);
+ ctxt->depth--;
+
++ if ((ctxt->lastError.code == XML_ERR_ENTITY_LOOP) ||
++ (ctxt->lastError.code == XML_ERR_INTERNAL_ERROR))
++ goto int_error;
++
+ if (rep != NULL) {
+ current = rep;
+ while (*current != 0) { /* non input consuming loop */
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch
new file mode 100644
index 0000000..955c961
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7497-Avoid-an-heap-buffer-overflow-in-xmlDi.patch
@@ -0,0 +1,40 @@
+From 6360a31a84efe69d155ed96306b9a931a40beab9 Mon Sep 17 00:00:00 2001
+From: David Drysdale <drysdale at google.com>
+Date: Fri, 20 Nov 2015 10:47:12 +0800
+Subject: [PATCH] CVE-2015-7497 Avoid an heap buffer overflow in
+ xmlDictComputeFastQKey
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=756528
+It was possible to hit a negative offset in the name indexing
+used to randomize the dictionary key generation
+Reported and fix provided by David Drysdale @ Google
+
+Upstream-Status: Backport
+
+CVE-2015-7497
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ dict.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/dict.c b/dict.c
+index 5f71d55..8c8f931 100644
+--- a/dict.c
++++ b/dict.c
+@@ -486,7 +486,10 @@ xmlDictComputeFastQKey(const xmlChar *prefix, int plen,
+ value += 30 * (*prefix);
+
+ if (len > 10) {
+- value += name[len - (plen + 1 + 1)];
++ int offset = len - (plen + 1 + 1);
++ if (offset < 0)
++ offset = len - (10 + 1);
++ value += name[offset];
+ len = 10;
+ if (plen > 10)
+ plen = 10;
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch
new file mode 100644
index 0000000..b486079
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-7500-Fix-memory-access-error-due-to-incorre.patch
@@ -0,0 +1,131 @@
+From f1063fdbe7fa66332bbb76874101c2a7b51b519f Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Fri, 20 Nov 2015 16:06:59 +0800
+Subject: [PATCH] CVE-2015-7500 Fix memory access error due to incorrect
+ entities boundaries
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=756525
+handle properly the case where we popped out of the current entity
+while processing a start tag
+Reported by Kostya Serebryany @ Google
+
+This slightly modifies the output of 754946 in regression tests
+
+Upstream-Status: Backport
+
+CVE-2015-7500
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 28 ++++++++++++++++++++++------
+ result/errors/754946.xml.err | 7 +++++--
+ 2 files changed, 27 insertions(+), 8 deletions(-)
+
+diff --git a/parser.c b/parser.c
+index c7e4574..c5741e3 100644
+--- a/parser.c
++++ b/parser.c
+@@ -9348,7 +9348,7 @@ xmlParseStartTag2(xmlParserCtxtPtr ctxt, const xmlChar **pref,
+ const xmlChar **atts = ctxt->atts;
+ int maxatts = ctxt->maxatts;
+ int nratts, nbatts, nbdef;
+- int i, j, nbNs, attval, oldline, oldcol;
++ int i, j, nbNs, attval, oldline, oldcol, inputNr;
+ const xmlChar *base;
+ unsigned long cur;
+ int nsNr = ctxt->nsNr;
+@@ -9367,6 +9367,7 @@ reparse:
+ SHRINK;
+ base = ctxt->input->base;
+ cur = ctxt->input->cur - ctxt->input->base;
++ inputNr = ctxt->inputNr;
+ oldline = ctxt->input->line;
+ oldcol = ctxt->input->col;
+ nbatts = 0;
+@@ -9392,7 +9393,8 @@ reparse:
+ */
+ SKIP_BLANKS;
+ GROW;
+- if (ctxt->input->base != base) goto base_changed;
++ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
++ goto base_changed;
+
+ while (((RAW != '>') &&
+ ((RAW != '/') || (NXT(1) != '>')) &&
+@@ -9403,7 +9405,7 @@ reparse:
+
+ attname = xmlParseAttribute2(ctxt, prefix, localname,
+ &aprefix, &attvalue, &len, &alloc);
+- if (ctxt->input->base != base) {
++ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr)) {
+ if ((attvalue != NULL) && (alloc != 0))
+ xmlFree(attvalue);
+ attvalue = NULL;
+@@ -9552,7 +9554,8 @@ skip_ns:
+ break;
+ }
+ SKIP_BLANKS;
+- if (ctxt->input->base != base) goto base_changed;
++ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
++ goto base_changed;
+ continue;
+ }
+
+@@ -9589,7 +9592,8 @@ failed:
+ GROW
+ if (ctxt->instate == XML_PARSER_EOF)
+ break;
+- if (ctxt->input->base != base) goto base_changed;
++ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
++ goto base_changed;
+ if ((RAW == '>') || (((RAW == '/') && (NXT(1) == '>'))))
+ break;
+ if (!IS_BLANK_CH(RAW)) {
+@@ -9605,7 +9609,8 @@ failed:
+ break;
+ }
+ GROW;
+- if (ctxt->input->base != base) goto base_changed;
++ if ((ctxt->input->base != base) || (inputNr != ctxt->inputNr))
++ goto base_changed;
+ }
+
+ /*
+@@ -9772,6 +9777,17 @@ base_changed:
+ if ((ctxt->attallocs[j] != 0) && (atts[i] != NULL))
+ xmlFree((xmlChar *) atts[i]);
+ }
++
++ /*
++ * We can't switch from one entity to another in the middle
++ * of a start tag
++ */
++ if (inputNr != ctxt->inputNr) {
++ xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
++ "Start tag doesn't start and stop in the same entity\n");
++ return(NULL);
++ }
++
+ ctxt->input->cur = ctxt->input->base + cur;
+ ctxt->input->line = oldline;
+ ctxt->input->col = oldcol;
+diff --git a/result/errors/754946.xml.err b/result/errors/754946.xml.err
+index 423dff5..a75088b 100644
+--- a/result/errors/754946.xml.err
++++ b/result/errors/754946.xml.err
+@@ -11,6 +11,9 @@ Entity: line 1: parser error : DOCTYPE improperly terminated
+ Entity: line 1:
+ A<lbbbbbbbbbbbbbbbbbbb_
+ ^
++./test/errors/754946.xml:1: parser error : Start tag doesn't start and stop in the same entity
++>%SYSTEM;<![
++ ^
+ ./test/errors/754946.xml:1: parser error : Extra content at the end of the document
+-<!DOCTYPEA[<!ENTITY %
+- ^
++>%SYSTEM;<![
++ ^
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch
new file mode 100644
index 0000000..7107355
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8035-Fix-XZ-compression-support-loop.patch
@@ -0,0 +1,38 @@
+From f0709e3ca8f8947f2d91ed34e92e38a4c23eae63 Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Tue, 3 Nov 2015 15:31:25 +0800
+Subject: [PATCH] CVE-2015-8035 Fix XZ compression support loop
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=757466
+DoS when parsing specially crafted XML document if XZ support
+is compiled in (which wasn't the case for 2.9.2 and master since
+Nov 2013, fixed in next commit !)
+
+Upstream-Status: Backport
+
+CVE-2015-8035
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ xzlib.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/xzlib.c b/xzlib.c
+index 0dcb9f4..1fab546 100644
+--- a/xzlib.c
++++ b/xzlib.c
+@@ -581,6 +581,10 @@ xz_decomp(xz_statep state)
+ xz_error(state, LZMA_DATA_ERROR, "compressed data error");
+ return -1;
+ }
++ if (ret == LZMA_PROG_ERROR) {
++ xz_error(state, LZMA_PROG_ERROR, "compression error");
++ return -1;
++ }
+ } while (strm->avail_out && ret != LZMA_STREAM_END);
+
+ /* update available output and crc check value */
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch
new file mode 100644
index 0000000..73531b3
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/0001-CVE-2015-8242-Buffer-overead-with-HTML-parser-in-pus.patch
@@ -0,0 +1,49 @@
+From 8fb4a770075628d6441fb17a1e435100e2f3b1a2 Mon Sep 17 00:00:00 2001
+From: Hugh Davenport <hugh at allthethings.co.nz>
+Date: Fri, 20 Nov 2015 17:16:06 +0800
+Subject: [PATCH] CVE-2015-8242 Buffer overead with HTML parser in push mode
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=756372
+Error in the code pointing to the codepoint in the stack for the
+current char value instead of the pointer in the input that the SAX
+callback expects
+Reported and fixed by Hugh Davenport
+
+Upstream-Status: Backport
+
+CVE-2015-8242
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ HTMLparser.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/HTMLparser.c b/HTMLparser.c
+index bdf7807..b729197 100644
+--- a/HTMLparser.c
++++ b/HTMLparser.c
+@@ -5735,17 +5735,17 @@ htmlParseTryOrFinish(htmlParserCtxtPtr ctxt, int terminate) {
+ if (ctxt->keepBlanks) {
+ if (ctxt->sax->characters != NULL)
+ ctxt->sax->characters(
+- ctxt->userData, &cur, 1);
++ ctxt->userData, &in->cur[0], 1);
+ } else {
+ if (ctxt->sax->ignorableWhitespace != NULL)
+ ctxt->sax->ignorableWhitespace(
+- ctxt->userData, &cur, 1);
++ ctxt->userData, &in->cur[0], 1);
+ }
+ } else {
+ htmlCheckParagraph(ctxt);
+ if (ctxt->sax->characters != NULL)
+ ctxt->sax->characters(
+- ctxt->userData, &cur, 1);
++ ctxt->userData, &in->cur[0], 1);
+ }
+ }
+ ctxt->token = 0;
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch b/meta/recipes-core/libxml/libxml2/0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch
new file mode 100644
index 0000000..a86b9ee
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/0001-Fix-a-bug-on-name-parsing-at-the-end-of-current-inpu.patch
@@ -0,0 +1,138 @@
+From 51f02b0a03ea1fa6c65b3f9fd88cf60fb5803783 Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Tue, 15 Sep 2015 16:50:32 +0800
+Subject: [PATCH] Fix a bug on name parsing at the end of current input buffer
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=754946
+
+When hitting the end of the current input buffer while parsing
+a name we could end up loosing the beginning of the name, which
+led to various issues.
+
+Upstream-Status: backport
+
+Depend patch for CVE-2015-7500
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+---
+ parser.c | 29 ++++++++++++++++++++---------
+ result/errors/754946.xml | 0
+ result/errors/754946.xml.err | 16 ++++++++++++++++
+ result/errors/754946.xml.str | 4 ++++
+ test/errors/754946.xml | 1 +
+ 5 files changed, 41 insertions(+), 9 deletions(-)
+ create mode 100644 result/errors/754946.xml
+ create mode 100644 result/errors/754946.xml.err
+ create mode 100644 result/errors/754946.xml.str
+ create mode 100644 test/errors/754946.xml
+
+diff --git a/parser.c b/parser.c
+index 0edd53b..fd29a39 100644
+--- a/parser.c
++++ b/parser.c
+@@ -3491,7 +3491,14 @@ xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) {
+ c = CUR_CHAR(l);
+ if (c == 0) {
+ count = 0;
++ /*
++ * when shrinking to extend the buffer we really need to preserve
++ * the part of the name we already parsed. Hence rolling back
++ * by current lenght.
++ */
++ ctxt->input->cur -= l;
+ GROW;
++ ctxt->input->cur += l;
+ if (ctxt->instate == XML_PARSER_EOF)
+ return(NULL);
+ end = ctxt->input->cur;
+@@ -3523,7 +3530,7 @@ xmlParseNCNameComplex(xmlParserCtxtPtr ctxt) {
+
+ static const xmlChar *
+ xmlParseNCName(xmlParserCtxtPtr ctxt) {
+- const xmlChar *in;
++ const xmlChar *in, *e;
+ const xmlChar *ret;
+ int count = 0;
+
+@@ -3535,16 +3542,19 @@ xmlParseNCName(xmlParserCtxtPtr ctxt) {
+ * Accelerator for simple ASCII names
+ */
+ in = ctxt->input->cur;
+- if (((*in >= 0x61) && (*in <= 0x7A)) ||
+- ((*in >= 0x41) && (*in <= 0x5A)) ||
+- (*in == '_')) {
++ e = ctxt->input->end;
++ if ((((*in >= 0x61) && (*in <= 0x7A)) ||
++ ((*in >= 0x41) && (*in <= 0x5A)) ||
++ (*in == '_')) && (in < e)) {
+ in++;
+- while (((*in >= 0x61) && (*in <= 0x7A)) ||
+- ((*in >= 0x41) && (*in <= 0x5A)) ||
+- ((*in >= 0x30) && (*in <= 0x39)) ||
+- (*in == '_') || (*in == '-') ||
+- (*in == '.'))
++ while ((((*in >= 0x61) && (*in <= 0x7A)) ||
++ ((*in >= 0x41) && (*in <= 0x5A)) ||
++ ((*in >= 0x30) && (*in <= 0x39)) ||
++ (*in == '_') || (*in == '-') ||
++ (*in == '.')) && (in < e))
+ in++;
++ if (in >= e)
++ goto complex;
+ if ((*in > 0) && (*in < 0x80)) {
+ count = in - ctxt->input->cur;
+ if ((count > XML_MAX_NAME_LENGTH) &&
+@@ -3562,6 +3572,7 @@ xmlParseNCName(xmlParserCtxtPtr ctxt) {
+ return(ret);
+ }
+ }
++complex:
+ return(xmlParseNCNameComplex(ctxt));
+ }
+
+diff --git a/result/errors/754946.xml b/result/errors/754946.xml
+new file mode 100644
+index 0000000..e69de29
+diff --git a/result/errors/754946.xml.err b/result/errors/754946.xml.err
+new file mode 100644
+index 0000000..423dff5
+--- /dev/null
++++ b/result/errors/754946.xml.err
+@@ -0,0 +1,16 @@
++Entity: line 1: parser error : internal error: xmlParseInternalSubset: error detected in Markup declaration
++
++ %SYSTEM;
++ ^
++Entity: line 1:
++A<lbbbbbbbbbbbbbbbbbbb_
++^
++Entity: line 1: parser error : DOCTYPE improperly terminated
++ %SYSTEM;
++ ^
++Entity: line 1:
++A<lbbbbbbbbbbbbbbbbbbb_
++^
++./test/errors/754946.xml:1: parser error : Extra content at the end of the document
++<!DOCTYPEA[<!ENTITY %
++ ^
+diff --git a/result/errors/754946.xml.str b/result/errors/754946.xml.str
+new file mode 100644
+index 0000000..3b748cc
+--- /dev/null
++++ b/result/errors/754946.xml.str
+@@ -0,0 +1,4 @@
++./test/errors/754946.xml:1: parser error : Extra content at the end of the document
++<!DOCTYPEA[<!ENTITY %
++ ^
++./test/errors/754946.xml : failed to parse
+diff --git a/test/errors/754946.xml b/test/errors/754946.xml
+new file mode 100644
+index 0000000..6b5f9b0
+--- /dev/null
++++ b/test/errors/754946.xml
+@@ -0,0 +1 @@
++<!DOCTYPEA[<!ENTITY %
SYSTEM "A<lbbbbbbbbbbbbbbbbbbb_"
>%SYSTEM;<![
+\ No newline at end of file
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch
new file mode 100644
index 0000000..47ba897
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-7498-Avoid-processing-entities-after-encoding-conversion-.patch
@@ -0,0 +1,89 @@
+From afd27c21f6b36e22682b7da20d726bce2dcb2f43 Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Mon, 9 Nov 2015 18:07:18 +0800
+Subject: [PATCH] Avoid processing entities after encoding conversion failures
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=756527
+and was also raised by Chromium team in the past
+
+When we hit a convwersion failure when switching encoding
+it is bestter to stop parsing there, this was treated as a
+fatal error but the parser was continuing to process to extract
+more errors, unfortunately that makes little sense as the data
+is obviously corrupt and can potentially lead to unexpected behaviour.
+
+Upstream-Status: Backport
+
+CVE-2015-7498
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 7 +++++--
+ parserInternals.c | 11 ++++++++++-
+ 2 files changed, 15 insertions(+), 3 deletions(-)
+
+diff --git a/parser.c b/parser.c
+index 134afe7..c79b4e8 100644
+--- a/parser.c
++++ b/parser.c
+@@ -10665,7 +10665,8 @@ xmlParseXMLDecl(xmlParserCtxtPtr ctxt) {
+ xmlFatalErrMsg(ctxt, XML_ERR_SPACE_REQUIRED, "Blank needed here\n");
+ }
+ xmlParseEncodingDecl(ctxt);
+- if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) {
++ if ((ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) ||
++ (ctxt->instate == XML_PARSER_EOF)) {
+ /*
+ * The XML REC instructs us to stop parsing right here
+ */
+@@ -10789,6 +10790,7 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) {
+
+ if (CUR == 0) {
+ xmlFatalErr(ctxt, XML_ERR_DOCUMENT_EMPTY, NULL);
++ return(-1);
+ }
+
+ /*
+@@ -10806,7 +10808,8 @@ xmlParseDocument(xmlParserCtxtPtr ctxt) {
+ * Note that we will switch encoding on the fly.
+ */
+ xmlParseXMLDecl(ctxt);
+- if (ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) {
++ if ((ctxt->errNo == XML_ERR_UNSUPPORTED_ENCODING) ||
++ (ctxt->instate == XML_PARSER_EOF)) {
+ /*
+ * The XML REC instructs us to stop parsing right here
+ */
+diff --git a/parserInternals.c b/parserInternals.c
+index df204fd..c8230c1 100644
+--- a/parserInternals.c
++++ b/parserInternals.c
+@@ -937,6 +937,7 @@ xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc)
+ {
+ xmlCharEncodingHandlerPtr handler;
+ int len = -1;
++ int ret;
+
+ if (ctxt == NULL) return(-1);
+ switch (enc) {
+@@ -1097,7 +1098,15 @@ xmlSwitchEncoding(xmlParserCtxtPtr ctxt, xmlCharEncoding enc)
+ if (handler == NULL)
+ return(-1);
+ ctxt->charset = XML_CHAR_ENCODING_UTF8;
+- return(xmlSwitchToEncodingInt(ctxt, handler, len));
++ ret = xmlSwitchToEncodingInt(ctxt, handler, len);
++ if ((ret < 0) || (ctxt->errNo == XML_I18N_CONV_FAILED)) {
++ /*
++ * on encoding conversion errors, stop the parser
++ */
++ xmlStopParser(ctxt);
++ ctxt->errNo = XML_I18N_CONV_FAILED;
++ }
++ return(ret);
+ }
+
+ /**
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch
new file mode 100644
index 0000000..e39ec65
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-7499-1-Add-xmlHaltParser-to-stop-the-parser.patch
@@ -0,0 +1,88 @@
+From 28cd9cb747a94483f4aea7f0968d202c20bb4cfc Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Fri, 20 Nov 2015 14:55:30 +0800
+Subject: [PATCH] Add xmlHaltParser() to stop the parser
+
+The problem is doing it in a consistent and safe fashion
+It's more complex than just setting ctxt->instate = XML_PARSER_EOF
+Update the public function to reuse that new internal routine
+
+Upstream-Status: Backport
+
+CVE-2015-7499-1
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 34 +++++++++++++++++++++++++++++-----
+ 1 file changed, 29 insertions(+), 5 deletions(-)
+
+diff --git a/parser.c b/parser.c
+index da6e729..b6e99b1 100644
+--- a/parser.c
++++ b/parser.c
+@@ -94,6 +94,8 @@ static xmlParserCtxtPtr
+ xmlCreateEntityParserCtxtInternal(const xmlChar *URL, const xmlChar *ID,
+ const xmlChar *base, xmlParserCtxtPtr pctx);
+
++static void xmlHaltParser(xmlParserCtxtPtr ctxt);
++
+ /************************************************************************
+ * *
+ * Arbitrary limits set in the parser. See XML_PARSE_HUGE *
+@@ -12625,25 +12627,47 @@ xmlCreatePushParserCtxt(xmlSAXHandlerPtr sax, void *user_data,
+ #endif /* LIBXML_PUSH_ENABLED */
+
+ /**
+- * xmlStopParser:
++ * xmlHaltParser:
+ * @ctxt: an XML parser context
+ *
+- * Blocks further parser processing
++ * Blocks further parser processing don't override error
++ * for internal use
+ */
+-void
+-xmlStopParser(xmlParserCtxtPtr ctxt) {
++static void
++xmlHaltParser(xmlParserCtxtPtr ctxt) {
+ if (ctxt == NULL)
+ return;
+ ctxt->instate = XML_PARSER_EOF;
+- ctxt->errNo = XML_ERR_USER_STOP;
+ ctxt->disableSAX = 1;
+ if (ctxt->input != NULL) {
++ /*
++ * in case there was a specific allocation deallocate before
++ * overriding base
++ */
++ if (ctxt->input->free != NULL) {
++ ctxt->input->free((xmlChar *) ctxt->input->base);
++ ctxt->input->free = NULL;
++ }
+ ctxt->input->cur = BAD_CAST"";
+ ctxt->input->base = ctxt->input->cur;
+ }
+ }
+
+ /**
++ * xmlStopParser:
++ * @ctxt: an XML parser context
++ *
++ * Blocks further parser processing
++ */
++void
++xmlStopParser(xmlParserCtxtPtr ctxt) {
++ if (ctxt == NULL)
++ return;
++ xmlHaltParser(ctxt);
++ ctxt->errNo = XML_ERR_USER_STOP;
++}
++
++/**
+ * xmlCreateIOParserCtxt:
+ * @sax: a SAX handler
+ * @user_data: The user data returned on SAX callbacks
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-7499-2-Detect-incoherency-on-GROW.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-7499-2-Detect-incoherency-on-GROW.patch
new file mode 100644
index 0000000..aff3920
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-7499-2-Detect-incoherency-on-GROW.patch
@@ -0,0 +1,43 @@
+From 35bcb1d758ed70aa7b257c9c3b3ff55e54e3d0da Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Fri, 20 Nov 2015 15:04:09 +0800
+Subject: [PATCH] Detect incoherency on GROW
+
+the current pointer to the input has to be between the base and end
+if not stop everything we have an internal state error.
+
+Upstream-Status: Backport
+
+CVE-2015-7499-2
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/parser.c b/parser.c
+index 1810f99..ab007aa 100644
+--- a/parser.c
++++ b/parser.c
+@@ -2075,9 +2075,16 @@ static void xmlGROW (xmlParserCtxtPtr ctxt) {
+ ((ctxt->input->buf) && (ctxt->input->buf->readcallback != (xmlInputReadCallback) xmlNop)) &&
+ ((ctxt->options & XML_PARSE_HUGE) == 0)) {
+ xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "Huge input lookup");
+- ctxt->instate = XML_PARSER_EOF;
++ xmlHaltParser(ctxt);
++ return;
+ }
+ xmlParserInputGrow(ctxt->input, INPUT_CHUNK);
++ if ((ctxt->input->cur > ctxt->input->end) ||
++ (ctxt->input->cur < ctxt->input->base)) {
++ xmlHaltParser(ctxt);
++ xmlFatalErr(ctxt, XML_ERR_INTERNAL_ERROR, "cur index out of bound");
++ return;
++ }
+ if ((ctxt->input->cur != NULL) && (*ctxt->input->cur == 0) &&
+ (xmlParserInputGrow(ctxt->input, INPUT_CHUNK) <= 0))
+ xmlPopInput(ctxt);
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch
new file mode 100644
index 0000000..11da9f9
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-7941-1-Stop-parsing-on-entities-boundaries-errors.patch
@@ -0,0 +1,39 @@
+From a7dfab7411cbf545f359dd3157e5df1eb0e7ce31 Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Mon, 23 Feb 2015 11:17:35 +0800
+Subject: [PATCH] Stop parsing on entities boundaries errors
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=744980
+
+There are times, like on unterminated entities that it's preferable to
+stop parsing, even if that means less error reporting. Entities are
+feeding the parser on further processing, and if they are ill defined
+then it's possible to get the parser to bug. Also do the same on
+Conditional Sections if the input is broken, as the structure of
+the document can't be guessed.
+
+Upstream-Status: Backport
+
+CVE-2015-7941-1
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/parser.c b/parser.c
+index a8d1b67..bbe97eb 100644
+--- a/parser.c
++++ b/parser.c
+@@ -5658,6 +5658,7 @@ xmlParseEntityDecl(xmlParserCtxtPtr ctxt) {
+ if (RAW != '>') {
+ xmlFatalErrMsgStr(ctxt, XML_ERR_ENTITY_NOT_FINISHED,
+ "xmlParseEntityDecl: entity %s not terminated\n", name);
++ xmlStopParser(ctxt);
+ } else {
+ if (input != ctxt->input) {
+ xmlFatalErrMsg(ctxt, XML_ERR_ENTITY_BOUNDARY,
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch
new file mode 100644
index 0000000..b7bd960
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-7941-2-Cleanup-conditional-section-error-handling.patch
@@ -0,0 +1,56 @@
+From 9b8512337d14c8ddf662fcb98b0135f225a1c489 Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Mon, 23 Feb 2015 11:29:20 +0800
+Subject: [PATCH] Cleanup conditional section error handling
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=744980
+
+The error handling of Conditional Section also need to be
+straightened as the structure of the document can't be
+guessed on a failure there and it's better to stop parsing
+as further errors are likely to be irrelevant.
+
+Upstream-Status: Backport
+
+CVE-2015-7941-2
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/parser.c b/parser.c
+index bbe97eb..fe603ac 100644
+--- a/parser.c
++++ b/parser.c
+@@ -6770,6 +6770,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
+ SKIP_BLANKS;
+ if (RAW != '[') {
+ xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL);
++ xmlStopParser(ctxt);
++ return;
+ } else {
+ if (ctxt->input->id != id) {
+ xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
+@@ -6830,6 +6832,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
+ SKIP_BLANKS;
+ if (RAW != '[') {
+ xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID, NULL);
++ xmlStopParser(ctxt);
++ return;
+ } else {
+ if (ctxt->input->id != id) {
+ xmlValidityError(ctxt, XML_ERR_ENTITY_BOUNDARY,
+@@ -6885,6 +6889,8 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
+
+ } else {
+ xmlFatalErr(ctxt, XML_ERR_CONDSEC_INVALID_KEYWORD, NULL);
++ xmlStopParser(ctxt);
++ return;
+ }
+
+ if (RAW == 0)
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch
new file mode 100644
index 0000000..34b6036
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-7942-2-Fix-an-error-in-previous-Conditional-section-patch.patch
@@ -0,0 +1,35 @@
+From 41ac9049a27f52e7a1f3b341f8714149fc88d450 Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Tue, 27 Oct 2015 10:53:44 +0800
+Subject: [PATCH] Fix an error in previous Conditional section patch
+
+an off by one mistake in the change, led to error on correct
+document where the end of the included entity was exactly
+the end of the conditional section, leading to regtest failure
+
+Upstream-Status: Backport
+
+CVE-2015-7942-2
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/parser.c b/parser.c
+index b9217ff..d67b300 100644
+--- a/parser.c
++++ b/parser.c
+@@ -6916,7 +6916,7 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
+ NULL, NULL);
+ }
+ if ((ctxt-> instate != XML_PARSER_EOF) &&
+- ((ctxt->input->cur + 3) < ctxt->input->end))
++ ((ctxt->input->cur + 3) <= ctxt->input->end))
+ SKIP(3);
+ }
+ }
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch
new file mode 100644
index 0000000..40082ec
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-7942-Another-variation-of-overflow-in-Conditional-section.patch
@@ -0,0 +1,39 @@
+From bd0526e66a56e75a18da8c15c4750db8f801c52d Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Fri, 23 Oct 2015 19:02:28 +0800
+Subject: [PATCH] Another variation of overflow in Conditional sections
+
+Which happen after the previous fix to
+https://bugzilla.gnome.org/show_bug.cgi?id=756456
+
+But stopping the parser and exiting we didn't pop the intermediary entities
+and doing the SKIP there applies on an input which may be too small
+
+Upstream-Status: Backport
+
+CVE-2015-7942
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/parser.c b/parser.c
+index a65e4cc..b9217ff 100644
+--- a/parser.c
++++ b/parser.c
+@@ -6915,7 +6915,9 @@ xmlParseConditionalSections(xmlParserCtxtPtr ctxt) {
+ "All markup of the conditional section is not in the same entity\n",
+ NULL, NULL);
+ }
+- SKIP(3);
++ if ((ctxt-> instate != XML_PARSER_EOF) &&
++ ((ctxt->input->cur + 3) < ctxt->input->end))
++ SKIP(3);
+ }
+ }
+
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-8241.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-8241.patch
new file mode 100644
index 0000000..89a46ad
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-8241.patch
@@ -0,0 +1,40 @@
+From ab2b9a93ff19cedde7befbf2fcc48c6e352b6cbe Mon Sep 17 00:00:00 2001
+From: Hugh Davenport <hugh at allthethings.co.nz>
+Date: Tue, 3 Nov 2015 20:40:49 +0800
+Subject: [PATCH] Avoid extra processing of MarkupDecl when EOF
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=756263
+
+One place where ctxt->instate == XML_PARSER_EOF whic was set up
+by entity detection issues doesn't get noticed, and even overrided
+
+Upstream-status: Backport
+
+https://git.gnome.org/browse/libxml2/commit/?id=ab2b9a93ff19cedde7befbf2fcc48c6e352b6cbe
+
+CVE: CVE-2015-8241
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+Index: libxml2-2.9.2/parser.c
+===================================================================
+--- libxml2-2.9.2.orig/parser.c
++++ libxml2-2.9.2/parser.c
+@@ -6999,6 +6999,14 @@ xmlParseMarkupDecl(xmlParserCtxtPtr ctxt
+ xmlParsePI(ctxt);
+ }
+ }
++
++ /*
++ * detect requirement to exit there and act accordingly
++ * and avoid having instate overriden later on
++ */
++ if (ctxt->instate == XML_PARSER_EOF)
++ return;
++
+ /*
+ * This is only for internal subset. On external entities,
+ * the replacement is done before parsing stage
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch
new file mode 100644
index 0000000..59425cb
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-8317-Fail-parsing-early-on-if-encoding-conversion-failed.patch
@@ -0,0 +1,42 @@
+From 709a952110e98621c9b78c4f26462a9d8333102e Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Mon, 29 Jun 2015 16:10:26 +0800
+Subject: [PATCH] Fail parsing early on if encoding conversion failed
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=751631
+
+If we fail conversing the current input stream while
+processing the encoding declaration of the XMLDecl
+then it's safer to just abort there and not try to
+report further errors.
+
+Upstream-Status: Backport
+
+CVE-2015-8317
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ parser.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/parser.c b/parser.c
+index a3a9568..0edd53b 100644
+--- a/parser.c
++++ b/parser.c
+@@ -10471,7 +10471,11 @@ xmlParseEncodingDecl(xmlParserCtxtPtr ctxt) {
+
+ handler = xmlFindCharEncodingHandler((const char *) encoding);
+ if (handler != NULL) {
+- xmlSwitchToEncoding(ctxt, handler);
++ if (xmlSwitchToEncoding(ctxt, handler) < 0) {
++ /* failed to convert */
++ ctxt->errNo = XML_ERR_UNSUPPORTED_ENCODING;
++ return(NULL);
++ }
+ } else {
+ xmlFatalErrMsgStr(ctxt, XML_ERR_UNSUPPORTED_ENCODING,
+ "Unsupported encoding %s\n", encoding);
+--
+2.3.5
+
diff --git a/meta/recipes-core/libxml/libxml2/CVE-2015-8710.patch b/meta/recipes-core/libxml/libxml2/CVE-2015-8710.patch
new file mode 100644
index 0000000..be06cc2
--- /dev/null
+++ b/meta/recipes-core/libxml/libxml2/CVE-2015-8710.patch
@@ -0,0 +1,71 @@
+From e724879d964d774df9b7969fc846605aa1bac54c Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Fri, 30 Oct 2015 21:14:55 +0800
+Subject: [PATCH] Fix parsing short unclosed comment uninitialized access
+
+For https://bugzilla.gnome.org/show_bug.cgi?id=746048
+The HTML parser was too optimistic when processing comments and
+didn't check for the end of the stream on the first 2 characters
+
+Upstream-Status: Backport
+
+https://git.gnome.org/browse/libxml2/commit/?id=e724879d964d774df9b7969fc846605aa1bac54c
+
+CVE: CVE-2015-8710
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ HTMLparser.c | 21 ++++++++++++++-------
+ 1 file changed, 14 insertions(+), 7 deletions(-)
+
+Index: libxml2-2.9.2/HTMLparser.c
+===================================================================
+--- libxml2-2.9.2.orig/HTMLparser.c
++++ libxml2-2.9.2/HTMLparser.c
+@@ -3245,12 +3245,17 @@ htmlParseComment(htmlParserCtxtPtr ctxt)
+ ctxt->instate = state;
+ return;
+ }
++ len = 0;
++ buf[len] = 0;
+ q = CUR_CHAR(ql);
++ if (!IS_CHAR(q))
++ goto unfinished;
+ NEXTL(ql);
+ r = CUR_CHAR(rl);
++ if (!IS_CHAR(r))
++ goto unfinished;
+ NEXTL(rl);
+ cur = CUR_CHAR(l);
+- len = 0;
+ while (IS_CHAR(cur) &&
+ ((cur != '>') ||
+ (r != '-') || (q != '-'))) {
+@@ -3281,18 +3286,20 @@ htmlParseComment(htmlParserCtxtPtr ctxt)
+ }
+ }
+ buf[len] = 0;
+- if (!IS_CHAR(cur)) {
+- htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
+- "Comment not terminated \n<!--%.50s\n", buf, NULL);
+- xmlFree(buf);
+- } else {
++ if (IS_CHAR(cur)) {
+ NEXT;
+ if ((ctxt->sax != NULL) && (ctxt->sax->comment != NULL) &&
+ (!ctxt->disableSAX))
+ ctxt->sax->comment(ctxt->userData, buf);
+ xmlFree(buf);
++ ctxt->instate = state;
++ return;
+ }
+- ctxt->instate = state;
++
++unfinished:
++ htmlParseErr(ctxt, XML_ERR_COMMENT_NOT_FINISHED,
++ "Comment not terminated \n<!--%.50s\n", buf, NULL);
++ xmlFree(buf);
+ }
+
+ /**
diff --git a/meta/recipes-core/meta/meta-ide-support.bb b/meta/recipes-core/meta/meta-ide-support.bb
index 2f92912..86c57cd 100644
--- a/meta/recipes-core/meta/meta-ide-support.bb
+++ b/meta/recipes-core/meta/meta-ide-support.bb
@@ -13,5 +13,4 @@ do_populate_ide_support () {
toolchain_create_tree_env_script
}
-do_populate_ide_support[nostamp] = "1"
addtask populate_ide_support before do_build after do_install
diff --git a/meta/recipes-core/meta/nativesdk-buildtools-perl-dummy.bb b/meta/recipes-core/meta/nativesdk-buildtools-perl-dummy.bb
index d971c3c..9041734 100644
--- a/meta/recipes-core/meta/nativesdk-buildtools-perl-dummy.bb
+++ b/meta/recipes-core/meta/nativesdk-buildtools-perl-dummy.bb
@@ -2,10 +2,17 @@ SUMMARY = "Dummy package which ensures perl is excluded from buildtools"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COMMON_LICENSE_DIR}/MIT;md5=0835ade698e0bcf8506ecda2f7b4f302"
-inherit nativesdk
+inherit allarch
-# Put it somewhere separate to ensure it's never used except when we want it
-PACKAGE_ARCH = "buildtools-dummy-${SDKPKGSUFFIX}"
+PR = "r1"
+
+python() {
+ # Put the package somewhere separate to ensure it's never used except
+ # when we want it
+ # (note that we have to do this in anonymous python here to avoid
+ # allarch.bbclass disabling itself)
+ d.setVar('PACKAGE_ARCH', 'buildtools-dummy-${SDKPKGSUFFIX}')
+}
PERLPACKAGES = "nativesdk-perl \
nativesdk-perl-module-file-path"
diff --git a/meta/recipes-core/meta/signing-keys.bb b/meta/recipes-core/meta/signing-keys.bb
new file mode 100644
index 0000000..cc401f3
--- /dev/null
+++ b/meta/recipes-core/meta/signing-keys.bb
@@ -0,0 +1,45 @@
+# Copyright (C) 2015 Intel Corporation
+# Released under the MIT license (see COPYING.MIT for the terms)
+
+DESCRIPTION = "Make public keys of the signing keys available"
+LICENSE = "MIT"
+PACKAGES = ""
+
+do_fetch[noexec] = "1"
+do_unpack[noexec] = "1"
+do_patch[noexec] = "1"
+do_configure[noexec] = "1"
+do_compile[noexec] = "1"
+do_install[noexec] = "1"
+do_package[noexec] = "1"
+do_packagedata[noexec] = "1"
+do_package_write_ipk[noexec] = "1"
+do_package_write_rpm[noexec] = "1"
+do_package_write_deb[noexec] = "1"
+do_populate_sysroot[noexec] = "1"
+
+EXCLUDE_FROM_WORLD = "1"
+
+def export_gpg_pubkey(d, keyid, path):
+ import bb
+ gpg_bin = d.getVar('GPG_BIN', True) or \
+ bb.utils.which(os.getenv('PATH'), "gpg")
+ cmd = '%s --batch --yes --export --armor -o %s %s' % \
+ (gpg_bin, path, keyid)
+ status, output = oe.utils.getstatusoutput(cmd)
+ if status:
+ raise bb.build.FuncFailed('Failed to export gpg public key (%s): %s' %
+ (keyid, output))
+
+python do_export_public_keys () {
+ if d.getVar("RPM_SIGN_PACKAGES", True):
+ # Export public key of the rpm signing key
+ export_gpg_pubkey(d, d.getVar("RPM_GPG_NAME", True),
+ d.getVar('RPM_GPG_PUBKEY', True))
+
+ if d.getVar('PACKAGE_FEED_SIGN', True) == '1':
+ # Export public key of the feed signing key
+ export_gpg_pubkey(d, d.getVar("PACKAGE_FEED_GPG_NAME", True),
+ d.getVar('PACKAGE_FEED_GPG_PUBKEY', True))
+}
+addtask do_export_public_keys before do_build
diff --git a/meta/recipes-core/meta/uninative-tarball.bb b/meta/recipes-core/meta/uninative-tarball.bb
index 41f7927..21f3bd9 100644
--- a/meta/recipes-core/meta/uninative-tarball.bb
+++ b/meta/recipes-core/meta/uninative-tarball.bb
@@ -7,6 +7,7 @@ TOOLCHAIN_TARGET_TASK = ""
TOOLCHAIN_HOST_TASK = "\
nativesdk-glibc \
+ nativesdk-glibc-gconv-ibm850 \
nativesdk-patchelf \
"
diff --git a/meta/recipes-core/os-release/os-release.bb b/meta/recipes-core/os-release/os-release.bb
index cc431d2..c690b82 100644
--- a/meta/recipes-core/os-release/os-release.bb
+++ b/meta/recipes-core/os-release/os-release.bb
@@ -32,11 +32,12 @@ python do_compile () {
f.write('{0}={1}\n'.format(field, value))
if d.getVar('RPM_SIGN_PACKAGES', True) == '1':
rpm_gpg_pubkey = d.getVar('RPM_GPG_PUBKEY', True)
- os.mkdir('${B}/rpm-gpg')
- distro_version = self.d.getVar('DISTRO_VERSION', True) or "oe.0"
+ bb.utils.mkdirhier('${B}/rpm-gpg')
+ distro_version = d.getVar('DISTRO_VERSION', True) or "oe.0"
shutil.copy2(rpm_gpg_pubkey, d.expand('${B}/rpm-gpg/RPM-GPG-KEY-%s' % distro_version))
}
do_compile[vardeps] += "${OS_RELEASE_FIELDS}"
+do_compile[depends] += "signing-keys:do_export_public_keys"
do_install () {
install -d ${D}${sysconfdir}
diff --git a/meta/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bb b/meta/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bb
index 37f5e43..6997f39 100644
--- a/meta/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bb
+++ b/meta/recipes-core/packagegroups/packagegroup-core-standalone-sdk-target.bb
@@ -7,6 +7,8 @@ inherit packagegroup
RDEPENDS_${PN} = "\
libgcc \
libgcc-dev \
+ libatomic \
+ libatomic-dev \
libstdc++ \
libstdc++-dev \
${LIBC_DEPENDENCIES} \
diff --git a/meta/recipes-core/readline/readline-6.3/readline-cve-2014-2524.patch b/meta/recipes-core/readline/readline-6.3/readline-cve-2014-2524.patch
new file mode 100644
index 0000000..98a9d81
--- /dev/null
+++ b/meta/recipes-core/readline/readline-6.3/readline-cve-2014-2524.patch
@@ -0,0 +1,43 @@
+readline: Security Advisory - readline - CVE-2014-2524
+
+Upstream-Status: Backport
+
+Signed-off-by: Yue Tao <yue.tao at windriver.com>
+
+ READLINE PATCH REPORT
+ =====================
+
+Readline-Release: 6.3
+Patch-ID: readline63-003
+
+Bug-Reported-by:
+Bug-Reference-ID:
+Bug-Reference-URL:
+
+Bug-Description:
+
+There are debugging functions in the readline release that are theoretically
+exploitable as security problems. They are not public functions, but have
+global linkage.
+
+Patch (apply with `patch -p0'):
+
+*** ../readline-6.3/util.c 2013-09-02 13:36:12.000000000 -0400
+--- util.c 2014-03-20 10:25:53.000000000 -0400
+***************
+*** 477,480 ****
+--- 479,483 ----
+ }
+
++ #if defined (DEBUG)
+ #if defined (USE_VARARGS)
+ static FILE *_rl_tracefp;
+***************
+*** 539,542 ****
+--- 542,546 ----
+ }
+ #endif
++ #endif /* DEBUG */
+
+
+
diff --git a/meta/recipes-core/readline/readline-6.3/readline63-003 b/meta/recipes-core/readline/readline-6.3/readline63-003
deleted file mode 100644
index 98a9d81..0000000
--- a/meta/recipes-core/readline/readline-6.3/readline63-003
+++ /dev/null
@@ -1,43 +0,0 @@
-readline: Security Advisory - readline - CVE-2014-2524
-
-Upstream-Status: Backport
-
-Signed-off-by: Yue Tao <yue.tao at windriver.com>
-
- READLINE PATCH REPORT
- =====================
-
-Readline-Release: 6.3
-Patch-ID: readline63-003
-
-Bug-Reported-by:
-Bug-Reference-ID:
-Bug-Reference-URL:
-
-Bug-Description:
-
-There are debugging functions in the readline release that are theoretically
-exploitable as security problems. They are not public functions, but have
-global linkage.
-
-Patch (apply with `patch -p0'):
-
-*** ../readline-6.3/util.c 2013-09-02 13:36:12.000000000 -0400
---- util.c 2014-03-20 10:25:53.000000000 -0400
-***************
-*** 477,480 ****
---- 479,483 ----
- }
-
-+ #if defined (DEBUG)
- #if defined (USE_VARARGS)
- static FILE *_rl_tracefp;
-***************
-*** 539,542 ****
---- 542,546 ----
- }
- #endif
-+ #endif /* DEBUG */
-
-
-
diff --git a/meta/recipes-core/readline/readline_6.3.bb b/meta/recipes-core/readline/readline_6.3.bb
index 55964a6..fc362ae 100644
--- a/meta/recipes-core/readline/readline_6.3.bb
+++ b/meta/recipes-core/readline/readline_6.3.bb
@@ -1,6 +1,6 @@
require readline.inc
-SRC_URI += "file://readline63-003 \
+SRC_URI += "file://readline-cve-2014-2524.patch;striplevel=0 \
file://readline-dispatch-multikey.patch"
SRC_URI[archive.md5sum] = "33c8fb279e981274f485fd91da77e94a"
diff --git a/meta/recipes-core/systemd/systemd/0001-fix-build-on-uClibc-exp10.patch b/meta/recipes-core/systemd/systemd/0001-fix-build-on-uClibc-exp10.patch
new file mode 100644
index 0000000..76ce4b7
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0001-fix-build-on-uClibc-exp10.patch
@@ -0,0 +1,22 @@
+Inspired by: http://peter.korsgaard.com/patches/alsa-utils/alsamixer-fix-build-on-uClibc-exp10.patch
+
+exp10 extension is not part of uClibc, so compute it.
+
+
+Signed-off-by: Samuel Martin <s.martin49 at gmail.com>
+
+Upstream-Status: Pending
+
+Index: git/src/basic/missing.h
+===================================================================
+--- git.orig/src/basic/missing.h
++++ git/src/basic/missing.h
+@@ -1036,3 +1036,8 @@ static inline int kcmp(pid_t pid1, pid_t
+ #ifndef INPUT_PROP_ACCELEROMETER
+ #define INPUT_PROP_ACCELEROMETER 0x06
+ #endif
++
++#ifdef __UCLIBC__
++/* 10^x = 10^(log e^x) = (e^x)^log10 = e^(x * log 10) */
++#define exp10(x) (exp((x) * log(10)))
++#endif /* __UCLIBC__ */
diff --git a/meta/recipes-core/systemd/systemd/0022-Use-getenv-when-secure-versions-are-not-available.patch b/meta/recipes-core/systemd/systemd/0022-Use-getenv-when-secure-versions-are-not-available.patch
new file mode 100644
index 0000000..30e3817
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/0022-Use-getenv-when-secure-versions-are-not-available.patch
@@ -0,0 +1,39 @@
+From cb71e4beea3b3b11e5951f95c829cd2eee9fcf7b Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Sat, 12 Sep 2015 19:10:04 +0000
+Subject: [PATCH 22/31] Use getenv when secure versions are not available
+
+musl doesnt implement secure version, so we default
+to it if configure does not detect a secure imeplementation
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Rejected
+
+ src/basic/missing.h | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/src/basic/missing.h b/src/basic/missing.h
+index bf9b490..d6dbc7d 100644
+--- a/src/basic/missing.h
++++ b/src/basic/missing.h
+@@ -584,13 +584,14 @@ static inline int name_to_handle_at(int fd, const char *name, struct file_handle
+ return syscall(__NR_name_to_handle_at, fd, name, handle, mnt_id, flags);
+ }
+ #endif
+-
+-#ifndef HAVE_SECURE_GETENV
++#ifdef HAVE_SECURE_GETENV
+ # ifdef HAVE___SECURE_GETENV
+ # define secure_getenv __secure_getenv
+ # else
+ # error "neither secure_getenv nor __secure_getenv are available"
+ # endif
++#else
++# define secure_getenv getenv
+ #endif
+
+ #ifndef CIFS_MAGIC_NUMBER
+--
+2.5.2
+
diff --git a/meta/recipes-core/systemd/systemd/rules-whitelist-hd-devices.patch b/meta/recipes-core/systemd/systemd/rules-whitelist-hd-devices.patch
new file mode 100644
index 0000000..8975b05
--- /dev/null
+++ b/meta/recipes-core/systemd/systemd/rules-whitelist-hd-devices.patch
@@ -0,0 +1,32 @@
+From f77b7e5626e70c3a775e993816a33af5a61dea42 Mon Sep 17 00:00:00 2001
+From: Patrick Ohly <patrick.ohly at intel.com>
+Date: Wed, 16 Sep 2015 13:55:58 +0200
+Subject: [PATCH] rules: whitelist hd* devices
+
+qemu by default emulates IDE and the linux-yocto kernel(s) use
+CONFIG_IDE instead of the more modern libsata, so disks appear as
+/dev/hd*. Patch rejected upstream because CONFIG_IDE is deprecated.
+
+Upstream-Status: Denied [https://github.com/systemd/systemd/pull/1276]
+
+Signed-off-by: Patrick Ohly <patrick.ohly at intel.com>
+---
+ rules/60-persistent-storage.rules | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/rules/60-persistent-storage.rules b/rules/60-persistent-storage.rules
+index 0b14bb4..1c4d97a 100644
+--- a/rules/60-persistent-storage.rules
++++ b/rules/60-persistent-storage.rules
+@@ -6,7 +6,7 @@
+ ACTION=="remove", GOTO="persistent_storage_end"
+
+ SUBSYSTEM!="block", GOTO="persistent_storage_end"
+-KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|sd*|sr*|vd*|xvd*|bcache*|cciss*|dasd*|ubd*", GOTO="persistent_storage_end"
++KERNEL!="loop*|mmcblk*[0-9]|msblk*[0-9]|mspblk*[0-9]|nvme*|hd*|sd*|sr*|vd*|xvd*|bcache*|cciss*|dasd*|ubd*", GOTO="persistent_storage_end"
+
+ # ignore partitions that span the entire disk
+ TEST=="whole_disk", GOTO="persistent_storage_end"
+--
+2.1.4
+
diff --git a/meta/recipes-core/systemd/systemd_225.bb b/meta/recipes-core/systemd/systemd_225.bb
index f7d4c7d..18c2448 100644
--- a/meta/recipes-core/systemd/systemd_225.bb
+++ b/meta/recipes-core/systemd/systemd_225.bb
@@ -18,7 +18,7 @@ PROVIDES = "udev"
PE = "1"
-DEPENDS = "kmod docbook-sgml-dtd-4.1-native intltool-native gperf-native acl readline dbus libcap libcgroup glib-2.0 qemu-native util-linux"
+DEPENDS = "kmod docbook-sgml-dtd-4.1-native intltool-native gperf-native acl readline dbus libcap libcgroup qemu-native util-linux"
SECTION = "base/shell"
@@ -45,6 +45,7 @@ SRC_URI = "git://github.com/systemd/systemd.git;protocol=git \
file://00-create-volatile.conf \
file://init \
file://run-ptest \
+ file://rules-whitelist-hd-devices.patch \
"
SRC_URI_append_qemuall = " file://qemuall_io_latency-core-device.c-Change-the-default-device-timeout-to-2.patch"
@@ -52,6 +53,8 @@ S = "${WORKDIR}/git"
SRC_URI_append_libc-uclibc = "\
file://0001-units-Prefer-getty-to-agetty-in-console-setup-system.patch \
+ file://0022-Use-getenv-when-secure-versions-are-not-available.patch \
+ file://0001-fix-build-on-uClibc-exp10.patch \
"
LDFLAGS_append_libc-uclibc = " -lrt"
@@ -87,6 +90,7 @@ PACKAGECONFIG[iptc] = "--enable-libiptc,--disable-libiptc,iptables"
PACKAGECONFIG[ldconfig] = "--enable-ldconfig,--disable-ldconfig,,"
PACKAGECONFIG[selinux] = "--enable-selinux,--disable-selinux,libselinux"
PACKAGECONFIG[valgrind] = "ac_cv_header_valgrind_memcheck_h=yes ac_cv_header_valgrind_valgrind_h=yes ,ac_cv_header_valgrind_memcheck_h=no ac_cv_header_valgrind_valgrind_h=no ,valgrind"
+PACKAGECONFIG[qrencode] = "--enable-qrencode,--disable-qrencode,qrencode"
CACHED_CONFIGUREVARS += "ac_cv_path_KILL=${base_bindir}/kill"
CACHED_CONFIGUREVARS += "ac_cv_path_KMOD=${base_bindir}/kmod"
@@ -123,6 +127,9 @@ EXTRA_OECONF = " --with-rootprefix=${rootprefix} \
# uclibc does not have NSS
EXTRA_OECONF_append_libc-uclibc = " --disable-myhostname "
+# disable problematic GCC 5.2 optimizations [YOCTO #8291]
+FULL_OPTIMIZATION_append_arm = " -fno-schedule-insns -fno-schedule-insns2"
+
do_configure_prepend() {
export NM="${HOST_PREFIX}gcc-nm"
export AR="${HOST_PREFIX}gcc-ar"
@@ -186,8 +193,8 @@ do_install() {
sed -i -e 's/.*ForwardToSyslog.*/ForwardToSyslog=yes/' ${D}${sysconfdir}/systemd/journald.conf
# this file is needed to exist if networkd is disabled but timesyncd is still in use since timesyncd checks it
# for existence else it fails
- if [ -s ${D}${libdir}/tmpfiles.d/systemd.conf ]; then
- ${@bb.utils.contains('PACKAGECONFIG', 'networkd', ':', 'sed -i -e "\$ad /run/systemd/netif/links 0755 root root -" ${D}${libdir}/tmpfiles.d/systemd.conf', d)}
+ if [ -s ${D}${exec_prefix}/lib/tmpfiles.d/systemd.conf ]; then
+ ${@bb.utils.contains('PACKAGECONFIG', 'networkd', ':', 'sed -i -e "\$ad /run/systemd/netif/links 0755 root root -" ${D}${exec_prefix}/lib/tmpfiles.d/systemd.conf', d)}
fi
install -Dm 0755 ${S}/src/systemctl/systemd-sysv-install.SKELETON ${D}${systemd_unitdir}/systemd-sysv-install
}
diff --git a/meta/recipes-core/uclibc/uclibc-git.inc b/meta/recipes-core/uclibc/uclibc-git.inc
index 14a577f..b718479 100644
--- a/meta/recipes-core/uclibc/uclibc-git.inc
+++ b/meta/recipes-core/uclibc/uclibc-git.inc
@@ -16,5 +16,10 @@ SRC_URI = "git://uclibc.org/uClibc.git;branch=master \
file://0005-Always-use-O2-for-compiling-fork.c.patch \
file://0006-ldso-limited-support-for-ORIGIN-in-rpath.patch \
file://0007-nptl-atfork-Hide-pthread_atfork-in-shared-versions.patch \
+ file://0001-gcc5-optimizes-away-the-write-only-static-functions-.patch \
+ file://0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch \
+ file://0001-wire-in-syncfs.patch \
+ file://CVE-2016-2224.patch \
+ file://CVE-2016-2225.patch \
"
S = "${WORKDIR}/git"
diff --git a/meta/recipes-core/uclibc/uclibc-git/0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch b/meta/recipes-core/uclibc/uclibc-git/0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch
new file mode 100644
index 0000000..6942db4
--- /dev/null
+++ b/meta/recipes-core/uclibc/uclibc-git/0001-fcntl-Add-AT_EMPTY_PATH-for-all-and-O_PATH-for-arm.patch
@@ -0,0 +1,42 @@
+From 4c8f5fe7d41493e8e181941ae5a01713155f44d1 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Thu, 15 Oct 2015 15:34:39 +0000
+Subject: [PATCH] fcntl: Add AT_EMPTY_PATH for all and O_PATH for arm
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ include/fcntl.h | 3 +++
+ libc/sysdeps/linux/arm/bits/fcntl.h | 1 +
+ 2 files changed, 4 insertions(+)
+
+diff --git a/include/fcntl.h b/include/fcntl.h
+index 11000dd..8a7ad9b 100644
+--- a/include/fcntl.h
++++ b/include/fcntl.h
+@@ -65,6 +65,9 @@ __BEGIN_DECLS
+ # define AT_SYMLINK_FOLLOW 0x400 /* Follow symbolic links. */
+ # define AT_EACCESS 0x200 /* Test access permitted for
+ effective IDs, not real IDs. */
++# ifdef __USE_GNU
++# define AT_EMPTY_PATH 0x1000 /* Allow empty relative pathname. */
++# endif
+ #endif
+
+ /* Do the file control operation described by CMD on FD.
+diff --git a/libc/sysdeps/linux/arm/bits/fcntl.h b/libc/sysdeps/linux/arm/bits/fcntl.h
+index aedc154..c6ba958 100644
+--- a/libc/sysdeps/linux/arm/bits/fcntl.h
++++ b/libc/sysdeps/linux/arm/bits/fcntl.h
+@@ -50,6 +50,7 @@
+ # define O_DIRECT 0200000 /* Direct disk access. */
+ # define O_NOATIME 01000000 /* Do not set atime. */
+ # define O_CLOEXEC 02000000 /* Set close_on_exec. */
++# define O_PATH 010000000 /* Resolve pathname but do not open file. */
+ #endif
+
+ /* For now Linux has synchronisity options for data and read operations.
+--
+2.6.1
+
diff --git a/meta/recipes-core/uclibc/uclibc-git/0001-gcc5-optimizes-away-the-write-only-static-functions-.patch b/meta/recipes-core/uclibc/uclibc-git/0001-gcc5-optimizes-away-the-write-only-static-functions-.patch
new file mode 100644
index 0000000..e622f87
--- /dev/null
+++ b/meta/recipes-core/uclibc/uclibc-git/0001-gcc5-optimizes-away-the-write-only-static-functions-.patch
@@ -0,0 +1,51 @@
+From 2659fb25d32f4b29c1c96aa5730fe40e19d53ab0 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Wed, 14 Oct 2015 17:38:37 -0700
+Subject: [PATCH] gcc5 optimizes away the write only static functions and we
+ end up with
+
+ librt/librt_so.a(rt-unwind-resume.oS): In function `_Unwind_Resume':
+ rt-unwind-resume.c:(.text+0x3c): undefined reference to `libgcc_s_resume'
+ collect2: error: ld returned 1 exit status
+ make[2]: *** [lib/librt.so] Error 1
+
+marking these functions explicitly used with __attribute_used__ avoids
+that optimization.
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c | 2 +-
+ libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c
+index f4d6f41..0c2edd7 100644
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-forcedunwind.c
+@@ -27,7 +27,7 @@
+ #define __libc_fatal(x) {/*write(STDERR_FILENO, x, strlen(x));*/ abort();}
+
+ static void *libgcc_s_handle;
+-static void (*libgcc_s_resume) (struct _Unwind_Exception *exc);
++static void (*libgcc_s_resume) (struct _Unwind_Exception *exc) __attribute_used__;
+ static _Unwind_Reason_Code (*libgcc_s_personality)
+ (_Unwind_State, struct _Unwind_Exception *, struct _Unwind_Context *);
+ static _Unwind_Reason_Code (*libgcc_s_forcedunwind)
+diff --git a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c
+index f9a4ffb..f0c3047 100644
+--- a/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c
++++ b/libpthread/nptl/sysdeps/unix/sysv/linux/arm/unwind-resume.c
+@@ -25,7 +25,7 @@
+ #define __libc_dlclose dlclose
+ #define __libc_fatal(x) {/*write(STDERR_FILENO, x, strlen(x));*/ abort();}
+
+-static void (*libgcc_s_resume) (struct _Unwind_Exception *exc);
++static void (*libgcc_s_resume) (struct _Unwind_Exception *exc) __attribute_used__;
+ static _Unwind_Reason_Code (*libgcc_s_personality)
+ (_Unwind_State, struct _Unwind_Exception *, struct _Unwind_Context *);
+
+--
+2.6.1
+
diff --git a/meta/recipes-core/uclibc/uclibc-git/0001-wire-in-syncfs.patch b/meta/recipes-core/uclibc/uclibc-git/0001-wire-in-syncfs.patch
new file mode 100644
index 0000000..079ad6b
--- /dev/null
+++ b/meta/recipes-core/uclibc/uclibc-git/0001-wire-in-syncfs.patch
@@ -0,0 +1,49 @@
+From 4f2db1b46bda5e376245ec36198b137709f069e8 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Thu, 15 Oct 2015 17:03:37 +0000
+Subject: [PATCH] wire in syncfs
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ include/unistd.h | 2 +-
+ libc/sysdeps/linux/common/syncfs.c | 13 +++++++++++++
+ 2 files changed, 14 insertions(+), 1 deletion(-)
+ create mode 100644 libc/sysdeps/linux/common/syncfs.c
+
+diff --git a/include/unistd.h b/include/unistd.h
+index 3793d2d..d01bb08 100644
+--- a/include/unistd.h
++++ b/include/unistd.h
+@@ -1073,7 +1073,7 @@ extern char *getpass (const char *__prompt) __nonnull ((1));
+ extern int fsync (int __fd);
+ #endif /* Use BSD || X/Open || Unix98. */
+
+-#if 0 /*def __USE_GNU */
++#ifdef __USE_GNU
+ /* Make all changes done to all files on the file system associated
+ * with FD actually appear on disk. */
+ extern int syncfs (int __fd) __THROW;
+diff --git a/libc/sysdeps/linux/common/syncfs.c b/libc/sysdeps/linux/common/syncfs.c
+new file mode 100644
+index 0000000..d2eed05
+--- /dev/null
++++ b/libc/sysdeps/linux/common/syncfs.c
+@@ -0,0 +1,13 @@
++/* vi: set sw=4 ts=4: */
++/*
++ * fsync() for uClibc
++ *
++ * Copyright (C) 2000-2006 Erik Andersen <andersen at uclibc.org>
++ *
++ * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball.
++ */
++
++#include <sys/syscall.h>
++#include <unistd.h>
++
++_syscall1(int, syncfs, int, fd)
+--
+2.6.1
+
diff --git a/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2224.patch b/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2224.patch
new file mode 100644
index 0000000..218b60a
--- /dev/null
+++ b/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2224.patch
@@ -0,0 +1,49 @@
+From 16719c1a7078421928e6d31dd1dec574825ef515 Mon Sep 17 00:00:00 2001
+From: Waldemar Brodkorb <wbx at openadk.org>
+Date: Sun, 17 Jan 2016 15:47:22 +0100
+Subject: [PATCH] Do not follow compressed items forever.
+
+It is possible to get stuck in an infinite loop when receiving a
+specially crafted DNS reply. Exit the loop after a number of iteration
+and consider the packet invalid.
+
+Signed-off-by: Daniel Fahlgren <daniel at fahlgren.se>
+Signed-off-by: Waldemar Brodkorb <wbx at uclibc-ng.org>
+
+Upstream-status: Backport
+http://repo.or.cz/uclibc-ng.git/commit/16719c1a7078421928e6d31dd1dec574825ef515
+
+CVE: CVE-2016-2224
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ libc/inet/resolv.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+Index: git/libc/inet/resolv.c
+===================================================================
+--- git.orig/libc/inet/resolv.c
++++ git/libc/inet/resolv.c
+@@ -666,11 +666,12 @@ int __decode_dotted(const unsigned char
+ bool measure = 1;
+ unsigned total = 0;
+ unsigned used = 0;
++ unsigned maxiter = 256;
+
+ if (!packet)
+ return -1;
+
+- while (1) {
++ while (--maxiter) {
+ if (offset >= packet_len)
+ return -1;
+ b = packet[offset++];
+@@ -707,6 +708,8 @@ int __decode_dotted(const unsigned char
+ else
+ dest[used++] = '\0';
+ }
++ if (!maxiter)
++ return -1;
+
+ /* The null byte must be counted too */
+ if (measure)
diff --git a/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2225.patch b/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2225.patch
new file mode 100644
index 0000000..0217e4b
--- /dev/null
+++ b/meta/recipes-core/uclibc/uclibc-git/CVE-2016-2225.patch
@@ -0,0 +1,32 @@
+From bb01edff0377f2585ce304ecbadcb7b6cde372ac Mon Sep 17 00:00:00 2001
+From: Waldemar Brodkorb <wbx at openadk.org>
+Date: Mon, 25 Jan 2016 21:11:34 +0100
+Subject: [PATCH] Make sure to always terminate decoded string
+
+Write a terminating '\0' to dest when the first byte of the encoded data
+is 0. This corner case was previously missed.
+
+Signed-off-by: Daniel Fahlgren <daniel at fahlgren.se>
+Signed-off-by: Waldemar Brodkorb <wbx at uclibc-ng.org>
+
+Upstream-Status: Backport
+http://repo.or.cz/uclibc-ng.git/commit/bb01edff0377f2585ce304ecbadcb7b6cde372ac
+CVE: CVE-2016-2225
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ libc/inet/resolv.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+Index: git/libc/inet/resolv.c
+===================================================================
+--- git.orig/libc/inet/resolv.c
++++ git/libc/inet/resolv.c
+@@ -671,6 +671,7 @@ int __decode_dotted(const unsigned char
+ if (!packet)
+ return -1;
+
++ dest[0] = '\0';
+ while (--maxiter) {
+ if (offset >= packet_len)
+ return -1;
diff --git a/meta/recipes-core/uclibc/uclibc-git/uClibc.distro b/meta/recipes-core/uclibc/uclibc-git/uClibc.distro
index 6575482..3827b66 100644
--- a/meta/recipes-core/uclibc/uclibc-git/uClibc.distro
+++ b/meta/recipes-core/uclibc/uclibc-git/uClibc.distro
@@ -182,6 +182,8 @@ UCLIBC_HAS_FLOATS=y
# COMPILE_IN_THUMB_MODE is not set
+# needed by shadow
+UCLIBC_HAS_UTMP=y
# needed by systemd
UCLIBC_HAS_UTMPX=y
UCLIBC_LINUX_MODULE_26=y
diff --git a/meta/recipes-core/udev/udev.inc b/meta/recipes-core/udev/udev.inc
index a00dad5..c378ae3 100644
--- a/meta/recipes-core/udev/udev.inc
+++ b/meta/recipes-core/udev/udev.inc
@@ -15,6 +15,8 @@ LDFLAGS += "-lrt"
DEPENDS = "glib-2.0 libusb usbutils pciutils glib-2.0-native gperf-native libxslt-native util-linux"
RPROVIDES_${PN} = "hotplug"
+PROVIDES = "libgudev"
+
SRC_URI = "${KERNELORG_MIRROR}/linux/utils/kernel/hotplug/udev-${PV}.tar.gz \
file://0001-Fixing-keyboard_force_release.sh-shell-script-path.patch \
file://avoid-mouse-autosuspend.patch \
diff --git a/meta/recipes-core/util-linux/util-linux.inc b/meta/recipes-core/util-linux/util-linux.inc
index a4072bc..594108f 100644
--- a/meta/recipes-core/util-linux/util-linux.inc
+++ b/meta/recipes-core/util-linux/util-linux.inc
@@ -163,6 +163,12 @@ do_install () {
echo 'MOUNTALL="-t nonfs,nosmbfs,noncpfs"' > ${D}${sysconfdir}/default/mountall
rm -f ${D}${bindir}/chkdupexe
+
+ if [ "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}" = "pam" ]; then
+ install -d ${D}${sysconfdir}/pam.d
+ install -m 0644 ${WORKDIR}/runuser.pamd ${D}${sysconfdir}/pam.d/runuser
+ install -m 0644 ${WORKDIR}/runuser-l.pamd ${D}${sysconfdir}/pam.d/runuser-l
+ fi
}
# reset and nologin causes a conflict with ncurses-native and shadow-native
diff --git a/meta/recipes-core/util-linux/util-linux/runuser-l.pamd b/meta/recipes-core/util-linux/util-linux/runuser-l.pamd
new file mode 100644
index 0000000..4b368cc
--- /dev/null
+++ b/meta/recipes-core/util-linux/util-linux/runuser-l.pamd
@@ -0,0 +1,3 @@
+auth include runuser
+session optional pam_keyinit.so force revoke
+session include runuser
diff --git a/meta/recipes-core/util-linux/util-linux/runuser.pamd b/meta/recipes-core/util-linux/util-linux/runuser.pamd
new file mode 100644
index 0000000..48d133b
--- /dev/null
+++ b/meta/recipes-core/util-linux/util-linux/runuser.pamd
@@ -0,0 +1,4 @@
+auth sufficient pam_rootok.so
+session optional pam_keyinit.so revoke
+session required pam_limits.so
+session required pam_unix.so
diff --git a/meta/recipes-core/util-linux/util-linux_2.26.2.bb b/meta/recipes-core/util-linux/util-linux_2.26.2.bb
index fc7dc6e..e09fdfa 100644
--- a/meta/recipes-core/util-linux/util-linux_2.26.2.bb
+++ b/meta/recipes-core/util-linux/util-linux_2.26.2.bb
@@ -13,6 +13,8 @@ SRC_URI += "file://util-linux-ng-replace-siginterrupt.patch \
file://uclibc-__progname-conflict.patch \
file://configure-sbindir.patch \
file://fix-parallel-build.patch \
+ file://runuser.pamd \
+ file://runuser-l.pamd \
${OLDHOST} \
"
SRC_URI[md5sum] = "9bdf368c395f1b70325d0eb22c7f48fb"
diff --git a/meta/recipes-devtools/binutils/binutils/binutils-octeon3.patch b/meta/recipes-devtools/binutils/binutils/binutils-octeon3.patch
index 6108c0d..4e8c69f 100644
--- a/meta/recipes-devtools/binutils/binutils/binutils-octeon3.patch
+++ b/meta/recipes-devtools/binutils/binutils/binutils-octeon3.patch
@@ -229,7 +229,7 @@ Index: git/opcodes/mips-dis.c
+ { "octeon3", 1, bfd_mach_mips_octeon3, CPU_OCTEON3,
+ ISA_MIPS64R2 | INSN_OCTEON3, ASE_VIRT | ASE_VIRT64,
+ mips_cp0_names_numeric,
-+ NULL, 0, mips_hwr_names_numeric },
++ NULL, 0, mips_cp1_names_mips3264, mips_hwr_names_numeric },
+
{ "xlr", 1, bfd_mach_mips_xlr, CPU_XLR,
ISA_MIPS64 | INSN_XLR, 0,
diff --git a/meta/recipes-devtools/build-compare/build-compare_git.bb b/meta/recipes-devtools/build-compare/build-compare_git.bb
index 7ac3784..676f11d 100644
--- a/meta/recipes-devtools/build-compare/build-compare_git.bb
+++ b/meta/recipes-devtools/build-compare/build-compare_git.bb
@@ -10,7 +10,6 @@ SRC_URI = "git://github.com/openSUSE/build-compare.git \
file://Ignore-DWARF-sections.patch;striplevel=1 \
file://0001-Add-support-for-deb-and-ipk-packaging.patch \
"
-PATCHTOOL = "git"
SRCREV = "c5352c054c6ef15735da31b76d6d88620f4aff0a"
diff --git a/meta/recipes-devtools/ccache/ccache_3.2.3.bb b/meta/recipes-devtools/ccache/ccache_3.2.3.bb
index 357df75..97f557a 100644
--- a/meta/recipes-devtools/ccache/ccache_3.2.3.bb
+++ b/meta/recipes-devtools/ccache/ccache_3.2.3.bb
@@ -5,4 +5,6 @@ LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=b3c337e7664559a789d9f7a93e5283c1"
SRCREV = "4cad46e8ee0053144bb00919f0dadd20c1f87013"
-SRC_URI += "file://0001-Fix-regression-in-recent-change-related-to-zlib-in-n.patch"
+SRC_URI += "file://0001-Fix-regression-in-recent-change-related-to-zlib-in-n.patch \
+ file://0002-dev.mk.in-fix-file-name-too-long.patch \
+"
diff --git a/meta/recipes-devtools/ccache/files/0002-dev.mk.in-fix-file-name-too-long.patch b/meta/recipes-devtools/ccache/files/0002-dev.mk.in-fix-file-name-too-long.patch
new file mode 100644
index 0000000..837cfad
--- /dev/null
+++ b/meta/recipes-devtools/ccache/files/0002-dev.mk.in-fix-file-name-too-long.patch
@@ -0,0 +1,32 @@
+From 71bd0082c6edcf73f054a8a4fa34bd8dd4de7cd7 Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang at windriver.com>
+Date: Wed, 16 Sep 2015 19:45:40 -0700
+Subject: [PATCH] dev.mk.in: fix file name too long
+
+The all_cppflags change paths to filename which cause file name too long
+error when the path is longer than NAME_MAX (usually 255). Strip srcdir
+to fix the problem.
+
+Upstream-Status: Pending
+
+Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
+---
+ dev.mk.in | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/dev.mk.in b/dev.mk.in
+index 1261ad3..ec55ac4 100644
+--- a/dev.mk.in
++++ b/dev.mk.in
+@@ -1,7 +1,7 @@
+ # GNU make syntax reigns in this file.
+
+ all_cflags += -Werror
+-all_cppflags += -MD -MP -MF .deps/$(subst .._,,$(subst /,_,$<)).d
++all_cppflags += -MD -MP -MF .deps/$(subst .._,,$(subst /,_,$(subst $(srcdir)/,,$<))).d
+
+ ASCIIDOC = asciidoc
+ GPERF = gperf
+--
+1.7.9.5
+
diff --git a/meta/recipes-devtools/dpkg/dpkg/CVE-2015-0860.patch b/meta/recipes-devtools/dpkg/dpkg/CVE-2015-0860.patch
new file mode 100644
index 0000000..1f259d3
--- /dev/null
+++ b/meta/recipes-devtools/dpkg/dpkg/CVE-2015-0860.patch
@@ -0,0 +1,52 @@
+From f1aac7d933819569bf6f347c3c0d5a64a90bbce0 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Hanno=20B=C3=B6ck?= <hanno at hboeck.de>
+Date: Thu, 19 Nov 2015 20:03:10 +0100
+Subject: [PATCH] dpkg-deb: Fix off-by-one write access on ctrllenbuf variable
+
+This affects old format .deb packages.
+
+Fixes: CVE-2015-0860
+Warned-by: afl
+Signed-off-by: Guillem Jover <guillem at debian.org>
+
+Upstream-Status: Backport
+
+https://anonscm.debian.org/cgit/dpkg/dpkg.git/commit/?h=wheezy&id=f1aac7d933819569bf6f347c3c0d5a64a90bbce0
+
+CVE: CVE-2015-0860
+
+hand merge Changelog
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ debian/changelog | 3 +++
+ dpkg-deb/extract.c | 2 +-
+ 2 files changed, 4 insertions(+), 1 deletion(-)
+
+Index: dpkg-1.18.2/dpkg-deb/extract.c
+===================================================================
+--- dpkg-1.18.2.orig/dpkg-deb/extract.c
++++ dpkg-1.18.2/dpkg-deb/extract.c
+@@ -247,7 +247,7 @@ extracthalf(const char *debar, const cha
+ if (errstr)
+ ohshit(_("archive has invalid format version: %s"), errstr);
+
+- r = read_line(arfd, ctrllenbuf, 1, sizeof(ctrllenbuf));
++ r = read_line(arfd, ctrllenbuf, 1, sizeof(ctrllenbuf) - 1);
+ if (r < 0)
+ read_fail(r, debar, _("archive control member size"));
+ if (sscanf(ctrllenbuf, "%jd%c%d", &ctrllennum, &nlc, &dummy) != 2 ||
+Index: dpkg-1.18.2/ChangeLog
+===================================================================
+--- dpkg-1.18.2.orig/ChangeLog
++++ dpkg-1.18.2/ChangeLog
+@@ -1,3 +1,8 @@
++[ Guillem Jover ]
++ * Fix an off-by-one write access in dpkg-deb when parsing the old format
++ .deb control member size. Thanks to Hanno Böck <hanno at hboeck.de>.
++ Fixes CVE-2015-0860.
++
+ commit 5459d330c73cdcfd1327bc93c0ebddc2da4a3a3a (HEAD -> master, tag: 1.18.2)
+ Author: Guillem Jover <guillem at debian.org>
+ Date: Mon Aug 3 15:41:05 2015 +0200
diff --git a/meta/recipes-devtools/dpkg/dpkg_1.18.2.bb b/meta/recipes-devtools/dpkg/dpkg_1.18.2.bb
index 4c3fa4f..2fc096d 100644
--- a/meta/recipes-devtools/dpkg/dpkg_1.18.2.bb
+++ b/meta/recipes-devtools/dpkg/dpkg_1.18.2.bb
@@ -12,6 +12,7 @@ SRC_URI += "file://noman.patch \
file://0003-Our-pre-postinsts-expect-D-to-be-set-when-running-in.patch \
file://0004-The-lutimes-function-doesn-t-work-properly-for-all-s.patch \
file://0005-dpkg-compiler.m4-remove-Wvla.patch \
+ file://CVE-2015-0860.patch \
"
SRC_URI[md5sum] = "63b9d869081ec49adeef6c5ff62d6576"
diff --git a/meta/recipes-devtools/e2fsprogs/e2fsprogs/copy-in-create-hardlinks-with-the-correct-directory-.patch b/meta/recipes-devtools/e2fsprogs/e2fsprogs/copy-in-create-hardlinks-with-the-correct-directory-.patch
new file mode 100644
index 0000000..f549693
--- /dev/null
+++ b/meta/recipes-devtools/e2fsprogs/e2fsprogs/copy-in-create-hardlinks-with-the-correct-directory-.patch
@@ -0,0 +1,81 @@
+From 2dcf8e92bc39e05b3c799f53fe911c024aee4375 Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang at windriver.com>
+Date: Fri, 23 Oct 2015 03:21:05 -0700
+Subject: [PATCH] copy-in: create hardlinks with the correct directory
+ filetype
+
+When we're creating hard links via ext2fs_link, the (misnamed?) flags
+argument specifies the filetype for the directory entry. This is
+*derived* from i_mode, so provide a translator. Otherwise, fsck will
+complain about unset file types.
+
+Signed-off-by: Darrick J. Wong <darrick.wong at oracle.com>
+Signed-off-by: Theodore Ts'o <tytso at mit.edu>
+
+Upstream-Status: Backport
+
+Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
+---
+ misc/create_inode.c | 33 +++++++++++++++++++++++++++++++--
+ 1 file changed, 31 insertions(+), 2 deletions(-)
+
+diff --git a/misc/create_inode.c b/misc/create_inode.c
+index fcec5aa..b8565da 100644
+--- a/misc/create_inode.c
++++ b/misc/create_inode.c
+@@ -22,6 +22,33 @@
+ /* For saving the hard links */
+ int hdlink_cnt = HDLINK_CNT;
+
++static int ext2_file_type(unsigned int mode)
++{
++ if (LINUX_S_ISREG(mode))
++ return EXT2_FT_REG_FILE;
++
++ if (LINUX_S_ISDIR(mode))
++ return EXT2_FT_DIR;
++
++ if (LINUX_S_ISCHR(mode))
++ return EXT2_FT_CHRDEV;
++
++ if (LINUX_S_ISBLK(mode))
++ return EXT2_FT_BLKDEV;
++
++ if (LINUX_S_ISLNK(mode))
++ return EXT2_FT_SYMLINK;
++
++ if (LINUX_S_ISFIFO(mode))
++ return EXT2_FT_FIFO;
++
++ if (LINUX_S_ISSOCK(mode))
++ return EXT2_FT_SOCK;
++
++ return 0;
++}
++
++
+ /* Link an inode number to a directory */
+ static errcode_t add_link(ext2_ino_t parent_ino, ext2_ino_t ino, const char *name)
+ {
+@@ -34,14 +61,16 @@ static errcode_t add_link(ext2_ino_t parent_ino, ext2_ino_t ino, const char *nam
+ return retval;
+ }
+
+- retval = ext2fs_link(current_fs, parent_ino, name, ino, inode.i_flags);
++ retval = ext2fs_link(current_fs, parent_ino, name, ino,
++ ext2_file_type(inode.i_mode));
+ if (retval == EXT2_ET_DIR_NO_SPACE) {
+ retval = ext2fs_expand_dir(current_fs, parent_ino);
+ if (retval) {
+ com_err(__func__, retval, "while expanding directory");
+ return retval;
+ }
+- retval = ext2fs_link(current_fs, parent_ino, name, ino, inode.i_flags);
++ retval = ext2fs_link(current_fs, parent_ino, name, ino,
++ ext2_file_type(inode.i_mode));
+ }
+ if (retval) {
+ com_err(__func__, retval, "while linking %s", name);
+--
+1.7.9.5
+
diff --git a/meta/recipes-devtools/e2fsprogs/e2fsprogs_1.42.9.bb b/meta/recipes-devtools/e2fsprogs/e2fsprogs_1.42.9.bb
index 97e29c8..a8edeef 100644
--- a/meta/recipes-devtools/e2fsprogs/e2fsprogs_1.42.9.bb
+++ b/meta/recipes-devtools/e2fsprogs/e2fsprogs_1.42.9.bb
@@ -23,6 +23,7 @@ SRC_URI += "file://acinclude.m4 \
file://cache_inode.patch \
file://CVE-2015-0247.patch \
file://0001-libext2fs-fix-potential-buffer-overflow-in-closefs.patch \
+ file://copy-in-create-hardlinks-with-the-correct-directory-.patch \
"
SRC_URI[md5sum] = "3f8e41e63b432ba114b33f58674563f7"
@@ -60,12 +61,27 @@ do_install () {
install -v -m 755 ${S}/contrib/populate-extfs.sh ${D}${base_sbindir}/
}
+# Need to find the right mke2fs.conf file
+e2fsprogs_conf_fixup () {
+ for i in mke2fs mkfs.ext2 mkfs.ext3 mkfs.ext4 mkfs.ext4dev; do
+ create_wrapper ${D}${base_sbindir}/$i MKE2FS_CONFIG=${sysconfdir}/mke2fs.conf
+ done
+}
+
do_install_append_class-target() {
# Clean host path in compile_et, mk_cmds
sed -i -e "s,ET_DIR=\"${S}/lib/et\",ET_DIR=\"${datadir}/et\",g" ${D}${bindir}/compile_et
sed -i -e "s,SS_DIR=\"${S}/lib/ss\",SS_DIR=\"${datadir}/ss\",g" ${D}${bindir}/mk_cmds
}
+do_install_append_class-native() {
+ e2fsprogs_conf_fixup
+}
+
+do_install_append_class-nativesdk() {
+ e2fsprogs_conf_fixup
+}
+
RDEPENDS_e2fsprogs = "e2fsprogs-badblocks"
RRECOMMENDS_e2fsprogs = "e2fsprogs-mke2fs e2fsprogs-e2fsck"
diff --git a/meta/recipes-devtools/file/file/host-file.patch b/meta/recipes-devtools/file/file/host-file.patch
new file mode 100644
index 0000000..a7efbdc
--- /dev/null
+++ b/meta/recipes-devtools/file/file/host-file.patch
@@ -0,0 +1,32 @@
+Upstream-Status: Submitted (http://bugs.gw.com/view.php?id=485)
+Signed-off-by: Ross Burton <ross.burton at intel.com>
+
+From 3cde199d03b39632361c275cd30fa0612a03138b Mon Sep 17 00:00:00 2001
+From: Ross Burton <ross.burton at intel.com>
+Date: Mon, 19 Oct 2015 10:30:57 +0100
+Subject: [PATCH 2/2] When using the host file, respect FILE_COMPILE
+
+If we're cross-compiling and not using the file binary that was just built,
+execute the binary that we've been told to use (via FILE_COMPILE) when checking
+the version instead of assuming that "file" is correct as the actual compile
+uses FILE_COMPILE so different binaries may be used.
+---
+ magic/Makefile.am | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/magic/Makefile.am b/magic/Makefile.am
+index 89ac844..67067fe 100644
+--- a/magic/Makefile.am
++++ b/magic/Makefile.am
+@@ -293,7 +293,7 @@ ${MAGIC}: $(EXTRA_DIST) $(FILE_COMPILE_DEP)
+ @(if expr "${FILE_COMPILE}" : '.*/.*' > /dev/null; then \
+ echo "Using ${FILE_COMPILE} to generate ${MAGIC}" > /dev/null; \
+ else \
+- v=$$(file --version | sed -e s/file-// -e q); \
++ v=$$(${FILE_COMPILE} --version | sed -e s/file-// -e q); \
+ if [ "$$v" != "${PACKAGE_VERSION}" ]; then \
+ echo "Cannot use the installed version of file ($$v) to"; \
+ echo "cross-compile file ${PACKAGE_VERSION}"; \
+--
+2.1.4
+
diff --git a/meta/recipes-devtools/file/file_5.24.bb b/meta/recipes-devtools/file/file_5.24.bb
index 08b95d7..d04f121 100644
--- a/meta/recipes-devtools/file/file_5.24.bb
+++ b/meta/recipes-devtools/file/file_5.24.bb
@@ -8,12 +8,13 @@ SECTION = "console/utils"
LICENSE = "BSD"
LIC_FILES_CHKSUM = "file://COPYING;beginline=2;md5=6a7382872edb68d33e1a9398b6e03188"
-DEPENDS = "zlib file-native"
+DEPENDS = "zlib file-replacement-native"
DEPENDS_class-native = "zlib-native"
SRC_URI = "git://github.com/file/file.git \
file://debian-742262.patch \
file://0001-Add-P-prompt-into-Usage-info.patch \
+ file://host-file.patch \
"
SRCREV = "3c0874be4d3232d672b20f513451a39cfd7c585a"
@@ -21,6 +22,9 @@ S = "${WORKDIR}/git"
inherit autotools
+EXTRA_OEMAKE_append_class-target = "-e FILE_COMPILE=${STAGING_BINDIR_NATIVE}/file-native/file"
+EXTRA_OEMAKE_append_class-nativesdk = "-e FILE_COMPILE=${STAGING_BINDIR_NATIVE}/file-native/file"
+
FILES_${PN} += "${datadir}/misc/*.mgc"
do_install_append_class-native() {
@@ -34,3 +38,7 @@ do_install_append_class-nativesdk() {
}
BBCLASSEXTEND = "native nativesdk"
+PROVIDES_append_class-native = " file-replacement-native"
+# Don't use NATIVE_PACKAGE_PATH_SUFFIX as that hides libmagic from anyone who
+# depends on file-replacement-native.
+bindir_append_class-native = "/file-native"
diff --git a/meta/recipes-devtools/gcc/gcc-4.8.inc b/meta/recipes-devtools/gcc/gcc-4.8.inc
index 6a2454d..b3e1c33 100644
--- a/meta/recipes-devtools/gcc/gcc-4.8.inc
+++ b/meta/recipes-devtools/gcc/gcc-4.8.inc
@@ -69,6 +69,7 @@ SRC_URI = "\
file://0047-repomembug.patch \
file://0049-Enable-SPE-AltiVec-generation-on-powepc-linux-target.patch \
file://target-gcc-includedir.patch \
+ file://0051-gcc-483-universal-initializer-no-warning.patch \
"
SRC_URI[md5sum] = "5a84a30839b2aca22a2d723de2a626ec"
SRC_URI[sha256sum] = "4a80aa23798b8e9b5793494b8c976b39b8d9aa2e53cd5ed5534aff662a7f8695"
diff --git a/meta/recipes-devtools/gcc/gcc-4.8/0051-gcc-483-universal-initializer-no-warning.patch b/meta/recipes-devtools/gcc/gcc-4.8/0051-gcc-483-universal-initializer-no-warning.patch
new file mode 100644
index 0000000..fde227b
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.8/0051-gcc-483-universal-initializer-no-warning.patch
@@ -0,0 +1,107 @@
+Upstream-Status: Backport
+
+Signed-off-by: Kai Kang <kai.kang at windriver.com>
+---
+Fix for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119
+wrong warning when using the universal zero initializer {0}
+
+Backported to GCC 4.8.3
+
+Subject: 2014-06-05 S. Gilles <sgilles at terpmail.umd.edu>
+X-Git-Url: http://repo.or.cz/w/official-gcc.git/commitdiff_plain/95cdf3fdf2d440eb7775def8e35ab970651c33d9?hp=14a3093e9943937cbc63dfbf4d51ca60f8325b29
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211289 138bc75d-0d04-0410-961f-82ee72b054a4
+
+--- gcc-4.8.3.org/gcc/c/c-typeck.c 2014-08-03 20:52:09.257042137 +0200
++++ gcc-4.8.3/gcc/c/c-typeck.c 2014-08-03 20:57:10.645042614 +0200
+@@ -62,9 +62,9 @@
+ if expr.original_code == SIZEOF_EXPR. */
+ tree c_last_sizeof_arg;
+
+-/* Nonzero if we've already printed a "missing braces around initializer"
+- message within this initializer. */
+-static int missing_braces_mentioned;
++/* Nonzero if we might need to print a "missing braces around
++ initializer" message within this initializer. */
++static int found_missing_braces;
+
+ static int require_constant_value;
+ static int require_constant_elements;
+@@ -6379,6 +6379,9 @@
+ /* 1 if this constructor is erroneous so far. */
+ static int constructor_erroneous;
+
++/* 1 if this constructor is the universal zero initializer { 0 }. */
++static int constructor_zeroinit;
++
+ /* Structure for managing pending initializer elements, organized as an
+ AVL tree. */
+
+@@ -6540,7 +6543,7 @@
+ constructor_stack = 0;
+ constructor_range_stack = 0;
+
+- missing_braces_mentioned = 0;
++ found_missing_braces = 0;
+
+ spelling_base = 0;
+ spelling_size = 0;
+@@ -6635,6 +6638,7 @@
+ constructor_type = type;
+ constructor_incremental = 1;
+ constructor_designated = 0;
++ constructor_zeroinit = 1;
+ designator_depth = 0;
+ designator_erroneous = 0;
+
+@@ -6832,11 +6836,8 @@
+ set_nonincremental_init (braced_init_obstack);
+ }
+
+- if (implicit == 1 && warn_missing_braces && !missing_braces_mentioned)
+- {
+- missing_braces_mentioned = 1;
+- warning_init (OPT_Wmissing_braces, "missing braces around initializer");
+- }
++ if (implicit == 1)
++ found_missing_braces = 1;
+
+ if (TREE_CODE (constructor_type) == RECORD_TYPE
+ || TREE_CODE (constructor_type) == UNION_TYPE)
+@@ -6969,16 +6970,23 @@
+ }
+ }
+
++ if (vec_safe_length (constructor_elements) != 1)
++ constructor_zeroinit = 0;
++
++ /* Warn when some structs are initialized with direct aggregation. */
++ if (!implicit && found_missing_braces && warn_missing_braces
++ && !constructor_zeroinit)
++ {
++ warning_init (OPT_Wmissing_braces,
++ "missing braces around initializer");
++ }
++
+ /* Warn when some struct elements are implicitly initialized to zero. */
+ if (warn_missing_field_initializers
+ && constructor_type
+ && TREE_CODE (constructor_type) == RECORD_TYPE
+ && constructor_unfilled_fields)
+ {
+- bool constructor_zeroinit =
+- (vec_safe_length (constructor_elements) == 1
+- && integer_zerop ((*constructor_elements)[0].value));
+-
+ /* Do not warn for flexible array members or zero-length arrays. */
+ while (constructor_unfilled_fields
+ && (!DECL_SIZE (constructor_unfilled_fields)
+@@ -8093,6 +8101,9 @@
+ designator_depth = 0;
+ designator_erroneous = 0;
+
++ if (!implicit && value.value && !integer_zerop (value.value))
++ constructor_zeroinit = 0;
++
+ /* Handle superfluous braces around string cst as in
+ char x[] = {"foo"}; */
+ if (string_flag
diff --git a/meta/recipes-devtools/gcc/gcc-4.9.inc b/meta/recipes-devtools/gcc/gcc-4.9.inc
index 691ba5f..95b553c 100644
--- a/meta/recipes-devtools/gcc/gcc-4.9.inc
+++ b/meta/recipes-devtools/gcc/gcc-4.9.inc
@@ -80,6 +80,7 @@ SRC_URI = "\
file://0062-Use-SYSTEMLIBS_DIR-replacement-instead-of-hardcoding.patch \
file://0063-nativesdk-gcc-support.patch \
file://0064-handle-target-sysroot-multilib.patch \
+ file://0065-gcc-483-universal-initializer-no-warning.patch \
"
SRC_URI[md5sum] = "6f831b4d251872736e8e9cc09746f327"
SRC_URI[sha256sum] = "2332b2a5a321b57508b9031354a8503af6fdfb868b8c1748d33028d100a8b67e"
diff --git a/meta/recipes-devtools/gcc/gcc-4.9/0065-gcc-483-universal-initializer-no-warning.patch b/meta/recipes-devtools/gcc/gcc-4.9/0065-gcc-483-universal-initializer-no-warning.patch
new file mode 100644
index 0000000..fde227b
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-4.9/0065-gcc-483-universal-initializer-no-warning.patch
@@ -0,0 +1,107 @@
+Upstream-Status: Backport
+
+Signed-off-by: Kai Kang <kai.kang at windriver.com>
+---
+Fix for https://gcc.gnu.org/bugzilla/show_bug.cgi?id=53119
+wrong warning when using the universal zero initializer {0}
+
+Backported to GCC 4.8.3
+
+Subject: 2014-06-05 S. Gilles <sgilles at terpmail.umd.edu>
+X-Git-Url: http://repo.or.cz/w/official-gcc.git/commitdiff_plain/95cdf3fdf2d440eb7775def8e35ab970651c33d9?hp=14a3093e9943937cbc63dfbf4d51ca60f8325b29
+git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@211289 138bc75d-0d04-0410-961f-82ee72b054a4
+
+--- gcc-4.8.3.org/gcc/c/c-typeck.c 2014-08-03 20:52:09.257042137 +0200
++++ gcc-4.8.3/gcc/c/c-typeck.c 2014-08-03 20:57:10.645042614 +0200
+@@ -62,9 +62,9 @@
+ if expr.original_code == SIZEOF_EXPR. */
+ tree c_last_sizeof_arg;
+
+-/* Nonzero if we've already printed a "missing braces around initializer"
+- message within this initializer. */
+-static int missing_braces_mentioned;
++/* Nonzero if we might need to print a "missing braces around
++ initializer" message within this initializer. */
++static int found_missing_braces;
+
+ static int require_constant_value;
+ static int require_constant_elements;
+@@ -6379,6 +6379,9 @@
+ /* 1 if this constructor is erroneous so far. */
+ static int constructor_erroneous;
+
++/* 1 if this constructor is the universal zero initializer { 0 }. */
++static int constructor_zeroinit;
++
+ /* Structure for managing pending initializer elements, organized as an
+ AVL tree. */
+
+@@ -6540,7 +6543,7 @@
+ constructor_stack = 0;
+ constructor_range_stack = 0;
+
+- missing_braces_mentioned = 0;
++ found_missing_braces = 0;
+
+ spelling_base = 0;
+ spelling_size = 0;
+@@ -6635,6 +6638,7 @@
+ constructor_type = type;
+ constructor_incremental = 1;
+ constructor_designated = 0;
++ constructor_zeroinit = 1;
+ designator_depth = 0;
+ designator_erroneous = 0;
+
+@@ -6832,11 +6836,8 @@
+ set_nonincremental_init (braced_init_obstack);
+ }
+
+- if (implicit == 1 && warn_missing_braces && !missing_braces_mentioned)
+- {
+- missing_braces_mentioned = 1;
+- warning_init (OPT_Wmissing_braces, "missing braces around initializer");
+- }
++ if (implicit == 1)
++ found_missing_braces = 1;
+
+ if (TREE_CODE (constructor_type) == RECORD_TYPE
+ || TREE_CODE (constructor_type) == UNION_TYPE)
+@@ -6969,16 +6970,23 @@
+ }
+ }
+
++ if (vec_safe_length (constructor_elements) != 1)
++ constructor_zeroinit = 0;
++
++ /* Warn when some structs are initialized with direct aggregation. */
++ if (!implicit && found_missing_braces && warn_missing_braces
++ && !constructor_zeroinit)
++ {
++ warning_init (OPT_Wmissing_braces,
++ "missing braces around initializer");
++ }
++
+ /* Warn when some struct elements are implicitly initialized to zero. */
+ if (warn_missing_field_initializers
+ && constructor_type
+ && TREE_CODE (constructor_type) == RECORD_TYPE
+ && constructor_unfilled_fields)
+ {
+- bool constructor_zeroinit =
+- (vec_safe_length (constructor_elements) == 1
+- && integer_zerop ((*constructor_elements)[0].value));
+-
+ /* Do not warn for flexible array members or zero-length arrays. */
+ while (constructor_unfilled_fields
+ && (!DECL_SIZE (constructor_unfilled_fields)
+@@ -8093,6 +8101,9 @@
+ designator_depth = 0;
+ designator_erroneous = 0;
+
++ if (!implicit && value.value && !integer_zerop (value.value))
++ constructor_zeroinit = 0;
++
+ /* Handle superfluous braces around string cst as in
+ char x[] = {"foo"}; */
+ if (string_flag
diff --git a/meta/recipes-devtools/gcc/gcc-5.2.inc b/meta/recipes-devtools/gcc/gcc-5.2.inc
index f691f58..a6b385a 100644
--- a/meta/recipes-devtools/gcc/gcc-5.2.inc
+++ b/meta/recipes-devtools/gcc/gcc-5.2.inc
@@ -73,6 +73,7 @@ SRC_URI = "\
file://0039-libcc1-fix-libcc1-s-install-path-and-rpath.patch \
file://0040-nativesdk-gcc-support.patch \
file://0041-handle-target-sysroot-multilib.patch \
+ file://0042-cxxflags-for-build.patch \
"
BACKPORTS = ""
@@ -98,6 +99,7 @@ EXTRA_OECONF_BASE = "\
--with-cloog=no \
--enable-checking=release \
--enable-cheaders=c_global \
+ --without-isl \
"
EXTRA_OECONF_INITIAL = "\
@@ -109,6 +111,7 @@ EXTRA_OECONF_INITIAL = "\
--disable-lto \
--disable-plugin \
--enable-decimal-float=no \
+ --without-isl \
"
EXTRA_OECONF_append_libc-uclibc = " --disable-decimal-float "
diff --git a/meta/recipes-devtools/gcc/gcc-5.2/0042-cxxflags-for-build.patch b/meta/recipes-devtools/gcc/gcc-5.2/0042-cxxflags-for-build.patch
new file mode 100644
index 0000000..1105e29
--- /dev/null
+++ b/meta/recipes-devtools/gcc/gcc-5.2/0042-cxxflags-for-build.patch
@@ -0,0 +1,123 @@
+Fix various _FOR_BUILD and related variables
+
+When doing a FOR_BUILD thing, you have to override CFLAGS with
+CFLAGS_FOR_BUILD. And if you use C++, you also have to override
+CXXFLAGS with CXXFLAGS_FOR_BUILD.
+Without this, when building for mingw, you end up trying to use
+the mingw headers for a host build.
+
+The same goes for other variables as well, such as CPPFLAGS,
+CPP, and GMPINC.
+
+Upstream-Status: Pending
+
+Signed-off-by: Peter Seebach <peter.seebach at windriver.com>
+Signed-off-by: Mark Hatle <mark.hatle at windriver.com>
+
+diff --git a/Makefile.in b/Makefile.in
+index 9370174..011c29a 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -152,6 +152,7 @@ BUILD_EXPORTS = \
+ CPP="$(CC_FOR_BUILD) -E"; export CPP; \
+ CFLAGS="$(CFLAGS_FOR_BUILD)"; export CFLAGS; \
+ CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \
++ CPPFLAGS="$(CPPFLAGS_FOR_BUILD)"; export CPPFLAGS; \
+ CXX="$(CXX_FOR_BUILD)"; export CXX; \
+ CXXFLAGS="$(CXXFLAGS_FOR_BUILD)"; export CXXFLAGS; \
+ GCJ="$(GCJ_FOR_BUILD)"; export GCJ; \
+@@ -170,6 +171,9 @@ BUILD_EXPORTS = \
+ # built for the build system to override those in BASE_FLAGS_TO_PASS.
+ EXTRA_BUILD_FLAGS = \
+ CFLAGS="$(CFLAGS_FOR_BUILD)" \
++ CXXFLAGS="$(CXXFLAGS_FOR_BUILD)" \
++ CPP="$(CC_FOR_BUILD) -E" \
++ CPPFLAGS="$(CPPFLAGS_FOR_BUILD)" \
+ LDFLAGS="$(LDFLAGS_FOR_BUILD)"
+
+ # This is the list of directories to built for the host system.
+@@ -187,6 +191,7 @@ HOST_SUBDIR = @host_subdir@
+ HOST_EXPORTS = \
+ $(BASE_EXPORTS) \
+ CC="$(CC)"; export CC; \
++ CPP="$(CC) -E"; export CPP; \
+ ADA_CFLAGS="$(ADA_CFLAGS)"; export ADA_CFLAGS; \
+ CFLAGS="$(CFLAGS)"; export CFLAGS; \
+ CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \
+@@ -711,6 +715,7 @@ BASE_FLAGS_TO_PASS = \
+ "CC_FOR_BUILD=$(CC_FOR_BUILD)" \
+ "CFLAGS_FOR_BUILD=$(CFLAGS_FOR_BUILD)" \
+ "CXX_FOR_BUILD=$(CXX_FOR_BUILD)" \
++ "CXXFLAGS_FOR_BUILD=$(CXXFLAGS_FOR_BUILD)" \
+ "EXPECT=$(EXPECT)" \
+ "FLEX=$(FLEX)" \
+ "INSTALL=$(INSTALL)" \
+diff --git a/Makefile.tpl b/Makefile.tpl
+index 1ea1954..78a59c3 100644
+--- a/Makefile.tpl
++++ b/Makefile.tpl
+@@ -154,6 +154,7 @@ BUILD_EXPORTS = \
+ CC="$(CC_FOR_BUILD)"; export CC; \
+ CFLAGS="$(CFLAGS_FOR_BUILD)"; export CFLAGS; \
+ CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \
++ CPPFLAGS="$(CPPFLAGS_FOR_BUILD)"; export CPPFLAGS; \
+ CXX="$(CXX_FOR_BUILD)"; export CXX; \
+ CXXFLAGS="$(CXXFLAGS_FOR_BUILD)"; export CXXFLAGS; \
+ GCJ="$(GCJ_FOR_BUILD)"; export GCJ; \
+@@ -172,6 +173,9 @@ BUILD_EXPORTS = \
+ # built for the build system to override those in BASE_FLAGS_TO_PASS.
+ EXTRA_BUILD_FLAGS = \
+ CFLAGS="$(CFLAGS_FOR_BUILD)" \
++ CXXFLAGS="$(CXXFLAGS_FOR_BUILD)" \
++ CPP="$(CC_FOR_BUILD) -E" \
++ CPPFLAGS="$(CPPFLAGS_FOR_BUILD)" \
+ LDFLAGS="$(LDFLAGS_FOR_BUILD)"
+
+ # This is the list of directories to built for the host system.
+@@ -189,6 +193,7 @@ HOST_SUBDIR = @host_subdir@
+ HOST_EXPORTS = \
+ $(BASE_EXPORTS) \
+ CC="$(CC)"; export CC; \
++ CPP="$(CC) -E"; export CPP; \
+ ADA_CFLAGS="$(ADA_CFLAGS)"; export ADA_CFLAGS; \
+ CFLAGS="$(CFLAGS)"; export CFLAGS; \
+ CONFIG_SHELL="$(SHELL)"; export CONFIG_SHELL; \
+diff --git a/gcc/Makefile.in b/gcc/Makefile.in
+index cd5bc4a..98ae4f4 100644
+--- a/gcc/Makefile.in
++++ b/gcc/Makefile.in
+@@ -762,7 +762,7 @@ BUILD_LINKERFLAGS = $(BUILD_CXXFLAGS)
+ # Native linker and preprocessor flags. For x-fragment overrides.
+ BUILD_LDFLAGS=@BUILD_LDFLAGS@
+ BUILD_CPPFLAGS= -I. -I$(@D) -I$(srcdir) -I$(srcdir)/$(@D) \
+- -I$(srcdir)/../include @INCINTL@ $(CPPINC) $(CPPFLAGS)
++ -I$(srcdir)/../include @INCINTL@ $(CPPINC) $(CPPFLAGS_FOR_BUILD)
+
+ # Actual name to use when installing a native compiler.
+ GCC_INSTALL_NAME := $(shell echo gcc|sed '$(program_transform_name)')
+diff --git a/gcc/configure b/gcc/configure
+index c7ac14b..5ac63e4 100755
+--- a/gcc/configure
++++ b/gcc/configure
+@@ -11521,7 +11521,7 @@ else
+ CC="${CC_FOR_BUILD}" CFLAGS="${CFLAGS_FOR_BUILD}" \
+ CXX="${CXX_FOR_BUILD}" CXXFLAGS="${CXXFLAGS_FOR_BUILD}" \
+ LD="${LD_FOR_BUILD}" LDFLAGS="${LDFLAGS_FOR_BUILD}" \
+- GMPINC="" CPPFLAGS="${CPPFLAGS} -DGENERATOR_FILE" \
++ GMPINC="" CPPFLAGS="${CPPFLAGS_FOR_BUILD} -DGENERATOR_FILE" \
+ ${realsrcdir}/configure \
+ --enable-languages=${enable_languages-all} \
+ --target=$target_alias --host=$build_alias --build=$build_alias
+diff --git a/gcc/configure.ac b/gcc/configure.ac
+index 50856e6..17a4dfd 100644
+--- a/gcc/configure.ac
++++ b/gcc/configure.ac
+@@ -1633,7 +1633,7 @@ else
+ CC="${CC_FOR_BUILD}" CFLAGS="${CFLAGS_FOR_BUILD}" \
+ CXX="${CXX_FOR_BUILD}" CXXFLAGS="${CXXFLAGS_FOR_BUILD}" \
+ LD="${LD_FOR_BUILD}" LDFLAGS="${LDFLAGS_FOR_BUILD}" \
+- GMPINC="" CPPFLAGS="${CPPFLAGS} -DGENERATOR_FILE" \
++ GMPINC="" CPPFLAGS="${CPPFLAGS_FOR_BUILD} -DGENERATOR_FILE" \
+ ${realsrcdir}/configure \
+ --enable-languages=${enable_languages-all} \
+ --target=$target_alias --host=$build_alias --build=$build_alias
diff --git a/meta/recipes-devtools/gcc/gcc-common.inc b/meta/recipes-devtools/gcc/gcc-common.inc
index d63c07f..6f2f224 100644
--- a/meta/recipes-devtools/gcc/gcc-common.inc
+++ b/meta/recipes-devtools/gcc/gcc-common.inc
@@ -25,6 +25,11 @@ def get_gcc_mips_plt_setting(bb, d):
return "--with-mips-plt"
return ""
+def get_gcc_ppc_plt_settings(bb, d):
+ if d.getVar('TRANSLATED_TARGET_ARCH', True) in [ 'powerpc' ] and not bb.utils.contains('DISTRO_FEATURES', 'bssplt', True, False, d):
+ return "--enable-secureplt"
+ return ""
+
def get_long_double_setting(bb, d):
if d.getVar('TRANSLATED_TARGET_ARCH', True) in [ 'powerpc', 'powerpc64' ] and d.getVar('TCLIBC', True) in [ 'uclibc', 'glibc' ]:
return "--with-long-double-128"
diff --git a/meta/recipes-devtools/gcc/gcc-configure-common.inc b/meta/recipes-devtools/gcc/gcc-configure-common.inc
index a14be73..cee6f4a 100644
--- a/meta/recipes-devtools/gcc/gcc-configure-common.inc
+++ b/meta/recipes-devtools/gcc/gcc-configure-common.inc
@@ -47,6 +47,7 @@ EXTRA_OECONF = "\
${EXTRA_OECONF_GCC_FLOAT} \
${EXTRA_OECONF_PATHS} \
${@get_gcc_mips_plt_setting(bb, d)} \
+ ${@get_gcc_ppc_plt_settings(bb, d)} \
${@get_long_double_setting(bb, d)} \
${@get_gcc_multiarch_setting(bb, d)} \
"
diff --git a/meta/recipes-devtools/gcc/gcc-cross-initial.inc b/meta/recipes-devtools/gcc/gcc-cross-initial.inc
index 7197447..c0fa139 100644
--- a/meta/recipes-devtools/gcc/gcc-cross-initial.inc
+++ b/meta/recipes-devtools/gcc/gcc-cross-initial.inc
@@ -26,6 +26,7 @@ EXTRA_OECONF = "\
${EXTRA_OECONF_INITIAL} \
${@bb.utils.contains('DISTRO_FEATURES', 'ld-is-gold', '--with-ld=${STAGING_BINDIR_TOOLCHAIN}/${TARGET_PREFIX}ld.bfd', '', d)} \
${EXTRA_OECONF_GCC_FLOAT} \
+ ${@get_gcc_ppc_plt_settings(bb, d)} \
"
EXTRA_OECONF += "--with-native-system-header-dir=${SYSTEMHEADERS}"
diff --git a/meta/recipes-devtools/gcc/gcc-multilib-config.inc b/meta/recipes-devtools/gcc/gcc-multilib-config.inc
index f7f9f55..1c0a45a 100644
--- a/meta/recipes-devtools/gcc/gcc-multilib-config.inc
+++ b/meta/recipes-devtools/gcc/gcc-multilib-config.inc
@@ -206,7 +206,7 @@ python gcc_multilib_setup() {
# take out '-' mcpu='s and march='s from parameters
opts = []
whitelist = (d.getVar("MULTILIB_OPTION_WHITELIST", True) or "").split()
- for i in tune_parameters['ccargs'].split():
+ for i in d.expand(tune_parameters['ccargs']).split():
if i in whitelist:
# Need to strip '-' from option
opts.append(i[1:])
@@ -223,5 +223,6 @@ python gcc_multilib_setup() {
}
gcc_multilib_setup[cleandirs] = "${B}/gcc/config"
+gcc_multilib_setup[vardepsexclude] = "SDK_ARCH"
EXTRACONFFUNCS += "gcc_multilib_setup"
diff --git a/meta/recipes-devtools/gcc/gcc-runtime.inc b/meta/recipes-devtools/gcc/gcc-runtime.inc
index 09757e6..690d780 100644
--- a/meta/recipes-devtools/gcc/gcc-runtime.inc
+++ b/meta/recipes-devtools/gcc/gcc-runtime.inc
@@ -53,6 +53,9 @@ do_install () {
if [ -d ${D}${infodir} ]; then
rmdir --ignore-fail-on-non-empty -p ${D}${infodir}
fi
+ if [ "${TARGET_VENDOR_MULTILIB_ORIGINAL}" != "" -a "${TARGET_VENDOR}" != "${TARGET_VENDOR_MULTILIB_ORIGINAL}" ]; then
+ ln -s ${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR_MULTILIB_ORIGINAL}-${TARGET_OS}
+ fi
if [ "${TARGET_OS}" = "linux-gnuspe" ]; then
ln -s ${TARGET_SYS} ${D}${includedir}/c++/${BINV}/${TARGET_ARCH}${TARGET_VENDOR}-linux
fi
diff --git a/meta/recipes-devtools/gcc/gcc-shared-source.inc b/meta/recipes-devtools/gcc/gcc-shared-source.inc
index 9acffb1..aac4b49 100644
--- a/meta/recipes-devtools/gcc/gcc-shared-source.inc
+++ b/meta/recipes-devtools/gcc/gcc-shared-source.inc
@@ -5,5 +5,7 @@ do_fetch[noexec] = "1"
deltask do_unpack
deltask do_patch
+SRC_URI = ""
+
do_configure[depends] += "gcc-source-${PV}:do_preconfigure"
do_populate_lic[depends] += "gcc-source-${PV}:do_unpack"
diff --git a/meta/recipes-devtools/gcc/gcc-target.inc b/meta/recipes-devtools/gcc/gcc-target.inc
index 6e160c0..d62c15a 100644
--- a/meta/recipes-devtools/gcc/gcc-target.inc
+++ b/meta/recipes-devtools/gcc/gcc-target.inc
@@ -31,7 +31,7 @@ PACKAGES = "\
FILES_${PN} = "\
${bindir}/${TARGET_PREFIX}gcc* \
- ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/collect2 \
+ ${libexecdir}/gcc/${TARGET_SYS}/${BINV}/collect2* \
${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc* \
${libexecdir}/gcc/${TARGET_SYS}/${BINV}/lto* \
${libexecdir}/gcc/${TARGET_SYS}/${BINV}/lib*${SOLIBS} \
@@ -83,20 +83,20 @@ FILES_gfortran-symlinks = "\
${bindir}/f95"
FILES_cpp = "\
- ${bindir}/${TARGET_PREFIX}cpp \
+ ${bindir}/${TARGET_PREFIX}cpp* \
${base_libdir}/cpp \
${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc1"
FILES_cpp-symlinks = "${bindir}/cpp"
-FILES_gcov = "${bindir}/${TARGET_PREFIX}gcov \
- ${bindir}/${TARGET_PREFIX}gcov-tool \
+FILES_gcov = "${bindir}/${TARGET_PREFIX}gcov* \
+ ${bindir}/${TARGET_PREFIX}gcov-tool* \
"
FILES_gcov-symlinks = "${bindir}/gcov \
${bindir}/gcov-tool \
"
FILES_g++ = "\
- ${bindir}/${TARGET_PREFIX}g++ \
+ ${bindir}/${TARGET_PREFIX}g++* \
${libexecdir}/gcc/${TARGET_SYS}/${BINV}/cc1plus \
"
FILES_g++-symlinks = "\
@@ -141,7 +141,7 @@ do_install () {
cd ${D}${bindir}
# We care about g++ not c++
- rm -f *c++
+ rm -f *c++*
# We don't care about the gcc-<version> ones for this
rm -f *gcc-?.?*
diff --git a/meta/recipes-devtools/gcc/gcc_4.9.bb b/meta/recipes-devtools/gcc/gcc_4.9.bb
index b84baae..a9dc612 100644
--- a/meta/recipes-devtools/gcc/gcc_4.9.bb
+++ b/meta/recipes-devtools/gcc/gcc_4.9.bb
@@ -1,10 +1,9 @@
require recipes-devtools/gcc/gcc-${PV}.inc
require gcc-target.inc
-# Building with thumb enabled on armv4t fails with
-# | gcc-4.8.1-r0/gcc-4.8.1/gcc/cp/decl.c:7438:(.text.unlikely+0x2fa): relocation truncated to fit: R_ARM_THM_CALL against symbol `fancy_abort(char const*, int, char const*)' defined in .glue_7 section in linker stubs
-# | gcc-4.8.1-r0/gcc-4.8.1/gcc/cp/decl.c:7442:(.text.unlikely+0x318): additional relocation overflows omitted from the output
+# http://errors.yoctoproject.org/Errors/Details/20497/
ARM_INSTRUCTION_SET_armv4 = "arm"
+ARM_INSTRUCTION_SET_armv5 = "arm"
BBCLASSEXTEND = "nativesdk"
diff --git a/meta/recipes-devtools/gcc/libgcc.inc b/meta/recipes-devtools/gcc/libgcc.inc
index 739adbd..95fa3f4 100644
--- a/meta/recipes-devtools/gcc/libgcc.inc
+++ b/meta/recipes-devtools/gcc/libgcc.inc
@@ -15,17 +15,10 @@ LICENSE_${PN}-dev = "GPL-3.0-with-GCC-exception"
LICENSE_${PN}-dbg = "GPL-3.0-with-GCC-exception"
-FILES_${PN} = "${base_libdir}/libgcc*.so.*"
FILES_${PN}-dev = "\
${base_libdir}/libgcc*.so \
- ${libdir}/${TARGET_SYS}/${BINV}/*crt* \
- ${libdir}/${TARGET_SYS}/${BINV}/64 \
- ${libdir}/${TARGET_SYS}/${BINV}/32 \
- ${libdir}/${TARGET_SYS}/${BINV}/x32 \
- ${libdir}/${TARGET_SYS}/${BINV}/n32 \
- ${libdir}/${TARGET_SYS}/${BINV}/libgcc* \
${@base_conditional('BASETARGET_SYS', '${TARGET_SYS}', '', '${libdir}/${BASETARGET_SYS}', d)} \
- ${libdir}/${TARGET_SYS}/${BINV}/libgcov.a \
+ ${libdir}/${TARGET_SYS}/${BINV}* \
"
FILES_${PN}-dbg += "${base_libdir}/.debug/"
diff --git a/meta/recipes-devtools/git/git-2.5.0/0008-CVE-2015-7545-1.patch b/meta/recipes-devtools/git/git-2.5.0/0008-CVE-2015-7545-1.patch
new file mode 100644
index 0000000..b552c09
--- /dev/null
+++ b/meta/recipes-devtools/git/git-2.5.0/0008-CVE-2015-7545-1.patch
@@ -0,0 +1,446 @@
+From a5adaced2e13c135d5d9cc65be9eb95aa3bacedf Mon Sep 17 00:00:00 2001
+From: Jeff King <peff at peff.net>
+Date: Wed, 16 Sep 2015 13:12:52 -0400
+Subject: [PATCH] transport: add a protocol-whitelist environment variable
+
+If we are cloning an untrusted remote repository into a
+sandbox, we may also want to fetch remote submodules in
+order to get the complete view as intended by the other
+side. However, that opens us up to attacks where a malicious
+user gets us to clone something they would not otherwise
+have access to (this is not necessarily a problem by itself,
+but we may then act on the cloned contents in a way that
+exposes them to the attacker).
+
+Ideally such a setup would sandbox git entirely away from
+high-value items, but this is not always practical or easy
+to set up (e.g., OS network controls may block multiple
+protocols, and we would want to enable some but not others).
+
+We can help this case by providing a way to restrict
+particular protocols. We use a whitelist in the environment.
+This is more annoying to set up than a blacklist, but
+defaults to safety if the set of protocols git supports
+grows). If no whitelist is specified, we continue to default
+to allowing all protocols (this is an "unsafe" default, but
+since the minority of users will want this sandboxing
+effect, it is the only sensible one).
+
+A note on the tests: ideally these would all be in a single
+test file, but the git-daemon and httpd test infrastructure
+is an all-or-nothing proposition rather than a test-by-test
+prerequisite. By putting them all together, we would be
+unable to test the file-local code on machines without
+apache.
+
+Signed-off-by: Jeff King <peff at peff.net>
+Signed-off-by: Junio C Hamano <gitster at pobox.com>
+
+Upstream-Status: Backport
+
+http://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.5.0-1ubuntu0.1.debian.tar.xz
+
+CVE: CVE-2015-7545 #1
+Singed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ Documentation/git.txt | 32 ++++++++++++++
+ connect.c | 5 +++
+ t/lib-proto-disable.sh | 96 ++++++++++++++++++++++++++++++++++++++++++
+ t/t5810-proto-disable-local.sh | 14 ++++++
+ t/t5811-proto-disable-git.sh | 20 +++++++++
+ t/t5812-proto-disable-http.sh | 20 +++++++++
+ t/t5813-proto-disable-ssh.sh | 20 +++++++++
+ t/t5814-proto-disable-ext.sh | 18 ++++++++
+ transport-helper.c | 2 +
+ transport.c | 21 ++++++++-
+ transport.h | 7 +++
+ 11 files changed, 254 insertions(+), 1 deletion(-)
+ create mode 100644 t/lib-proto-disable.sh
+ create mode 100755 t/t5810-proto-disable-local.sh
+ create mode 100755 t/t5811-proto-disable-git.sh
+ create mode 100755 t/t5812-proto-disable-http.sh
+ create mode 100755 t/t5813-proto-disable-ssh.sh
+ create mode 100755 t/t5814-proto-disable-ext.sh
+
+Index: git-2.5.0/Documentation/git.txt
+===================================================================
+--- git-2.5.0.orig/Documentation/git.txt 2015-12-11 12:46:48.975637719 -0500
++++ git-2.5.0/Documentation/git.txt 2015-12-11 12:46:48.967637661 -0500
+@@ -1069,6 +1069,38 @@
+ an operation has touched every ref (e.g., because you are
+ cloning a repository to make a backup).
+
++`GIT_ALLOW_PROTOCOL`::
++ If set, provide a colon-separated list of protocols which are
++ allowed to be used with fetch/push/clone. This is useful to
++ restrict recursive submodule initialization from an untrusted
++ repository. Any protocol not mentioned will be disallowed (i.e.,
++ this is a whitelist, not a blacklist). If the variable is not
++ set at all, all protocols are enabled. The protocol names
++ currently used by git are:
++
++ - `file`: any local file-based path (including `file://` URLs,
++ or local paths)
++
++ - `git`: the anonymous git protocol over a direct TCP
++ connection (or proxy, if configured)
++
++ - `ssh`: git over ssh (including `host:path` syntax,
++ `git+ssh://`, etc).
++
++ - `rsync`: git over rsync
++
++ - `http`: git over http, both "smart http" and "dumb http".
++ Note that this does _not_ include `https`; if you want both,
++ you should specify both as `http:https`.
++
++ - any external helpers are named by their protocol (e.g., use
++ `hg` to allow the `git-remote-hg` helper)
+++
++Note that this controls only git's internal protocol selection.
++If libcurl is used (e.g., by the `http` transport), it may
++redirect to other protocols. There is not currently any way to
++restrict this.
++
+
+ Discussion[[Discussion]]
+ ------------------------
+Index: git-2.5.0/connect.c
+===================================================================
+--- git-2.5.0.orig/connect.c 2015-12-11 12:46:48.975637719 -0500
++++ git-2.5.0/connect.c 2015-12-11 12:46:48.967637661 -0500
+@@ -9,6 +9,7 @@
+ #include "url.h"
+ #include "string-list.h"
+ #include "sha1-array.h"
++#include "transport.h"
+
+ static char *server_capabilities;
+ static const char *parse_feature_value(const char *, const char *, int *);
+@@ -694,6 +695,8 @@
+ else
+ target_host = xstrdup(hostandport);
+
++ transport_check_allowed("git");
++
+ /* These underlying connection commands die() if they
+ * cannot connect.
+ */
+@@ -727,6 +730,7 @@
+ int putty, tortoiseplink = 0;
+ char *ssh_host = hostandport;
+ const char *port = NULL;
++ transport_check_allowed("ssh");
+ get_host_and_port(&ssh_host, &port);
+
+ if (!port)
+@@ -781,6 +785,7 @@
+ /* remove repo-local variables from the environment */
+ conn->env = local_repo_env;
+ conn->use_shell = 1;
++ transport_check_allowed("file");
+ }
+ argv_array_push(&conn->args, cmd.buf);
+
+Index: git-2.5.0/t/lib-proto-disable.sh
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ git-2.5.0/t/lib-proto-disable.sh 2015-12-11 12:46:48.967637661 -0500
+@@ -0,0 +1,96 @@
++# Test routines for checking protocol disabling.
++
++# test cloning a particular protocol
++# $1 - description of the protocol
++# $2 - machine-readable name of the protocol
++# $3 - the URL to try cloning
++test_proto () {
++ desc=$1
++ proto=$2
++ url=$3
++
++ test_expect_success "clone $1 (enabled)" '
++ rm -rf tmp.git &&
++ (
++ GIT_ALLOW_PROTOCOL=$proto &&
++ export GIT_ALLOW_PROTOCOL &&
++ git clone --bare "$url" tmp.git
++ )
++ '
++
++ test_expect_success "fetch $1 (enabled)" '
++ (
++ cd tmp.git &&
++ GIT_ALLOW_PROTOCOL=$proto &&
++ export GIT_ALLOW_PROTOCOL &&
++ git fetch
++ )
++ '
++
++ test_expect_success "push $1 (enabled)" '
++ (
++ cd tmp.git &&
++ GIT_ALLOW_PROTOCOL=$proto &&
++ export GIT_ALLOW_PROTOCOL &&
++ git push origin HEAD:pushed
++ )
++ '
++
++ test_expect_success "push $1 (disabled)" '
++ (
++ cd tmp.git &&
++ GIT_ALLOW_PROTOCOL=none &&
++ export GIT_ALLOW_PROTOCOL &&
++ test_must_fail git push origin HEAD:pushed
++ )
++ '
++
++ test_expect_success "fetch $1 (disabled)" '
++ (
++ cd tmp.git &&
++ GIT_ALLOW_PROTOCOL=none &&
++ export GIT_ALLOW_PROTOCOL &&
++ test_must_fail git fetch
++ )
++ '
++
++ test_expect_success "clone $1 (disabled)" '
++ rm -rf tmp.git &&
++ (
++ GIT_ALLOW_PROTOCOL=none &&
++ export GIT_ALLOW_PROTOCOL &&
++ test_must_fail git clone --bare "$url" tmp.git
++ )
++ '
++}
++
++# set up an ssh wrapper that will access $host/$repo in the
++# trash directory, and enable it for subsequent tests.
++setup_ssh_wrapper () {
++ test_expect_success 'setup ssh wrapper' '
++ write_script ssh-wrapper <<-\EOF &&
++ echo >&2 "ssh: $*"
++ host=$1; shift
++ cd "$TRASH_DIRECTORY/$host" &&
++ eval "$*"
++ EOF
++ GIT_SSH="$PWD/ssh-wrapper" &&
++ export GIT_SSH &&
++ export TRASH_DIRECTORY
++ '
++}
++
++# set up a wrapper that can be used with remote-ext to
++# access repositories in the "remote" directory of trash-dir,
++# like "ext::fake-remote %S repo.git"
++setup_ext_wrapper () {
++ test_expect_success 'setup ext wrapper' '
++ write_script fake-remote <<-\EOF &&
++ echo >&2 "fake-remote: $*"
++ cd "$TRASH_DIRECTORY/remote" &&
++ eval "$*"
++ EOF
++ PATH=$TRASH_DIRECTORY:$PATH &&
++ export TRASH_DIRECTORY
++ '
++}
+Index: git-2.5.0/t/t5810-proto-disable-local.sh
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ git-2.5.0/t/t5810-proto-disable-local.sh 2015-12-11 12:46:48.967637661 -0500
+@@ -0,0 +1,14 @@
++#!/bin/sh
++
++test_description='test disabling of local paths in clone/fetch'
++. ./test-lib.sh
++. "$TEST_DIRECTORY/lib-proto-disable.sh"
++
++test_expect_success 'setup repository to clone' '
++ test_commit one
++'
++
++test_proto "file://" file "file://$PWD"
++test_proto "path" file .
++
++test_done
+Index: git-2.5.0/t/t5811-proto-disable-git.sh
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ git-2.5.0/t/t5811-proto-disable-git.sh 2015-12-11 12:46:48.967637661 -0500
+@@ -0,0 +1,20 @@
++#!/bin/sh
++
++test_description='test disabling of git-over-tcp in clone/fetch'
++. ./test-lib.sh
++. "$TEST_DIRECTORY/lib-proto-disable.sh"
++. "$TEST_DIRECTORY/lib-git-daemon.sh"
++start_git_daemon
++
++test_expect_success 'create git-accessible repo' '
++ bare="$GIT_DAEMON_DOCUMENT_ROOT_PATH/repo.git" &&
++ test_commit one &&
++ git --bare init "$bare" &&
++ git push "$bare" HEAD &&
++ >"$bare/git-daemon-export-ok" &&
++ git -C "$bare" config daemon.receivepack true
++'
++
++test_proto "git://" git "$GIT_DAEMON_URL/repo.git"
++
++test_done
+Index: git-2.5.0/t/t5812-proto-disable-http.sh
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ git-2.5.0/t/t5812-proto-disable-http.sh 2015-12-11 12:46:48.967637661 -0500
+@@ -0,0 +1,20 @@
++#!/bin/sh
++
++test_description='test disabling of git-over-http in clone/fetch'
++. ./test-lib.sh
++. "$TEST_DIRECTORY/lib-proto-disable.sh"
++. "$TEST_DIRECTORY/lib-httpd.sh"
++start_httpd
++
++test_expect_success 'create git-accessible repo' '
++ bare="$HTTPD_DOCUMENT_ROOT_PATH/repo.git" &&
++ test_commit one &&
++ git --bare init "$bare" &&
++ git push "$bare" HEAD &&
++ git -C "$bare" config http.receivepack true
++'
++
++test_proto "smart http" http "$HTTPD_URL/smart/repo.git"
++
++stop_httpd
++test_done
+Index: git-2.5.0/t/t5813-proto-disable-ssh.sh
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ git-2.5.0/t/t5813-proto-disable-ssh.sh 2015-12-11 12:46:48.967637661 -0500
+@@ -0,0 +1,20 @@
++#!/bin/sh
++
++test_description='test disabling of git-over-ssh in clone/fetch'
++. ./test-lib.sh
++. "$TEST_DIRECTORY/lib-proto-disable.sh"
++
++setup_ssh_wrapper
++
++test_expect_success 'setup repository to clone' '
++ test_commit one &&
++ mkdir remote &&
++ git init --bare remote/repo.git &&
++ git push remote/repo.git HEAD
++'
++
++test_proto "host:path" ssh "remote:repo.git"
++test_proto "ssh://" ssh "ssh://remote/$PWD/remote/repo.git"
++test_proto "git+ssh://" ssh "git+ssh://remote/$PWD/remote/repo.git"
++
++test_done
+Index: git-2.5.0/t/t5814-proto-disable-ext.sh
+===================================================================
+--- /dev/null 1970-01-01 00:00:00.000000000 +0000
++++ git-2.5.0/t/t5814-proto-disable-ext.sh 2015-12-11 12:46:48.967637661 -0500
+@@ -0,0 +1,18 @@
++#!/bin/sh
++
++test_description='test disabling of remote-helper paths in clone/fetch'
++. ./test-lib.sh
++. "$TEST_DIRECTORY/lib-proto-disable.sh"
++
++setup_ext_wrapper
++
++test_expect_success 'setup repository to clone' '
++ test_commit one &&
++ mkdir remote &&
++ git init --bare remote/repo.git &&
++ git push remote/repo.git HEAD
++'
++
++test_proto "remote-helper" ext "ext::fake-remote %S repo.git"
++
++test_done
+Index: git-2.5.0/transport-helper.c
+===================================================================
+--- git-2.5.0.orig/transport-helper.c 2015-12-11 12:46:48.975637719 -0500
++++ git-2.5.0/transport-helper.c 2015-12-11 12:46:48.967637661 -0500
+@@ -1039,6 +1039,8 @@
+ struct helper_data *data = xcalloc(1, sizeof(*data));
+ data->name = name;
+
++ transport_check_allowed(name);
++
+ if (getenv("GIT_TRANSPORT_HELPER_DEBUG"))
+ debug = 1;
+
+Index: git-2.5.0/transport.c
+===================================================================
+--- git-2.5.0.orig/transport.c 2015-12-11 12:46:48.975637719 -0500
++++ git-2.5.0/transport.c 2015-12-11 12:46:48.967637661 -0500
+@@ -912,6 +912,20 @@
+ return strchr(url, ':') - url;
+ }
+
++void transport_check_allowed(const char *type)
++{
++ struct string_list allowed = STRING_LIST_INIT_DUP;
++ const char *v = getenv("GIT_ALLOW_PROTOCOL");
++
++ if (!v)
++ return;
++
++ string_list_split(&allowed, v, ':', -1);
++ if (!unsorted_string_list_has_string(&allowed, type))
++ die("transport '%s' not allowed", type);
++ string_list_clear(&allowed, 0);
++}
++
+ struct transport *transport_get(struct remote *remote, const char *url)
+ {
+ const char *helper;
+@@ -943,12 +957,14 @@
+ if (helper) {
+ transport_helper_init(ret, helper);
+ } else if (starts_with(url, "rsync:")) {
++ transport_check_allowed("rsync");
+ ret->get_refs_list = get_refs_via_rsync;
+ ret->fetch = fetch_objs_via_rsync;
+ ret->push = rsync_transport_push;
+ ret->smart_options = NULL;
+ } else if (url_is_local_not_ssh(url) && is_file(url) && is_bundle(url, 1)) {
+ struct bundle_transport_data *data = xcalloc(1, sizeof(*data));
++ transport_check_allowed("file");
+ ret->data = data;
+ ret->get_refs_list = get_refs_from_bundle;
+ ret->fetch = fetch_refs_from_bundle;
+@@ -960,7 +976,10 @@
+ || starts_with(url, "ssh://")
+ || starts_with(url, "git+ssh://")
+ || starts_with(url, "ssh+git://")) {
+- /* These are builtin smart transports. */
++ /*
++ * These are builtin smart transports; "allowed" transports
++ * will be checked individually in git_connect.
++ */
+ struct git_transport_data *data = xcalloc(1, sizeof(*data));
+ ret->data = data;
+ ret->set_option = NULL;
+Index: git-2.5.0/transport.h
+===================================================================
+--- git-2.5.0.orig/transport.h 2015-12-11 12:46:48.975637719 -0500
++++ git-2.5.0/transport.h 2015-12-11 12:46:48.971637690 -0500
+@@ -133,6 +133,13 @@
+ /* Returns a transport suitable for the url */
+ struct transport *transport_get(struct remote *, const char *);
+
++/*
++ * Check whether a transport is allowed by the environment,
++ * and die otherwise. type should generally be the URL scheme,
++ * as described in Documentation/git.txt
++ */
++void transport_check_allowed(const char *type);
++
+ /* Transport options which apply to git:// and scp-style URLs */
+
+ /* The program to use on the remote side to send a pack */
diff --git a/meta/recipes-devtools/git/git-2.5.0/0009-CVE-2015-7545-2.patch b/meta/recipes-devtools/git/git-2.5.0/0009-CVE-2015-7545-2.patch
new file mode 100644
index 0000000..8000e26
--- /dev/null
+++ b/meta/recipes-devtools/git/git-2.5.0/0009-CVE-2015-7545-2.patch
@@ -0,0 +1,112 @@
+From 33cfccbbf35a56e190b79bdec5c85457c952a021 Mon Sep 17 00:00:00 2001
+From: Jeff King <peff at peff.net>
+Date: Wed, 16 Sep 2015 13:13:12 -0400
+Subject: [PATCH] submodule: allow only certain protocols for submodule fetches
+
+Some protocols (like git-remote-ext) can execute arbitrary
+code found in the URL. The URLs that submodules use may come
+from arbitrary sources (e.g., .gitmodules files in a remote
+repository). Let's restrict submodules to fetching from a
+known-good subset of protocols.
+
+Note that we apply this restriction to all submodule
+commands, whether the URL comes from .gitmodules or not.
+This is more restrictive than we need to be; for example, in
+the tests we run:
+
+ git submodule add ext::...
+
+which should be trusted, as the URL comes directly from the
+command line provided by the user. But doing it this way is
+simpler, and makes it much less likely that we would miss a
+case. And since such protocols should be an exception
+(especially because nobody who clones from them will be able
+to update the submodules!), it's not likely to inconvenience
+anyone in practice.
+
+Reported-by: Blake Burkhart <bburky at bburky.com>
+Signed-off-by: Jeff King <peff at peff.net>
+Signed-off-by: Junio C Hamano <gitster at pobox.com>
+
+Upstream-Status: Backport
+
+http://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.5.0-1ubuntu0.1.debian.tar.xz
+
+CVE: CVE-2015-7545 #2
+Singed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ git-submodule.sh | 9 +++++++++
+ t/t5815-submodule-protos.sh | 43 +++++++++++++++++++++++++++++++++++++++++++
+ 2 files changed, 52 insertions(+)
+ create mode 100755 t/t5815-submodule-protos.sh
+
+diff --git a/git-submodule.sh b/git-submodule.sh
+index 36797c3..78c2740 100755
+--- a/git-submodule.sh
++++ b/git-submodule.sh
+@@ -22,6 +22,15 @@ require_work_tree
+ wt_prefix=$(git rev-parse --show-prefix)
+ cd_to_toplevel
+
++# Restrict ourselves to a vanilla subset of protocols; the URLs
++# we get are under control of a remote repository, and we do not
++# want them kicking off arbitrary git-remote-* programs.
++#
++# If the user has already specified a set of allowed protocols,
++# we assume they know what they're doing and use that instead.
++: ${GIT_ALLOW_PROTOCOL=file:git:http:https:ssh}
++export GIT_ALLOW_PROTOCOL
++
+ command=
+ branch=
+ force=
+diff --git a/t/t5815-submodule-protos.sh b/t/t5815-submodule-protos.sh
+new file mode 100755
+index 0000000..06f55a1
+--- /dev/null
++++ b/t/t5815-submodule-protos.sh
+@@ -0,0 +1,43 @@
++#!/bin/sh
++
++test_description='test protocol whitelisting with submodules'
++. ./test-lib.sh
++. "$TEST_DIRECTORY"/lib-proto-disable.sh
++
++setup_ext_wrapper
++setup_ssh_wrapper
++
++test_expect_success 'setup repository with submodules' '
++ mkdir remote &&
++ git init remote/repo.git &&
++ (cd remote/repo.git && test_commit one) &&
++ # submodule-add should probably trust what we feed it on the cmdline,
++ # but its implementation is overly conservative.
++ GIT_ALLOW_PROTOCOL=ssh git submodule add remote:repo.git ssh-module &&
++ GIT_ALLOW_PROTOCOL=ext git submodule add "ext::fake-remote %S repo.git" ext-module &&
++ git commit -m "add submodules"
++'
++
++test_expect_success 'clone with recurse-submodules fails' '
++ test_must_fail git clone --recurse-submodules . dst
++'
++
++test_expect_success 'setup individual updates' '
++ rm -rf dst &&
++ git clone . dst &&
++ git -C dst submodule init
++'
++
++test_expect_success 'update of ssh allowed' '
++ git -C dst submodule update ssh-module
++'
++
++test_expect_success 'update of ext not allowed' '
++ test_must_fail git -C dst submodule update ext-module
++'
++
++test_expect_success 'user can override whitelist' '
++ GIT_ALLOW_PROTOCOL=ext git -C dst submodule update ext-module
++'
++
++test_done
diff --git a/meta/recipes-devtools/git/git-2.5.0/0010-CVE-2015-7545-3.patch b/meta/recipes-devtools/git/git-2.5.0/0010-CVE-2015-7545-3.patch
new file mode 100644
index 0000000..b6edc9d
--- /dev/null
+++ b/meta/recipes-devtools/git/git-2.5.0/0010-CVE-2015-7545-3.patch
@@ -0,0 +1,112 @@
+From 5088d3b38775f8ac12d7f77636775b16059b67ef Mon Sep 17 00:00:00 2001
+From: Jeff King <peff at peff.net>
+Date: Tue, 22 Sep 2015 18:03:49 -0400
+Subject: [PATCH] transport: refactor protocol whitelist code
+
+The current callers only want to die when their transport is
+prohibited. But future callers want to query the mechanism
+without dying.
+
+Let's break out a few query functions, and also save the
+results in a static list so we don't have to re-parse for
+each query.
+
+Based-on-a-patch-by: Blake Burkhart <bburky at bburky.com>
+Signed-off-by: Jeff King <peff at peff.net>
+Signed-off-by: Junio C Hamano <gitster at pobox.com>
+
+Upstream-Status: Backport
+
+http://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.5.0-1ubuntu0.1.debian.tar.xz
+
+CVE: CVE-2015-7545 #3
+Singed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ transport.c | 38 ++++++++++++++++++++++++++++++--------
+ transport.h | 15 +++++++++++++--
+ 2 files changed, 43 insertions(+), 10 deletions(-)
+
+Index: git-2.5.0/transport.c
+===================================================================
+--- git-2.5.0.orig/transport.c 2015-12-11 12:47:09.547784038 -0500
++++ git-2.5.0/transport.c 2015-12-11 12:47:09.543784009 -0500
+@@ -912,18 +912,40 @@
+ return strchr(url, ':') - url;
+ }
+
+-void transport_check_allowed(const char *type)
++static const struct string_list *protocol_whitelist(void)
+ {
+- struct string_list allowed = STRING_LIST_INIT_DUP;
+- const char *v = getenv("GIT_ALLOW_PROTOCOL");
++ static int enabled = -1;
++ static struct string_list allowed = STRING_LIST_INIT_DUP;
++
++ if (enabled < 0) {
++ const char *v = getenv("GIT_ALLOW_PROTOCOL");
++ if (v) {
++ string_list_split(&allowed, v, ':', -1);
++ string_list_sort(&allowed);
++ enabled = 1;
++ } else {
++ enabled = 0;
++ }
++ }
++
++ return enabled ? &allowed : NULL;
++}
+
+- if (!v)
+- return;
++int is_transport_allowed(const char *type)
++{
++ const struct string_list *allowed = protocol_whitelist();
++ return !allowed || string_list_has_string(allowed, type);
++}
+
+- string_list_split(&allowed, v, ':', -1);
+- if (!unsorted_string_list_has_string(&allowed, type))
++void transport_check_allowed(const char *type)
++{
++ if (!is_transport_allowed(type))
+ die("transport '%s' not allowed", type);
+- string_list_clear(&allowed, 0);
++}
++
++int transport_restrict_protocols(void)
++{
++ return !!protocol_whitelist();
+ }
+
+ struct transport *transport_get(struct remote *remote, const char *url)
+Index: git-2.5.0/transport.h
+===================================================================
+--- git-2.5.0.orig/transport.h 2015-12-11 12:47:09.547784038 -0500
++++ git-2.5.0/transport.h 2015-12-11 12:47:09.543784009 -0500
+@@ -134,12 +134,23 @@
+ struct transport *transport_get(struct remote *, const char *);
+
+ /*
++ * Check whether a transport is allowed by the environment. Type should
++ * generally be the URL scheme, as described in Documentation/git.txt
++ */
++int is_transport_allowed(const char *type);
++
++/*
+ * Check whether a transport is allowed by the environment,
+- * and die otherwise. type should generally be the URL scheme,
+- * as described in Documentation/git.txt
++ * and die otherwise.
+ */
+ void transport_check_allowed(const char *type);
+
++/*
++ * Returns true if the user has attempted to turn on protocol
++ * restrictions at all.
++ */
++int transport_restrict_protocols(void);
++
+ /* Transport options which apply to git:// and scp-style URLs */
+
+ /* The program to use on the remote side to send a pack */
diff --git a/meta/recipes-devtools/git/git-2.5.0/0011-CVE-2015-7545-4.patch b/meta/recipes-devtools/git/git-2.5.0/0011-CVE-2015-7545-4.patch
new file mode 100644
index 0000000..44dcd1e
--- /dev/null
+++ b/meta/recipes-devtools/git/git-2.5.0/0011-CVE-2015-7545-4.patch
@@ -0,0 +1,150 @@
+Backport of:
+
+From f4113cac0c88b4f36ee6f3abf3218034440a68e3 Mon Sep 17 00:00:00 2001
+From: Blake Burkhart <bburky at bburky.com>
+Date: Tue, 22 Sep 2015 18:06:04 -0400
+Subject: [PATCH] http: limit redirection to protocol-whitelist
+
+Previously, libcurl would follow redirection to any protocol
+it was compiled for support with. This is desirable to allow
+redirection from HTTP to HTTPS. However, it would even
+successfully allow redirection from HTTP to SFTP, a protocol
+that git does not otherwise support at all. Furthermore
+git's new protocol-whitelisting could be bypassed by
+following a redirect within the remote helper, as it was
+only enforced at transport selection time.
+
+This patch limits redirects within libcurl to HTTP, HTTPS,
+FTP and FTPS. If there is a protocol-whitelist present, this
+list is limited to those also allowed by the whitelist. As
+redirection happens from within libcurl, it is impossible
+for an HTTP redirect to a protocol implemented within
+another remote helper.
+
+When the curl version git was compiled with is too old to
+support restrictions on protocol redirection, we warn the
+user if GIT_ALLOW_PROTOCOL restrictions were requested. This
+is a little inaccurate, as even without that variable in the
+environment, we would still restrict SFTP, etc, and we do
+not warn in that case. But anything else means we would
+literally warn every time git accesses an http remote.
+
+This commit includes a test, but it is not as robust as we
+would hope. It redirects an http request to ftp, and checks
+that curl complained about the protocol, which means that we
+are relying on curl's specific error message to know what
+happened. Ideally we would redirect to a working ftp server
+and confirm that we can clone without protocol restrictions,
+and not with them. But we do not have a portable way of
+providing an ftp server, nor any other protocol that curl
+supports (https is the closest, but we would have to deal
+with certificates).
+
+[jk: added test and version warning]
+
+Signed-off-by: Jeff King <peff at peff.net>
+Signed-off-by: Junio C Hamano <gitster at pobox.com>
+
+Upstream-Status: Backport
+
+http://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.5.0-1ubuntu0.1.debian.tar.xz
+
+CVE: CVE-2015-7545 #4
+Singed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ Documentation/git.txt | 5 -----
+ http.c | 17 +++++++++++++++++
+ t/lib-httpd/apache.conf | 1 +
+ t/t5812-proto-disable-http.sh | 9 +++++++++
+ 4 files changed, 27 insertions(+), 5 deletions(-)
+
+Index: git-2.5.0/Documentation/git.txt
+===================================================================
+--- git-2.5.0.orig/Documentation/git.txt 2015-12-11 12:47:18.707849212 -0500
++++ git-2.5.0/Documentation/git.txt 2015-12-11 12:47:18.703849183 -0500
+@@ -1095,11 +1095,6 @@
+
+ - any external helpers are named by their protocol (e.g., use
+ `hg` to allow the `git-remote-hg` helper)
+-+
+-Note that this controls only git's internal protocol selection.
+-If libcurl is used (e.g., by the `http` transport), it may
+-redirect to other protocols. There is not currently any way to
+-restrict this.
+
+
+ Discussion[[Discussion]]
+Index: git-2.5.0/http.c
+===================================================================
+--- git-2.5.0.orig/http.c 2015-12-11 12:47:18.707849212 -0500
++++ git-2.5.0/http.c 2015-12-11 12:47:34.171959268 -0500
+@@ -8,6 +8,7 @@
+ #include "credential.h"
+ #include "version.h"
+ #include "pkt-line.h"
++#include "transport.h"
+ #include "gettext.h"
+
+ int active_requests;
+@@ -340,6 +341,7 @@
+ static CURL *get_curl_handle(void)
+ {
+ CURL *result = curl_easy_init();
++ long allowed_protocols = 0;
+
+ if (!result)
+ die("curl_easy_init failed");
+@@ -399,6 +401,21 @@
+ #elif LIBCURL_VERSION_NUM >= 0x071101
+ curl_easy_setopt(result, CURLOPT_POST301, 1);
+ #endif
++#if LIBCURL_VERSION_NUM >= 0x071304
++ if (is_transport_allowed("http"))
++ allowed_protocols |= CURLPROTO_HTTP;
++ if (is_transport_allowed("https"))
++ allowed_protocols |= CURLPROTO_HTTPS;
++ if (is_transport_allowed("ftp"))
++ allowed_protocols |= CURLPROTO_FTP;
++ if (is_transport_allowed("ftps"))
++ allowed_protocols |= CURLPROTO_FTPS;
++ curl_easy_setopt(result, CURLOPT_REDIR_PROTOCOLS, allowed_protocols);
++#else
++ if (transport_restrict_protocols())
++ warning("protocol restrictions not applied to curl redirects because\n"
++ "your curl version is too old (>= 7.19.4)");
++#endif
+
+ if (getenv("GIT_CURL_VERBOSE"))
+ curl_easy_setopt(result, CURLOPT_VERBOSE, 1);
+Index: git-2.5.0/t/lib-httpd/apache.conf
+===================================================================
+--- git-2.5.0.orig/t/lib-httpd/apache.conf 2015-12-11 12:47:18.707849212 -0500
++++ git-2.5.0/t/lib-httpd/apache.conf 2015-12-11 12:47:18.703849183 -0500
+@@ -119,6 +119,7 @@
+ RewriteRule ^/smart-redir-temp/(.*)$ /smart/$1 [R=302]
+ RewriteRule ^/smart-redir-auth/(.*)$ /auth/smart/$1 [R=301]
+ RewriteRule ^/smart-redir-limited/(.*)/info/refs$ /smart/$1/info/refs [R=301]
++RewriteRule ^/ftp-redir/(.*)$ ftp://localhost:1000/$1 [R=302]
+
+ <IfDefine SSL>
+ LoadModule ssl_module modules/mod_ssl.so
+Index: git-2.5.0/t/t5812-proto-disable-http.sh
+===================================================================
+--- git-2.5.0.orig/t/t5812-proto-disable-http.sh 2015-12-11 12:47:18.707849212 -0500
++++ git-2.5.0/t/t5812-proto-disable-http.sh 2015-12-11 12:47:18.703849183 -0500
+@@ -16,5 +16,14 @@
+
+ test_proto "smart http" http "$HTTPD_URL/smart/repo.git"
+
++test_expect_success 'curl redirects respect whitelist' '
++ test_must_fail env GIT_ALLOW_PROTOCOL=http:https \
++ git clone "$HTTPD_URL/ftp-redir/repo.git" 2>stderr &&
++ {
++ test_i18ngrep "ftp.*disabled" stderr ||
++ test_i18ngrep "your curl version is too old"
++ }
++'
++
+ stop_httpd
+ test_done
diff --git a/meta/recipes-devtools/git/git-2.5.0/0012-CVE-2015-7545-5.patch b/meta/recipes-devtools/git/git-2.5.0/0012-CVE-2015-7545-5.patch
new file mode 100644
index 0000000..76d66ba
--- /dev/null
+++ b/meta/recipes-devtools/git/git-2.5.0/0012-CVE-2015-7545-5.patch
@@ -0,0 +1,69 @@
+From b258116462399b318c86165c61a5c7123043cfd4 Mon Sep 17 00:00:00 2001
+From: Blake Burkhart <bburky at bburky.com>
+Date: Tue, 22 Sep 2015 18:06:20 -0400
+Subject: [PATCH] http: limit redirection depth
+
+By default, libcurl will follow circular http redirects
+forever. Let's put a cap on this so that somebody who can
+trigger an automated fetch of an arbitrary repository (e.g.,
+for CI) cannot convince git to loop infinitely.
+
+The value chosen is 20, which is the same default that
+Firefox uses.
+
+Signed-off-by: Jeff King <peff at peff.net>
+Signed-off-by: Junio C Hamano <gitster at pobox.com>
+
+Upstream-Status: Backport
+
+http://archive.ubuntu.com/ubuntu/pool/main/g/git/git_2.5.0-1ubuntu0.1.debian.tar.xz
+
+CVE: CVE-2015-7545 #5
+Singed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ http.c | 1 +
+ t/lib-httpd/apache.conf | 3 +++
+ t/t5812-proto-disable-http.sh | 4 ++++
+ 3 files changed, 8 insertions(+)
+
+Index: git-2.5.0/http.c
+===================================================================
+--- git-2.5.0.orig/http.c 2015-12-11 12:48:02.900163824 -0500
++++ git-2.5.0/http.c 2015-12-11 12:48:02.896163796 -0500
+@@ -396,6 +396,7 @@
+ }
+
+ curl_easy_setopt(result, CURLOPT_FOLLOWLOCATION, 1);
++ curl_easy_setopt(result, CURLOPT_MAXREDIRS, 20);
+ #if LIBCURL_VERSION_NUM >= 0x071301
+ curl_easy_setopt(result, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
+ #elif LIBCURL_VERSION_NUM >= 0x071101
+Index: git-2.5.0/t/lib-httpd/apache.conf
+===================================================================
+--- git-2.5.0.orig/t/lib-httpd/apache.conf 2015-12-11 12:48:02.900163824 -0500
++++ git-2.5.0/t/lib-httpd/apache.conf 2015-12-11 12:48:02.896163796 -0500
+@@ -121,6 +121,9 @@
+ RewriteRule ^/smart-redir-limited/(.*)/info/refs$ /smart/$1/info/refs [R=301]
+ RewriteRule ^/ftp-redir/(.*)$ ftp://localhost:1000/$1 [R=302]
+
++RewriteRule ^/loop-redir/x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-x-(.*) /$1 [R=302]
++RewriteRule ^/loop-redir/(.*)$ /loop-redir/x-$1 [R=302]
++
+ <IfDefine SSL>
+ LoadModule ssl_module modules/mod_ssl.so
+
+Index: git-2.5.0/t/t5812-proto-disable-http.sh
+===================================================================
+--- git-2.5.0.orig/t/t5812-proto-disable-http.sh 2015-12-11 12:48:02.900163824 -0500
++++ git-2.5.0/t/t5812-proto-disable-http.sh 2015-12-11 12:48:02.896163796 -0500
+@@ -25,5 +25,9 @@
+ }
+ '
+
++test_expect_success 'curl limits redirects' '
++ test_must_fail git clone "$HTTPD_URL/loop-redir/smart/repo.git"
++'
++
+ stop_httpd
+ test_done
diff --git a/meta/recipes-devtools/git/git_2.5.0.bb b/meta/recipes-devtools/git/git_2.5.0.bb
index de686c2..792f258 100644
--- a/meta/recipes-devtools/git/git_2.5.0.bb
+++ b/meta/recipes-devtools/git/git_2.5.0.bb
@@ -9,3 +9,11 @@ SRC_URI[tarball.md5sum] = "3bc9b0a803ae8ec6c5316cc64f0b7f78"
SRC_URI[tarball.sha256sum] = "8fa13ba8434ff83d24f57f831d55dbb9046434c266641180a37744facfce72ac"
SRC_URI[manpages.md5sum] = "134b049e51420a336049aac21c88a75a"
SRC_URI[manpages.sha256sum] = "745e4e797fe5061e781c880d370b1beb480199127da5acaf4e376e0b09d4d685"
+
+SRC_URI += "\
+ file://0008-CVE-2015-7545-1.patch \
+ file://0009-CVE-2015-7545-2.patch \
+ file://0010-CVE-2015-7545-3.patch \
+ file://0011-CVE-2015-7545-4.patch \
+ file://0012-CVE-2015-7545-5.patch \
+ "
diff --git a/meta/recipes-devtools/guile/guile_2.0.11.bb b/meta/recipes-devtools/guile/guile_2.0.11.bb
index 4869694..98b465b 100644
--- a/meta/recipes-devtools/guile/guile_2.0.11.bb
+++ b/meta/recipes-devtools/guile/guile_2.0.11.bb
@@ -39,7 +39,11 @@ DEPENDS = "libunistring bdwgc gmp libtool libffi ncurses readline"
# add guile-native only to the target recipe's DEPENDS
DEPENDS_append_class-target = " guile-native libatomic-ops"
-RDEPENDS_${PN}_append_libc-glibc_class-target = "glibc-gconv-iso8859-1"
+# The comment of the script guile-config said it has been deprecated but we should
+# at least add the required dependency to make it work since we still provide the script.
+RDEPENDS_${PN} = "pkgconfig"
+
+RDEPENDS_${PN}_append_libc-glibc_class-target = " glibc-gconv-iso8859-1"
EXTRA_OECONF += "${@['--without-libltdl-prefix --without-libgmp-prefix --without-libreadline-prefix', ''][bb.data.inherits_class('native',d)]}"
@@ -77,6 +81,12 @@ do_install_append_class-native() {
GUILE_LOAD_COMPILED_PATH=${STAGING_LIBDIR_NATIVE}/guile/2.0/ccache
}
+do_install_append_class-target() {
+ # cleanup buildpaths in scripts
+ sed -i -e 's:${STAGING_DIR_NATIVE}::' ${D}/usr/bin/guile-config
+ sed -i -e 's:${STAGING_DIR_HOST}::' ${D}/usr/bin/guile-snarf
+}
+
SYSROOT_PREPROCESS_FUNCS = "guile_cross_config"
guile_cross_config() {
@@ -109,3 +119,7 @@ guile_sstate_postinst() {
find ${STAGING_DIR_TARGET}/${libdir}/guile/2.0/ccache -type f | xargs touch
fi
}
+
+# http://errors.yoctoproject.org/Errors/Details/20491/
+ARM_INSTRUCTION_SET_armv4 = "arm"
+ARM_INSTRUCTION_SET_armv5 = "arm"
diff --git a/meta/recipes-devtools/i2c-tools/i2c-tools_3.1.2.bb b/meta/recipes-devtools/i2c-tools/i2c-tools_3.1.2.bb
index 92f4d69..042695b 100644
--- a/meta/recipes-devtools/i2c-tools/i2c-tools_3.1.2.bb
+++ b/meta/recipes-devtools/i2c-tools/i2c-tools_3.1.2.bb
@@ -30,5 +30,4 @@ FILES_${PN}-misc = "${sbindir}/i2c-stub-from-dump \
${bindir}/decode-dimms \
${bindir}/decode-vaio \
"
-RDEPENDS_${PN} += "${PN}-misc"
-RDEPENDS_${PN}-misc += "perl"
+RDEPENDS_${PN}-misc = "${PN} perl"
diff --git a/meta/recipes-devtools/installer/adt-installer_1.0.bb b/meta/recipes-devtools/installer/adt-installer_1.0.bb
index 22e3850..4c2f097 100644
--- a/meta/recipes-devtools/installer/adt-installer_1.0.bb
+++ b/meta/recipes-devtools/installer/adt-installer_1.0.bb
@@ -82,7 +82,6 @@ fakeroot do_populate_adt () {
cp ${WORKDIR}/adt_installer.tar.bz2 ${ADT_DEPLOY}
}
-do_populate_adt[nostamp] = "1"
do_configure[noexec] = "1"
do_compile[noexec] = "1"
do_package[noexec] = "1"
diff --git a/meta/recipes-devtools/libtool/libtool-2.4.6.inc b/meta/recipes-devtools/libtool/libtool-2.4.6.inc
index a977c73..de06ccb 100644
--- a/meta/recipes-devtools/libtool/libtool-2.4.6.inc
+++ b/meta/recipes-devtools/libtool/libtool-2.4.6.inc
@@ -19,6 +19,7 @@ SRC_URI = "${GNU_MIRROR}/libtool/libtool-${PV}.tar.gz \
file://fix-resolve-lt-sysroot.patch \
file://nohardcodepaths.patch \
file://unwind-opt-parsing.patch \
+ file://0001-libtool-Fix-support-for-NIOS2-processor.patch \
"
SRC_URI[md5sum] = "addf44b646ddb4e3919805aa88fa7c5e"
diff --git a/meta/recipes-devtools/libtool/libtool/0001-libtool-Fix-support-for-NIOS2-processor.patch b/meta/recipes-devtools/libtool/libtool/0001-libtool-Fix-support-for-NIOS2-processor.patch
new file mode 100644
index 0000000..bbd36d8
--- /dev/null
+++ b/meta/recipes-devtools/libtool/libtool/0001-libtool-Fix-support-for-NIOS2-processor.patch
@@ -0,0 +1,68 @@
+From df2cd898e48208f26320d40c3ed6b19c75c27142 Mon Sep 17 00:00:00 2001
+From: Marek Vasut <marex at denx.de>
+Date: Thu, 17 Sep 2015 00:43:15 +0200
+Subject: [PATCH] libtool: Fix support for NIOS2 processor
+
+The name of the system contains the string "nios2". This string
+is caught by the some of the greedy checks for OS/2 in libtool,
+in particular the *os2* branches of switch statements match for
+the nios2 string, which results in incorrect behavior of libtool.
+
+This patch adds an explicit check for *nios2* before the *os2*
+checks to prevent the OS/2 check incorrectly trapping the nios2
+as well.
+
+Signed-off-by: Marek Vasut <marex at denx.de>
+Upstream-Status: Submitted
+---
+ build-aux/ltmain.in | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+diff --git a/build-aux/ltmain.in b/build-aux/ltmain.in
+index d5cf07a..4164284 100644
+--- a/build-aux/ltmain.in
++++ b/build-aux/ltmain.in
+@@ -504,6 +504,12 @@ libtool_validate_options ()
+ test : = "$debug_cmd" || func_append preserve_args " --debug"
+
+ case $host in
++ # For NIOS2, we want to make sure that it's not caught by the
++ # more general OS/2 check below. Otherwise, NIOS2 is the same
++ # as the default option.
++ *nios2*)
++ opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps
++ ;;
+ # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452
+ # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788
+ *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*)
+@@ -6220,6 +6226,15 @@ func_mode_link ()
+ if test -n "$library_names" &&
+ { test no = "$use_static_libs" || test -z "$old_library"; }; then
+ case $host in
++ *nios2*)
++ # For NIOS2, we want to make sure that it's not caught by the
++ # more general OS/2 check below. Otherwise, NIOS2 is the same
++ # as the default option.
++ if test no = "$installed"; then
++ func_append notinst_deplibs " $lib"
++ need_relink=yes
++ fi
++ ;;
+ *cygwin* | *mingw* | *cegcc* | *os2*)
+ # No point in relinking DLLs because paths are not encoded
+ func_append notinst_deplibs " $lib"
+@@ -6290,6 +6305,11 @@ func_mode_link ()
+ elif test -n "$soname_spec"; then
+ # bleh windows
+ case $host in
++ *nios2*)
++ # For NIOS2, we want to make sure that it's not caught by the
++ # more general OS/2 check below. Otherwise, NIOS2 is the same
++ # as the default option.
++ ;;
+ *cygwin* | mingw* | *cegcc* | *os2*)
+ func_arith $current - $age
+ major=$func_arith_result
+--
+2.5.1
+
diff --git a/meta/recipes-devtools/mmc/mmc-utils_git.bb b/meta/recipes-devtools/mmc/mmc-utils_git.bb
index 8950360..546f7f2 100644
--- a/meta/recipes-devtools/mmc/mmc-utils_git.bb
+++ b/meta/recipes-devtools/mmc/mmc-utils_git.bb
@@ -3,12 +3,12 @@ HOMEPAGE = "http://git.kernel.org/cgit/linux/kernel/git/cjb/mmc-utils.git/"
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://mmc.c;beginline=1;endline=17;md5=d7747fc87f1eb22b946ef819969503f0"
-BRANCH ?= "master"
+SRCBRANCH ?= "master"
SRCREV = "f4eb241519f8d500ce6068a70d2389be39ac5189"
PV = "0.1"
-SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc-utils.git;branch=${BRANCH} \
+SRC_URI = "git://git.kernel.org/pub/scm/linux/kernel/git/cjb/mmc-utils.git;branch=${SRCBRANCH} \
file://0001-mmc.h-don-t-include-asm-generic-int-ll64.h.patch"
S = "${WORKDIR}/git"
diff --git a/meta/recipes-devtools/mtools/mtools_4.0.18.bb b/meta/recipes-devtools/mtools/mtools_4.0.18.bb
index 52decfd..24c9d49 100644
--- a/meta/recipes-devtools/mtools/mtools_4.0.18.bb
+++ b/meta/recipes-devtools/mtools/mtools_4.0.18.bb
@@ -45,3 +45,8 @@ do_install_prepend () {
mkdir -p ${D}/${bindir}
mkdir -p ${D}/${datadir}
}
+
+do_install_append_class-native () {
+ create_wrapper ${D}${bindir}/mcopy \
+ GCONV_PATH=${libdir}/gconv
+}
diff --git a/meta/recipes-devtools/opensp/opensp_1.5.2.bb b/meta/recipes-devtools/opensp/opensp_1.5.2.bb
index a1f115c..60a7d2e 100644
--- a/meta/recipes-devtools/opensp/opensp_1.5.2.bb
+++ b/meta/recipes-devtools/opensp/opensp_1.5.2.bb
@@ -53,3 +53,7 @@ do_install_append_class-native() {
FILES_${PN} += "${datadir}/OpenSP/"
BBCLASSEXTEND = "native"
+
+# http://errors.yoctoproject.org/Errors/Details/20489/
+ARM_INSTRUCTION_SET_armv4 = "arm"
+ARM_INSTRUCTION_SET_armv5 = "arm"
diff --git a/meta/recipes-devtools/opkg/opkg/0001-libopkg-include-stdio.h-for-getting-FILE-defined.patch b/meta/recipes-devtools/opkg/opkg/0001-libopkg-include-stdio.h-for-getting-FILE-defined.patch
new file mode 100644
index 0000000..acc1338
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0001-libopkg-include-stdio.h-for-getting-FILE-defined.patch
@@ -0,0 +1,45 @@
+From 58f4d3d63cd6097154205ea7ee042005036659b3 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Thu, 10 Sep 2015 21:43:32 -0700
+Subject: [PATCH] libopkg: include stdio.h for getting FILE defined
+To: opkg-devel at googlegroups.com
+Cc: paul at paulbarker.me.uk
+
+For some libc(musl) stdio.h may not get included indirectly which means
+we need to mention it in explicit include list
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Submitted
+
+ libopkg/opkg_verify.c | 1 +
+ libopkg/pkg_src.c | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/libopkg/opkg_verify.c b/libopkg/opkg_verify.c
+index 41dc3f4..a71591d 100644
+--- a/libopkg/opkg_verify.c
++++ b/libopkg/opkg_verify.c
+@@ -18,6 +18,7 @@
+
+ #include <malloc.h>
+ #include <string.h>
++#include <stdio.h>
+
+ #include "file_util.h"
+ #include "opkg_conf.h"
+diff --git a/libopkg/pkg_src.c b/libopkg/pkg_src.c
+index e31ec21..6b49a00 100644
+--- a/libopkg/pkg_src.c
++++ b/libopkg/pkg_src.c
+@@ -20,6 +20,7 @@
+
+ #include <malloc.h>
+ #include <unistd.h>
++#include <stdio.h>
+
+ #include "file_util.h"
+ #include "opkg_conf.h"
+--
+2.5.1
+
diff --git a/meta/recipes-devtools/opkg/opkg/0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch b/meta/recipes-devtools/opkg/opkg/0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch
new file mode 100644
index 0000000..255021b
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch
@@ -0,0 +1,34 @@
+From a4628a6171f393add9a2b287483ca39bb72b4dd6 Mon Sep 17 00:00:00 2001
+From: Jonathan Liu <net147 at gmail.com>
+Date: Mon, 21 Sep 2015 20:23:23 +1000
+Subject: [PATCH] opkg_conf: create opkg.lock in /run instead of /var/run
+
+This avoids a "Could not unlink" warning when extracting a /var/run
+symbolic link pointing to /run from a package as it is unable to
+unlink the /var/run directory when it contains opkg.lock.
+
+This also fixes an issue where /var/run is created as a directory
+instead of a symbolic link to /run.
+
+Upstream-Status: Inappropriate [OE-Specific]
+Signed-off-by: Jonathan Liu <net147 at gmail.com>
+---
+ libopkg/opkg_conf.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libopkg/opkg_conf.h b/libopkg/opkg_conf.h
+index 7bca948..5a1bc44 100644
+--- a/libopkg/opkg_conf.h
++++ b/libopkg/opkg_conf.h
+@@ -40,7 +40,7 @@ extern "C" {
+ #define OPKG_CONF_DEFAULT_STATUS_FILE "/var/lib/opkg/status"
+ #define OPKG_CONF_DEFAULT_CACHE_DIR "/var/cache/opkg"
+ #define OPKG_CONF_DEFAULT_CONF_FILE_DIR "/etc/opkg"
+-#define OPKG_CONF_DEFAULT_LOCK_FILE "/var/run/opkg.lock"
++#define OPKG_CONF_DEFAULT_LOCK_FILE "/run/opkg.lock"
+
+ /* In case the config file defines no dest */
+ #define OPKG_CONF_DEFAULT_DEST_NAME "root"
+--
+2.5.0
+
diff --git a/meta/recipes-devtools/opkg/opkg/0001-string_util-New-file-with-bin_to_hex-function.patch b/meta/recipes-devtools/opkg/opkg/0001-string_util-New-file-with-bin_to_hex-function.patch
new file mode 100644
index 0000000..fb3ac46
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0001-string_util-New-file-with-bin_to_hex-function.patch
@@ -0,0 +1,122 @@
+From 646b80024567a6245c598be3374653fa1fa09a12 Mon Sep 17 00:00:00 2001
+From: Paul Barker <paul at paulbarker.me.uk>
+Date: Sat, 7 Nov 2015 10:23:49 +0000
+Subject: [PATCH 1/4] string_util: New file with bin_to_hex function
+
+This function does very simple conversion from binary data to a hex string.
+
+Signed-off-by: Paul Barker <paul at paulbarker.me.uk>
+Signed-off-by: Alejandro del Castillo <alejandro.delcastillo at ni.com>
+
+Upstream-Status: Accepted
+---
+ libopkg/Makefile.am | 4 ++--
+ libopkg/string_util.c | 42 ++++++++++++++++++++++++++++++++++++++++++
+ libopkg/string_util.h | 24 ++++++++++++++++++++++++
+ 3 files changed, 68 insertions(+), 2 deletions(-)
+ create mode 100644 libopkg/string_util.c
+ create mode 100644 libopkg/string_util.h
+
+diff --git a/libopkg/Makefile.am b/libopkg/Makefile.am
+index ee3fbee..3e62c24 100644
+--- a/libopkg/Makefile.am
++++ b/libopkg/Makefile.am
+@@ -13,7 +13,7 @@ opkg_headers = active_list.h cksum_list.h conffile.h conffile_list.h \
+ pkg_depends.h pkg_dest.h pkg_dest_list.h pkg_extract.h pkg_hash.h \
+ pkg_parse.h pkg_src.h pkg_src_list.h pkg_vec.h release.h \
+ release_parse.h sha256.h sprintf_alloc.h str_list.h void_list.h \
+- xregex.h xsystem.h xfuncs.h opkg_verify.h
++ xregex.h xsystem.h xfuncs.h opkg_verify.h string_util.h
+
+ opkg_sources = opkg_cmd.c opkg_configure.c opkg_download.c \
+ opkg_install.c opkg_remove.c opkg_conf.c release.c \
+@@ -23,7 +23,7 @@ opkg_sources = opkg_cmd.c opkg_configure.c opkg_download.c \
+ pkg_src.c pkg_src_list.c str_list.c void_list.c active_list.c \
+ file_util.c opkg_message.c md5.c parse_util.c cksum_list.c \
+ sprintf_alloc.c xregex.c xsystem.c xfuncs.c opkg_archive.c \
+- opkg_verify.c
++ opkg_verify.c string_util.c
+
+ if HAVE_CURL
+ opkg_sources += opkg_download_curl.c
+diff --git a/libopkg/string_util.c b/libopkg/string_util.c
+new file mode 100644
+index 0000000..822cab6
+--- /dev/null
++++ b/libopkg/string_util.c
+@@ -0,0 +1,42 @@
++/* vi: set expandtab sw=4 sts=4: */
++/* string_util.c - convenience routines for common string operations
++
++ Copyright (C) 2015 Paul Barker
++
++ This program is free software; you can redistribute it and/or
++ modify it under the terms of the GNU General Public License as
++ published by the Free Software Foundation; either version 2, or (at
++ your option) any later version.
++
++ This program is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++*/
++
++#include "config.h"
++
++#include "string_util.h"
++#include "xfuncs.h"
++
++char *bin_to_hex(const void *bin_data, size_t len)
++{
++ const unsigned char *src = (const unsigned char *)bin_data;
++ char *buf = xmalloc(2 * len + 1);
++ int i;
++
++ static const unsigned char bin2hex[16] = {
++ '0', '1', '2', '3',
++ '4', '5', '6', '7',
++ '8', '9', 'a', 'b',
++ 'c', 'd', 'e', 'f'
++ };
++
++ for (i = 0; i < len; i++) {
++ buf[i * 2] = bin2hex[src[i] >> 4];
++ buf[i * 2 + 1] = bin2hex[src[i] & 0xf];
++ }
++
++ buf[len * 2] = '\0';
++ return buf;
++}
+diff --git a/libopkg/string_util.h b/libopkg/string_util.h
+new file mode 100644
+index 0000000..a920e2a
+--- /dev/null
++++ b/libopkg/string_util.h
+@@ -0,0 +1,24 @@
++/* vi: set expandtab sw=4 sts=4: */
++/* string_util.h - convenience routines for common file operations
++
++ Copyright (C) 2015 Paul Barker
++
++ This program is free software; you can redistribute it and/or
++ modify it under the terms of the GNU General Public License as
++ published by the Free Software Foundation; either version 2, or (at
++ your option) any later version.
++
++ This program is distributed in the hope that it will be useful, but
++ WITHOUT ANY WARRANTY; without even the implied warranty of
++ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
++ General Public License for more details.
++*/
++
++#ifndef STRING_UTIL_H
++#define STRING_UTIL_H
++
++#include <stddef.h>
++
++char *bin_to_hex(const void *bin_data, size_t len);
++
++#endif /* STRING_UTIL_H */
+--
+1.9.1
+
diff --git a/meta/recipes-devtools/opkg/opkg/0002-md5-Add-md5_to_string-function.patch b/meta/recipes-devtools/opkg/opkg/0002-md5-Add-md5_to_string-function.patch
new file mode 100644
index 0000000..3b823c6
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0002-md5-Add-md5_to_string-function.patch
@@ -0,0 +1,110 @@
+From ecad8afab377d8be95eeaafc08afa228c8e030c3 Mon Sep 17 00:00:00 2001
+From: Paul Barker <paul at paulbarker.me.uk>
+Date: Sat, 7 Nov 2015 10:23:50 +0000
+Subject: [PATCH 2/4] md5: Add md5_to_string function
+
+Signed-off-by: Paul Barker <paul at paulbarker.me.uk>
+Signed-off-by: Alejandro del Castillo <alejandro.delcastillo at ni.com>
+
+Upstream-Status: Accepted
+---
+ libopkg/file_util.c | 28 +++-------------------------
+ libopkg/md5.c | 7 +++++++
+ libopkg/md5.h | 3 +++
+ 3 files changed, 13 insertions(+), 25 deletions(-)
+
+diff --git a/libopkg/file_util.c b/libopkg/file_util.c
+index 5eff469..cb3dbf0 100644
+--- a/libopkg/file_util.c
++++ b/libopkg/file_util.c
+@@ -349,27 +349,13 @@ int file_mkdir_hier(const char *path, long mode)
+
+ char *file_md5sum_alloc(const char *file_name)
+ {
+- static const int md5sum_bin_len = 16;
+- static const int md5sum_hex_len = 32;
+-
+- static const unsigned char bin2hex[16] = {
+- '0', '1', '2', '3',
+- '4', '5', '6', '7',
+- '8', '9', 'a', 'b',
+- 'c', 'd', 'e', 'f'
+- };
+-
+- int i, err;
++ int err;
+ FILE *file;
+- char *md5sum_hex;
+- unsigned char md5sum_bin[md5sum_bin_len];
+-
+- md5sum_hex = xcalloc(1, md5sum_hex_len + 1);
++ unsigned char md5sum_bin[16];
+
+ file = fopen(file_name, "r");
+ if (file == NULL) {
+ opkg_perror(ERROR, "Failed to open file %s", file_name);
+- free(md5sum_hex);
+ return NULL;
+ }
+
+@@ -377,20 +363,12 @@ char *file_md5sum_alloc(const char *file_name)
+ if (err) {
+ opkg_msg(ERROR, "Could't compute md5sum for %s.\n", file_name);
+ fclose(file);
+- free(md5sum_hex);
+ return NULL;
+ }
+
+ fclose(file);
+
+- for (i = 0; i < md5sum_bin_len; i++) {
+- md5sum_hex[i * 2] = bin2hex[md5sum_bin[i] >> 4];
+- md5sum_hex[i * 2 + 1] = bin2hex[md5sum_bin[i] & 0xf];
+- }
+-
+- md5sum_hex[md5sum_hex_len] = '\0';
+-
+- return md5sum_hex;
++ return md5_to_string(md5sum_bin);
+ }
+
+ #ifdef HAVE_SHA256
+diff --git a/libopkg/md5.c b/libopkg/md5.c
+index d476b8b..bc2b229 100644
+--- a/libopkg/md5.c
++++ b/libopkg/md5.c
+@@ -30,6 +30,8 @@
+ #include <string.h>
+ #include <sys/types.h>
+
++#include "string_util.h"
++
+ #if USE_UNLOCKED_IO
+ #include "unlocked-io.h"
+ #endif
+@@ -431,3 +433,8 @@ void md5_process_block(const void *buffer, size_t len, struct md5_ctx *ctx)
+ ctx->C = C;
+ ctx->D = D;
+ }
++
++char *md5_to_string(const void *md5sum_bin)
++{
++ return bin_to_hex(md5sum_bin, 16);
++}
+diff --git a/libopkg/md5.h b/libopkg/md5.h
+index 01320f5..2a7274d 100644
+--- a/libopkg/md5.h
++++ b/libopkg/md5.h
+@@ -118,6 +118,9 @@ extern int __md5_stream(FILE * stream, void *resblock) __THROW;
+ extern void *__md5_buffer(const char *buffer, size_t len,
+ void *resblock) __THROW;
+
++/* Convert a binary md5sum value to an ASCII string. */
++char *md5_to_string(const void *md5sum_bin);
++
+ #ifdef __cplusplus
+ }
+ #endif
+--
+1.9.1
+
diff --git a/meta/recipes-devtools/opkg/opkg/0003-sha256-Add-sha256_to_string-function.patch b/meta/recipes-devtools/opkg/opkg/0003-sha256-Add-sha256_to_string-function.patch
new file mode 100644
index 0000000..16e82d7
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0003-sha256-Add-sha256_to_string-function.patch
@@ -0,0 +1,110 @@
+From 92e8378103bba3b91f2dec4e6fda3e1755a7c0fd Mon Sep 17 00:00:00 2001
+From: Paul Barker <paul at paulbarker.me.uk>
+Date: Sat, 7 Nov 2015 10:23:51 +0000
+Subject: [PATCH 3/4] sha256: Add sha256_to_string function
+
+Signed-off-by: Paul Barker <paul at paulbarker.me.uk>
+Signed-off-by: Alejandro del Castillo <alejandro.delcastillo at ni.com>
+
+Upstream-Status: Accepted
+---
+ libopkg/file_util.c | 28 +++-------------------------
+ libopkg/sha256.c | 7 +++++++
+ libopkg/sha256.h | 3 +++
+ 3 files changed, 13 insertions(+), 25 deletions(-)
+
+diff --git a/libopkg/file_util.c b/libopkg/file_util.c
+index cb3dbf0..864aedb 100644
+--- a/libopkg/file_util.c
++++ b/libopkg/file_util.c
+@@ -374,27 +374,13 @@ char *file_md5sum_alloc(const char *file_name)
+ #ifdef HAVE_SHA256
+ char *file_sha256sum_alloc(const char *file_name)
+ {
+- static const int sha256sum_bin_len = 32;
+- static const int sha256sum_hex_len = 64;
+-
+- static const unsigned char bin2hex[16] = {
+- '0', '1', '2', '3',
+- '4', '5', '6', '7',
+- '8', '9', 'a', 'b',
+- 'c', 'd', 'e', 'f'
+- };
+-
+- int i, err;
++ int err;
+ FILE *file;
+- char *sha256sum_hex;
+- unsigned char sha256sum_bin[sha256sum_bin_len];
+-
+- sha256sum_hex = xcalloc(1, sha256sum_hex_len + 1);
++ unsigned char sha256sum_bin[32];
+
+ file = fopen(file_name, "r");
+ if (file == NULL) {
+ opkg_perror(ERROR, "Failed to open file %s", file_name);
+- free(sha256sum_hex);
+ return NULL;
+ }
+
+@@ -402,20 +388,12 @@ char *file_sha256sum_alloc(const char *file_name)
+ if (err) {
+ opkg_msg(ERROR, "Could't compute sha256sum for %s.\n", file_name);
+ fclose(file);
+- free(sha256sum_hex);
+ return NULL;
+ }
+
+ fclose(file);
+
+- for (i = 0; i < sha256sum_bin_len; i++) {
+- sha256sum_hex[i * 2] = bin2hex[sha256sum_bin[i] >> 4];
+- sha256sum_hex[i * 2 + 1] = bin2hex[sha256sum_bin[i] & 0xf];
+- }
+-
+- sha256sum_hex[sha256sum_hex_len] = '\0';
+-
+- return sha256sum_hex;
++ return sha256_to_string(sha256sum_bin);
+ }
+
+ #endif
+diff --git a/libopkg/sha256.c b/libopkg/sha256.c
+index 0816858..bceed72 100644
+--- a/libopkg/sha256.c
++++ b/libopkg/sha256.c
+@@ -29,6 +29,8 @@
+ #include <stddef.h>
+ #include <string.h>
+
++#include "string_util.h"
++
+ #if USE_UNLOCKED_IO
+ #include "unlocked-io.h"
+ #endif
+@@ -517,3 +519,8 @@ void sha256_process_block(const void *buffer, size_t len,
+ h = ctx->state[7] += h;
+ }
+ }
++
++char *sha256_to_string(const void *sha256sum_bin)
++{
++ return bin_to_hex(sha256sum_bin, 32);
++}
+diff --git a/libopkg/sha256.h b/libopkg/sha256.h
+index 734ab54..0d1e9e5 100644
+--- a/libopkg/sha256.h
++++ b/libopkg/sha256.h
+@@ -85,6 +85,9 @@ extern int sha224_stream(FILE * stream, void *resblock);
+ extern void *sha256_buffer(const char *buffer, size_t len, void *resblock);
+ extern void *sha224_buffer(const char *buffer, size_t len, void *resblock);
+
++/* Convert a binary sha256sum value to an ASCII string. */
++char *sha256_to_string(const void *sha256sum_bin);
++
+ #ifdef __cplusplus
+ }
+ #endif
+--
+1.9.1
+
diff --git a/meta/recipes-devtools/opkg/opkg/0004-opkg_download-Use-short-cache-file-name.patch b/meta/recipes-devtools/opkg/opkg/0004-opkg_download-Use-short-cache-file-name.patch
new file mode 100644
index 0000000..7ea661d
--- /dev/null
+++ b/meta/recipes-devtools/opkg/opkg/0004-opkg_download-Use-short-cache-file-name.patch
@@ -0,0 +1,85 @@
+From 61636f15718edc7ea17b91f22f1d97b905eaf951 Mon Sep 17 00:00:00 2001
+From: Paul Barker <paul at paulbarker.me.uk>
+Date: Sat, 7 Nov 2015 10:23:52 +0000
+Subject: [PATCH 4/4] opkg_download: Use short cache file name
+
+Source URIs can be very long. The cache directory itself may already have a very
+long path, especially if we're installing packages into an offline rootfs.
+Therefore it's not a good idea to simply tag the source URI onto the cache
+directory path to create a cache file name.
+
+To create shorter cache file names which are deterministic and very likely to be
+unique, we use the md5sum of the source URI along with the basename of the
+source URI. The basename is length limited to ensure that it the resulting
+filename length is always reasonable.
+
+Signed-off-by: Paul Barker <paul at paulbarker.me.uk>
+Signed-off-by: Alejandro del Castillo <alejandro.delcastillo at ni.com>
+
+Upstream-Status: Accepted
+---
+ libopkg/opkg_download.c | 35 ++++++++++++++++++++++++++++-------
+ 1 file changed, 28 insertions(+), 7 deletions(-)
+
+diff --git a/libopkg/opkg_download.c b/libopkg/opkg_download.c
+index e9b86a5..a37b10d 100644
+--- a/libopkg/opkg_download.c
++++ b/libopkg/opkg_download.c
+@@ -29,10 +29,18 @@
+ #include "opkg_verify.h"
+ #include "opkg_utils.h"
+
++#include "md5.h"
+ #include "sprintf_alloc.h"
+ #include "file_util.h"
+ #include "xfuncs.h"
+
++/* Limit the short file name used to generate cache file names to 90 characters
++ * so that when added to the md5sum (32 characters) and an underscore, the
++ * resulting length is below 128 characters. The maximum file name length
++ * differs between plaforms but 128 characters should be reasonable.
++ */
++#define MAX_SHORT_FILE_NAME_LENGTH 90
++
+ static int opkg_download_set_env()
+ {
+ int r;
+@@ -135,15 +143,28 @@ int opkg_download_internal(const char *src, const char *dest,
+ */
+ char *get_cache_location(const char *src)
+ {
+- char *cache_name = xstrdup(src);
+- char *cache_location, *p;
++ unsigned char md5sum_bin[16];
++ char *md5sum_hex;
++ char *cache_location;
++ char *short_file_name;
++ char *tmp = xstrdup(src);
+
+- for (p = cache_name; *p; p++)
+- if (*p == '/')
+- *p = '_';
++ md5_buffer(src, strlen(src), md5sum_bin);
++ md5sum_hex = md5_to_string(md5sum_bin);
+
+- sprintf_alloc(&cache_location, "%s/%s", opkg_config->cache_dir, cache_name);
+- free(cache_name);
++ /* Generate a short file name which will be used along with an md5sum of the
++ * full src URI in the cache file name. This short file name is limited to
++ * MAX_SHORT_FILE_NAME_LENGTH to ensure that the total cache file name
++ * length is reasonable.
++ */
++ short_file_name = basename(tmp);
++ if (strlen(short_file_name) > MAX_SHORT_FILE_NAME_LENGTH)
++ short_file_name[MAX_SHORT_FILE_NAME_LENGTH] = '\0';
++
++ sprintf_alloc(&cache_location, "%s/%s_%s", opkg_config->cache_dir,
++ md5sum_hex, short_file_name);
++ free(md5sum_hex);
++ free(tmp);
+ return cache_location;
+ }
+
+--
+1.9.1
+
diff --git a/meta/recipes-devtools/opkg/opkg_0.3.0.bb b/meta/recipes-devtools/opkg/opkg_0.3.0.bb
index f4dbb2d..5ad3e92 100644
--- a/meta/recipes-devtools/opkg/opkg_0.3.0.bb
+++ b/meta/recipes-devtools/opkg/opkg_0.3.0.bb
@@ -15,6 +15,12 @@ SRC_URI = "http://downloads.yoctoproject.org/releases/${BPN}/${BPN}-${PV}.tar.gz
file://opkg-configure.service \
file://opkg.conf \
file://0001-opkg_archive-add-support-for-empty-compressed-files.patch \
+ file://0001-libopkg-include-stdio.h-for-getting-FILE-defined.patch \
+ file://0001-opkg_conf-create-opkg.lock-in-run-instead-of-var-run.patch \
+ file://0001-string_util-New-file-with-bin_to_hex-function.patch \
+ file://0002-md5-Add-md5_to_string-function.patch \
+ file://0003-sha256-Add-sha256_to_string-function.patch \
+ file://0004-opkg_download-Use-short-cache-file-name.patch \
"
SRC_URI[md5sum] = "3412cdc71d78b98facc84b19331ec64e"
diff --git a/meta/recipes-devtools/perl/perl-native_5.22.0.bb b/meta/recipes-devtools/perl/perl-native_5.22.0.bb
index a9a1cab..b4dda31 100644
--- a/meta/recipes-devtools/perl/perl-native_5.22.0.bb
+++ b/meta/recipes-devtools/perl/perl-native_5.22.0.bb
@@ -28,16 +28,15 @@ do_configure () {
-Dcf_by="Open Embedded" \
-Dprefix=${prefix} \
-Dvendorprefix=${prefix} \
- -Dvendorprefix=${prefix} \
-Dsiteprefix=${prefix} \
\
-Dbin=${STAGING_BINDIR}/${PN} \
-Dprivlib=${STAGING_LIBDIR}/perl/${PV} \
-Darchlib=${STAGING_LIBDIR}/perl/${PV} \
- -Dvendorlib=${STAGING_LIBDIR}/perl/${PV} \
- -Dvendorarch=${STAGING_LIBDIR}/perl/${PV} \
- -Dsitelib=${STAGING_LIBDIR}/perl/${PV} \
- -Dsitearch=${STAGING_LIBDIR}/perl/${PV} \
+ -Dvendorlib=${STAGING_LIBDIR}/perl/vendor_perl/${PV} \
+ -Dvendorarch=${STAGING_LIBDIR}/perl/vendor_perl/${PV} \
+ -Dsitelib=${STAGING_LIBDIR}/perl/site_perl/${PV} \
+ -Dsitearch=${STAGING_LIBDIR}/perl/site_perl/${PV} \
\
-Duseshrplib \
-Dusethreads \
@@ -95,8 +94,11 @@ do_install () {
install $i ${D}${libdir}/perl/${PV}/CORE
done
- create_wrapper ${D}${bindir}/perl PERL5LIB='$PERL5LIB:${STAGING_LIBDIR}/perl/${PV}:${STAGING_LIBDIR}/perl:${STAGING_LIBDIR}/perl/site_perl/${PV}:${STAGING_LIBDIR}/perl/vendor_perl/${PV}'
- create_wrapper ${D}${bindir}/perl${PV} PERL5LIB='$PERL5LIB:${STAGING_LIBDIR}/perl/${PV}:${STAGING_LIBDIR}/perl${STAGING_LIBDIR}/perl:${STAGING_LIBDIR}/perl/site_perl/${PV}:${STAGING_LIBDIR}/perl/vendor_perl/${PV}'
+ # Those wrappers mean that perl installed from sstate (which may change
+ # path location) works and that in the nativesdk case, the SDK can be
+ # installed to a different location from the one it was built for.
+ create_wrapper ${D}${bindir}/perl PERL5LIB='$PERL5LIB:${STAGING_LIBDIR}/perl/site_perl/${PV}:${STAGING_LIBDIR}/perl/vendor_perl/${PV}:${STAGING_LIBDIR}/perl/${PV}'
+ create_wrapper ${D}${bindir}/perl${PV} PERL5LIB='$PERL5LIB:${STAGING_LIBDIR}/perl/site_perl/${PV}:${STAGING_LIBDIR}/perl/vendor_perl/${PV}:${STAGING_LIBDIR}/perl/${PV}'
# Use /usr/bin/env nativeperl for the perl script.
for f in `grep -Il '#! *${bindir}/perl' ${D}/${bindir}/*`; do
diff --git a/meta/recipes-devtools/perl/perl/perl-errno-generation-gcc5.patch b/meta/recipes-devtools/perl/perl/perl-errno-generation-gcc5.patch
new file mode 100644
index 0000000..efbc55d
--- /dev/null
+++ b/meta/recipes-devtools/perl/perl/perl-errno-generation-gcc5.patch
@@ -0,0 +1,23 @@
+Upstream-Status:Inappropriate [embedded specific]
+
+The upstream code assumes that the compiler version used to compiler miniperl/perl-native
+is the same as the one being used to build the perl binary. Since most people are not running
+systems with gcc 5, it is unlikely that it will work on any supported host. Switch out gccversion
+for the version extracted from $CC --version.
+
+--- perl-5.22.0/ext/Errno/Errno_pm.PL 2015-10-19 18:01:20.622143786 -0400
++++ perl-5.22.0-fixed/ext/Errno/Errno_pm.PL 2015-10-19 17:50:35.662137367 -0400
+@@ -224,9 +224,12 @@
+
+ { # BeOS (support now removed) did not enter this block
+ # invoke CPP and read the output
++ my $compiler = $ENV{'CC'};
++ my $compiler_out = `$compiler --version`;
++ my @compiler_version = split / /,$compiler_out;
+
+ my $inhibit_linemarkers = '';
+- if ($Config{gccversion} =~ /\A(\d+)\./ and $1 >= 5) {
++ if (@compiler_version[2] =~ /\A(\d+)\./ and $1 >= 5) {
+ # GCC 5.0 interleaves expanded macros with line numbers breaking
+ # each line into multiple lines. RT#123784
+ $inhibit_linemarkers = ' -P';
diff --git a/meta/recipes-devtools/perl/perl_5.22.0.bb b/meta/recipes-devtools/perl/perl_5.22.0.bb
index 3ce7849..9df8d04 100644
--- a/meta/recipes-devtools/perl/perl_5.22.0.bb
+++ b/meta/recipes-devtools/perl/perl_5.22.0.bb
@@ -62,6 +62,7 @@ SRC_URI += " \
file://ext-ODBM_File-hints-linux.pl-link-libgdbm_compat.patch \
file://ext-ODBM_File-t-odbm.t-fix-the-path-of-dbmt_common.p.patch \
file://perl-PathTools-don-t-filter-out-blib-from-INC.patch \
+ file://perl-errno-generation-gcc5.patch \
"
# Fix test case issues
@@ -245,7 +246,7 @@ do_install() {
do_install_append_class-nativesdk () {
create_wrapper ${D}${bindir}/perl \
- PERL5LIB='$PERL5LIB:$OECORE_NATIVE_SYSROOT/${libdir_nativesdk}/perl:$OECORE_NATIVE_SYSROOT/${libdir_nativesdk}/perl/${PV}:$OECORE_NATIVE_SYSROOT/${libdir_nativesdk}/perl/site_perl/${PV}:$OECORE_NATIVE_SYSROOT/${libdir_nativesdk}/perl/vendor_perl/${PV}'
+ PERL5LIB='$PERL5LIB:$OECORE_NATIVE_SYSROOT/${libdir_nativesdk}/perl/site_perl/${PV}:$OECORE_NATIVE_SYSROOT/${libdir_nativesdk}/perl/vendor_perl/${PV}:$OECORE_NATIVE_SYSROOT/${libdir_nativesdk}/perl/${PV}'
}
PACKAGE_PREPROCESS_FUNCS += "perl_package_preprocess"
diff --git a/meta/recipes-devtools/prelink/prelink_git.bb b/meta/recipes-devtools/prelink/prelink_git.bb
index 79a5f50..e223ef6 100644
--- a/meta/recipes-devtools/prelink/prelink_git.bb
+++ b/meta/recipes-devtools/prelink/prelink_git.bb
@@ -8,7 +8,7 @@ and executables, so that far fewer relocations need to be resolved at \
runtime and thus programs come up faster."
LICENSE = "GPLv2"
LIC_FILES_CHKSUM = "file://COPYING;md5=c93c0550bd3173f4504b2cbd8991e50b"
-SRCREV = "cdee5a4dd226cc5e9f30f370067a9031f398ef3c"
+SRCREV = "927979bbd115eeb8a75db3231906ef6aca4c4eb6"
PV = "1.0+git${SRCPV}"
#
@@ -35,7 +35,7 @@ SRC_URI = "git://git.yoctoproject.org/prelink-cross.git;branch=cross_prelink \
TARGET_OS_ORIG := "${TARGET_OS}"
OVERRIDES_append = ":${TARGET_OS_ORIG}"
-S = "${WORKDIR}/git/trunk"
+S = "${WORKDIR}/git"
inherit autotools
diff --git a/meta/recipes-devtools/pseudo/pseudo_1.7.3.bb b/meta/recipes-devtools/pseudo/pseudo_1.7.3.bb
deleted file mode 100644
index 1e9ef3b..0000000
--- a/meta/recipes-devtools/pseudo/pseudo_1.7.3.bb
+++ /dev/null
@@ -1,19 +0,0 @@
-require pseudo.inc
-
-SRC_URI = " \
- http://downloads.yoctoproject.org/releases/pseudo/${BPN}-${PV}.tar.bz2 \
- file://fallback-passwd \
- file://fallback-group \
-"
-
-SRC_URI[md5sum] = "2bd0a44eadd4713e90ad8c152eea77aa"
-SRC_URI[sha256sum] = "e9fc3922f8feb97839b50d14eb1987afdc8f22cdcac93119323cccd5f8444652"
-
-PSEUDO_EXTRA_OPTS ?= "--enable-force-async --without-passwd-fallback"
-
-do_install_append_class-native () {
- install -d ${D}${sysconfdir}
- # The fallback files should never be modified
- install -m 444 ${WORKDIR}/fallback-passwd ${D}${sysconfdir}/passwd
- install -m 444 ${WORKDIR}/fallback-group ${D}${sysconfdir}/group
-}
diff --git a/meta/recipes-devtools/pseudo/pseudo_1.7.4.bb b/meta/recipes-devtools/pseudo/pseudo_1.7.4.bb
new file mode 100644
index 0000000..d68e0af
--- /dev/null
+++ b/meta/recipes-devtools/pseudo/pseudo_1.7.4.bb
@@ -0,0 +1,19 @@
+require pseudo.inc
+
+SRC_URI = " \
+ http://downloads.yoctoproject.org/releases/pseudo/${BPN}-${PV}.tar.bz2 \
+ file://fallback-passwd \
+ file://fallback-group \
+"
+
+SRC_URI[md5sum] = "6e4b59a346d08d4a29133c335ea12052"
+SRC_URI[sha256sum] = "f33ff84da328f943155f22cfd49030ef4ad85ad35fc2d9419a203521b65c384c"
+
+PSEUDO_EXTRA_OPTS ?= "--enable-force-async --without-passwd-fallback"
+
+do_install_append_class-native () {
+ install -d ${D}${sysconfdir}
+ # The fallback files should never be modified
+ install -m 444 ${WORKDIR}/fallback-passwd ${D}${sysconfdir}/passwd
+ install -m 444 ${WORKDIR}/fallback-group ${D}${sysconfdir}/group
+}
diff --git a/meta/recipes-devtools/pseudo/pseudo_git.bb b/meta/recipes-devtools/pseudo/pseudo_git.bb
index 31e1223..eb666c0 100644
--- a/meta/recipes-devtools/pseudo/pseudo_git.bb
+++ b/meta/recipes-devtools/pseudo/pseudo_git.bb
@@ -1,7 +1,7 @@
require pseudo.inc
-SRCREV = "e795df44a90a426a76b790f1b2774f3046a8fc31"
-PV = "1.7.2+git${SRCPV}"
+SRCREV = "3bc3909fa70535c2ef876009dc58e577b10a7e0e"
+PV = "1.7.4+git${SRCPV}"
DEFAULT_PREFERENCE = "-1"
diff --git a/meta/recipes-devtools/python/python-3.4-manifest.inc b/meta/recipes-devtools/python/python-3.4-manifest.inc
index 07e1490..97070b6 100644
--- a/meta/recipes-devtools/python/python-3.4-manifest.inc
+++ b/meta/recipes-devtools/python/python-3.4-manifest.inc
@@ -58,7 +58,7 @@ RDEPENDS_${PN}-db="${PN}-core"
FILES_${PN}-db="${libdir}/python3.4/anydbm.* ${libdir}/python3.4/dumbdbm.* ${libdir}/python3.4/whichdb.* ${libdir}/python3.4/dbm ${libdir}/python3.4/lib-dynload/_dbm.*.so "
SUMMARY_${PN}-debugger="Python debugger"
-RDEPENDS_${PN}-debugger="${PN}-core ${PN}-io ${PN}-lang ${PN}-re ${PN}-stringold ${PN}-shell ${PN}-pprint"
+RDEPENDS_${PN}-debugger="${PN}-core ${PN}-io ${PN}-lang ${PN}-re ${PN}-stringold ${PN}-shell ${PN}-pprint ${PN}-importlib ${PN}-pkgutil"
FILES_${PN}-debugger="${libdir}/python3.4/bdb.* ${libdir}/python3.4/pdb.* "
SUMMARY_${PN}-dev="Python development package"
diff --git a/meta/recipes-devtools/python/python-async_0.6.2.bb b/meta/recipes-devtools/python/python-async_0.6.2.bb
index 8ed0b03..5a17a1a 100644
--- a/meta/recipes-devtools/python/python-async_0.6.2.bb
+++ b/meta/recipes-devtools/python/python-async_0.6.2.bb
@@ -10,7 +10,7 @@ SRC_URI[sha256sum] = "ac6894d876e45878faae493b0cf61d0e28ec417334448ac0a6ea2229d8
S = "${WORKDIR}/async-${PV}"
-inherit distutils
+inherit setuptools
RDEPENDS_${PN} += "python-threading python-lang"
diff --git a/meta/recipes-devtools/python/python-pygtk_2.24.0.bb b/meta/recipes-devtools/python/python-pygtk_2.24.0.bb
index e4c33a8..79b3110 100644
--- a/meta/recipes-devtools/python/python-pygtk_2.24.0.bb
+++ b/meta/recipes-devtools/python/python-pygtk_2.24.0.bb
@@ -26,7 +26,9 @@ S = "${WORKDIR}/${SRCNAME}-${PV}"
EXTRA_OECONF = "--disable-docs --with-python-includes=${STAGING_INCDIR}/../"
-inherit autotools pkgconfig distutils-base
+inherit autotools pkgconfig distutils-base distro_features_check
+
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
do_configure_prepend() {
install -m 0644 ${WORKDIR}/acinclude.m4 ${S}/
diff --git a/meta/recipes-devtools/python/python-smartpm/smart-cache.py-getPackages-matches-name-version.patch b/meta/recipes-devtools/python/python-smartpm/smart-cache.py-getPackages-matches-name-version.patch
new file mode 100644
index 0000000..225b02f
--- /dev/null
+++ b/meta/recipes-devtools/python/python-smartpm/smart-cache.py-getPackages-matches-name-version.patch
@@ -0,0 +1,43 @@
+From ee05e55e84b53f4bb0d0baba13ca47a8f84b7cb4 Mon Sep 17 00:00:00 2001
+From: Robert Yang <liezhi.yang at windriver.com>
+Date: Wed, 30 Sep 2015 01:12:52 -0700
+Subject: [PATCH] smart:cache.py: getPackages() matches name + arch
+
+It only matched name ony in the past, for example:
+smart install busybox (matched)
+but:
+smart install busybox at core2_64 (didn't match)
+
+The installation is very slow when no match since it would seach all the
+packages in the repo
+This patch makes it match both.
+
+Upstream-Status: Pending
+
+Signed-off-by: Robert Yang <liezhi.yang at windriver.com>
+---
+ smart/cache.py | 3 ++-
+ smart/ccache.c | 9 ++++++++-
+ 2 files changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/smart/control.py b/smart/control.py
+index d44abe7..f23a604 100644
+--- a/smart/control.py
++++ b/smart/control.py
+@@ -876,9 +876,13 @@ class Control(object):
+ objects = []
+
+ # If we find packages with exactly the given
+- # name or name-version, use them.
+- for pkg in self._cache.getPackages(s):
+- if pkg.name == s or "%s-%s" % (pkg.name, pkg.version) == s:
++ # name, name-version, or name at arch, use them.
++ s_name = s
++ if "@" in s:
++ s_name = s.split("@")[0]
++ for pkg in self._cache.getPackages(s_name):
++ if pkg.name == s or "%s-%s" % (pkg.name, pkg.version) == s \
++ or "%s@%s" % (pkg.name, pkg.version.split('@')[1]) == s:
+ objects.append((1.0, pkg))
+
+ if not objects:
diff --git a/meta/recipes-devtools/python/python-smartpm_git.bb b/meta/recipes-devtools/python/python-smartpm_git.bb
index 8b974b0..d6c378b 100644
--- a/meta/recipes-devtools/python/python-smartpm_git.bb
+++ b/meta/recipes-devtools/python/python-smartpm_git.bb
@@ -23,6 +23,7 @@ SRC_URI = "\
file://smart-add-for-rpm-ignoresize-check.patch \
file://smart-already-installed-message.patch \
file://smart-set-noprogress-for-pycurl.patch \
+ file://smart-cache.py-getPackages-matches-name-version.patch \
"
SRCREV = "407a7eca766431257dcd1da15175cc36a1bb22d0"
diff --git a/meta/recipes-devtools/qemu/qemu.inc b/meta/recipes-devtools/qemu/qemu.inc
index 738bf2b..abbace8 100644
--- a/meta/recipes-devtools/qemu/qemu.inc
+++ b/meta/recipes-devtools/qemu/qemu.inc
@@ -31,9 +31,6 @@ SRC_URI_append_class-native = "\
EXTRA_OECONF += "--target-list=${@get_qemu_target_list(d)} --disable-werror --disable-bluez --disable-libiscsi --with-system-pixman --extra-cflags='${CFLAGS}'"
-EXTRA_OECONF_append_class-native = " --enable-debug --enable-debug-info"
-INHIBIT_SYSROOT_STRIP = "1"
-
EXTRA_OECONF_class-nativesdk = "--target-list=${@get_qemu_target_list(d)} --disable-werror \
"
export LIBTOOL="${HOST_SYS}-libtool"
@@ -129,9 +126,4 @@ PACKAGECONFIG[gnutls] = "--enable-gnutls,--disable-gnutls,gnutls"
EXTRA_OECONF += "${@bb.utils.contains('PACKAGECONFIG', 'alsa', '--audio-drv-list=oss,alsa', '', d)}"
-# Qemu target will not build in world build for ARM or Mips
-BROKEN_qemuarm = "1"
-BROKEN_qemumips64 = "1"
-BROKEN_qemumips = "1"
-
INSANE_SKIP_${PN} = "arch"
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_1.patch b/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_1.patch
new file mode 100644
index 0000000..d7ae871
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_1.patch
@@ -0,0 +1,63 @@
+From ce317461573bac12b10d67699b4ddf1f97cf066c Mon Sep 17 00:00:00 2001
+From: Jason Wang <jasowang at redhat.com>
+Date: Fri, 25 Sep 2015 13:21:28 +0800
+Subject: [PATCH] virtio: introduce virtqueue_unmap_sg()
+
+Factor out sg unmapping logic. This will be reused by the patch that
+can discard descriptor.
+
+Cc: Michael S. Tsirkin <mst at redhat.com>
+Cc: Andrew James <andrew.james at hpe.com>
+Signed-off-by: Jason Wang <jasowang at redhat.com>
+Reviewed-by: Michael S. Tsirkin <mst at redhat.com>
+Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
+
+Upstream-Status: Backport
+
+git.qemu.org/?p=qemu.git;a=commit;h=ce317461573bac12b10d67699b4ddf1f97cf066c
+
+CVE: CVE-2015-7295 patch #1
+[Yocto # 9013]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/virtio/virtio.c | 14 ++++++++++----
+ 1 file changed, 10 insertions(+), 4 deletions(-)
+
+Index: qemu-2.4.0/hw/virtio/virtio.c
+===================================================================
+--- qemu-2.4.0.orig/hw/virtio/virtio.c
++++ qemu-2.4.0/hw/virtio/virtio.c
+@@ -243,14 +243,12 @@ int virtio_queue_empty(VirtQueue *vq)
+ return vring_avail_idx(vq) == vq->last_avail_idx;
+ }
+
+-void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
+- unsigned int len, unsigned int idx)
++static void virtqueue_unmap_sg(VirtQueue *vq, const VirtQueueElement *elem,
++ unsigned int len)
+ {
+ unsigned int offset;
+ int i;
+
+- trace_virtqueue_fill(vq, elem, len, idx);
+-
+ offset = 0;
+ for (i = 0; i < elem->in_num; i++) {
+ size_t size = MIN(len - offset, elem->in_sg[i].iov_len);
+@@ -266,6 +264,14 @@ void virtqueue_fill(VirtQueue *vq, const
+ cpu_physical_memory_unmap(elem->out_sg[i].iov_base,
+ elem->out_sg[i].iov_len,
+ 0, elem->out_sg[i].iov_len);
++}
++
++void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
++ unsigned int len, unsigned int idx)
++{
++ trace_virtqueue_fill(vq, elem, len, idx);
++
++ virtqueue_unmap_sg(vq, elem, len);
+
+ idx = (idx + vring_used_idx(vq)) % vq->vring.num;
+
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_2.patch b/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_2.patch
new file mode 100644
index 0000000..45dfab3
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_2.patch
@@ -0,0 +1,58 @@
+From 29b9f5efd78ae0f9cc02dd169b6e80d2c404bade Mon Sep 17 00:00:00 2001
+From: Jason Wang <jasowang at redhat.com>
+Date: Fri, 25 Sep 2015 13:21:29 +0800
+Subject: [PATCH] virtio: introduce virtqueue_discard()
+
+This patch introduces virtqueue_discard() to discard a descriptor and
+unmap the sgs. This will be used by the patch that will discard
+descriptor when packet is truncated.
+
+Cc: Michael S. Tsirkin <mst at redhat.com>
+Signed-off-by: Jason Wang <jasowang at redhat.com>
+Reviewed-by: Michael S. Tsirkin <mst at redhat.com>
+Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
+Upstream-Status: Backport
+
+git.qemu.org/?p=qemu.git;a=commit;h=29b9f5efd78ae0f9cc02dd169b6e80d2c404bade
+
+CVE: CVE-2015-7295 patch #2
+[Yocto # 9013]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/virtio/virtio.c | 7 +++++++
+ include/hw/virtio/virtio.h | 2 ++
+ 2 files changed, 9 insertions(+)
+
+Index: qemu-2.4.0/hw/virtio/virtio.c
+===================================================================
+--- qemu-2.4.0.orig/hw/virtio/virtio.c
++++ qemu-2.4.0/hw/virtio/virtio.c
+@@ -266,6 +266,13 @@ static void virtqueue_unmap_sg(VirtQueue
+ 0, elem->out_sg[i].iov_len);
+ }
+
++void virtqueue_discard(VirtQueue *vq, const VirtQueueElement *elem,
++ unsigned int len)
++{
++ vq->last_avail_idx--;
++ virtqueue_unmap_sg(vq, elem, len);
++}
++
+ void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
+ unsigned int len, unsigned int idx)
+ {
+Index: qemu-2.4.0/include/hw/virtio/virtio.h
+===================================================================
+--- qemu-2.4.0.orig/include/hw/virtio/virtio.h
++++ qemu-2.4.0/include/hw/virtio/virtio.h
+@@ -146,6 +146,8 @@ void virtio_del_queue(VirtIODevice *vdev
+ void virtqueue_push(VirtQueue *vq, const VirtQueueElement *elem,
+ unsigned int len);
+ void virtqueue_flush(VirtQueue *vq, unsigned int count);
++void virtqueue_discard(VirtQueue *vq, const VirtQueueElement *elem,
++ unsigned int len);
+ void virtqueue_fill(VirtQueue *vq, const VirtQueueElement *elem,
+ unsigned int len, unsigned int idx);
+
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_3.patch b/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_3.patch
new file mode 100644
index 0000000..74442e3
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2015-7295_3.patch
@@ -0,0 +1,52 @@
+From 0cf33fb6b49a19de32859e2cdc6021334f448fb3 Mon Sep 17 00:00:00 2001
+From: Jason Wang <jasowang at redhat.com>
+Date: Fri, 25 Sep 2015 13:21:30 +0800
+Subject: [PATCH] virtio-net: correctly drop truncated packets
+
+When packet is truncated during receiving, we drop the packets but
+neither discard the descriptor nor add and signal used
+descriptor. This will lead several issues:
+
+- sg mappings are leaked
+- rx will be stalled if a lots of packets were truncated
+
+In order to be consistent with vhost, fix by discarding the descriptor
+in this case.
+
+Cc: Michael S. Tsirkin <mst at redhat.com>
+Signed-off-by: Jason Wang <jasowang at redhat.com>
+Reviewed-by: Michael S. Tsirkin <mst at redhat.com>
+Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
+
+Upstream-Status: Backport
+
+git.qemu.org/?p=qemu.git;a=commit;h=0cf33fb6b49a19de32859e2cdc6021334f448fb3
+
+CVE: CVE-2015-7295 patch #3
+[Yocto # 9013]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/net/virtio-net.c | 8 +-------
+ 1 file changed, 1 insertion(+), 7 deletions(-)
+
+Index: qemu-2.4.0/hw/net/virtio-net.c
+===================================================================
+--- qemu-2.4.0.orig/hw/net/virtio-net.c
++++ qemu-2.4.0/hw/net/virtio-net.c
+@@ -1086,13 +1086,7 @@ static ssize_t virtio_net_receive(NetCli
+ * must have consumed the complete packet.
+ * Otherwise, drop it. */
+ if (!n->mergeable_rx_bufs && offset < size) {
+-#if 0
+- error_report("virtio-net truncated non-mergeable packet: "
+- "i %zd mergeable %d offset %zd, size %zd, "
+- "guest hdr len %zd, host hdr len %zd",
+- i, n->mergeable_rx_bufs,
+- offset, size, n->guest_hdr_len, n->host_hdr_len);
+-#endif
++ virtqueue_discard(q->rx_vq, &elem, total);
+ return size;
+ }
+
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2015-7504.patch b/meta/recipes-devtools/qemu/qemu/CVE-2015-7504.patch
new file mode 100644
index 0000000..90a7947
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2015-7504.patch
@@ -0,0 +1,56 @@
+From 837f21aacf5a714c23ddaadbbc5212f9b661e3f7 Mon Sep 17 00:00:00 2001
+From: Prasad J Pandit <pjp at fedoraproject.org>
+Date: Fri, 20 Nov 2015 11:50:31 +0530
+Subject: [PATCH] net: pcnet: add check to validate receive data
+ size(CVE-2015-7504)
+
+In loopback mode, pcnet_receive routine appends CRC code to the
+receive buffer. If the data size given is same as the buffer size,
+the appended CRC code overwrites 4 bytes after s->buffer. Added a
+check to avoid that.
+
+Reported by: Qinghao Tang <luodalongde at gmail.com>
+Cc: qemu-stable at nongnu.org
+Reviewed-by: Michael S. Tsirkin <mst at redhat.com>
+Signed-off-by: Prasad J Pandit <pjp at fedoraproject.org>
+Signed-off-by: Jason Wang <jasowang at redhat.com>
+
+Upstream-Status: Backport
+
+http://git.qemu.org/?p=qemu.git;a=commit;h=837f21aacf5a714c23ddaadbbc5212f9b661e3f7
+
+CVE: CVE-2015-7504
+[Yocto # 9013]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/net/pcnet.c | 8 +++++---
+ 1 file changed, 5 insertions(+), 3 deletions(-)
+
+Index: qemu-2.4.0/hw/net/pcnet.c
+===================================================================
+--- qemu-2.4.0.orig/hw/net/pcnet.c
++++ qemu-2.4.0/hw/net/pcnet.c
+@@ -1085,7 +1085,7 @@ ssize_t pcnet_receive(NetClientState *nc
+ uint32_t fcs = ~0;
+ uint8_t *p = src;
+
+- while (p != &src[size-4])
++ while (p != &src[size])
+ CRC(fcs, *p++);
+ crc_err = (*(uint32_t *)p != htonl(fcs));
+ }
+@@ -1234,8 +1234,10 @@ static void pcnet_transmit(PCNetState *s
+ bcnt = 4096 - GET_FIELD(tmd.length, TMDL, BCNT);
+
+ /* if multi-tmd packet outsizes s->buffer then skip it silently.
+- Note: this is not what real hw does */
+- if (s->xmit_pos + bcnt > sizeof(s->buffer)) {
++ * Note: this is not what real hw does.
++ * Last four bytes of s->buffer are used to store CRC FCS code.
++ */
++ if (s->xmit_pos + bcnt > sizeof(s->buffer) - 4) {
+ s->xmit_pos = -1;
+ goto txdone;
+ }
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2015-7512.patch b/meta/recipes-devtools/qemu/qemu/CVE-2015-7512.patch
new file mode 100644
index 0000000..50b8a6c
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2015-7512.patch
@@ -0,0 +1,44 @@
+From 8b98a2f07175d46c3f7217639bd5e03f2ec56343 Mon Sep 17 00:00:00 2001
+From: Jason Wang <jasowang at redhat.com>
+Date: Mon, 30 Nov 2015 15:00:06 +0800
+Subject: [PATCH] pcnet: fix rx buffer overflow(CVE-2015-7512)
+
+Backends could provide a packet whose length is greater than buffer
+size. Check for this and truncate the packet to avoid rx buffer
+overflow in this case.
+
+Cc: Prasad J Pandit <pjp at fedoraproject.org>
+Cc: qemu-stable at nongnu.org
+Reviewed-by: Michael S. Tsirkin <mst at redhat.com>
+Signed-off-by: Jason Wang <jasowang at redhat.com>
+
+Upsteam_Status: Backport
+
+http://git.qemu.org/?p=qemu.git;a=commit;h=8b98a2f07175d46c3f7217639bd5e03f2ec56343
+
+CVE: CVE-2015-7512
+[Yocto # 9013]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/net/pcnet.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+Index: qemu-2.4.0/hw/net/pcnet.c
+===================================================================
+--- qemu-2.4.0.orig/hw/net/pcnet.c
++++ qemu-2.4.0/hw/net/pcnet.c
+@@ -1065,6 +1065,12 @@ ssize_t pcnet_receive(NetClientState *nc
+ int pktcount = 0;
+
+ if (!s->looptest) {
++ if (size > 4092) {
++#ifdef PCNET_DEBUG_RMD
++ fprintf(stderr, "pcnet: truncates rx packet.\n");
++#endif
++ size = 4092;
++ }
+ memcpy(src, buf, size);
+ /* no need to compute the CRC */
+ src[size] = 0;
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2015-8345.patch b/meta/recipes-devtools/qemu/qemu/CVE-2015-8345.patch
new file mode 100644
index 0000000..310b458
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2015-8345.patch
@@ -0,0 +1,73 @@
+From 00837731d254908a841d69298a4f9f077babaf24 Mon Sep 17 00:00:00 2001
+From: Stefan Weil <sw at weilnetz.de>
+Date: Fri, 20 Nov 2015 08:42:33 +0100
+Subject: [PATCH] eepro100: Prevent two endless loops
+
+http://lists.nongnu.org/archive/html/qemu-devel/2015-11/msg04592.html
+shows an example how an endless loop in function action_command can
+be achieved.
+
+During my code review, I noticed a 2nd case which can result in an
+endless loop.
+
+Reported-by: Qinghao Tang <luodalongde at gmail.com>
+Signed-off-by: Stefan Weil <sw at weilnetz.de>
+Signed-off-by: Jason Wang <jasowang at redhat.com>
+
+Upstream-Status: Backport
+
+http://git.qemu.org/?p=qemu.git;a=commit;h=00837731d254908a841d69298a4f9f077babaf24
+
+CVE: CVE-2015-8345
+[Yocto # 9013]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/net/eepro100.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/hw/net/eepro100.c b/hw/net/eepro100.c
+index 60333b7..685a478 100644
+--- a/hw/net/eepro100.c
++++ b/hw/net/eepro100.c
+@@ -774,6 +774,11 @@ static void tx_command(EEPRO100State *s)
+ #if 0
+ uint16_t tx_buffer_el = lduw_le_pci_dma(&s->dev, tbd_address + 6);
+ #endif
++ if (tx_buffer_size == 0) {
++ /* Prevent an endless loop. */
++ logout("loop in %s:%u\n", __FILE__, __LINE__);
++ break;
++ }
+ tbd_address += 8;
+ TRACE(RXTX, logout
+ ("TBD (simplified mode): buffer address 0x%08x, size 0x%04x\n",
+@@ -855,6 +860,10 @@ static void set_multicast_list(EEPRO100State *s)
+
+ static void action_command(EEPRO100State *s)
+ {
++ /* The loop below won't stop if it gets special handcrafted data.
++ Therefore we limit the number of iterations. */
++ unsigned max_loop_count = 16;
++
+ for (;;) {
+ bool bit_el;
+ bool bit_s;
+@@ -870,6 +879,13 @@ static void action_command(EEPRO100State *s)
+ #if 0
+ bool bit_sf = ((s->tx.command & COMMAND_SF) != 0);
+ #endif
++
++ if (max_loop_count-- == 0) {
++ /* Prevent an endless loop. */
++ logout("loop in %s:%u\n", __FILE__, __LINE__);
++ break;
++ }
++
+ s->cu_offset = s->tx.link;
+ TRACE(OTHER,
+ logout("val=(cu start), status=0x%04x, command=0x%04x, link=0x%08x\n",
+--
+2.3.5
+
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2015-8504.patch b/meta/recipes-devtools/qemu/qemu/CVE-2015-8504.patch
new file mode 100644
index 0000000..9e66021
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2015-8504.patch
@@ -0,0 +1,51 @@
+From 4c65fed8bdf96780735dbdb92a8bd0d6b6526cc3 Mon Sep 17 00:00:00 2001
+From: Prasad J Pandit <pjp at fedoraproject.org>
+Date: Thu, 3 Dec 2015 18:54:17 +0530
+Subject: [PATCH] ui: vnc: avoid floating point exception
+
+While sending 'SetPixelFormat' messages to a VNC server,
+the client could set the 'red-max', 'green-max' and 'blue-max'
+values to be zero. This leads to a floating point exception in
+write_png_palette while doing frame buffer updates.
+
+Reported-by: Lian Yihan <lianyihan at 360.cn>
+Signed-off-by: Prasad J Pandit <pjp at fedoraproject.org>
+Reviewed-by: Gerd Hoffmann <kraxel at redhat.com>
+Signed-off-by: Peter Maydell <peter.maydell at linaro.org>
+
+Upstream-Status: Backport
+
+http://git.qemu.org/?p=qemu.git;a=commitdiff;h=4c65fed8bdf96780735dbdb92a8
+
+CVE: CVE-2015-8504
+[Yocto # 9013]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ui/vnc.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+Index: qemu-2.4.0/ui/vnc.c
+===================================================================
+--- qemu-2.4.0.orig/ui/vnc.c
++++ qemu-2.4.0/ui/vnc.c
+@@ -2189,15 +2189,15 @@ static void set_pixel_format(VncState *v
+ return;
+ }
+
+- vs->client_pf.rmax = red_max;
++ vs->client_pf.rmax = red_max ? red_max : 0xFF;
+ vs->client_pf.rbits = hweight_long(red_max);
+ vs->client_pf.rshift = red_shift;
+ vs->client_pf.rmask = red_max << red_shift;
+- vs->client_pf.gmax = green_max;
++ vs->client_pf.gmax = green_max ? green_max : 0xFF;
+ vs->client_pf.gbits = hweight_long(green_max);
+ vs->client_pf.gshift = green_shift;
+ vs->client_pf.gmask = green_max << green_shift;
+- vs->client_pf.bmax = blue_max;
++ vs->client_pf.bmax = blue_max ? blue_max : 0xFF;
+ vs->client_pf.bbits = hweight_long(blue_max);
+ vs->client_pf.bshift = blue_shift;
+ vs->client_pf.bmask = blue_max << blue_shift;
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2016-1568.patch b/meta/recipes-devtools/qemu/qemu/CVE-2016-1568.patch
new file mode 100644
index 0000000..9c40ffb
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2016-1568.patch
@@ -0,0 +1,46 @@
+From 4ab0359a8ae182a7ac5c99609667273167703fab Mon Sep 17 00:00:00 2001
+From: Prasad J Pandit <pjp at fedoraproject.org>
+Date: Mon, 11 Jan 2016 14:10:42 -0500
+Subject: [PATCH] ide: ahci: reset ncq object to unused on error
+
+When processing NCQ commands, AHCI device emulation prepares a
+NCQ transfer object; To which an aio control block(aiocb) object
+is assigned in 'execute_ncq_command'. In case, when the NCQ
+command is invalid, the 'aiocb' object is not assigned, and NCQ
+transfer object is left as 'used'. This leads to a use after
+free kind of error in 'bdrv_aio_cancel_async' via 'ahci_reset_port'.
+Reset NCQ transfer object to 'unused' to avoid it.
+
+[Maintainer edit: s/ACHI/AHCI/ in the commit message. --js]
+
+Reported-by: Qinghao Tang <luodalongde at gmail.com>
+Signed-off-by: Prasad J Pandit <pjp at fedoraproject.org>
+Reviewed-by: John Snow <jsnow at redhat.com>
+Message-id: 1452282511-4116-1-git-send-email-ppandit at redhat.com
+Signed-off-by: John Snow <jsnow at redhat.com>
+
+Upstream-Status: Backport
+
+http://git.qemu.org/?p=qemu.git;a=commit;h=4ab0359a8ae182a7ac5c99609667273167703fab
+
+CVE: CVE-2016-1568
+[Yocto # 9013]
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/ide/ahci.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+Index: qemu-2.4.0/hw/ide/ahci.c
+===================================================================
+--- qemu-2.4.0.orig/hw/ide/ahci.c
++++ qemu-2.4.0/hw/ide/ahci.c
+@@ -898,6 +898,7 @@ static void ncq_err(NCQTransferState *nc
+ ide_state->error = ABRT_ERR;
+ ide_state->status = READY_STAT | ERR_STAT;
+ ncq_tfs->drive->port_regs.scr_err |= (1 << ncq_tfs->tag);
++ ncq_tfs->used = 0;
+ }
+
+ static void ncq_finish(NCQTransferState *ncq_tfs)
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2016-2197.patch b/meta/recipes-devtools/qemu/qemu/CVE-2016-2197.patch
new file mode 100644
index 0000000..946435c
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2016-2197.patch
@@ -0,0 +1,59 @@
+From: Prasad J Pandit <address at hidden>
+
+When IDE AHCI emulation uses Frame Information Structures(FIS)
+engine for data transfer, the mapped FIS buffer address is stored
+in a static 'bounce.buffer'. When a request is made to map another
+memory region, address_space_map() returns NULL because
+'bounce.buffer' is in_use. It leads to a null pointer dereference
+error while doing 'dma_memory_unmap'. Add a check to avoid it.
+
+Reported-by: Zuozhi fzz <address at hidden>
+Signed-off-by: Prasad J Pandit <address at hidden>
+
+Upstream-Status: Backport
+https://lists.gnu.org/archive/html/qemu-devel/2016-01/msg05740.html
+
+CVE: CVE-2016-2197
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/ide/ahci.c | 16 ++++++++++------
+ 1 file changed, 10 insertions(+), 6 deletions(-)
+
+ Update as per review
+ -> https://lists.gnu.org/archive/html/qemu-devel/2016-01/msg05715.html
+
+Index: qemu-2.5.0/hw/ide/ahci.c
+===================================================================
+--- qemu-2.5.0.orig/hw/ide/ahci.c
++++ qemu-2.5.0/hw/ide/ahci.c
+@@ -661,9 +661,11 @@ static bool ahci_map_fis_address(AHCIDev
+
+ static void ahci_unmap_fis_address(AHCIDevice *ad)
+ {
+- dma_memory_unmap(ad->hba->as, ad->res_fis, 256,
+- DMA_DIRECTION_FROM_DEVICE, 256);
+- ad->res_fis = NULL;
++ if (ad->res_fis) {
++ dma_memory_unmap(ad->hba->as, ad->res_fis, 256,
++ DMA_DIRECTION_FROM_DEVICE, 256);
++ ad->res_fis = NULL;
++ }
+ }
+
+ static bool ahci_map_clb_address(AHCIDevice *ad)
+@@ -677,9 +679,11 @@ static bool ahci_map_clb_address(AHCIDev
+
+ static void ahci_unmap_clb_address(AHCIDevice *ad)
+ {
+- dma_memory_unmap(ad->hba->as, ad->lst, 1024,
+- DMA_DIRECTION_FROM_DEVICE, 1024);
+- ad->lst = NULL;
++ if (ad->lst) {
++ dma_memory_unmap(ad->hba->as, ad->lst, 1024,
++ DMA_DIRECTION_FROM_DEVICE, 1024);
++ ad->lst = NULL;
++ }
+ }
+
+ static void ahci_write_fis_sdb(AHCIState *s, NCQTransferState *ncq_tfs)
diff --git a/meta/recipes-devtools/qemu/qemu/CVE-2016-2198.patch b/meta/recipes-devtools/qemu/qemu/CVE-2016-2198.patch
new file mode 100644
index 0000000..f1201f0
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/CVE-2016-2198.patch
@@ -0,0 +1,45 @@
+From: Prasad J Pandit <address at hidden>
+
+USB Ehci emulation supports host controller capability registers.
+But its mmio '.write' function was missing, which lead to a null
+pointer dereference issue. Add a do nothing 'ehci_caps_write'
+definition to avoid it; Do nothing because capability registers
+are Read Only(RO).
+
+Reported-by: Zuozhi Fzz <address at hidden>
+Signed-off-by: Prasad J Pandit <address at hidden>
+
+Upstream-Status: Backport
+https://lists.gnu.org/archive/html/qemu-devel/2016-01/msg05899.html
+
+CVE: CVE-2016-2198
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ hw/usb/hcd-ehci.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+Index: qemu-2.5.0/hw/usb/hcd-ehci.c
+===================================================================
+--- qemu-2.5.0.orig/hw/usb/hcd-ehci.c
++++ qemu-2.5.0/hw/usb/hcd-ehci.c
+@@ -893,6 +893,11 @@ static uint64_t ehci_caps_read(void *ptr
+ return s->caps[addr];
+ }
+
++static void ehci_caps_write(void *ptr, hwaddr addr,
++ uint64_t val, unsigned size)
++{
++}
++
+ static uint64_t ehci_opreg_read(void *ptr, hwaddr addr,
+ unsigned size)
+ {
+@@ -2310,6 +2315,7 @@ static void ehci_frame_timer(void *opaqu
+
+ static const MemoryRegionOps ehci_mmio_caps_ops = {
+ .read = ehci_caps_read,
++ .write = ehci_caps_write,
+ .valid.min_access_size = 1,
+ .valid.max_access_size = 4,
+ .impl.min_access_size = 1,
diff --git a/meta/recipes-devtools/qemu/qemu/no-valgrind.patch b/meta/recipes-devtools/qemu/qemu/no-valgrind.patch
new file mode 100644
index 0000000..91f7280
--- /dev/null
+++ b/meta/recipes-devtools/qemu/qemu/no-valgrind.patch
@@ -0,0 +1,19 @@
+There isn't an option to enable or disable valgrind support, so disable it to avoid non-deterministic builds.
+
+Upstream-Status: Inappropriate
+Signed-off-by: Ross Burton <ross.burton at intel.com>
+
+diff --git a/configure b/configure
+index b3c4f51..4d3929e 100755
+--- a/configure
++++ b/configure
+@@ -4193,9 +4192,0 @@ valgrind_h=no
+-cat > $TMPC << EOF
+-#include <valgrind/valgrind.h>
+-int main(void) {
+- return 0;
+-}
+-EOF
+-if compile_prog "" "" ; then
+- valgrind_h=yes
+-fi
diff --git a/meta/recipes-devtools/qemu/qemu_2.4.0.bb b/meta/recipes-devtools/qemu/qemu_2.4.0.bb
index 59b1788..8d47b16 100644
--- a/meta/recipes-devtools/qemu/qemu_2.4.0.bb
+++ b/meta/recipes-devtools/qemu/qemu_2.4.0.bb
@@ -9,6 +9,17 @@ SRC_URI += "file://configure-fix-Darwin-target-detection.patch \
file://smc91c111_fix1.patch \
file://smc91c111_fix2.patch \
file://smc91c111_fix3.patch \
+ file://no-valgrind.patch \
+ file://CVE-2015-8504.patch \
+ file://CVE-2015-7504.patch \
+ file://CVE-2015-7512.patch \
+ file://CVE-2015-8345.patch \
+ file://CVE-2016-1568.patch \
+ file://CVE-2015-7295_1.patch \
+ file://CVE-2015-7295_2.patch \
+ file://CVE-2015-7295_3.patch \
+ file://CVE-2016-2197.patch \
+ file://CVE-2016-2198.patch \
"
SRC_URI_prepend = "http://wiki.qemu-project.org/download/${BP}.tar.bz2"
SRC_URI[md5sum] = "186ee8194140a484a455f8e3c74589f4"
diff --git a/meta/recipes-devtools/rpm/rpm/configure.ac-check-for-both-gpg2-and-gpg.patch b/meta/recipes-devtools/rpm/rpm/configure.ac-check-for-both-gpg2-and-gpg.patch
new file mode 100644
index 0000000..7894a42
--- /dev/null
+++ b/meta/recipes-devtools/rpm/rpm/configure.ac-check-for-both-gpg2-and-gpg.patch
@@ -0,0 +1,29 @@
+configure.ac: search for both gpg2 and gpg
+
+On some platforms the GnuPG binary is named 'gpg2' whereas others have 'gpg'.
+This patch increases compatibility by searching for 'gpg' in addition to
+'gpg2'.
+
+Upstream-Status: Pending
+
+Signed-off-by: Markus Lehtonen <markus.lehtonen at linux.intel.com>
+---
+ configure.ac | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/configure.ac b/configure.ac
+index 6746b4c..f6922ae 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -562,7 +562,7 @@ AC_PATH_PROG(__DIFF, diff, /bin/diff, $MYPATH)
+ AC_PATH_PROG(__DITTO, ditto, %{_bindir}/ditto, $MYPATH)
+ AC_PATH_PROG(__FILE, file, %{_bindir}/file, $MYPATH)
+ AC_PATH_PROG(__GIT, git, %{_bindir}/git, $MYPATH)
+-AC_PATH_PROG(__GPG, gpg2, %{_bindir}/gpg2, $MYPATH)
++AC_PATH_PROGS(__GPG, [gpg2 gpg], %{_bindir}/gpg2, $MYPATH)
+ AC_PATH_PROG(__GSR, gsr, %{_bindir}/gsr, $MYPATH)
+ AC_PATH_PROG(__GST_INSPECT, gst-inspect-0.10, %{_bindir}/gst-inspect-0.10, $MYPATH)
+ AC_PATH_PROG(__GZIP, gzip, /bin/gzip, $MYPATH)
+--
+2.1.4
+
diff --git a/meta/recipes-devtools/rpm/rpm/rpm-check-rootpath-reasonableness.patch b/meta/recipes-devtools/rpm/rpm/rpm-check-rootpath-reasonableness.patch
index 3986030..3d8d645 100644
--- a/meta/recipes-devtools/rpm/rpm/rpm-check-rootpath-reasonableness.patch
+++ b/meta/recipes-devtools/rpm/rpm/rpm-check-rootpath-reasonableness.patch
@@ -37,7 +37,7 @@ index 40c42bd..88d85ab 100644
+ int ret,rootdir_len;
+
+ if(rootdir == NULL) {
-+ return;
++ return -1;
+ }
+
+ rootdir_len = strlen(rootdir);
diff --git a/meta/recipes-devtools/rpm/rpm_4.11.2.bb b/meta/recipes-devtools/rpm/rpm_4.11.2.bb
index 210c943..f4a2110 100644
--- a/meta/recipes-devtools/rpm/rpm_4.11.2.bb
+++ b/meta/recipes-devtools/rpm/rpm_4.11.2.bb
@@ -22,7 +22,8 @@ HOMEPAGE = "http://www.rpm.org"
LICENSE = "GPL-2.0+"
LIC_FILES_CHKSUM ??= "file://${COMMON_LICENSE_DIR}/GPL-2.0;md5=801f80980d171dd6425610833a22dbe6"
-DEPENDS = "db libxml2 xz findutils file popt nss bzip2 elfutils patch attr zlib acl gzip make binutils python"
+DEPENDS = "db libxml2 xz findutils file popt nss bzip2 elfutils attr zlib acl gzip python"
+DEPENDS_append_class-native = " file-replacement-native"
SRC_URI += "http://rpm.org/releases/rpm-4.11.x/${BP}.tar.bz2 \
file://use-pkgconfig-for-python.patch \
diff --git a/meta/recipes-devtools/rpm/rpm_5.4+cvs.bb b/meta/recipes-devtools/rpm/rpm_5.4+cvs.bb
index 8903f3b..951b251 100644
--- a/meta/recipes-devtools/rpm/rpm_5.4+cvs.bb
+++ b/meta/recipes-devtools/rpm/rpm_5.4+cvs.bb
@@ -43,6 +43,7 @@ LICENSE = "LGPLv2.1"
LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
DEPENDS = "libpcre attr acl popt ossp-uuid file byacc-native"
+DEPENDS_append_class-native = " file-replacement-native"
S = "${WORKDIR}/rpm"
diff --git a/meta/recipes-devtools/rpm/rpm_5.4.14.bb b/meta/recipes-devtools/rpm/rpm_5.4.14.bb
index 1f9a4bd..73b3734 100644
--- a/meta/recipes-devtools/rpm/rpm_5.4.14.bb
+++ b/meta/recipes-devtools/rpm/rpm_5.4.14.bb
@@ -41,6 +41,7 @@ LICENSE = "LGPLv2.1"
LIC_FILES_CHKSUM = "file://COPYING.LIB;md5=2d5025d4aa3495befef8f17206a5b0a1"
DEPENDS = "libpcre attr acl popt ossp-uuid file byacc-native"
+DEPENDS_append_class-native = " file-replacement-native"
# rpm2cpio is a shell script, which is part of the rpm src.rpm. It is needed
# in order to extract the distribution SRPM into a format we can extract...
@@ -98,6 +99,7 @@ SRC_URI = "http://www.rpm5.org/files/rpm/rpm-5.4/rpm-5.4.14-0.20131024.src.rpm;e
file://rpm-check-rootpath-reasonableness.patch \
file://rpm-macros.in-disable-external-key-server.patch \
file://rpm-opendb-before-verifyscript-to-avoid-null-point.patch \
+ file://configure.ac-check-for-both-gpg2-and-gpg.patch \
"
# Uncomment the following line to enable platform score debugging
diff --git a/meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c b/meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c
index 7f4caf9..c0b4d56 100644
--- a/meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c
+++ b/meta/recipes-devtools/rpm/rpmresolve/rpmresolve.c
@@ -42,7 +42,7 @@ FILE *outf;
int getPackageStr(rpmts ts, const char *NVRA, rpmTag tag, char **value)
{
int rc = -1;
- rpmmi mi = rpmtsInitIterator(ts, RPMTAG_NVRA, NVRA, 0);
+ rpmmi mi = rpmmiInit(rpmtsGetRdb(ts), RPMTAG_NVRA, NVRA, 0);
Header h;
if ((h = rpmmiNext(mi)) != NULL) {
HE_t he = (HE_t) memset(alloca(sizeof(*he)), 0, sizeof(*he));
@@ -225,7 +225,7 @@ int processPackages(rpmts *ts, int tscount, const char *packagelistfn, int ignor
int lookupProvider(rpmts ts, const char *req, char **provider)
{
int rc = 0;
- rpmmi provmi = rpmtsInitIterator(ts, RPMTAG_PROVIDENAME, req, 0);
+ rpmmi provmi = rpmmiInit(rpmtsGetRdb(ts), RPMTAG_PROVIDENAME, req, 0);
if(provmi) {
Header h;
if ((h = rpmmiNext(provmi)) != NULL) {
@@ -266,7 +266,7 @@ int printDepList(rpmts *ts, int tscount)
HE_t he = (HE_t) memset(alloca(sizeof(*he)), 0, sizeof(*he));
int nkeys = argvCount(keys);
for(i=0; i<nkeys; i++) {
- rpmmi mi = rpmtsInitIterator(ts[0], RPMTAG_NVRA, keys[i], 0);
+ rpmmi mi = rpmmiInit(db, RPMTAG_NVRA, keys[i], 0);
Header h;
if ((h = rpmmiNext(mi)) != NULL) {
/* Get name of package */
@@ -280,6 +280,8 @@ int printDepList(rpmts *ts, int tscount)
printf("DEBUG: %s requires null\n", name);
}
rc = 0;
+ free(name);
+ (void)rpmmiFree(mi);
continue;
}
ARGV_t reqs = (ARGV_t)he->p.ptr;
@@ -412,7 +414,7 @@ int main(int argc, char **argv)
}
for(i=0; i<tscount; i++)
- (void) rpmtsCloseDB(ts[i]);
+ (void)rpmtsFree(ts[i]);
free(ts);
if( outfile ) {
diff --git a/meta/recipes-devtools/subversion/subversion-1.8.13/subversion-CVE-2015-3184.patch b/meta/recipes-devtools/subversion/subversion-1.8.13/subversion-CVE-2015-3184.patch
new file mode 100644
index 0000000..0663bd2
--- /dev/null
+++ b/meta/recipes-devtools/subversion/subversion-1.8.13/subversion-CVE-2015-3184.patch
@@ -0,0 +1,2094 @@
+Fix CVE-2015-3184
+
+Patch is from:
+http://subversion.apache.org/security/CVE-2015-3184-advisory.txt
+
+Upstream-Status: Backport
+
+Signed-off-by: Wenzong Fan <wenzong.fan at windriver.com>
+
+Index: Makefile.in
+===================================================================
+--- a/Makefile.in (revision 1691883)
++++ b/Makefile.in (working copy)
+@@ -357,6 +357,7 @@ TEST_SHLIB_VAR_SWIG_RB=\
+ fi;
+
+ APXS = @APXS@
++HTTPD_VERSION = @HTTPD_VERSION@
+
+ PYTHON = @PYTHON@
+ PERL = @PERL@
+@@ -509,6 +510,9 @@ check: bin @TRANSFORM_LIBTOOL_SCRIPTS@ $(TEST_DEPS
+ if test "$(HTTP_LIBRARY)" != ""; then \
+ flags="--http-library $(HTTP_LIBRARY) $$flags"; \
+ fi; \
++ if test "$(HTTPD_VERSION)" != ""; then \
++ flags="--httpd-version $(HTTPD_VERSION) $$flags"; \
++ fi; \
+ if test "$(SERVER_MINOR_VERSION)" != ""; then \
+ flags="--server-minor-version $(SERVER_MINOR_VERSION) $$flags"; \
+ fi; \
+Index: build/ac-macros/apache.m4
+===================================================================
+--- a/build/ac-macros/apache.m4 (revision 1691883)
++++ b/build/ac-macros/apache.m4 (working copy)
+@@ -160,6 +160,20 @@ if test -n "$APXS" && test "$APXS" != "no"; then
+ BUILD_APACHE_RULE=apache-mod
+ INSTALL_APACHE_RULE=install-mods-shared
+ INSTALL_APACHE_MODS=true
++ HTTPD="`$APXS -q sbindir`/`$APXS -q PROGNAME`"
++ if ! test -e $HTTPD ; then
++ HTTPD="`$APXS -q bindir`/`$APXS -q PROGNAME`"
++ fi
++ HTTPD_VERSION=["`$HTTPD -v | $SED -e 's@^.*/\([0-9.]*\)\(.*$\)@\1@ ; 1q'`"]
++ AC_ARG_ENABLE(broken-httpd-auth,
++ AS_HELP_STRING([--enable-broken-httpd-auth],
++ [Allow building against httpd 2.4 with broken auth]),
++ [broken_httpd_auth=$enableval],[broken_httpd_auth=no])
++ if test "$enable_broken_httpd_auth" = "yes"; then
++ AC_MSG_NOTICE([Building with broken httpd auth])
++ AC_DEFINE(SVN_ALLOW_BROKEN_HTTPD_AUTH, 1,
++ [Defined to allow building against httpd 2.4 with broken auth])
++ fi
+
+ case $host in
+ *-*-cygwin*)
+@@ -178,6 +192,7 @@ AC_SUBST(APACHE_LDFLAGS)
+ AC_SUBST(APACHE_INCLUDES)
+ AC_SUBST(APACHE_LIBEXECDIR)
+ AC_SUBST(INSTALL_APACHE_MODS)
++AC_SUBST(HTTPD_VERSION)
+
+ # there aren't any flags that interest us ...
+ #if test -n "$APXS" && test "$APXS" != "no"; then
+Index: build/run_tests.py
+===================================================================
+--- a/build/run_tests.py (revision 1691883)
++++ b/build/run_tests.py (working copy)
+@@ -29,6 +29,7 @@
+ [--fs-type=<fs-type>] [--fsfs-packing] [--fsfs-sharding=<n>]
+ [--list] [--milestone-filter=<regex>] [--mode-filter=<type>]
+ [--server-minor-version=<version>] [--http-proxy=<host>:<port>]
++ [--httpd-version=<version>]
+ [--config-file=<file>] [--ssl-cert=<file>]
+ <abs_srcdir> <abs_builddir>
+ <prog ...>
+@@ -125,7 +126,7 @@ class TestHarness:
+ fsfs_sharding=None, fsfs_packing=None,
+ list_tests=None, svn_bin=None, mode_filter=None,
+ milestone_filter=None, set_log_level=None, ssl_cert=None,
+- http_proxy=None):
++ http_proxy=None, httpd_version=None):
+ '''Construct a TestHarness instance.
+
+ ABS_SRCDIR and ABS_BUILDDIR are the source and build directories.
+@@ -178,6 +179,7 @@ class TestHarness:
+ self.log = None
+ self.ssl_cert = ssl_cert
+ self.http_proxy = http_proxy
++ self.httpd_version = httpd_version
+ if not sys.stdout.isatty() or sys.platform == 'win32':
+ TextColors.disable()
+
+@@ -481,6 +483,8 @@ class TestHarness:
+ svntest.main.options.ssl_cert = self.ssl_cert
+ if self.http_proxy is not None:
+ svntest.main.options.http_proxy = self.http_proxy
++ if self.httpd_version is not None:
++ svntest.main.options.httpd_version = self.httpd_version
+
+ svntest.main.options.srcdir = self.srcdir
+
+@@ -645,7 +649,7 @@ def main():
+ 'enable-sasl', 'parallel', 'config-file=',
+ 'log-to-stdout', 'list', 'milestone-filter=',
+ 'mode-filter=', 'set-log-level=', 'ssl-cert=',
+- 'http-proxy='])
++ 'http-proxy=', 'httpd-version='])
+ except getopt.GetoptError:
+ args = []
+
+@@ -656,9 +660,9 @@ def main():
+ base_url, fs_type, verbose, cleanup, enable_sasl, http_library, \
+ server_minor_version, fsfs_sharding, fsfs_packing, parallel, \
+ config_file, log_to_stdout, list_tests, mode_filter, milestone_filter, \
+- set_log_level, ssl_cert, http_proxy = \
++ set_log_level, ssl_cert, http_proxy, httpd_version = \
+ None, None, None, None, None, None, None, None, None, None, None, \
+- None, None, None, None, None, None, None
++ None, None, None, None, None, None, None, None
+ for opt, val in opts:
+ if opt in ['-u', '--url']:
+ base_url = val
+@@ -696,6 +700,8 @@ def main():
+ ssl_cert = val
+ elif opt in ['--http-proxy']:
+ http_proxy = val
++ elif opt in ['--httpd-version']:
++ httpd_version = val
+ else:
+ raise getopt.GetoptError
+
+@@ -712,7 +718,7 @@ def main():
+ fsfs_sharding, fsfs_packing, list_tests,
+ mode_filter=mode_filter, milestone_filter=milestone_filter,
+ set_log_level=set_log_level, ssl_cert=ssl_cert,
+- http_proxy=http_proxy)
++ http_proxy=http_proxy, httpd_version=httpd_version)
+
+ failed = th.run(args[2:])
+ if failed:
+Index: subversion/mod_authz_svn/mod_authz_svn.c
+===================================================================
+--- a/subversion/mod_authz_svn/mod_authz_svn.c (revision 1691883)
++++ b/subversion/mod_authz_svn/mod_authz_svn.c (working copy)
+@@ -48,6 +48,23 @@
+ #include "svn_dirent_uri.h"
+ #include "private/svn_fspath.h"
+
++/* The apache headers define these and they conflict with our definitions. */
++#ifdef PACKAGE_BUGREPORT
++#undef PACKAGE_BUGREPORT
++#endif
++#ifdef PACKAGE_NAME
++#undef PACKAGE_NAME
++#endif
++#ifdef PACKAGE_STRING
++#undef PACKAGE_STRING
++#endif
++#ifdef PACKAGE_TARNAME
++#undef PACKAGE_TARNAME
++#endif
++#ifdef PACKAGE_VERSION
++#undef PACKAGE_VERSION
++#endif
++#include "svn_private_config.h"
+
+ #ifdef APLOG_USE_MODULE
+ APLOG_USE_MODULE(authz_svn);
+@@ -67,6 +84,30 @@ typedef struct authz_svn_config_rec {
+ const char *force_username_case;
+ } authz_svn_config_rec;
+
++#if AP_MODULE_MAGIC_AT_LEAST(20060110,0) /* version where
++ ap_some_auth_required breaks */
++# if AP_MODULE_MAGIC_AT_LEAST(20120211,47) /* first version with
++ force_authn hook and
++ ap_some_authn_required() which
++ allows us to work without
++ ap_some_auth_required() */
++# define USE_FORCE_AUTHN 1
++# define IN_SOME_AUTHN_NOTE "authz_svn-in-some-authn"
++# define FORCE_AUTHN_NOTE "authz_svn-force-authn"
++# else
++ /* ap_some_auth_required() is busted and no viable alternative exists */
++# ifndef SVN_ALLOW_BROKEN_HTTPD_AUTH
++# error This version of httpd has a security hole with mod_authz_svn
++# else
++ /* user wants to build anyway */
++# define USE_FORCE_AUTHN 0
++# endif
++# endif
++#else
++ /* old enough that ap_some_auth_required() still works */
++# define USE_FORCE_AUTHN 0
++#endif
++
+ /*
+ * Configuration
+ */
+@@ -819,9 +860,51 @@ access_checker(request_rec *r)
+ &authz_svn_module);
+ const char *repos_path = NULL;
+ const char *dest_repos_path = NULL;
+- int status;
++ int status, authn_required;
+
++#if USE_FORCE_AUTHN
++ /* Use the force_authn() hook available in 2.4.x to work securely
++ * given that ap_some_auth_required() is no longer functional for our
++ * purposes in 2.4.x.
++ */
++ int authn_configured;
++
+ /* We are not configured to run */
++ if (!conf->anonymous || apr_table_get(r->notes, IN_SOME_AUTHN_NOTE)
++ || (! (conf->access_file || conf->repo_relative_access_file)))
++ return DECLINED;
++
++ /* Authentication is configured */
++ authn_configured = ap_auth_type(r) != NULL;
++ if (authn_configured)
++ {
++ /* If the user is trying to authenticate, let him. It doesn't
++ * make much sense to grant anonymous access but deny authenticated
++ * users access, even though you can do that with '$anon' in the
++ * access file.
++ */
++ if (apr_table_get(r->headers_in,
++ (PROXYREQ_PROXY == r->proxyreq)
++ ? "Proxy-Authorization" : "Authorization"))
++ {
++ /* Set the note to force authn regardless of what access_checker_ex
++ hook requires */
++ apr_table_setn(r->notes, FORCE_AUTHN_NOTE, (const char*)1);
++
++ /* provide the proper return so the access_checker hook doesn't
++ * prevent the code from continuing on to the other auth hooks */
++ if (ap_satisfies(r) != SATISFY_ANY)
++ return OK;
++ else
++ return HTTP_FORBIDDEN;
++ }
++ }
++
++#else
++ /* Support for older versions of httpd that have a working
++ * ap_some_auth_required() */
++
++ /* We are not configured to run */
+ if (!conf->anonymous
+ || (! (conf->access_file || conf->repo_relative_access_file)))
+ return DECLINED;
+@@ -834,9 +917,10 @@ access_checker(request_rec *r)
+ if (ap_satisfies(r) != SATISFY_ANY)
+ return DECLINED;
+
+- /* If the user is trying to authenticate, let him. If anonymous
+- * access is allowed, so is authenticated access, by definition
+- * of the meaning of '*' in the access file.
++ /* If the user is trying to authenticate, let him. It doesn't
++ * make much sense to grant anonymous access but deny authenticated
++ * users access, even though you can do that with '$anon' in the
++ * access file.
+ */
+ if (apr_table_get(r->headers_in,
+ (PROXYREQ_PROXY == r->proxyreq)
+@@ -848,6 +932,7 @@ access_checker(request_rec *r)
+ return HTTP_FORBIDDEN;
+ }
+ }
++#endif
+
+ /* If anon access is allowed, return OK */
+ status = req_check_access(r, conf, &repos_path, &dest_repos_path);
+@@ -856,7 +941,26 @@ access_checker(request_rec *r)
+ if (!conf->authoritative)
+ return DECLINED;
+
++#if USE_FORCE_AUTHN
++ if (authn_configured) {
++ /* We have to check to see if authn is required because if so we must
++ * return UNAUTHORIZED (401) rather than FORBIDDEN (403) since returning
++ * the 403 leaks information about what paths may exist to
++ * unauthenticated users. We must set a note here in order
++ * to use ap_some_authn_rquired() without triggering an infinite
++ * loop since the call will trigger this function to be called again. */
++ apr_table_setn(r->notes, IN_SOME_AUTHN_NOTE, (const char*)1);
++ authn_required = ap_some_authn_required(r);
++ apr_table_unset(r->notes, IN_SOME_AUTHN_NOTE);
++ if (authn_required)
++ {
++ ap_note_auth_failure(r);
++ return HTTP_UNAUTHORIZED;
++ }
++ }
++#else
+ if (!ap_some_auth_required(r))
++#endif
+ log_access_verdict(APLOG_MARK, r, 0, repos_path, dest_repos_path);
+
+ return HTTP_FORBIDDEN;
+@@ -937,6 +1041,17 @@ auth_checker(request_rec *r)
+ return OK;
+ }
+
++#if USE_FORCE_AUTHN
++static int
++force_authn(request_rec *r)
++{
++ if (apr_table_get(r->notes, FORCE_AUTHN_NOTE))
++ return OK;
++
++ return DECLINED;
++}
++#endif
++
+ /*
+ * Module flesh
+ */
+@@ -953,6 +1068,9 @@ register_hooks(apr_pool_t *p)
+ * give SSLOptions +FakeBasicAuth a chance to work. */
+ ap_hook_check_user_id(check_user_id, mod_ssl, NULL, APR_HOOK_FIRST);
+ ap_hook_auth_checker(auth_checker, NULL, NULL, APR_HOOK_FIRST);
++#if USE_FORCE_AUTHN
++ ap_hook_force_authn(force_authn, NULL, NULL, APR_HOOK_FIRST);
++#endif
+ ap_register_provider(p,
+ AUTHZ_SVN__SUBREQ_BYPASS_PROV_GRP,
+ AUTHZ_SVN__SUBREQ_BYPASS_PROV_NAME,
+Index: subversion/tests/cmdline/README
+===================================================================
+--- a/subversion/tests/cmdline/README (revision 1691883)
++++ b/subversion/tests/cmdline/README (working copy)
+@@ -83,6 +83,133 @@ paths adjusted appropriately:
+ Require valid-user
+ </Location>
+
++ <Location /authz-test-work/anon>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ # This may seem unnecessary but granting access to everyone here is necessary
++ # to exercise a bug with httpd 2.3.x+. The "Require all granted" syntax is
++ # new to 2.3.x+ which we can detect with the mod_authz_core.c module
++ # signature. Use the "Allow from all" syntax with older versions for symmetry.
++ <IfModule mod_authz_core.c>
++ Require all granted
++ </IfModule>
++ <IfModule !mod_authz_core.c>
++ Allow from all
++ </IfMOdule>
++ </Location>
++ <Location /authz-test-work/mixed>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ Require valid-user
++ Satisfy Any
++ </Location>
++ <Location /authz-test-work/mixed-noauthwhenanon>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ Require valid-user
++ AuthzSVNNoAuthWhenAnonymousAllowed On
++ </Location>
++ <Location /authz-test-work/authn>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ Require valid-user
++ </Location>
++ <Location /authz-test-work/authn-anonoff>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ Require valid-user
++ AuthzSVNAnonymous Off
++ </Location>
++ <Location /authz-test-work/authn-lcuser>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ Require valid-user
++ AuthzForceUsernameCase Lower
++ </Location>
++ <Location /authz-test-work/authn-lcuser>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ Require valid-user
++ AuthzForceUsernameCase Lower
++ </Location>
++ <Location /authz-test-work/authn-group>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ AuthGroupFile /usr/local/apache2/conf/groups
++ Require group random
++ AuthzSVNAuthoritative Off
++ </Location>
++ <IfModule mod_authz_core.c>
++ <Location /authz-test-work/sallrany>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ AuthzSendForbiddenOnFailure On
++ Satisfy All
++ <RequireAny>
++ Require valid-user
++ Require expr req('ALLOW') == '1'
++ </RequireAny>
++ </Location>
++ <Location /authz-test-work/sallrall>
++ DAV svn
++ SVNParentPath /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/local_tmp
++ AuthzSVNAccessFile /home/yourusernamehere/projects/svn/subversion/tests/cmdline/svn-test-work/authz
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile /usr/local/apache2/conf/users
++ AuthzSendForbiddenOnFailure On
++ Satisfy All
++ <RequireAll>
++ Require valid-user
++ Require expr req('ALLOW') == '1'
++ </RequireAll>
++ </Location>
++ </IfModule>
++
++
+ RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)$ /svn-test-work/repositories/$1
+ RedirectMatch ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)$ /svn-test-work/repositories/$1
+
+@@ -101,8 +228,17 @@ just drop the following 2-line snippet into the
+ ----------------------------
+ jrandom:xCGl35kV9oWCY
+ jconstant:xCGl35kV9oWCY
++JRANDOM:xCGl35kV9oWCY
++JCONSTANT:xCGl35kV9oWCY
+ ----------------------------
+
++and these lines into the
++/usr/local/apache/conf/groups file:
++----------------------------
++random: jrandom
++constant: jconstant
++----------------------------
++
+ Now, (re)start Apache and run the tests over mod_dav_svn.
+
+ You can run a test script over DAV:
+@@ -138,6 +274,8 @@ Note [1]: It would be quite too much to expect tho
+ ----------------------------
+ jrandom:$apr1$3p1.....$FQW6RceW5QhJ2blWDQgKn0
+ jconstant:$apr1$jp1.....$Usrqji1c9H6AbOxOGAzzb0
++ JRANDOM:$apr1$3p1.....$FQW6RceW5QhJ2blWDQgKn0
++ JCONSTANT:$apr1$jp1.....$Usrqji1c9H6AbOxOGAzzb0
+ ----------------------------
+
+
+Index: subversion/tests/cmdline/davautocheck.sh
+===================================================================
+--- a/subversion/tests/cmdline/davautocheck.sh (revision 1691883)
++++ b/subversion/tests/cmdline/davautocheck.sh (working copy)
+@@ -289,8 +289,6 @@ LOAD_MOD_AUTHN_CORE="$(get_loadmodule_config mod_a
+ || fail "Authn_Core module not found."
+ LOAD_MOD_AUTHZ_CORE="$(get_loadmodule_config mod_authz_core)" \
+ || fail "Authz_Core module not found."
+-LOAD_MOD_AUTHZ_HOST="$(get_loadmodule_config mod_authz_host)" \
+- || fail "Authz_Host module not found."
+ LOAD_MOD_UNIXD=$(get_loadmodule_config mod_unixd) \
+ || fail "UnixD module not found"
+ }
+@@ -298,6 +296,10 @@ LOAD_MOD_AUTHN_FILE="$(get_loadmodule_config mod_a
+ || fail "Authn_File module not found."
+ LOAD_MOD_AUTHZ_USER="$(get_loadmodule_config mod_authz_user)" \
+ || fail "Authz_User module not found."
++LOAD_MOD_AUTHZ_GROUPFILE="$(get_loadmodule_config mod_authz_groupfile)" \
++ || fail "Authz_GroupFile module not found."
++LOAD_MOD_AUTHZ_HOST="$(get_loadmodule_config mod_authz_host)" \
++ || fail "Authz_Host module not found."
+ }
+ if [ ${APACHE_MPM:+set} ]; then
+ LOAD_MOD_MPM=$(get_loadmodule_config mod_mpm_$APACHE_MPM) \
+@@ -328,6 +330,7 @@ HTTPD_ERROR_LOG="$HTTPD_ROOT/error_log"
+ HTTPD_MIME_TYPES="$HTTPD_ROOT/mime.types"
+ BASE_URL="http://localhost:$HTTPD_PORT"
+ HTTPD_USERS="$HTTPD_ROOT/users"
++HTTPD_GROUPS="$HTTPD_ROOT/groups"
+
+ mkdir "$HTTPD_ROOT" \
+ || fail "couldn't create temporary directory '$HTTPD_ROOT'"
+@@ -388,6 +391,14 @@ fi
+ say "Adding users for lock authentication"
+ $HTPASSWD -bc $HTTPD_USERS jrandom rayjandom
+ $HTPASSWD -b $HTTPD_USERS jconstant rayjandom
++$HTPASSWD -b $HTTPD_USERS JRANDOM rayjandom
++$HTPASSWD -b $HTTPD_USERS JCONSTANT rayjandom
++
++say "Adding groups for mod_authz_svn tests"
++cat > "$HTTPD_GROUPS" <<__EOF__
++random: jrandom
++constant: jconstant
++__EOF__
+
+ touch $HTTPD_MIME_TYPES
+
+@@ -405,7 +416,9 @@ $LOAD_MOD_AUTHN_CORE
+ $LOAD_MOD_AUTHN_FILE
+ $LOAD_MOD_AUTHZ_CORE
+ $LOAD_MOD_AUTHZ_USER
++$LOAD_MOD_AUTHZ_GROUPFILE
+ $LOAD_MOD_AUTHZ_HOST
++$LOAD_MOD_ACCESS_COMPAT
+ LoadModule authz_svn_module "$MOD_AUTHZ_SVN"
+
+ __EOF__
+@@ -497,6 +510,161 @@ CustomLog "$HTTPD_ROOT/ops" "%t %u %{SVN
+ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
+ ${SVN_PATH_AUTHZ_LINE}
+ </Location>
++<Location /authz-test-work/anon>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ # This may seem unnecessary but granting access to everyone here is necessary
++ # to exercise a bug with httpd 2.3.x+. The "Require all granted" syntax is
++ # new to 2.3.x+ which we can detect with the mod_authz_core.c module
++ # signature. Use the "Allow from all" syntax with older versions for symmetry.
++ <IfModule mod_authz_core.c>
++ Require all granted
++ </IfModule>
++ <IfModule !mod_authz_core.c>
++ Allow from all
++ </IfMOdule>
++ ${SVN_PATH_AUTHZ_LINE}
++</Location>
++<Location /authz-test-work/mixed>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ Require valid-user
++ Satisfy Any
++ ${SVN_PATH_AUTHZ_LINE}
++</Location>
++<Location /authz-test-work/mixed-noauthwhenanon>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ Require valid-user
++ AuthzSVNNoAuthWhenAnonymousAllowed On
++ SVNPathAuthz On
++</Location>
++<Location /authz-test-work/authn>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ Require valid-user
++ ${SVN_PATH_AUTHZ_LINE}
++</Location>
++<Location /authz-test-work/authn-anonoff>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ Require valid-user
++ AuthzSVNAnonymous Off
++ SVNPathAuthz On
++</Location>
++<Location /authz-test-work/authn-lcuser>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ Require valid-user
++ AuthzForceUsernameCase Lower
++ ${SVN_PATH_AUTHZ_LINE}
++</Location>
++<Location /authz-test-work/authn-lcuser>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ Require valid-user
++ AuthzForceUsernameCase Lower
++ ${SVN_PATH_AUTHZ_LINE}
++</Location>
++<Location /authz-test-work/authn-group>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ AuthGroupFile $HTTPD_GROUPS
++ Require group random
++ AuthzSVNAuthoritative Off
++ SVNPathAuthz On
++</Location>
++<IfModule mod_authz_core.c>
++ <Location /authz-test-work/sallrany>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ AuthzSendForbiddenOnFailure On
++ Satisfy All
++ <RequireAny>
++ Require valid-user
++ Require expr req('ALLOW') == '1'
++ </RequireAny>
++ ${SVN_PATH_AUTHZ_LINE}
++ </Location>
++ <Location /authz-test-work/sallrall>
++ DAV svn
++ SVNParentPath "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/local_tmp"
++ AuthzSVNAccessFile "$ABS_BUILDDIR/subversion/tests/cmdline/svn-test-work/authz"
++ SVNAdvertiseV2Protocol ${ADVERTISE_V2_PROTOCOL}
++ SVNCacheRevProps ${CACHE_REVPROPS_SETTING}
++ SVNListParentPath On
++ AuthType Basic
++ AuthName "Subversion Repository"
++ AuthUserFile $HTTPD_USERS
++ AuthzSendForbiddenOnFailure On
++ Satisfy All
++ <RequireAll>
++ Require valid-user
++ Require expr req('ALLOW') == '1'
++ </RequireAll>
++ ${SVN_PATH_AUTHZ_LINE}
++ </Location>
++</IfModule>
+ RedirectMatch permanent ^/svn-test-work/repositories/REDIRECT-PERM-(.*)\$ /svn-test-work/repositories/\$1
+ RedirectMatch ^/svn-test-work/repositories/REDIRECT-TEMP-(.*)\$ /svn-test-work/repositories/\$1
+ __EOF__
+Index: subversion/tests/cmdline/mod_authz_svn_tests.py
+===================================================================
+--- a/subversion/tests/cmdline/mod_authz_svn_tests.py (nonexistent)
++++ b/subversion/tests/cmdline/mod_authz_svn_tests.py (working copy)
+@@ -0,0 +1,1073 @@
++#!/usr/bin/env python
++#
++# mod_authz_svn_tests.py: testing mod_authz_svn
++#
++# Subversion is a tool for revision control.
++# See http://subversion.apache.org for more information.
++#
++# ====================================================================
++# Licensed to the Apache Software Foundation (ASF) under one
++# or more contributor license agreements. See the NOTICE file
++# distributed with this work for additional information
++# regarding copyright ownership. The ASF licenses this file
++# to you under the Apache License, Version 2.0 (the
++# "License"); you may not use this file except in compliance
++# with the License. You may obtain a copy of the License at
++#
++# http://www.apache.org/licenses/LICENSE-2.0
++#
++# Unless required by applicable law or agreed to in writing,
++# software distributed under the License is distributed on an
++# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
++# KIND, either express or implied. See the License for the
++# specific language governing permissions and limitations
++# under the License.
++######################################################################
++
++# General modules
++import os, re, logging
++
++logger = logging.getLogger()
++
++# Our testing module
++import svntest
++
++# (abbreviation)
++Skip = svntest.testcase.Skip_deco
++SkipUnless = svntest.testcase.SkipUnless_deco
++XFail = svntest.testcase.XFail_deco
++Issues = svntest.testcase.Issues_deco
++Issue = svntest.testcase.Issue_deco
++Wimp = svntest.testcase.Wimp_deco
++
++ls_of_D_no_H = '''<html><head><title>repos - Revision 1: /A/D</title></head>
++<body>
++ <h2>repos - Revision 1: /A/D</h2>
++ <ul>
++ <li><a href="../">..</a></li>
++ <li><a href="G/">G/</a></li>
++ <li><a href="gamma">gamma</a></li>
++ </ul>
++</body></html>'''
++
++ls_of_D_H = '''<html><head><title>repos - Revision 1: /A/D</title></head>
++<body>
++ <h2>repos - Revision 1: /A/D</h2>
++ <ul>
++ <li><a href="../">..</a></li>
++ <li><a href="G/">G/</a></li>
++ <li><a href="H/">H/</a></li>
++ <li><a href="gamma">gamma</a></li>
++ </ul>
++</body></html>'''
++
++ls_of_H = '''<html><head><title>repos - Revision 1: /A/D/H</title></head>
++<body>
++ <h2>repos - Revision 1: /A/D/H</h2>
++ <ul>
++ <li><a href="../">..</a></li>
++ <li><a href="chi">chi</a></li>
++ <li><a href="omega">omega</a></li>
++ <li><a href="psi">psi</a></li>
++ </ul>
++</body></html>'''
++
++user1 = svntest.main.wc_author
++user1_upper = user1.upper()
++user1_pass = svntest.main.wc_passwd
++user1_badpass = 'XXX'
++assert user1_pass != user1_badpass, "Passwords can't match"
++user2 = svntest.main.wc_author2
++user2_upper = user2.upper()
++user2_pass = svntest.main.wc_passwd
++user2_badpass = 'XXX'
++assert user2_pass != user2_badpass, "Passwords can't match"
++
++def write_authz_file(sbox):
++ svntest.main.write_authz_file(sbox, {
++ '/': '$anonymous = r\n' +
++ 'jrandom = rw\n' +
++ 'jconstant = rw',
++ '/A/D/H': '$anonymous =\n' +
++ '$authenticated =\n' +
++ 'jrandom = rw'
++ })
++
++def write_authz_file_groups(sbox):
++ authz_name = sbox.authz_name()
++ svntest.main.write_authz_file(sbox,{
++ '/': '* =',
++ })
++
++def verify_get(test_area_url, path, user, pw,
++ expected_status, expected_body, headers):
++ import httplib
++ from urlparse import urlparse
++ import base64
++
++ req_url = test_area_url + path
++
++ loc = urlparse(req_url)
++
++ if loc.scheme == 'http':
++ h = httplib.HTTPConnection(loc.hostname, loc.port)
++ else:
++ h = httplib.HTTPSConnection(loc.hostname, loc.port)
++
++ if headers is None:
++ headers = {}
++
++ if user and pw:
++ auth_info = user + ':' + pw
++ headers['Authorization'] = 'Basic ' + base64.b64encode(auth_info)
++ else:
++ auth_info = "anonymous"
++
++ h.request('GET', req_url, None, headers)
++
++ r = h.getresponse()
++
++ actual_status = r.status
++ if expected_status and expected_status != actual_status:
++
++ logger.warn("Expected status '" + str(expected_status) +
++ "' but got '" + str(actual_status) +
++ "' on url '" + req_url + "' (" +
++ auth_info + ").")
++ raise svntest.Failure
++
++ if expected_body:
++ actual_body = r.read()
++ if expected_body != actual_body:
++ logger.warn("Expected body:")
++ logger.warn(expected_body)
++ logger.warn("But got:")
++ logger.warn(actual_body)
++ logger.warn("on url '" + req_url + "' (" + auth_info + ").")
++ raise svntest.Failure
++
++def verify_gets(test_area_url, tests):
++ for test in tests:
++ verify_get(test_area_url, test['path'], test.get('user'), test.get('pw'),
++ test['status'], test.get('body'), test.get('headers'))
++
++
++######################################################################
++# Tests
++#
++# Each test must return on success or raise on failure.
++
++
++#----------------------------------------------------------------------
++
++
++ at SkipUnless(svntest.main.is_ra_type_dav)
++def anon(sbox):
++ "test anonymous access"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/anon')
++
++ write_authz_file(sbox)
++
++ anon_tests = (
++ { 'path': '', 'status': 301 },
++ { 'path': '/', 'status': 200 },
++ { 'path': '/repos', 'status': 301 },
++ { 'path': '/repos/', 'status': 200 },
++ { 'path': '/repos/A', 'status': 301 },
++ { 'path': '/repos/A/', 'status': 200 },
++ { 'path': '/repos/A/D', 'status': 301 },
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H },
++ { 'path': '/repos/A/D/gamma', 'status': 200 },
++ { 'path': '/repos/A/D/H', 'status': 403 },
++ { 'path': '/repos/A/D/H/', 'status': 403 },
++ { 'path': '/repos/A/D/H/chi', 'status': 403 },
++ # auth isn't configured so nothing should change when passing
++ # authn details
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ )
++
++ verify_gets(test_area_url, anon_tests)
++
++
++ at SkipUnless(svntest.main.is_ra_type_dav)
++def mixed(sbox):
++ "test mixed anonymous and authenticated access"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/mixed')
++
++ write_authz_file(sbox)
++
++ mixed_tests = (
++ { 'path': '', 'status': 301, },
++ { 'path': '/', 'status': 200, },
++ { 'path': '/repos', 'status': 301, },
++ { 'path': '/repos/', 'status': 200, },
++ { 'path': '/repos/A', 'status': 301, },
++ { 'path': '/repos/A/', 'status': 200, },
++ { 'path': '/repos/A/D', 'status': 301, },
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ },
++ { 'path': '/repos/A/D/gamma', 'status': 200, },
++ { 'path': '/repos/A/D/H', 'status': 401, },
++ { 'path': '/repos/A/D/H/', 'status': 401, },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, },
++ # auth is configured and user1 is allowed access to H
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
++ # try with the wrong password for user1
++ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ # auth is configured and user2 is not allowed access to H
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
++ # try with the wrong password for user2
++ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ )
++
++ verify_gets(test_area_url, mixed_tests)
++
++ at SkipUnless(svntest.main.is_ra_type_dav)
++ at XFail(svntest.main.is_httpd_authz_provider_enabled)
++# uses the AuthzSVNNoAuthWhenAnonymousAllowed On directive
++# this is broken with httpd 2.3.x+ since it requires the auth system to accept
++# r->user == NULL and there is a test for this in server/request.c now. It
++# was intended as a workaround for the lack of Satisfy Any in 2.3.x+ which
++# was resolved by httpd with mod_access_compat in 2.3.x+.
++def mixed_noauthwhenanon(sbox):
++ "test mixed with noauthwhenanon directive"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/mixed-noauthwhenanon')
++
++ write_authz_file(sbox)
++
++ noauthwhenanon_tests = (
++ { 'path': '', 'status': 301, },
++ { 'path': '/', 'status': 200, },
++ { 'path': '/repos', 'status': 301, },
++ { 'path': '/repos/', 'status': 200, },
++ { 'path': '/repos/A', 'status': 301, },
++ { 'path': '/repos/A/', 'status': 200, },
++ { 'path': '/repos/A/D', 'status': 301, },
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ },
++ { 'path': '/repos/A/D/gamma', 'status': 200, },
++ { 'path': '/repos/A/D/H', 'status': 401, },
++ { 'path': '/repos/A/D/H/', 'status': 401, },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, },
++ # auth is configured and user1 is allowed access to H
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
++ # try with the wrong password for user1
++ # note that unlike doing this with Satisfy Any this case
++ # actually provides anon access when provided with an invalid
++ # password
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ # auth is configured and user2 is not allowed access to H
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
++ # try with the wrong password for user2
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ )
++
++ verify_gets(test_area_url, noauthwhenanon_tests)
++
++
++ at SkipUnless(svntest.main.is_ra_type_dav)
++def authn(sbox):
++ "test authenticated only access"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/authn')
++
++ write_authz_file(sbox)
++
++ authn_tests = (
++ { 'path': '', 'status': 401, },
++ { 'path': '/', 'status': 401, },
++ { 'path': '/repos', 'status': 401, },
++ { 'path': '/repos/', 'status': 401, },
++ { 'path': '/repos/A', 'status': 401, },
++ { 'path': '/repos/A/', 'status': 401, },
++ { 'path': '/repos/A/D', 'status': 401, },
++ { 'path': '/repos/A/D/', 'status': 401, },
++ { 'path': '/repos/A/D/gamma', 'status': 401, },
++ { 'path': '/repos/A/D/H', 'status': 401, },
++ { 'path': '/repos/A/D/H/', 'status': 401, },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, },
++ # auth is configured and user1 is allowed access to H
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
++ # try with upper case username for user1
++ { 'path': '', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ # try with the wrong password for user1
++ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ # auth is configured and user2 is not allowed access to H
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
++ # try with upper case username for user2
++ { 'path': '', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ # try with the wrong password for user2
++ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ )
++
++ verify_gets(test_area_url, authn_tests)
++
++ at SkipUnless(svntest.main.is_ra_type_dav)
++def authn_anonoff(sbox):
++ "test authenticated only access with anonoff"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/authn-anonoff')
++
++ write_authz_file(sbox)
++
++ anonoff_tests = (
++ { 'path': '', 'status': 401, },
++ { 'path': '/', 'status': 401, },
++ { 'path': '/repos', 'status': 401, },
++ { 'path': '/repos/', 'status': 401, },
++ { 'path': '/repos/A', 'status': 401, },
++ { 'path': '/repos/A/', 'status': 401, },
++ { 'path': '/repos/A/D', 'status': 401, },
++ { 'path': '/repos/A/D/', 'status': 401, },
++ { 'path': '/repos/A/D/gamma', 'status': 401, },
++ { 'path': '/repos/A/D/H', 'status': 401, },
++ { 'path': '/repos/A/D/H/', 'status': 401, },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, },
++ # auth is configured and user1 is allowed access to H
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
++ # try with upper case username for user1
++ { 'path': '', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1_upper, 'pw': user1_pass},
++ # try with the wrong password for user1
++ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ # auth is configured and user2 is not allowed access to H
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
++ # try with upper case username for user2
++ { 'path': '', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ # try with the wrong password for user2
++ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ )
++
++ verify_gets(test_area_url, anonoff_tests)
++
++ at SkipUnless(svntest.main.is_ra_type_dav)
++def authn_lcuser(sbox):
++ "test authenticated only access with lcuser"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/authn-lcuser')
++
++ write_authz_file(sbox)
++
++ lcuser_tests = (
++ # try with upper case username for user1 (works due to lcuser option)
++ { 'path': '', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1_upper, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1_upper, 'pw': user1_pass},
++ # try with upper case username for user2 (works due to lcuser option)
++ { 'path': '', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2_upper, 'pw': user2_pass},
++ )
++
++ verify_gets(test_area_url, lcuser_tests)
++
++# authenticated access only by group - a excuse to use AuthzSVNAuthoritative Off
++# this is terribly messed up, Require group runs after mod_authz_svn.
++# so if mod_authz_svn grants the access then it doesn't matter what the group
++# requirement says. If we reject the access then you can use the AuthzSVNAuthoritative Off
++# directive to fall through to the group check. Overall the behavior of setups like this
++# is almost guaranteed to not be what users expect.
++ at SkipUnless(svntest.main.is_ra_type_dav)
++def authn_group(sbox):
++ "test authenticated only access via groups"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/authn-group')
++
++ # Can't use write_authz_file() as most tests because we want to deny all
++ # access with mod_authz_svn so the tests fall through to the group handling
++ authz_name = sbox.authz_name()
++ svntest.main.write_authz_file(sbox, {
++ '/': '* =',
++ })
++
++ group_tests = (
++ { 'path': '', 'status': 401, },
++ { 'path': '/', 'status': 401, },
++ { 'path': '/repos', 'status': 401, },
++ { 'path': '/repos/', 'status': 401, },
++ { 'path': '/repos/A', 'status': 401, },
++ { 'path': '/repos/A/', 'status': 401, },
++ { 'path': '/repos/A/D', 'status': 401, },
++ { 'path': '/repos/A/D/', 'status': 401, },
++ { 'path': '/repos/A/D/gamma', 'status': 401, },
++ { 'path': '/repos/A/D/H', 'status': 401, },
++ { 'path': '/repos/A/D/H/', 'status': 401, },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, },
++ # auth is configured and user1 is allowed access repo including H
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
++ )
++
++ verify_gets(test_area_url, group_tests)
++
++# This test exists to validate our behavior when used with the new authz
++# provider system introduced in httpd 2.3.x. The Satisfy directive
++# determines how older authz hooks are combined and the RequireA(ll|ny)
++# blocks handles how new authz providers are combined. The overall results of
++# all the authz providers (combined per the Require* blocks) are then
++# combined with the other authz hooks via the Satisfy directive.
++# Meaning this test requires that mod_authz_svn says yes and there is
++# either a valid user or the ALLOW header is 1. The header may seem
++# like a silly test but it's easier to excercise than say a host directive
++# in a repeatable test.
++ at SkipUnless(svntest.main.is_httpd_authz_provider_enabled)
++def authn_sallrany(sbox):
++ "test satisfy all require any config"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/sallrany')
++
++ write_authz_file(sbox)
++
++ allow_header = { 'ALLOW': '1' }
++
++ sallrany_tests = (
++ #anon access isn't allowed without ALLOW header
++ { 'path': '', 'status': 401, },
++ { 'path': '/', 'status': 401, },
++ { 'path': '/repos', 'status': 401, },
++ { 'path': '/repos/', 'status': 401, },
++ { 'path': '/repos/A', 'status': 401, },
++ { 'path': '/repos/A/', 'status': 401, },
++ { 'path': '/repos/A/D', 'status': 401, },
++ { 'path': '/repos/A/D/', 'status': 401, },
++ { 'path': '/repos/A/D/gamma', 'status': 401, },
++ { 'path': '/repos/A/D/H', 'status': 401, },
++ { 'path': '/repos/A/D/H/', 'status': 401, },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, },
++ # auth is configured and user1 is allowed access repo including H
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass},
++ # try with the wrong password for user1
++ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass},
++ # auth is configured and user2 is not allowed access to H
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
++ # try with the wrong password for user2
++ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass},
++ # anon is allowed with the ALLOW header
++ { 'path': '', 'status': 301, 'headers': allow_header },
++ { 'path': '/', 'status': 200, 'headers': allow_header },
++ { 'path': '/repos', 'status': 301, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 200, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 301, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 200, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 301, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'headers': allow_header },
++ # these 3 tests return 403 instead of 401 becasue the config allows
++ # the anon user with the ALLOW header without any auth and the old hook
++ # system has no way of knowing it should return 401 since authentication is
++ # configured and can change the behavior. It could decide to return 401 just on
++ # the basis of authentication being configured but then that leaks info in other
++ # cases so it's better for this case to be "broken".
++ { 'path': '/repos/A/D/H', 'status': 403, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 403, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'headers': allow_header },
++ # auth is configured and user1 is allowed access repo including H
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ # try with the wrong password for user1
++ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ # auth is configured and user2 is not allowed access to H
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ # try with the wrong password for user2
++ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++
++ )
++
++ verify_gets(test_area_url, sallrany_tests)
++
++# See comments on authn_sallrany test for some background on the interaction
++# of Satisfy Any and the newer Require blocks.
++ at SkipUnless(svntest.main.is_httpd_authz_provider_enabled)
++def authn_sallrall(sbox):
++ "test satisfy all require all config"
++ sbox.build(read_only = True, create_wc = False)
++
++ test_area_url = sbox.repo_url.replace('/svn-test-work/local_tmp/repos',
++ '/authz-test-work/sallrall')
++
++ write_authz_file(sbox)
++
++ allow_header = { 'ALLOW': '1' }
++
++ sallrall_tests = (
++ #anon access isn't allowed without ALLOW header
++ { 'path': '', 'status': 403, },
++ { 'path': '/', 'status': 403, },
++ { 'path': '/repos', 'status': 403, },
++ { 'path': '/repos/', 'status': 403, },
++ { 'path': '/repos/A', 'status': 403, },
++ { 'path': '/repos/A/', 'status': 403, },
++ { 'path': '/repos/A/D', 'status': 403, },
++ { 'path': '/repos/A/D/', 'status': 403, },
++ { 'path': '/repos/A/D/gamma', 'status': 403, },
++ { 'path': '/repos/A/D/H', 'status': 403, },
++ { 'path': '/repos/A/D/H/', 'status': 403, },
++ { 'path': '/repos/A/D/H/chi', 'status': 403, },
++ # auth is configured but no access is allowed without the ALLOW header
++ { 'path': '', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1, 'pw': user1_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1, 'pw': user1_pass},
++ # try with the wrong password for user1
++ { 'path': '', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user1, 'pw': user1_badpass},
++ # auth is configured but no access is allowed without the ALLOW header
++ { 'path': '', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass},
++ # try with the wrong password for user2
++ { 'path': '', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/gamma', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_badpass},
++ # anon is not allowed even with ALLOW header
++ { 'path': '', 'status': 401, 'headers': allow_header },
++ { 'path': '/', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 401, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'headers': allow_header },
++ # auth is configured and user1 is allowed access repo including H
++ { 'path': '', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_H,
++ 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 301, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 200, 'body': ls_of_H, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 200, 'user': user1, 'pw': user1_pass, 'headers': allow_header },
++ # try with the wrong password for user1
++ { 'path': '', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user1, 'pw': user1_badpass, 'headers': allow_header },
++ # auth is configured and user2 is not allowed access to H
++ { 'path': '', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 301, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 200, 'body': ls_of_D_no_H,
++ 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 200, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 403, 'user': user2, 'pw': user2_pass, 'headers': allow_header },
++ # try with the wrong password for user2
++ { 'path': '', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/gamma', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++ { 'path': '/repos/A/D/H/chi', 'status': 401, 'user': user2, 'pw': user2_badpass, 'headers': allow_header },
++
++ )
++
++ verify_gets(test_area_url, sallrall_tests)
++
++
++########################################################################
++# Run the tests
++
++
++# list all tests here, starting with None:
++test_list = [ None,
++ anon,
++ mixed,
++ mixed_noauthwhenanon,
++ authn,
++ authn_anonoff,
++ authn_lcuser,
++ authn_group,
++ authn_sallrany,
++ authn_sallrall,
++ ]
++serial_only = True
++
++if __name__ == '__main__':
++ svntest.main.run_tests(test_list)
++ # NOTREACHED
++
++
++### End of file.
+
+Property changes on: subversion/tests/cmdline/mod_authz_svn_tests.py
+___________________________________________________________________
+Added: svn:eol-style
+## -0,0 +1 ##
++native
+\ No newline at end of property
+Index: subversion/tests/cmdline/svntest/main.py
+===================================================================
+--- a/subversion/tests/cmdline/svntest/main.py (revision 1691883)
++++ b/subversion/tests/cmdline/svntest/main.py (working copy)
+@@ -1378,6 +1378,30 @@ def is_plaintext_password_storage_disabled():
+ return False
+ return True
+
++
++# https://issues.apache.org/bugzilla/show_bug.cgi?id=56480
++# https://issues.apache.org/bugzilla/show_bug.cgi?id=55397
++__mod_dav_url_quoting_broken_versions = frozenset([
++ '2.2.27',
++ '2.2.26',
++ '2.2.25',
++ '2.4.9',
++ '2.4.8',
++ '2.4.7',
++ '2.4.6',
++ '2.4.5',
++])
++def is_mod_dav_url_quoting_broken():
++ if is_ra_type_dav():
++ return (options.httpd_version in __mod_dav_url_quoting_broken_versions)
++ return None
++
++def is_httpd_authz_provider_enabled():
++ if is_ra_type_dav():
++ v = options.httpd_version.split('.')
++ return (v[0] == '2' and int(v[1]) >= 3) or int(v[0]) > 2
++ return None
++
+ ######################################################################
+
+
+@@ -1435,6 +1459,8 @@ class TestSpawningThread(threading.Thread):
+ args.append('--ssl-cert=' + options.ssl_cert)
+ if options.http_proxy:
+ args.append('--http-proxy=' + options.http_proxy)
++ if options.httpd_version:
++ args.append('--httpd-version=' + options.httpd_version)
+
+ result, stdout_lines, stderr_lines = spawn_process(command, 0, False, None,
+ *args)
+@@ -1600,6 +1626,12 @@ class TestRunner:
+ sandbox.cleanup_test_paths()
+ return exit_code
+
++def is_httpd_authz_provider_enabled():
++ if is_ra_type_dav():
++ v = options.httpd_version.split('.')
++ return (v[0] == '2' and int(v[1]) >= 3) or int(v[0]) > 2
++ return None
++
+ ######################################################################
+ # Main testing functions
+
+@@ -1780,6 +1812,8 @@ def _create_parser():
+ help='Path to SSL server certificate.')
+ parser.add_option('--http-proxy', action='store',
+ help='Use the HTTP Proxy at hostname:port.')
++ parser.add_option('--httpd-version', action='store',
++ help='Assume HTTPD is this version.')
+ parser.add_option('--tools-bin', action='store', dest='tools_bin',
+ help='Use the svn tools installed in this path')
+
+Index: win-tests.py
+===================================================================
+--- a/win-tests.py (revision 1691883)
++++ b/win-tests.py (working copy)
+@@ -481,6 +481,7 @@ class Httpd:
+ self.httpd_config = os.path.join(self.root, 'httpd.conf')
+ self.httpd_users = os.path.join(self.root, 'users')
+ self.httpd_mime_types = os.path.join(self.root, 'mime.types')
++ self.httpd_groups = os.path.join(self.root, 'groups')
+ self.abs_builddir = abs_builddir
+ self.abs_objdir = abs_objdir
+ self.service_name = 'svn-test-httpd-' + str(httpd_port)
+@@ -494,6 +495,7 @@ class Httpd:
+ create_target_dir(self.root_dir)
+
+ self._create_users_file()
++ self._create_groups_file()
+ self._create_mime_types_file()
+ self._create_dontdothat_file()
+
+@@ -540,6 +542,8 @@ class Httpd:
+ if self.httpd_ver >= 2.2:
+ fp.write(self._sys_module('auth_basic_module', 'mod_auth_basic.so'))
+ fp.write(self._sys_module('authn_file_module', 'mod_authn_file.so'))
++ fp.write(self._sys_module('authz_groupfile_module', 'mod_authz_groupfile.so'))
++ fp.write(self._sys_module('authz_host_module', 'mod_authz_host.so'))
+ else:
+ fp.write(self._sys_module('auth_module', 'mod_auth.so'))
+ fp.write(self._sys_module('alias_module', 'mod_alias.so'))
+@@ -562,6 +566,7 @@ class Httpd:
+ # Define two locations for repositories
+ fp.write(self._svn_repo('repositories'))
+ fp.write(self._svn_repo('local_tmp'))
++ fp.write(self._svn_authz_repo())
+
+ # And two redirects for the redirect tests
+ fp.write('RedirectMatch permanent ^/svn-test-work/repositories/'
+@@ -592,7 +597,18 @@ class Httpd:
+ 'jrandom', 'rayjandom'])
+ os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users,
+ 'jconstant', 'rayjandom'])
++ os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users,
++ 'JRANDOM', 'rayjandom'])
++ os.spawnv(os.P_WAIT, htpasswd, ['htpasswd.exe', '-bp', self.httpd_users,
++ 'JCONSTANT', 'rayjandom'])
+
++ def _create_groups_file(self):
++ "Create groups for mod_authz_svn tests"
++ fp = open(self.httpd_groups, 'w')
++ fp.write('random: jrandom\n')
++ fp.write('constant: jconstant\n')
++ fp.close()
++
+ def _create_mime_types_file(self):
+ "Create empty mime.types file"
+ fp = open(self.httpd_mime_types, 'w')
+@@ -652,6 +668,153 @@ class Httpd:
+ ' DontDoThatConfigFile ' + self._quote(self.dontdothat_file) + '\n' \
+ '</Location>\n'
+
++ def _svn_authz_repo(self):
++ local_tmp = os.path.join(self.abs_builddir,
++ CMDLINE_TEST_SCRIPT_NATIVE_PATH,
++ 'svn-test-work', 'local_tmp')
++ return \
++ '<Location /authz-test-work/anon>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' <IfModule mod_authz_core.c>' + '\n' \
++ ' Require all granted' + '\n' \
++ ' </IfModule>' + '\n' \
++ ' <IfModule !mod_authz_core.c>' + '\n' \
++ ' Allow from all' + '\n' \
++ ' </IfModule>' + '\n' \
++ ' SVNPathAuthz ' + self.path_authz_option + '\n' \
++ '</Location>' + '\n' \
++ '<Location /authz-test-work/mixed>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' Require valid-user' + '\n' \
++ ' Satisfy Any' + '\n' \
++ ' SVNPathAuthz ' + self.path_authz_option + '\n' \
++ '</Location>' + '\n' \
++ '<Location /authz-test-work/mixed-noauthwhenanon>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' Require valid-user' + '\n' \
++ ' AuthzSVNNoAuthWhenAnonymousAllowed On' + '\n' \
++ ' SVNPathAuthz On' + '\n' \
++ '</Location>' + '\n' \
++ '<Location /authz-test-work/authn>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' Require valid-user' + '\n' \
++ ' SVNPathAuthz ' + self.path_authz_option + '\n' \
++ '</Location>' + '\n' \
++ '<Location /authz-test-work/authn-anonoff>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' Require valid-user' + '\n' \
++ ' AuthzSVNAnonymous Off' + '\n' \
++ ' SVNPathAuthz On' + '\n' \
++ '</Location>' + '\n' \
++ '<Location /authz-test-work/authn-lcuser>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' Require valid-user' + '\n' \
++ ' AuthzForceUsernameCase Lower' + '\n' \
++ ' SVNPathAuthz ' + self.path_authz_option + '\n' \
++ '</Location>' + '\n' \
++ '<Location /authz-test-work/authn-lcuser>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' Require valid-user' + '\n' \
++ ' AuthzForceUsernameCase Lower' + '\n' \
++ ' SVNPathAuthz ' + self.path_authz_option + '\n' \
++ '</Location>' + '\n' \
++ '<Location /authz-test-work/authn-group>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' AuthGroupFile ' + self._quote(self.httpd_groups) + '\n' \
++ ' Require group random' + '\n' \
++ ' AuthzSVNAuthoritative Off' + '\n' \
++ ' SVNPathAuthz On' + '\n' \
++ '</Location>' + '\n' \
++ '<IfModule mod_authz_core.c>' + '\n' \
++ '<Location /authz-test-work/sallrany>' + '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' AuthzSendForbiddenOnFailure On' + '\n' \
++ ' Satisfy All' + '\n' \
++ ' <RequireAny>' + '\n' \
++ ' Require valid-user' + '\n' \
++ ' Require expr req(\'ALLOW\') == \'1\'' + '\n' \
++ ' </RequireAny>' + '\n' \
++ ' SVNPathAuthz ' + self.path_authz_option + '\n' \
++ '</Location>' + '\n' \
++ '<Location /authz-test-work/sallrall>'+ '\n' \
++ ' DAV svn' + '\n' \
++ ' SVNParentPath ' + local_tmp + '\n' \
++ ' AuthzSVNAccessFile ' + self._quote(self.authz_file) + '\n' \
++ ' SVNAdvertiseV2Protocol ' + self.httpv2_option + '\n' \
++ ' SVNListParentPath On' + '\n' \
++ ' AuthType Basic' + '\n' \
++ ' AuthName "Subversion Repository"' + '\n' \
++ ' AuthUserFile ' + self._quote(self.httpd_users) + '\n' \
++ ' AuthzSendForbiddenOnFailure On' + '\n' \
++ ' Satisfy All' + '\n' \
++ ' <RequireAll>' + '\n' \
++ ' Require valid-user' + '\n' \
++ ' Require expr req(\'ALLOW\') == \'1\'' + '\n' \
++ ' </RequireAll>' + '\n' \
++ ' SVNPathAuthz ' + self.path_authz_option + '\n' \
++ '</Location>' + '\n' \
++ '</IfModule>' + '\n' \
++
+ def start(self):
+ if self.service:
+ self._start_service()
+@@ -786,6 +949,10 @@ if not test_javahl:
+ log_file = os.path.join(abs_builddir, log)
+ fail_log_file = os.path.join(abs_builddir, faillog)
+
++ if run_httpd:
++ httpd_version = "%.1f" % daemon.httpd_ver
++ else:
++ httpd_version = None
+ th = run_tests.TestHarness(abs_srcdir, abs_builddir,
+ log_file,
+ fail_log_file,
+@@ -795,6 +962,7 @@ if not test_javahl:
+ fsfs_sharding, fsfs_packing,
+ list_tests, svn_bin, mode_filter,
+ milestone_filter,
++ httpd_version=httpd_version,
+ set_log_level=log_level, ssl_cert=ssl_cert)
+ old_cwd = os.getcwd()
+ try:
diff --git a/meta/recipes-devtools/subversion/subversion-1.8.13/subversion-CVE-2015-3187.patch b/meta/recipes-devtools/subversion/subversion-1.8.13/subversion-CVE-2015-3187.patch
new file mode 100644
index 0000000..494e11c
--- /dev/null
+++ b/meta/recipes-devtools/subversion/subversion-1.8.13/subversion-CVE-2015-3187.patch
@@ -0,0 +1,346 @@
+Fix CVE-2015-3187
+
+Patch is from:
+http://subversion.apache.org/security/CVE-2015-3187-advisory.txt
+
+Upstream-Status: Backport
+
+Signed-off-by: Wenzong Fan <wenzong.fan at windriver.com>
+
+Index: subversion/libsvn_repos/rev_hunt.c
+===================================================================
+--- a/subversion/libsvn_repos/rev_hunt.c (revision 1685077)
++++ b/subversion/libsvn_repos/rev_hunt.c (working copy)
+@@ -726,23 +726,6 @@ svn_repos_trace_node_locations(svn_fs_t *fs,
+ if (! prev_path)
+ break;
+
+- if (authz_read_func)
+- {
+- svn_boolean_t readable;
+- svn_fs_root_t *tmp_root;
+-
+- SVN_ERR(svn_fs_revision_root(&tmp_root, fs, revision, currpool));
+- SVN_ERR(authz_read_func(&readable, tmp_root, path,
+- authz_read_baton, currpool));
+- if (! readable)
+- {
+- svn_pool_destroy(lastpool);
+- svn_pool_destroy(currpool);
+-
+- return SVN_NO_ERROR;
+- }
+- }
+-
+ /* Assign the current path to all younger revisions until we reach
+ the copy target rev. */
+ while ((revision_ptr < revision_ptr_end)
+@@ -765,6 +748,20 @@ svn_repos_trace_node_locations(svn_fs_t *fs,
+ path = prev_path;
+ revision = prev_rev;
+
++ if (authz_read_func)
++ {
++ svn_boolean_t readable;
++ SVN_ERR(svn_fs_revision_root(&root, fs, revision, currpool));
++ SVN_ERR(authz_read_func(&readable, root, path,
++ authz_read_baton, currpool));
++ if (!readable)
++ {
++ svn_pool_destroy(lastpool);
++ svn_pool_destroy(currpool);
++ return SVN_NO_ERROR;
++ }
++ }
++
+ /* Clear last pool and switch. */
+ svn_pool_clear(lastpool);
+ tmppool = lastpool;
+Index: subversion/tests/cmdline/authz_tests.py
+===================================================================
+--- a/subversion/tests/cmdline/authz_tests.py (revision 1685077)
++++ b/subversion/tests/cmdline/authz_tests.py (working copy)
+@@ -609,8 +609,10 @@ def authz_log_and_tracing_test(sbox):
+
+ ## cat
+
++ expected_err2 = ".*svn: E195012: Unable to find repository location.*"
++
+ # now see if we can look at the older version of rho
+- svntest.actions.run_and_verify_svn(None, None, expected_err,
++ svntest.actions.run_and_verify_svn(None, None, expected_err2,
+ 'cat', '-r', '2', D_url+'/rho')
+
+ if sbox.repo_url.startswith('http'):
+@@ -627,10 +629,11 @@ def authz_log_and_tracing_test(sbox):
+ svntest.actions.run_and_verify_svn(None, None, expected_err,
+ 'diff', '-r', 'HEAD', G_url+'/rho')
+
+- svntest.actions.run_and_verify_svn(None, None, expected_err,
++ # diff treats the unreadable path as indicating an add so no error
++ svntest.actions.run_and_verify_svn(None, None, [],
+ 'diff', '-r', '2', D_url+'/rho')
+
+- svntest.actions.run_and_verify_svn(None, None, expected_err,
++ svntest.actions.run_and_verify_svn(None, None, [],
+ 'diff', '-r', '2:4', D_url+'/rho')
+
+ # test whether read access is correctly granted and denied
+Index: subversion/tests/libsvn_repos/repos-test.c
+===================================================================
+--- a/subversion/tests/libsvn_repos/repos-test.c (revision 1685077)
++++ b/subversion/tests/libsvn_repos/repos-test.c (working copy)
+@@ -3524,6 +3524,245 @@ test_load_r0_mergeinfo(const svn_test_opts_t *opts
+ return SVN_NO_ERROR;
+ }
+
++static svn_error_t *
++mkdir_delete_copy(svn_repos_t *repos,
++ const char *src,
++ const char *dst,
++ apr_pool_t *pool)
++{
++ svn_fs_t *fs = svn_repos_fs(repos);
++ svn_revnum_t youngest_rev;
++ svn_fs_txn_t *txn;
++ svn_fs_root_t *txn_root, *rev_root;
++
++ SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool));
++
++ SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
++ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
++ SVN_ERR(svn_fs_make_dir(txn_root, "A/T", pool));
++ SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
++
++ SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
++ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
++ SVN_ERR(svn_fs_delete(txn_root, "A/T", pool));
++ SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
++
++ SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
++ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
++ SVN_ERR(svn_fs_revision_root(&rev_root, fs, youngest_rev - 1, pool));
++ SVN_ERR(svn_fs_copy(rev_root, src, txn_root, dst, pool));
++ SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
++
++ return SVN_NO_ERROR;
++}
++
++struct authz_read_baton_t {
++ apr_hash_t *paths;
++ apr_pool_t *pool;
++ const char *deny;
++};
++
++static svn_error_t *
++authz_read_func(svn_boolean_t *allowed,
++ svn_fs_root_t *root,
++ const char *path,
++ void *baton,
++ apr_pool_t *pool)
++{
++ struct authz_read_baton_t *b = baton;
++
++ if (b->deny && !strcmp(b->deny, path))
++ *allowed = FALSE;
++ else
++ *allowed = TRUE;
++
++ svn_hash_sets(b->paths, apr_pstrdup(b->pool, path), (void*)1);
++
++ return SVN_NO_ERROR;
++}
++
++static svn_error_t *
++verify_locations(apr_hash_t *actual,
++ apr_hash_t *expected,
++ apr_hash_t *checked,
++ apr_pool_t *pool)
++{
++ apr_hash_index_t *hi;
++
++ for (hi = apr_hash_first(pool, expected); hi; hi = apr_hash_next(hi))
++ {
++ const svn_revnum_t *rev = svn__apr_hash_index_key(hi);
++ const char *path = apr_hash_get(actual, rev, sizeof(svn_revnum_t));
++
++ if (!path)
++ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
++ "expected %s for %d found (null)",
++ (char*)svn__apr_hash_index_val(hi),
++ (int)*rev);
++ else if (strcmp(path, svn__apr_hash_index_val(hi)))
++ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
++ "expected %s for %d found %s",
++ (char*)svn__apr_hash_index_val(hi),
++ (int)*rev, path);
++
++ }
++
++ for (hi = apr_hash_first(pool, actual); hi; hi = apr_hash_next(hi))
++ {
++ const svn_revnum_t *rev = svn__apr_hash_index_key(hi);
++ const char *path = apr_hash_get(expected, rev, sizeof(svn_revnum_t));
++
++ if (!path)
++ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
++ "found %s for %d expected (null)",
++ (char*)svn__apr_hash_index_val(hi),
++ (int)*rev);
++ else if (strcmp(path, svn__apr_hash_index_val(hi)))
++ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
++ "found %s for %d expected %s",
++ (char*)svn__apr_hash_index_val(hi),
++ (int)*rev, path);
++
++ if (!svn_hash_gets(checked, path))
++ return svn_error_createf(SVN_ERR_TEST_FAILED, NULL,
++ "did not check %s", path);
++ }
++
++ return SVN_NO_ERROR;
++}
++
++static void
++set_expected(apr_hash_t *expected,
++ svn_revnum_t rev,
++ const char *path,
++ apr_pool_t *pool)
++{
++ svn_revnum_t *rp = apr_palloc(pool, sizeof(svn_revnum_t));
++ *rp = rev;
++ apr_hash_set(expected, rp, sizeof(svn_revnum_t), path);
++}
++
++static svn_error_t *
++trace_node_locations_authz(const svn_test_opts_t *opts,
++ apr_pool_t *pool)
++{
++ svn_repos_t *repos;
++ svn_fs_t *fs;
++ svn_revnum_t youngest_rev = 0;
++ svn_fs_txn_t *txn;
++ svn_fs_root_t *txn_root;
++ struct authz_read_baton_t arb;
++ apr_array_header_t *revs = apr_array_make(pool, 10, sizeof(svn_revnum_t));
++ apr_hash_t *locations;
++ apr_hash_t *expected = apr_hash_make(pool);
++ int i;
++
++ /* Create test repository. */
++ SVN_ERR(svn_test__create_repos(&repos, "test-repo-trace-node-locations-authz",
++ opts, pool));
++ fs = svn_repos_fs(repos);
++
++ /* r1 create A */
++ SVN_ERR(svn_fs_begin_txn(&txn, fs, youngest_rev, pool));
++ SVN_ERR(svn_fs_txn_root(&txn_root, txn, pool));
++ SVN_ERR(svn_fs_make_dir(txn_root, "A", pool));
++ SVN_ERR(svn_fs_make_file(txn_root, "A/f", pool));
++ SVN_ERR(svn_test__set_file_contents(txn_root, "A/f", "foobar", pool));
++ SVN_ERR(svn_repos_fs_commit_txn(NULL, repos, &youngest_rev, txn, pool));
++
++ /* r4 copy A to B */
++ SVN_ERR(mkdir_delete_copy(repos, "A", "B", pool));
++
++ /* r7 copy B to C */
++ SVN_ERR(mkdir_delete_copy(repos, "B", "C", pool));
++
++ /* r10 copy C to D */
++ SVN_ERR(mkdir_delete_copy(repos, "C", "D", pool));
++
++ SVN_ERR(svn_fs_youngest_rev(&youngest_rev, fs, pool));
++ SVN_ERR_ASSERT(youngest_rev == 10);
++
++ arb.paths = apr_hash_make(pool);
++ arb.pool = pool;
++ arb.deny = NULL;
++
++ apr_array_clear(revs);
++ for (i = 0; i <= youngest_rev; ++i)
++ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
++ set_expected(expected, 10, "/D/f", pool);
++ set_expected(expected, 8, "/C/f", pool);
++ set_expected(expected, 7, "/C/f", pool);
++ set_expected(expected, 5, "/B/f", pool);
++ set_expected(expected, 4, "/B/f", pool);
++ set_expected(expected, 2, "/A/f", pool);
++ set_expected(expected, 1, "/A/f", pool);
++ apr_hash_clear(arb.paths);
++ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
++ authz_read_func, &arb, pool));
++ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
++
++ apr_array_clear(revs);
++ for (i = 1; i <= youngest_rev; ++i)
++ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
++ apr_hash_clear(arb.paths);
++ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
++ authz_read_func, &arb, pool));
++ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
++
++ apr_array_clear(revs);
++ for (i = 2; i <= youngest_rev; ++i)
++ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
++ set_expected(expected, 1, NULL, pool);
++ apr_hash_clear(arb.paths);
++ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
++ authz_read_func, &arb, pool));
++ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
++
++ apr_array_clear(revs);
++ for (i = 3; i <= youngest_rev; ++i)
++ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
++ set_expected(expected, 2, NULL, pool);
++ apr_hash_clear(arb.paths);
++ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
++ authz_read_func, &arb, pool));
++ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
++
++ apr_array_clear(revs);
++ for (i = 6; i <= youngest_rev; ++i)
++ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
++ set_expected(expected, 5, NULL, pool);
++ set_expected(expected, 4, NULL, pool);
++ apr_hash_clear(arb.paths);
++ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
++ authz_read_func, &arb, pool));
++ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
++
++ arb.deny = "/B/f";
++ apr_array_clear(revs);
++ for (i = 0; i <= youngest_rev; ++i)
++ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
++ apr_hash_clear(arb.paths);
++ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
++ authz_read_func, &arb, pool));
++ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
++
++ apr_array_clear(revs);
++ for (i = 6; i <= youngest_rev; ++i)
++ APR_ARRAY_PUSH(revs, svn_revnum_t) = i;
++ apr_hash_clear(arb.paths);
++ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
++ authz_read_func, &arb, pool));
++ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
++
++ APR_ARRAY_PUSH(revs, svn_revnum_t) = 0;
++ apr_hash_clear(arb.paths);
++ SVN_ERR(svn_repos_trace_node_locations(fs, &locations, "D/f", 10, revs,
++ authz_read_func, &arb, pool));
++ SVN_ERR(verify_locations(locations, expected, arb.paths, pool));
++
++ return SVN_NO_ERROR;
++}
++
+ /* The test table. */
+
+ struct svn_test_descriptor_t test_funcs[] =
+@@ -3573,5 +3812,7 @@ struct svn_test_descriptor_t test_funcs[] =
+ "test dumping with r0 mergeinfo"),
+ SVN_TEST_OPTS_PASS(test_load_r0_mergeinfo,
+ "test loading with r0 mergeinfo"),
++ SVN_TEST_OPTS_PASS(trace_node_locations_authz,
++ "authz for svn_repos_trace_node_locations"),
+ SVN_TEST_NULL
+ };
diff --git a/meta/recipes-devtools/subversion/subversion_1.8.13.bb b/meta/recipes-devtools/subversion/subversion_1.8.13.bb
index f843b95..68934b7 100644
--- a/meta/recipes-devtools/subversion/subversion_1.8.13.bb
+++ b/meta/recipes-devtools/subversion/subversion_1.8.13.bb
@@ -1,6 +1,7 @@
SUMMARY = "Subversion (svn) version control system client"
SECTION = "console/network"
DEPENDS = "apr-util serf sqlite3 file"
+DEPENDS_append_class-native = " file-replacement-native"
RDEPENDS_${PN} = "serf"
LICENSE = "Apache-2"
HOMEPAGE = "http://subversion.tigris.org"
@@ -13,6 +14,8 @@ SRC_URI = "${APACHE_MIRROR}/${BPN}/${BPN}-${PV}.tar.bz2 \
file://libtool2.patch \
file://disable_macos.patch \
file://serf.m4-Regex-modified-to-allow-D-in-paths.patch \
+ file://subversion-CVE-2015-3184.patch \
+ file://subversion-CVE-2015-3187.patch \
"
SRC_URI[md5sum] = "4413417b529d7bdf82f74e50df02e88b"
SRC_URI[sha256sum] = "1099cc68840753b48aedb3a27ebd1e2afbcc84ddb871412e5d500e843d607579"
diff --git a/meta/recipes-devtools/syslinux/syslinux/0010-gcc46-compatibility.patch b/meta/recipes-devtools/syslinux/syslinux/0010-gcc46-compatibility.patch
new file mode 100644
index 0000000..6279258
--- /dev/null
+++ b/meta/recipes-devtools/syslinux/syslinux/0010-gcc46-compatibility.patch
@@ -0,0 +1,37 @@
+don't break with old compilers and -DGNU_EFI_USE_MS_ABI
+It's entirely legitimate to request GNU_EFI_USE_MS_ABI even if the current
+compiler doesn't support it, and gnu-efi should transparently fall back to
+using legacy techniques to set the calling convention. We don't get type
+checking, but at least it will still compile.
+
+Adapted from gnu-efi
+
+Author: Steve Langasek <steve.langasek at ubuntu.com>
+Upstream-Status: Pending
+
+Index: syslinux-6.03/efi64/include/efi/x86_64/efibind.h
+===================================================================
+--- syslinux-6.03.orig/efi64/include/efi/x86_64/efibind.h
++++ syslinux-6.03/efi64/include/efi/x86_64/efibind.h
+@@ -25,8 +25,6 @@ Revision History
+ #if defined(GNU_EFI_USE_MS_ABI)
+ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
+ #define HAVE_USE_MS_ABI 1
+- #else
+- #error Compiler is too old for GNU_EFI_USE_MS_ABI
+ #endif
+ #endif
+
+Index: syslinux-6.03/gnu-efi/gnu-efi-3.0/inc/x86_64/efibind.h
+===================================================================
+--- syslinux-6.03.orig/gnu-efi/gnu-efi-3.0/inc/x86_64/efibind.h
++++ syslinux-6.03/gnu-efi/gnu-efi-3.0/inc/x86_64/efibind.h
+@@ -25,8 +25,6 @@ Revision History
+ #if defined(GNU_EFI_USE_MS_ABI)
+ #if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
+ #define HAVE_USE_MS_ABI 1
+- #else
+- #error Compiler is too old for GNU_EFI_USE_MS_ABI
+ #endif
+ #endif
+
diff --git a/meta/recipes-devtools/syslinux/syslinux/0011-mk-MMD-does-not-take-any-arguments.patch b/meta/recipes-devtools/syslinux/syslinux/0011-mk-MMD-does-not-take-any-arguments.patch
new file mode 100644
index 0000000..443c1cc
--- /dev/null
+++ b/meta/recipes-devtools/syslinux/syslinux/0011-mk-MMD-does-not-take-any-arguments.patch
@@ -0,0 +1,33 @@
+From 0f3d83c25491951f1fa84c7957358ef3d1bcd8a9 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Wed, 9 Sep 2015 17:39:22 +0000
+Subject: [PATCH] mk: -MMD does not take any arguments
+
+Specify -Wp for each option, clang seems to not accept
+-Wp,-x,y,-a,b
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ mk/syslinux.mk | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+Index: syslinux-6.03/mk/syslinux.mk
+===================================================================
+--- syslinux-6.03.orig/mk/syslinux.mk
++++ syslinux-6.03/mk/syslinux.mk
+@@ -82,11 +82,11 @@ ARCH ?= $(strip $(SUBARCH))
+ GCCWARN = -W -Wall -Wstrict-prototypes $(DEBUGOPT)
+
+ # Common stanza to make gcc generate .*.d dependency files
+-MAKEDEPS = -Wp,-MT,$@,-MD,$(dir $@).$(notdir $@).d
++MAKEDEPS = -MT $@ -MD
+
+ # Dependencies that exclude system headers; use whenever we use
+ # header files from the platform.
+-UMAKEDEPS = -Wp,-MT,$@,-MMD,$(dir $@).$(notdir $@).d
++UMAKEDEPS = -MT $@ -MMD
+
+ # Items that are only appropriate during development; this file is
+ # removed when tarballs are generated.
diff --git a/meta/recipes-devtools/syslinux/syslinux_6.03.bb b/meta/recipes-devtools/syslinux/syslinux_6.03.bb
index ef9ae2f..8534528 100644
--- a/meta/recipes-devtools/syslinux/syslinux_6.03.bb
+++ b/meta/recipes-devtools/syslinux/syslinux_6.03.bb
@@ -21,6 +21,8 @@ SRC_URI = "${KERNELORG_MIRROR}/linux/utils/boot/syslinux/syslinux-${PV}.tar.xz \
file://0007-linux-syslinux-implement-ext_construct_sectmap_fs.patch \
file://0008-libinstaller-syslinuxext-implement-syslinux_patch_bo.patch \
file://0009-linux-syslinux-implement-install_bootblock.patch \
+ file://0010-gcc46-compatibility.patch \
+ file://0011-mk-MMD-does-not-take-any-arguments.patch \
"
SRC_URI[md5sum] = "92a253df9211e9c20172796ecf388f13"
diff --git a/meta/recipes-devtools/unfs3/unfs3_0.9.22.r490.bb b/meta/recipes-devtools/unfs3/unfs3_0.9.22.r490.bb
index 45cf545..5130895 100644
--- a/meta/recipes-devtools/unfs3/unfs3_0.9.22.r490.bb
+++ b/meta/recipes-devtools/unfs3/unfs3_0.9.22.r490.bb
@@ -29,6 +29,7 @@ SRC_URI = "svn://svn.code.sf.net/p/unfs3/code;module=trunk;rev=${MOD_PV} \
BBCLASSEXTEND = "native nativesdk"
inherit autotools
+EXTRA_OECONF_append_class-native = " --sbindir=${bindir}"
# Turn off these header detects else the inode search
# will walk entire file systems and this is a real problem
diff --git a/meta/recipes-extended/bash/bash.inc b/meta/recipes-extended/bash/bash.inc
index c06f157..020409f 100644
--- a/meta/recipes-extended/bash/bash.inc
+++ b/meta/recipes-extended/bash/bash.inc
@@ -7,7 +7,7 @@ DEPENDS = "ncurses bison-native"
inherit autotools gettext texinfo update-alternatives ptest
EXTRA_AUTORECONF += "--exclude=autoheader"
-EXTRA_OECONF = "--enable-job-control"
+EXTRA_OECONF = "--enable-job-control --without-bash-malloc"
# If NON_INTERACTIVE_LOGIN_SHELLS is defined, all login shells read the
# startup files, even if they are not interactive.
diff --git a/meta/recipes-extended/byacc/byacc/byacc-open.patch b/meta/recipes-extended/byacc/byacc/byacc-open.patch
index 9160543..0058311 100644
--- a/meta/recipes-extended/byacc/byacc/byacc-open.patch
+++ b/meta/recipes-extended/byacc/byacc/byacc-open.patch
@@ -1,3 +1,15 @@
+Ubuntu defaults to passing _FORTIFY_SOURCE=2 which breaks byacc as it doesn't
+pass enough arguments to open():
+
+ inlined from 'open_tmpfile' at byacc-20150711/main.c:588:5:
+ /usr/include/x86_64-linux-gnu/bits/fcntl2.h:50:24: error: call to '__open_missing_mode' declared with attribute error:
+ open with O_CREAT in second argument needs 3 arguments
+
+Add a mode of 0666 to fix this.
+
+Upstream-Status: Pending
+Signed-off-by: Ross Burton <ross.burton at intel.com>
+
diff --git a/main.c b/main.c
index 620ce3f..82071a4 100644
--- a/main.c
diff --git a/meta/recipes-extended/bzip2/bzip2-1.0.6/fix-bunzip2-qt-returns-0-for-corrupt-archives.patch b/meta/recipes-extended/bzip2/bzip2-1.0.6/fix-bunzip2-qt-returns-0-for-corrupt-archives.patch
new file mode 100644
index 0000000..ece90d9
--- /dev/null
+++ b/meta/recipes-extended/bzip2/bzip2-1.0.6/fix-bunzip2-qt-returns-0-for-corrupt-archives.patch
@@ -0,0 +1,55 @@
+From 8068659388127e8e63f2d2297ba2348c72b20705 Mon Sep 17 00:00:00 2001
+From: Wenzong Fan <wenzong.fan at windriver.com>
+Date: Mon, 12 Oct 2015 03:19:51 -0400
+Subject: [PATCH] bzip2: fix bunzip2 -qt returns 0 for corrupt archives
+
+"bzip2 -t FILE" returns 2 if FILE exists, but is not a valid bzip2 file.
+"bzip2 -qt FILE" returns 0 when this happens, although it does print out
+an error message as is does so.
+
+This has been fix by Debian, just port changes from Debian patch file
+"20-legacy.patch".
+
+Debian defect:
+https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=279025
+
+Fix item from changelog:
+http://archive.debian.net/changelogs/pool/main/b/bzip2/bzip2_1.0.2-7/changelog
+
+ * Fixed "bunzip2 -qt returns 0 for corrupt archives" (Closes: #279025).
+
+Upstream-Status: Pending
+
+Signed-off-by: Wenzong Fan <wenzong.fan at windriver.com>
+---
+ bzip2.c | 14 ++++++++------
+ 1 file changed, 8 insertions(+), 6 deletions(-)
+
+diff --git a/bzip2.c b/bzip2.c
+index 6de9d1d..f2ce668 100644
+--- a/bzip2.c
++++ b/bzip2.c
+@@ -2003,12 +2003,14 @@ IntNative main ( IntNative argc, Char *argv[] )
+ testf ( aa->name );
+ }
+ }
+- if (testFailsExist && noisy) {
+- fprintf ( stderr,
+- "\n"
+- "You can use the `bzip2recover' program to attempt to recover\n"
+- "data from undamaged sections of corrupted files.\n\n"
+- );
++ if (testFailsExist) {
++ if (noisy) {
++ fprintf ( stderr,
++ "\n"
++ "You can use the `bzip2recover' program to attempt to recover\n"
++ "data from undamaged sections of corrupted files.\n\n"
++ );
++ }
+ setExit(2);
+ exit(exitValue);
+ }
+--
+1.9.1
+
diff --git a/meta/recipes-extended/bzip2/bzip2_1.0.6.bb b/meta/recipes-extended/bzip2/bzip2_1.0.6.bb
index 233fe4c..d7b8c06 100644
--- a/meta/recipes-extended/bzip2/bzip2_1.0.6.bb
+++ b/meta/recipes-extended/bzip2/bzip2_1.0.6.bb
@@ -9,6 +9,7 @@ LIC_FILES_CHKSUM = "file://LICENSE;beginline=8;endline=37;md5=40d9d1eb05736d1bfc
PR = "r5"
SRC_URI = "http://www.bzip.org/${PV}/${BP}.tar.gz \
+ file://fix-bunzip2-qt-returns-0-for-corrupt-archives.patch \
file://configure.ac;subdir=${BP} \
file://Makefile.am;subdir=${BP} \
file://run-ptest"
diff --git a/meta/recipes-extended/cpio/cpio_v2.inc b/meta/recipes-extended/cpio/cpio_v2.inc
index 93de4bb..8520ff2 100644
--- a/meta/recipes-extended/cpio/cpio_v2.inc
+++ b/meta/recipes-extended/cpio/cpio_v2.inc
@@ -18,9 +18,11 @@ EXTRA_OECONF += "DEFAULT_RMT_DIR=${base_sbindir}"
do_install () {
autotools_do_install
- install -d ${D}${base_bindir}/
- mv "${D}${bindir}/cpio" "${D}${base_bindir}/cpio"
- rmdir ${D}${bindir}/
+ if [ "${base_bindir}" != "${bindir}" ]; then
+ install -d ${D}${base_bindir}/
+ mv "${D}${bindir}/cpio" "${D}${base_bindir}/cpio"
+ rmdir ${D}${bindir}/
+ fi
}
PACKAGES =+ "${PN}-rmt"
diff --git a/meta/recipes-extended/cronie/cronie_1.5.0.bb b/meta/recipes-extended/cronie/cronie_1.5.0.bb
index 38bd593..697501a 100644
--- a/meta/recipes-extended/cronie/cronie_1.5.0.bb
+++ b/meta/recipes-extended/cronie/cronie_1.5.0.bb
@@ -4,7 +4,7 @@ specified programs at scheduled times and related tools. It is based on the \
original cron and has security and configuration enhancements like the \
ability to use pam and SELinux."
HOMEPAGE = "https://fedorahosted.org/cronie/"
-BUGTRACKER = "mmaslano at redhat.com"
+BUGTRACKER = "https://bugzilla.redhat.com"
# Internet Systems Consortium License
LICENSE = "ISC & BSD-3-Clause & BSD-2-Clause & GPLv2+"
diff --git a/meta/recipes-extended/cups/cups.inc b/meta/recipes-extended/cups/cups.inc
index 57cdf26..2c34da9 100644
--- a/meta/recipes-extended/cups/cups.inc
+++ b/meta/recipes-extended/cups/cups.inc
@@ -28,6 +28,7 @@ PACKAGECONFIG ??= "${@bb.utils.contains('DISTRO_FEATURES', 'zeroconf', 'avahi',
PACKAGECONFIG[avahi] = "--enable-avahi,--disable-avahi,avahi"
PACKAGECONFIG[acl] = "--enable-acl,--disable-acl,acl"
PACKAGECONFIG[pam] = "--enable-pam, --disable-pam, libpam"
+PACKAGECONFIG[xinetd] = "--with-xinetd=${sysconfdir}/xinetd.d,--without-xinetd,xinetd"
EXTRA_OECONF = " \
--enable-gnutls \
@@ -64,6 +65,11 @@ do_install () {
rm -fr ${D}/${localstatedir}/run
rmdir ${D}/${libdir}/${BPN}/driver
+ # Fix the pam configuration file permissions
+ if ${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'true', 'false', d)}; then
+ chmod 0644 ${D}${sysconfdir}/pam.d/cups
+ fi
+
# Remove sysinit script and symlinks if sysvinit is not in DISTRO_FEATURES
if ${@bb.utils.contains('DISTRO_FEATURES','sysvinit','false','true',d)}; then
rm -rf ${D}${sysconfdir}/init.d/
diff --git a/meta/recipes-extended/cwautomacros/cwautomacros_20110201.bb b/meta/recipes-extended/cwautomacros/cwautomacros_20110201.bb
index 43ea3ce..65a99fc 100644
--- a/meta/recipes-extended/cwautomacros/cwautomacros_20110201.bb
+++ b/meta/recipes-extended/cwautomacros/cwautomacros_20110201.bb
@@ -14,6 +14,9 @@ do_configure() {
do_install() {
oe_runmake CWAUTOMACROSPREFIX=${D}${prefix} install
+
+ # cleanup buildpaths in autogen.sh
+ sed -i -e 's,${D},,g' ${D}${prefix}/share/cwautomacros/scripts/autogen.sh
}
BBCLASSEXTEND = "native"
diff --git a/meta/recipes-extended/foomatic/foomatic-filters-4.0.17/CVE-2015-8327.patch b/meta/recipes-extended/foomatic/foomatic-filters-4.0.17/CVE-2015-8327.patch
new file mode 100644
index 0000000..aaedc88
--- /dev/null
+++ b/meta/recipes-extended/foomatic/foomatic-filters-4.0.17/CVE-2015-8327.patch
@@ -0,0 +1,23 @@
+Upstream-Status: Backport
+
+
+http://bzr.linuxfoundation.org/loggerhead/openprinting/cups-filters/revision/7406
+
+Hand applied change to util.c. Fix was for cups-filters but also applied to foomatic-filters.
+
+CVE: CVE-2015-8327
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+Index: util.c
+===================================================================
+--- a/util.c
++++ b/util.c
+@@ -31,7 +31,7 @@
+ #include <assert.h>
+
+
+-const char* shellescapes = "|;<>&!$\'\"#*?()[]{}";
++const char* shellescapes = "|;<>&!$\'\"`#*?()[]{}";
+
+ const char * temp_dir()
+ {
diff --git a/meta/recipes-extended/foomatic/foomatic-filters-4.0.17/CVE-2015-8560.patch b/meta/recipes-extended/foomatic/foomatic-filters-4.0.17/CVE-2015-8560.patch
new file mode 100644
index 0000000..dc973c4
--- /dev/null
+++ b/meta/recipes-extended/foomatic/foomatic-filters-4.0.17/CVE-2015-8560.patch
@@ -0,0 +1,23 @@
+Upstream-Status: Backport
+
+
+http://bzr.linuxfoundation.org/loggerhead/openprinting/cups-filters/revision/7419
+
+Hand applied change to util.c. Fix was for cups-filters but also applied to foomatic-filters.
+
+CVE: CVE-2015-8560
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+Index: util.c
+===================================================================
+--- a/util.c
++++ b/util.c
+@@ -31,7 +31,7 @@
+ #include <assert.h>
+
+
+-const char* shellescapes = "|<>&!$\'\"#*?()[]{}";
++const char* shellescapes = "|;<>&!$\'\"#*?()[]{}";
+
+ const char * temp_dir()
+ {
diff --git a/meta/recipes-extended/foomatic/foomatic-filters_4.0.17.bb b/meta/recipes-extended/foomatic/foomatic-filters_4.0.17.bb
index 790c981..58ef1f5 100644
--- a/meta/recipes-extended/foomatic/foomatic-filters_4.0.17.bb
+++ b/meta/recipes-extended/foomatic/foomatic-filters_4.0.17.bb
@@ -17,6 +17,10 @@ LIC_FILES_CHKSUM = "file://${WORKDIR}/foomatic-filters-${PV}/COPYING;md5=393a5ca
SRC_URI = "http://www.openprinting.org/download/foomatic/foomatic-filters-${PV}.tar.gz"
+SRC_URI += "file://CVE-2015-8560.patch \
+ file://CVE-2015-8327.patch \
+ "
+
SRC_URI[md5sum] = "b05f5dcbfe359f198eef3df5b283d896"
SRC_URI[sha256sum] = "a2e2e53e502571e88eeb9010c45a0d54671f15707ee104f5c9c22b59ea7a33e3"
diff --git a/meta/recipes-extended/ghostscript/ghostscript/png_mak.patch b/meta/recipes-extended/ghostscript/ghostscript/png_mak.patch
new file mode 100644
index 0000000..da900ea
--- /dev/null
+++ b/meta/recipes-extended/ghostscript/ghostscript/png_mak.patch
@@ -0,0 +1,21 @@
+ghostscript: add dependency for pnglibconf.h
+
+When using parallel make jobs, we need to be sure that
+pnglibconf.h is created before we try to reference it,
+so add a rule to png.mak.
+
+Upstream-Status: Pending
+
+Signed-off-by: Joe Slater <jslater at windriver.com>
+
+--- a/base/png.mak
++++ b/base/png.mak
+@@ -81,6 +81,8 @@ png.config-clean :
+ $(pnglibconf_h) : $(PNGSRC)scripts$(D)pnglibconf.h.prebuilt
+ $(CP_) $(PNGSRC)scripts$(D)pnglibconf.h.prebuilt $(pnglibconf_h)
+
++$(MAKEDIRS) : $(pnglibconf_h)
++
+ PDEP=$(AK) $(pnglibconf_h) $(MAKEDIRS)
+
+ png_1=$(PNGOBJ)png.$(OBJ) $(PNGOBJ)pngmem.$(OBJ) $(PNGOBJ)pngerror.$(OBJ) $(PNGOBJ)pngset.$(OBJ)
diff --git a/meta/recipes-extended/ghostscript/ghostscript_9.16.bb b/meta/recipes-extended/ghostscript/ghostscript_9.16.bb
index ec4acc6..d584c49 100644
--- a/meta/recipes-extended/ghostscript/ghostscript_9.16.bb
+++ b/meta/recipes-extended/ghostscript/ghostscript_9.16.bb
@@ -19,6 +19,7 @@ DEPENDS_class-native = ""
SRC_URI_BASE = "http://downloads.ghostscript.com/public/ghostscript-${PV}.tar.gz \
file://ghostscript-9.15-parallel-make.patch \
file://ghostscript-9.16-Werror-return-type.patch \
+ file://png_mak.patch \
"
SRC_URI = "${SRC_URI_BASE} \
diff --git a/meta/recipes-extended/grep/grep_2.21.bb b/meta/recipes-extended/grep/grep_2.21.bb
index 3661098..c51147b 100644
--- a/meta/recipes-extended/grep/grep_2.21.bb
+++ b/meta/recipes-extended/grep/grep_2.21.bb
@@ -23,11 +23,13 @@ do_configure_prepend () {
do_install () {
autotools_do_install
- install -d ${D}${base_bindir}
- mv ${D}${bindir}/grep ${D}${base_bindir}/grep
- mv ${D}${bindir}/egrep ${D}${base_bindir}/egrep
- mv ${D}${bindir}/fgrep ${D}${base_bindir}/fgrep
- rmdir ${D}${bindir}/
+ if [ "${base_bindir}" != "${bindir}" ]; then
+ install -d ${D}${base_bindir}
+ mv ${D}${bindir}/grep ${D}${base_bindir}/grep
+ mv ${D}${bindir}/egrep ${D}${base_bindir}/egrep
+ mv ${D}${bindir}/fgrep ${D}${base_bindir}/fgrep
+ rmdir ${D}${bindir}/
+ fi
}
inherit update-alternatives
diff --git a/meta/recipes-extended/gzip/gzip.inc b/meta/recipes-extended/gzip/gzip.inc
index 94480ec..58e5e0c 100644
--- a/meta/recipes-extended/gzip/gzip.inc
+++ b/meta/recipes-extended/gzip/gzip.inc
@@ -10,12 +10,14 @@ inherit autotools texinfo
EXTRA_OEMAKE_class-target = "GREP=${base_bindir}/grep"
do_install_append () {
- # Rename and move files into /bin (FHS), which is typical place for gzip
- install -d ${D}${base_bindir}
- mv ${D}${bindir}/gunzip ${D}${base_bindir}/gunzip
- mv ${D}${bindir}/gzip ${D}${base_bindir}/gzip
- mv ${D}${bindir}/zcat ${D}${base_bindir}/zcat
- mv ${D}${bindir}/uncompress ${D}${base_bindir}/uncompress
+ if [ "${base_bindir}" != "${bindir}" ]; then
+ # Rename and move files into /bin (FHS), which is typical place for gzip
+ install -d ${D}${base_bindir}
+ mv ${D}${bindir}/gunzip ${D}${base_bindir}/gunzip
+ mv ${D}${bindir}/gzip ${D}${base_bindir}/gzip
+ mv ${D}${bindir}/zcat ${D}${base_bindir}/zcat
+ mv ${D}${bindir}/uncompress ${D}${base_bindir}/uncompress
+ fi
}
inherit update-alternatives
diff --git a/meta/recipes-extended/images/wic-image-minimal.bb b/meta/recipes-extended/images/wic-image-minimal.bb
deleted file mode 100644
index 073c569..0000000
--- a/meta/recipes-extended/images/wic-image-minimal.bb
+++ /dev/null
@@ -1,14 +0,0 @@
-SUMMARY = "An example of partitioned image."
-
-IMAGE_INSTALL = "packagegroup-core-boot ${ROOTFS_PKGMANAGE_BOOTSTRAP}"
-
-IMAGE_FSTYPES = "wic.bz2"
-RM_OLD_IMAGE = "1"
-
-# core-image-minimal is referenced in .wks, so we need its rootfs
-# to be ready before our rootfs
-do_rootfs[depends] += "core-image-minimal:do_rootfs"
-
-IMAGE_ROOTFS_EXTRA_SPACE = "2000"
-
-inherit image
diff --git a/meta/recipes-extended/images/wic-image-minimal.wks b/meta/recipes-extended/images/wic-image-minimal.wks
deleted file mode 100644
index 29cd8f2..0000000
--- a/meta/recipes-extended/images/wic-image-minimal.wks
+++ /dev/null
@@ -1,10 +0,0 @@
-# short-description: Example of partitioned image with complex layout
-# long-description: This image contains boot partition and 3 rootfs partitions
-# created from core-image-minimal and wic-image-minimal image recipes.
-
-part /boot --source bootimg-pcbios --ondisk sda --label boot --active --align 1024
-part / --source rootfs --ondisk sda --fstype=ext2 --label platform --align 1024
-part /core --source rootfs --rootfs-dir=core-image-minimal --ondisk sda --fstype=ext2 --label core --align 1024
-part /backup --source rootfs --rootfs-dir=wic-image-minimal --ondisk sda --fstype=ext2 --label backup --align 1024
-
-bootloader --timeout=0 --append="rootwait console=tty0"
diff --git a/meta/recipes-extended/iptables/iptables/0002-configure.ac-only-check-conntrack-when-libnfnetlink-enabled.patch b/meta/recipes-extended/iptables/iptables/0002-configure.ac-only-check-conntrack-when-libnfnetlink-enabled.patch
new file mode 100644
index 0000000..89ad8f6
--- /dev/null
+++ b/meta/recipes-extended/iptables/iptables/0002-configure.ac-only-check-conntrack-when-libnfnetlink-enabled.patch
@@ -0,0 +1,34 @@
+Package libnetfilter-conntrack depends on package libnfnetlink. iptables
+checks package libnetfilter-conntrack whatever its package config
+libnfnetlink is enabled or not. When libnfnetlink is disabled but
+package libnetfilter-conntrack exists, it fails randomly with:
+
+| In file included from .../iptables/1.4.21-r0/iptables-1.4.21/extensions/libxt_connlabel.c:8:0:
+| .../tmp/sysroots/qemumips/usr/include/libnetfilter_conntrack/libnetfilter_conntrack.h:14:42: fatal error: libnfnetlink/linux_nfnetlink.h: No such file or directory
+| compilation terminated.
+| GNUmakefile:96: recipe for target 'libxt_connlabel.oo' failed
+
+Only check libnetfilter-conntrack when libnfnetlink is enabled to fix it.
+
+Upstream-Status: Pending
+
+Signed-off-by: Kai Kang <kai.kang at windriver.com>
+
+diff --git a/configure.ac b/configure.ac
+index 5d7e62b..e331ee7 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -88,8 +88,12 @@ if test "$ac_cv_header_linux_ip_vs_h" != "yes"; then
+ blacklist_modules="$blacklist_modules ipvs";
+ fi;
+
+-PKG_CHECK_MODULES([libnetfilter_conntrack], [libnetfilter_conntrack >= 1.0.4],
++nfconntrack=0
++AS_IF([test "x$enable_libnfnetlink" = "xyes"], [
++ PKG_CHECK_MODULES([libnetfilter_conntrack], [libnetfilter_conntrack >= 1.0.4],
+ [nfconntrack=1], [nfconntrack=0])
++ ])
++
+ AM_CONDITIONAL([HAVE_LIBNETFILTER_CONNTRACK], [test "$nfconntrack" = 1])
+
+ if test "$nfconntrack" -ne 1; then
diff --git a/meta/recipes-extended/iptables/iptables_1.4.21.bb b/meta/recipes-extended/iptables/iptables_1.4.21.bb
index 31c017b..deea5e5 100644
--- a/meta/recipes-extended/iptables/iptables_1.4.21.bb
+++ b/meta/recipes-extended/iptables/iptables_1.4.21.bb
@@ -23,6 +23,7 @@ SRC_URI = "http://netfilter.org/projects/iptables/files/iptables-${PV}.tar.bz2 \
file://types.h-add-defines-that-are-required-for-if_packet.patch \
file://0001-configure-Add-option-to-enable-disable-libnfnetlink.patch \
file://0001-fix-build-with-musl.patch \
+ file://0002-configure.ac-only-check-conntrack-when-libnfnetlink-enabled.patch \
"
SRC_URI[md5sum] = "536d048c8e8eeebcd9757d0863ebb0c0"
@@ -38,7 +39,7 @@ PACKAGECONFIG ?= "${@bb.utils.contains('DISTRO_FEATURES', 'ipv6', 'ipv6', '', d)
PACKAGECONFIG[ipv6] = "--enable-ipv6,--disable-ipv6,"
# libnfnetlink recipe is in meta-networking layer
-PACKAGECONFIG[libnfnetlink] = "--enable-libnfnetlink,--disable-libnfnetlink,libnfnetlink"
+PACKAGECONFIG[libnfnetlink] = "--enable-libnfnetlink,--disable-libnfnetlink,libnfnetlink libnetfilter-conntrack"
do_configure_prepend() {
# Remove some libtool m4 files
diff --git a/meta/recipes-extended/libaio/libaio/system-linkage.patch b/meta/recipes-extended/libaio/libaio/system-linkage.patch
new file mode 100644
index 0000000..0b1f475
--- /dev/null
+++ b/meta/recipes-extended/libaio/libaio/system-linkage.patch
@@ -0,0 +1,37 @@
+From 94bba6880b1f10c6b3bf33a17ac40935d65a81ae Mon Sep 17 00:00:00 2001
+From: Ross Burton <ross.burton at intel.com>
+Date: Fri, 6 Nov 2015 15:19:46 +0000
+Subject: [PATCH] Don't remove the system libraries and startup files from
+ libaio, as in some build configurations these are required. For example,
+ including conf/include/security_flags.inc on PPC results in:
+
+io_queue_init.os: In function `io_queue_init':
+tmp/work/ppce300c3-poky-linux/libaio/0.3.110-r0/libaio-0.3.110/src/io_queue_init.c:33:
+undefined reference to `__stack_chk_fail_local'
+
+Upstream-Status: Pending
+Signed-off-by: Ross Burton <ross.burton at intel.com>
+---
+ src/Makefile | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/Makefile b/src/Makefile
+index eadb336..56ab701 100644
+--- a/src/Makefile
++++ b/src/Makefile
+@@ -3,10 +3,10 @@ includedir=$(prefix)/include
+ libdir=$(prefix)/lib
+
+ CFLAGS ?= -g -fomit-frame-pointer -O2
+-CFLAGS += -nostdlib -nostartfiles -Wall -I. -fPIC
++CFLAGS += -Wall -I. -fPIC
+ SO_CFLAGS=-shared $(CFLAGS)
+ L_CFLAGS=$(CFLAGS)
+-LINK_FLAGS=
++LINK_FLAGS=$(LDFLAGS)
+ LINK_FLAGS+=$(LDFLAGS)
+
+ soname=libaio.so.1
+--
+2.1.4
+
diff --git a/meta/recipes-extended/libaio/libaio_0.3.110.bb b/meta/recipes-extended/libaio/libaio_0.3.110.bb
index cbe29ce..2adfa0a 100644
--- a/meta/recipes-extended/libaio/libaio_0.3.110.bb
+++ b/meta/recipes-extended/libaio/libaio_0.3.110.bb
@@ -11,18 +11,13 @@ SRC_URI = "${DEBIAN_MIRROR}/main/liba/libaio/libaio_${PV}.orig.tar.gz \
file://destdir.patch \
file://libaio_fix_for_x32.patch \
file://libaio_fix_for_mips_syscalls.patch \
-"
+ file://system-linkage.patch \
+ "
SRC_URI[md5sum] = "2a35602e43778383e2f4907a4ca39ab8"
SRC_URI[sha256sum] = "e019028e631725729376250e32b473012f7cb68e1f7275bfc1bbcdd0f8745f7e"
EXTRA_OEMAKE =+ "prefix=${prefix} includedir=${includedir} libdir=${libdir}"
-# Need libc for stack-protector's __stack_chk_fail_local() bounce function
-LDFLAGS_append_x86 = " -lc"
-
-do_configure () {
- sed -i 's#LINK_FLAGS=.*#LINK_FLAGS=$(LDFLAGS)#' src/Makefile
-}
do_install () {
oe_runmake install DESTDIR=${D}
diff --git a/meta/recipes-extended/libarchive/libarchive/0001-Add-ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS-option.patch b/meta/recipes-extended/libarchive/libarchive/0001-Add-ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS-option.patch
deleted file mode 100644
index 4ca779c..0000000
--- a/meta/recipes-extended/libarchive/libarchive/0001-Add-ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS-option.patch
+++ /dev/null
@@ -1,151 +0,0 @@
-From 59357157706d47c365b2227739e17daba3607526 Mon Sep 17 00:00:00 2001
-From: Alessandro Ghedini <alessandro at ghedini.me>
-Date: Sun, 1 Mar 2015 12:07:45 +0100
-Subject: [PATCH] Add ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS option
-
-This fixes a directory traversal in the cpio tool.
-
-
-Upstream-Status: backport
-
-Signed-off-by: Li Zhou <li.zhou at windriver.com>
----
- cpio/bsdcpio.1 | 3 ++-
- cpio/cpio.c | 2 ++
- libarchive/archive.h | 2 ++
- libarchive/archive_write_disk.3 | 3 +++
- libarchive/archive_write_disk_posix.c | 14 +++++++++++---
- libarchive/test/test_write_disk_secure.c | 23 +++++++++++++++++++++++
- 6 files changed, 43 insertions(+), 4 deletions(-)
-
-diff --git a/cpio/bsdcpio.1 b/cpio/bsdcpio.1
-index f966aa0..e52546e 100644
---- a/cpio/bsdcpio.1
-+++ b/cpio/bsdcpio.1
-@@ -156,7 +156,8 @@ See above for description.
- .It Fl Fl insecure
- (i and p mode only)
- Disable security checks during extraction or copying.
--This allows extraction via symbolic links and path names containing
-+This allows extraction via symbolic links, absolute paths,
-+and path names containing
- .Sq ..
- in the name.
- .It Fl J , Fl Fl xz
-diff --git a/cpio/cpio.c b/cpio/cpio.c
-index 0acde11..b267e9b 100644
---- a/cpio/cpio.c
-+++ b/cpio/cpio.c
-@@ -171,6 +171,7 @@ main(int argc, char *argv[])
- cpio->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
- cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_SYMLINKS;
- cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NODOTDOT;
-+ cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS;
- cpio->extract_flags |= ARCHIVE_EXTRACT_PERM;
- cpio->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
- cpio->extract_flags |= ARCHIVE_EXTRACT_ACL;
-@@ -256,6 +257,7 @@ main(int argc, char *argv[])
- case OPTION_INSECURE:
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_SYMLINKS;
- cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
-+ cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS;
- break;
- case 'L': /* GNU cpio */
- cpio->option_follow_links = 1;
-diff --git a/libarchive/archive.h b/libarchive/archive.h
-index 1f0fc38..ef635ac 100644
---- a/libarchive/archive.h
-+++ b/libarchive/archive.h
-@@ -649,6 +649,8 @@ __LA_DECL int archive_read_set_passphrase_callback(struct archive *,
- /* Default: Do not use HFS+ compression if it was not compressed. */
- /* This has no effect except on Mac OS v10.6 or later. */
- #define ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED (0x8000)
-+/* Default: Do not reject entries with absolute paths */
-+#define ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS (0x10000)
-
- __LA_DECL int archive_read_extract(struct archive *, struct archive_entry *,
- int flags);
-diff --git a/libarchive/archive_write_disk.3 b/libarchive/archive_write_disk.3
-index fa925cc..a2e7afa 100644
---- a/libarchive/archive_write_disk.3
-+++ b/libarchive/archive_write_disk.3
-@@ -177,6 +177,9 @@ The default is to not refuse such paths.
- Note that paths ending in
- .Pa ..
- always cause an error, regardless of this flag.
-+.It Cm ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS
-+Refuse to extract an absolute path.
-+The default is to not refuse such paths.
- .It Cm ARCHIVE_EXTRACT_SPARSE
- Scan data for blocks of NUL bytes and try to recreate them with holes.
- This results in sparse files, independent of whether the archive format
-diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c
-index ab3bdac..c1290eb 100644
---- a/libarchive/archive_write_disk_posix.c
-+++ b/libarchive/archive_write_disk_posix.c
-@@ -2509,8 +2509,9 @@ cleanup_pathname_win(struct archive_write_disk *a)
- /*
- * Canonicalize the pathname. In particular, this strips duplicate
- * '/' characters, '.' elements, and trailing '/'. It also raises an
-- * error for an empty path, a trailing '..' or (if _SECURE_NODOTDOT is
-- * set) any '..' in the path.
-+ * error for an empty path, a trailing '..', (if _SECURE_NODOTDOT is
-+ * set) any '..' in the path or (if ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS
-+ * is set) if the path is absolute.
- */
- static int
- cleanup_pathname(struct archive_write_disk *a)
-@@ -2529,8 +2530,15 @@ cleanup_pathname(struct archive_write_disk *a)
- cleanup_pathname_win(a);
- #endif
- /* Skip leading '/'. */
-- if (*src == '/')
-+ if (*src == '/') {
-+ if (a->flags & ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS) {
-+ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
-+ "Path is absolute");
-+ return (ARCHIVE_FAILED);
-+ }
-+
- separator = *src++;
-+ }
-
- /* Scan the pathname one element at a time. */
- for (;;) {
-diff --git a/libarchive/test/test_write_disk_secure.c b/libarchive/test/test_write_disk_secure.c
-index 31c5bfd..2c94206 100644
---- a/libarchive/test/test_write_disk_secure.c
-+++ b/libarchive/test/test_write_disk_secure.c
-@@ -178,6 +178,29 @@ DEFINE_TEST(test_write_disk_secure)
- assert(S_ISDIR(st.st_mode));
- archive_entry_free(ae);
-
-+ /*
-+ * Without security checks, we should be able to
-+ * extract an absolute path.
-+ */
-+ assert((ae = archive_entry_new()) != NULL);
-+ archive_entry_copy_pathname(ae, "/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
-+ archive_entry_set_mode(ae, S_IFREG | 0777);
-+ assert(0 == archive_write_header(a, ae));
-+ assert(0 == archive_write_finish_entry(a));
-+ assertFileExists("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
-+ assert(0 == unlink("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp"));
-+
-+ /* But with security checks enabled, this should fail. */
-+ assert(archive_entry_clear(ae) != NULL);
-+ archive_entry_copy_pathname(ae, "/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
-+ archive_entry_set_mode(ae, S_IFREG | 0777);
-+ archive_write_disk_set_options(a, ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS);
-+ failure("Extracting an absolute path should fail here.");
-+ assertEqualInt(ARCHIVE_FAILED, archive_write_header(a, ae));
-+ archive_entry_free(ae);
-+ assert(0 == archive_write_finish_entry(a));
-+ assertFileNotExists("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
-+
- assertEqualInt(ARCHIVE_OK, archive_write_free(a));
-
- /* Test the entries on disk. */
---
-1.7.9.5
-
diff --git a/meta/recipes-extended/libarchive/libarchive/libarchive-CVE-2015-2304.patch b/meta/recipes-extended/libarchive/libarchive/libarchive-CVE-2015-2304.patch
new file mode 100644
index 0000000..4ca779c
--- /dev/null
+++ b/meta/recipes-extended/libarchive/libarchive/libarchive-CVE-2015-2304.patch
@@ -0,0 +1,151 @@
+From 59357157706d47c365b2227739e17daba3607526 Mon Sep 17 00:00:00 2001
+From: Alessandro Ghedini <alessandro at ghedini.me>
+Date: Sun, 1 Mar 2015 12:07:45 +0100
+Subject: [PATCH] Add ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS option
+
+This fixes a directory traversal in the cpio tool.
+
+
+Upstream-Status: backport
+
+Signed-off-by: Li Zhou <li.zhou at windriver.com>
+---
+ cpio/bsdcpio.1 | 3 ++-
+ cpio/cpio.c | 2 ++
+ libarchive/archive.h | 2 ++
+ libarchive/archive_write_disk.3 | 3 +++
+ libarchive/archive_write_disk_posix.c | 14 +++++++++++---
+ libarchive/test/test_write_disk_secure.c | 23 +++++++++++++++++++++++
+ 6 files changed, 43 insertions(+), 4 deletions(-)
+
+diff --git a/cpio/bsdcpio.1 b/cpio/bsdcpio.1
+index f966aa0..e52546e 100644
+--- a/cpio/bsdcpio.1
++++ b/cpio/bsdcpio.1
+@@ -156,7 +156,8 @@ See above for description.
+ .It Fl Fl insecure
+ (i and p mode only)
+ Disable security checks during extraction or copying.
+-This allows extraction via symbolic links and path names containing
++This allows extraction via symbolic links, absolute paths,
++and path names containing
+ .Sq ..
+ in the name.
+ .It Fl J , Fl Fl xz
+diff --git a/cpio/cpio.c b/cpio/cpio.c
+index 0acde11..b267e9b 100644
+--- a/cpio/cpio.c
++++ b/cpio/cpio.c
+@@ -171,6 +171,7 @@ main(int argc, char *argv[])
+ cpio->extract_flags |= ARCHIVE_EXTRACT_NO_OVERWRITE_NEWER;
+ cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_SYMLINKS;
+ cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NODOTDOT;
++ cpio->extract_flags |= ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS;
+ cpio->extract_flags |= ARCHIVE_EXTRACT_PERM;
+ cpio->extract_flags |= ARCHIVE_EXTRACT_FFLAGS;
+ cpio->extract_flags |= ARCHIVE_EXTRACT_ACL;
+@@ -256,6 +257,7 @@ main(int argc, char *argv[])
+ case OPTION_INSECURE:
+ cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_SYMLINKS;
+ cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NODOTDOT;
++ cpio->extract_flags &= ~ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS;
+ break;
+ case 'L': /* GNU cpio */
+ cpio->option_follow_links = 1;
+diff --git a/libarchive/archive.h b/libarchive/archive.h
+index 1f0fc38..ef635ac 100644
+--- a/libarchive/archive.h
++++ b/libarchive/archive.h
+@@ -649,6 +649,8 @@ __LA_DECL int archive_read_set_passphrase_callback(struct archive *,
+ /* Default: Do not use HFS+ compression if it was not compressed. */
+ /* This has no effect except on Mac OS v10.6 or later. */
+ #define ARCHIVE_EXTRACT_HFS_COMPRESSION_FORCED (0x8000)
++/* Default: Do not reject entries with absolute paths */
++#define ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS (0x10000)
+
+ __LA_DECL int archive_read_extract(struct archive *, struct archive_entry *,
+ int flags);
+diff --git a/libarchive/archive_write_disk.3 b/libarchive/archive_write_disk.3
+index fa925cc..a2e7afa 100644
+--- a/libarchive/archive_write_disk.3
++++ b/libarchive/archive_write_disk.3
+@@ -177,6 +177,9 @@ The default is to not refuse such paths.
+ Note that paths ending in
+ .Pa ..
+ always cause an error, regardless of this flag.
++.It Cm ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS
++Refuse to extract an absolute path.
++The default is to not refuse such paths.
+ .It Cm ARCHIVE_EXTRACT_SPARSE
+ Scan data for blocks of NUL bytes and try to recreate them with holes.
+ This results in sparse files, independent of whether the archive format
+diff --git a/libarchive/archive_write_disk_posix.c b/libarchive/archive_write_disk_posix.c
+index ab3bdac..c1290eb 100644
+--- a/libarchive/archive_write_disk_posix.c
++++ b/libarchive/archive_write_disk_posix.c
+@@ -2509,8 +2509,9 @@ cleanup_pathname_win(struct archive_write_disk *a)
+ /*
+ * Canonicalize the pathname. In particular, this strips duplicate
+ * '/' characters, '.' elements, and trailing '/'. It also raises an
+- * error for an empty path, a trailing '..' or (if _SECURE_NODOTDOT is
+- * set) any '..' in the path.
++ * error for an empty path, a trailing '..', (if _SECURE_NODOTDOT is
++ * set) any '..' in the path or (if ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS
++ * is set) if the path is absolute.
+ */
+ static int
+ cleanup_pathname(struct archive_write_disk *a)
+@@ -2529,8 +2530,15 @@ cleanup_pathname(struct archive_write_disk *a)
+ cleanup_pathname_win(a);
+ #endif
+ /* Skip leading '/'. */
+- if (*src == '/')
++ if (*src == '/') {
++ if (a->flags & ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS) {
++ archive_set_error(&a->archive, ARCHIVE_ERRNO_MISC,
++ "Path is absolute");
++ return (ARCHIVE_FAILED);
++ }
++
+ separator = *src++;
++ }
+
+ /* Scan the pathname one element at a time. */
+ for (;;) {
+diff --git a/libarchive/test/test_write_disk_secure.c b/libarchive/test/test_write_disk_secure.c
+index 31c5bfd..2c94206 100644
+--- a/libarchive/test/test_write_disk_secure.c
++++ b/libarchive/test/test_write_disk_secure.c
+@@ -178,6 +178,29 @@ DEFINE_TEST(test_write_disk_secure)
+ assert(S_ISDIR(st.st_mode));
+ archive_entry_free(ae);
+
++ /*
++ * Without security checks, we should be able to
++ * extract an absolute path.
++ */
++ assert((ae = archive_entry_new()) != NULL);
++ archive_entry_copy_pathname(ae, "/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
++ archive_entry_set_mode(ae, S_IFREG | 0777);
++ assert(0 == archive_write_header(a, ae));
++ assert(0 == archive_write_finish_entry(a));
++ assertFileExists("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
++ assert(0 == unlink("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp"));
++
++ /* But with security checks enabled, this should fail. */
++ assert(archive_entry_clear(ae) != NULL);
++ archive_entry_copy_pathname(ae, "/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
++ archive_entry_set_mode(ae, S_IFREG | 0777);
++ archive_write_disk_set_options(a, ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS);
++ failure("Extracting an absolute path should fail here.");
++ assertEqualInt(ARCHIVE_FAILED, archive_write_header(a, ae));
++ archive_entry_free(ae);
++ assert(0 == archive_write_finish_entry(a));
++ assertFileNotExists("/tmp/libarchive_test-test_write_disk_secure-absolute_path.tmp");
++
+ assertEqualInt(ARCHIVE_OK, archive_write_free(a));
+
+ /* Test the entries on disk. */
+--
+1.7.9.5
+
diff --git a/meta/recipes-extended/libarchive/libarchive_3.1.2.bb b/meta/recipes-extended/libarchive/libarchive_3.1.2.bb
index aaa3255..716db9a 100644
--- a/meta/recipes-extended/libarchive/libarchive_3.1.2.bb
+++ b/meta/recipes-extended/libarchive/libarchive_3.1.2.bb
@@ -32,7 +32,7 @@ PACKAGECONFIG[nettle] = "--with-nettle,--without-nettle,nettle,"
SRC_URI = "http://libarchive.org/downloads/libarchive-${PV}.tar.gz \
file://libarchive-CVE-2013-0211.patch \
file://pkgconfig.patch \
- file://0001-Add-ARCHIVE_EXTRACT_SECURE_NOABSOLUTEPATHS-option.patch \
+ file://libarchive-CVE-2015-2304.patch \
file://mkdir.patch \
"
diff --git a/meta/recipes-extended/libtirpc/libtirpc/remove-des-uclibc.patch b/meta/recipes-extended/libtirpc/libtirpc/remove-des-uclibc.patch
index d003348..553b1ff 100644
--- a/meta/recipes-extended/libtirpc/libtirpc/remove-des-uclibc.patch
+++ b/meta/recipes-extended/libtirpc/libtirpc/remove-des-uclibc.patch
@@ -3,11 +3,11 @@ uclibc does not provide des functionality unlike eglibc so lets disable ssl supp
Upstream-Status: Inappropriate [uclibc specific]
Signed-off-by: Khem Raj <raj.khem at gmail.com>
-Index: libtirpc-0.2.3/src/rpc_soc.c
+Index: libtirpc-0.2.5/src/rpc_soc.c
===================================================================
---- libtirpc-0.2.3.orig/src/rpc_soc.c 2013-03-10 16:00:51.355282153 -0700
-+++ libtirpc-0.2.3/src/rpc_soc.c 2013-03-10 16:00:51.703282148 -0700
-@@ -520,6 +520,7 @@
+--- libtirpc-0.2.5.orig/src/rpc_soc.c
++++ libtirpc-0.2.5/src/rpc_soc.c
+@@ -520,6 +520,7 @@ clnt_broadcast(prog, vers, proc, xargs,
(resultproc_t) rpc_wrap_bcast, "udp");
}
@@ -15,7 +15,7 @@ Index: libtirpc-0.2.3/src/rpc_soc.c
/*
* Create the client des authentication object. Obsoleted by
* authdes_seccreate().
-@@ -551,6 +552,7 @@
+@@ -551,6 +552,7 @@ fallback:
dummy = authdes_seccreate(servername, window, NULL, ckey);
return (dummy);
}
@@ -23,16 +23,16 @@ Index: libtirpc-0.2.3/src/rpc_soc.c
/*
* Create a client handle for a unix connection. Obsoleted by clnt_vc_create()
-Index: libtirpc-0.2.3/src/Makefile.am
+Index: libtirpc-0.2.5/src/Makefile.am
===================================================================
---- libtirpc-0.2.3.orig/src/Makefile.am 2013-03-10 16:00:51.355282153 -0700
-+++ libtirpc-0.2.3/src/Makefile.am 2013-03-10 16:00:51.703282148 -0700
-@@ -50,7 +50,7 @@
+--- libtirpc-0.2.5.orig/src/Makefile.am
++++ libtirpc-0.2.5/src/Makefile.am
+@@ -51,7 +51,7 @@ libtirpc_la_SOURCES = auth_none.c auth_u
rpc_callmsg.c rpc_generic.c rpc_soc.c rpcb_clnt.c rpcb_prot.c \
rpcb_st_xdr.c svc.c svc_auth.c svc_dg.c svc_auth_unix.c svc_auth_none.c \
svc_generic.c svc_raw.c svc_run.c svc_simple.c svc_vc.c getpeereid.c \
-- auth_time.c auth_des.c authdes_prot.c
-+ auth_time.c
+- auth_time.c auth_des.c authdes_prot.c debug.c
++ auth_time.c debug.c
## XDR
libtirpc_la_SOURCES += xdr.c xdr_rec.c xdr_array.c xdr_float.c xdr_mem.c xdr_reference.c xdr_stdio.c
diff --git a/meta/recipes-extended/libtirpc/libtirpc/va_list.patch b/meta/recipes-extended/libtirpc/libtirpc/va_list.patch
new file mode 100644
index 0000000..855d15b
--- /dev/null
+++ b/meta/recipes-extended/libtirpc/libtirpc/va_list.patch
@@ -0,0 +1,18 @@
+This patch is fixing build with uclibc where compiler ( gcc5 ) says it cant find va_list
+the patch is right for upstreaming as well
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+Upstream-Status: Pending
+
+Index: libtirpc-0.2.5/src/debug.h
+===================================================================
+--- libtirpc-0.2.5.orig/src/debug.h
++++ libtirpc-0.2.5/src/debug.h
+@@ -22,6 +22,7 @@
+ #ifndef _DEBUG_H
+ #define _DEBUG_H
+ #include <syslog.h>
++#include <stdarg.h>
+
+ extern int libtirpc_debug_level;
+ extern int log_stderr;
diff --git a/meta/recipes-extended/libtirpc/libtirpc_0.2.5.bb b/meta/recipes-extended/libtirpc/libtirpc_0.2.5.bb
index 3edf002..330b829 100644
--- a/meta/recipes-extended/libtirpc/libtirpc_0.2.5.bb
+++ b/meta/recipes-extended/libtirpc/libtirpc_0.2.5.bb
@@ -15,7 +15,9 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/${BPN}/${BP}.tar.bz2;name=libtirpc \
file://libtirpc-0.2.1-fortify.patch \
"
-SRC_URI_append_libc-uclibc = " file://remove-des-uclibc.patch"
+SRC_URI_append_libc-uclibc = " file://remove-des-uclibc.patch \
+ file://va_list.patch \
+ "
SRC_URI[libtirpc.md5sum] = "8cd41a5ef5a9b50d0fb6abb98af15368"
SRC_URI[libtirpc.sha256sum] = "62f9de7c2c8686c568757730e1fef66502a0e00d6cacf33546d0267984e002db"
diff --git a/meta/recipes-extended/logrotate/logrotate_3.9.1.bb b/meta/recipes-extended/logrotate/logrotate_3.9.1.bb
index 7d0a159..5f1a601 100644
--- a/meta/recipes-extended/logrotate/logrotate_3.9.1.bb
+++ b/meta/recipes-extended/logrotate/logrotate_3.9.1.bb
@@ -53,7 +53,7 @@ do_compile_prepend() {
}
do_install(){
- oe_runmake install DESTDIR=${D} PREFIX=${D} MANDIR=${mandir} BINDIR=${bindir}
+ oe_runmake install DESTDIR=${D} PREFIX=${D} MANDIR=${mandir}
mkdir -p ${D}${sysconfdir}/logrotate.d
mkdir -p ${D}${sysconfdir}/cron.daily
mkdir -p ${D}${localstatedir}/lib
diff --git a/meta/recipes-extended/lsb/lsb_4.1.bb b/meta/recipes-extended/lsb/lsb_4.1.bb
index 6215b62..c9f6a8b 100644
--- a/meta/recipes-extended/lsb/lsb_4.1.bb
+++ b/meta/recipes-extended/lsb/lsb_4.1.bb
@@ -9,8 +9,8 @@ LSB_CORE_x86 = "lsb-core-ia32"
LSB_CORE_x86-64 = "lsb-core-amd64"
RPROVIDES_${PN} += "${LSB_CORE}"
-# lsb_release needs getopt
-RDEPENDS_${PN} += "${VIRTUAL-RUNTIME_getopt}"
+# lsb_release needs getopt, lsbinitscripts
+RDEPENDS_${PN} += "${VIRTUAL-RUNTIME_getopt} lsbinitscripts"
LIC_FILES_CHKSUM = "file://README;md5=12da544b1a3a5a1795a21160b49471cf"
diff --git a/meta/recipes-extended/lsb/lsbinitscripts_9.64.bb b/meta/recipes-extended/lsb/lsbinitscripts_9.64.bb
index 6db667c..150f6f2 100644
--- a/meta/recipes-extended/lsb/lsbinitscripts_9.64.bb
+++ b/meta/recipes-extended/lsb/lsbinitscripts_9.64.bb
@@ -3,6 +3,8 @@ SECTION = "base"
LICENSE = "GPLv2"
DEPENDS = "popt glib-2.0"
+RDEPENDS_${PN} += "util-linux"
+
LIC_FILES_CHKSUM = "file://COPYING;md5=ebf4e8b49780ab187d51bd26aaa022c6"
S="${WORKDIR}/initscripts-${PV}"
diff --git a/meta/recipes-extended/ltp/ltp/0001-replace-inline-with-static-inline-for-gcc-5.x.patch b/meta/recipes-extended/ltp/ltp/0001-replace-inline-with-static-inline-for-gcc-5.x.patch
new file mode 100644
index 0000000..0b594dc
--- /dev/null
+++ b/meta/recipes-extended/ltp/ltp/0001-replace-inline-with-static-inline-for-gcc-5.x.patch
@@ -0,0 +1,69 @@
+Upstream-Status: Backport [From https://github.com/linux-test-project/ltp/commit/40a2457cb8ec42a05a2f96b0810057efdb2a55f5]
+
+gcc 5.x defaults to -std=gnu11 instead of -std=gnu89 which causes
+semantics for inline functions changes.
+
+The standalone 'inline' causes error with gcc 5 such as:
+
+git/testcases/kernel/syscalls/kill/kill10.c:355: undefined reference to `k_sigaction'
+
+Replace inline with static inline to be compatible with both gcc 4 and 5.
+
+Signed-off-by: Kai Kang <kai.kang at windriver.com>
+---
+ testcases/kernel/controllers/libcontrollers/libcontrollers.c | 2 +-
+ testcases/kernel/controllers/libcontrollers/libcontrollers.h | 2 +-
+ testcases/kernel/syscalls/kill/kill10.c | 4 ++--
+ 3 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/testcases/kernel/controllers/libcontrollers/libcontrollers.c b/testcases/kernel/controllers/libcontrollers/libcontrollers.c
+index b01e1b8..8857bc9 100644
+--- a/testcases/kernel/controllers/libcontrollers/libcontrollers.c
++++ b/testcases/kernel/controllers/libcontrollers/libcontrollers.c
+@@ -146,7 +146,7 @@ int read_file(char *filepath, int action, unsigned int *value)
+ * Prints error message and returns -1
+ */
+
+-inline int error_function(char *msg1, char *msg2)
++static inline int error_function(char *msg1, char *msg2)
+ {
+ fprintf(stdout, "ERROR: %s ", msg1);
+ fprintf(stdout, "%s\n", msg2);
+diff --git a/testcases/kernel/controllers/libcontrollers/libcontrollers.h b/testcases/kernel/controllers/libcontrollers/libcontrollers.h
+index 4001555..a1a0dfa 100644
+--- a/testcases/kernel/controllers/libcontrollers/libcontrollers.h
++++ b/testcases/kernel/controllers/libcontrollers/libcontrollers.h
+@@ -70,7 +70,7 @@ enum{
+ GET_TASKS
+ };
+
+-inline int error_function(char *msg1, char *msg2);
++static inline int error_function(char *msg1, char *msg2);
+
+ unsigned int read_shares_file (char *filepath);
+
+diff --git a/testcases/kernel/syscalls/kill/kill10.c b/testcases/kernel/syscalls/kill/kill10.c
+index 982d9da..33dbcd3 100644
+--- a/testcases/kernel/syscalls/kill/kill10.c
++++ b/testcases/kernel/syscalls/kill/kill10.c
+@@ -185,7 +185,7 @@ int child_checklist_total = 0;
+ int checklist_cmp(const void *a, const void *b);
+ void checklist_reset(int bit);
+
+-inline int k_sigaction(int sig, struct sigaction *sa, struct sigaction *osa);
++static inline int k_sigaction(int sig, struct sigaction *sa, struct sigaction *osa);
+
+ char *TCID = "kill10";
+ int TST_TOTAL = 1;
+@@ -756,7 +756,7 @@ void checklist_reset(int bit)
+
+ }
+
+-inline int k_sigaction(int sig, struct sigaction *sa, struct sigaction *osa)
++static inline int k_sigaction(int sig, struct sigaction *sa, struct sigaction *osa)
+ {
+ int ret;
+ if ((ret = sigaction(sig, sa, osa)) == -1) {
+---
+-1.9.1
+-
diff --git a/meta/recipes-extended/ltp/ltp_20150420.bb b/meta/recipes-extended/ltp/ltp_20150420.bb
index 108ebf1..ed46b5e 100644
--- a/meta/recipes-extended/ltp/ltp_20150420.bb
+++ b/meta/recipes-extended/ltp/ltp_20150420.bb
@@ -29,6 +29,7 @@ SRC_URI = "git://github.com/linux-test-project/ltp.git \
file://add-knob-for-numa.patch \
file://add-knob-for-tirpc.patch \
file://0001-ltp-vma03-fix-the-alginment-of-page-size.patch \
+ file://0001-replace-inline-with-static-inline-for-gcc-5.x.patch \
"
S = "${WORKDIR}/git"
diff --git a/meta/recipes-extended/mailx/mailx_12.5-5.bb b/meta/recipes-extended/mailx/mailx_12.5-5.bb
index ffa9049..c87c582 100644
--- a/meta/recipes-extended/mailx/mailx_12.5-5.bb
+++ b/meta/recipes-extended/mailx/mailx_12.5-5.bb
@@ -41,3 +41,8 @@ EXTRA_OEMAKE = "SENDMAIL=${sbindir}/sendmail IPv6=-DHAVE_IPv6_FUNCS PREFIX=/usr
# fio.c:56:17: fatal error: ssl.h: No such file or directory
# #include <ssl.h>
PARALLEL_MAKE = ""
+
+# Causes gcc to get stuck and eat all available memory in qemuarm builds
+# http://errors.yoctoproject.org/Errors/Details/20488/
+ARM_INSTRUCTION_SET_armv4 = "arm"
+ARM_INSTRUCTION_SET_armv5 = "arm"
diff --git a/meta/recipes-extended/pam/libpam/use-utmpx.patch b/meta/recipes-extended/pam/libpam/use-utmpx.patch
new file mode 100644
index 0000000..dd04bbb
--- /dev/null
+++ b/meta/recipes-extended/pam/libpam/use-utmpx.patch
@@ -0,0 +1,233 @@
+utmp() may not be configured in and use posix compliant utmpx always
+UTMP is SVID legacy, UTMPX is mandated by POSIX
+
+Upstream-Status: Pending
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+Index: Linux-PAM-1.2.1/libpam/pam_modutil_getlogin.c
+===================================================================
+--- Linux-PAM-1.2.1.orig/libpam/pam_modutil_getlogin.c
++++ Linux-PAM-1.2.1/libpam/pam_modutil_getlogin.c
+@@ -10,8 +10,7 @@
+
+ #include <stdlib.h>
+ #include <unistd.h>
+-#include <utmp.h>
+-
++#include <utmpx.h>
+ #define _PAMMODUTIL_GETLOGIN "_pammodutil_getlogin"
+
+ const char *
+@@ -22,7 +21,7 @@ pam_modutil_getlogin(pam_handle_t *pamh)
+ const void *void_curr_tty;
+ const char *curr_tty;
+ char *curr_user;
+- struct utmp *ut, line;
++ struct utmpx *ut, line;
+
+ status = pam_get_data(pamh, _PAMMODUTIL_GETLOGIN, &logname);
+ if (status == PAM_SUCCESS) {
+@@ -48,10 +47,10 @@ pam_modutil_getlogin(pam_handle_t *pamh)
+ }
+ logname = NULL;
+
+- setutent();
++ setutxent();
+ strncpy(line.ut_line, curr_tty, sizeof(line.ut_line));
+
+- if ((ut = getutline(&line)) == NULL) {
++ if ((ut = getutxline(&line)) == NULL) {
+ goto clean_up_and_go_home;
+ }
+
+@@ -74,7 +73,7 @@ pam_modutil_getlogin(pam_handle_t *pamh)
+
+ clean_up_and_go_home:
+
+- endutent();
++ endutxent();
+
+ return logname;
+ }
+Index: Linux-PAM-1.2.1/modules/pam_issue/pam_issue.c
+===================================================================
+--- Linux-PAM-1.2.1.orig/modules/pam_issue/pam_issue.c
++++ Linux-PAM-1.2.1/modules/pam_issue/pam_issue.c
+@@ -25,7 +25,7 @@
+ #include <string.h>
+ #include <unistd.h>
+ #include <sys/utsname.h>
+-#include <utmp.h>
++#include <utmpx.h>
+ #include <time.h>
+ #include <syslog.h>
+
+@@ -246,13 +246,13 @@ read_issue_quoted(pam_handle_t *pamh, FI
+ case 'U':
+ {
+ unsigned int users = 0;
+- struct utmp *ut;
+- setutent();
+- while ((ut = getutent())) {
++ struct utmpx *ut;
++ setutxent();
++ while ((ut = getutxent())) {
+ if (ut->ut_type == USER_PROCESS)
+ ++users;
+ }
+- endutent();
++ endutxent();
+ if (c == 'U')
+ snprintf (buf, sizeof buf, "%u %s", users,
+ (users == 1) ? "user" : "users");
+Index: Linux-PAM-1.2.1/modules/pam_lastlog/pam_lastlog.c
+===================================================================
+--- Linux-PAM-1.2.1.orig/modules/pam_lastlog/pam_lastlog.c
++++ Linux-PAM-1.2.1/modules/pam_lastlog/pam_lastlog.c
+@@ -15,8 +15,9 @@
+ #include <errno.h>
+ #ifdef HAVE_UTMP_H
+ # include <utmp.h>
+-#else
+-# include <lastlog.h>
++#endif
++#ifdef HAVE_UTMPX_H
++# include <utmpx.h>
+ #endif
+ #include <pwd.h>
+ #include <stdlib.h>
+@@ -27,6 +28,12 @@
+ #include <syslog.h>
+ #include <unistd.h>
+
++#ifndef HAVE_UTMP_H
++#define UT_LINESIZE 32
++#define UT_HOSTSIZE 32
++#define UT_NAMESIZE 256
++#endif
++
+ #if defined(hpux) || defined(sunos) || defined(solaris)
+ # ifndef _PATH_LASTLOG
+ # define _PATH_LASTLOG "/usr/adm/lastlog"
+@@ -38,7 +45,7 @@
+ # define UT_LINESIZE 12
+ # endif /* UT_LINESIZE */
+ #endif
+-#if defined(hpux)
++#if defined(hpux) || !defined HAVE_UTMP_H
+ struct lastlog {
+ time_t ll_time;
+ char ll_line[UT_LINESIZE];
+@@ -447,8 +454,8 @@ last_login_failed(pam_handle_t *pamh, in
+ {
+ int retval;
+ int fd;
+- struct utmp ut;
+- struct utmp utuser;
++ struct utmpx ut;
++ struct utmpx utuser;
+ int failed = 0;
+ char the_time[256];
+ char *date = NULL;
+Index: Linux-PAM-1.2.1/modules/pam_limits/pam_limits.c
+===================================================================
+--- Linux-PAM-1.2.1.orig/modules/pam_limits/pam_limits.c
++++ Linux-PAM-1.2.1/modules/pam_limits/pam_limits.c
+@@ -33,7 +33,7 @@
+ #include <sys/resource.h>
+ #include <limits.h>
+ #include <glob.h>
+-#include <utmp.h>
++#include <utmpx.h>
+ #ifndef UT_USER /* some systems have ut_name instead of ut_user */
+ #define UT_USER ut_user
+ #endif
+@@ -227,7 +227,7 @@ static int
+ check_logins (pam_handle_t *pamh, const char *name, int limit, int ctrl,
+ struct pam_limit_s *pl)
+ {
+- struct utmp *ut;
++ struct utmpx *ut;
+ int count;
+
+ if (ctrl & PAM_DEBUG_ARG) {
+@@ -242,7 +242,7 @@ check_logins (pam_handle_t *pamh, const
+ return LOGIN_ERR;
+ }
+
+- setutent();
++ setutxent();
+
+ /* Because there is no definition about when an application
+ actually adds a utmp entry, some applications bizarrely do the
+@@ -260,7 +260,7 @@ check_logins (pam_handle_t *pamh, const
+ count = 1;
+ }
+
+- while((ut = getutent())) {
++ while((ut = getutxent())) {
+ #ifdef USER_PROCESS
+ if (ut->ut_type != USER_PROCESS) {
+ continue;
+@@ -296,7 +296,7 @@ check_logins (pam_handle_t *pamh, const
+ break;
+ }
+ }
+- endutent();
++ endutxent();
+ if (count > limit) {
+ if (name) {
+ pam_syslog(pamh, LOG_WARNING,
+Index: Linux-PAM-1.2.1/modules/pam_timestamp/pam_timestamp.c
+===================================================================
+--- Linux-PAM-1.2.1.orig/modules/pam_timestamp/pam_timestamp.c
++++ Linux-PAM-1.2.1/modules/pam_timestamp/pam_timestamp.c
+@@ -56,7 +56,7 @@
+ #include <time.h>
+ #include <sys/time.h>
+ #include <unistd.h>
+-#include <utmp.h>
++#include <utmpx.h>
+ #include <syslog.h>
+ #include <paths.h>
+ #include "hmacsha1.h"
+@@ -197,15 +197,15 @@ timestamp_good(time_t then, time_t now,
+ static int
+ check_login_time(const char *ruser, time_t timestamp)
+ {
+- struct utmp utbuf, *ut;
++ struct utmpx utbuf, *ut;
+ time_t oldest_login = 0;
+
+- setutent();
++ setutxent();
+ while(
+ #ifdef HAVE_GETUTENT_R
+- !getutent_r(&utbuf, &ut)
++ !getutxent_r(&utbuf, &ut)
+ #else
+- (ut = getutent()) != NULL
++ (ut = getutxent()) != NULL
+ #endif
+ ) {
+ if (ut->ut_type != USER_PROCESS) {
+@@ -218,7 +218,7 @@ check_login_time(const char *ruser, time
+ oldest_login = ut->ut_tv.tv_sec;
+ }
+ }
+- endutent();
++ endutxent();
+ if(oldest_login == 0 || timestamp < oldest_login) {
+ return PAM_AUTH_ERR;
+ }
+Index: Linux-PAM-1.2.1/modules/pam_unix/support.c
+===================================================================
+--- Linux-PAM-1.2.1.orig/modules/pam_unix/support.c
++++ Linux-PAM-1.2.1/modules/pam_unix/support.c
+@@ -13,7 +13,6 @@
+ #include <pwd.h>
+ #include <shadow.h>
+ #include <limits.h>
+-#include <utmp.h>
+ #include <errno.h>
+ #include <signal.h>
+ #include <ctype.h>
diff --git a/meta/recipes-extended/pam/libpam_1.2.1.bb b/meta/recipes-extended/pam/libpam_1.2.1.bb
index ac3097e..0353356 100644
--- a/meta/recipes-extended/pam/libpam_1.2.1.bb
+++ b/meta/recipes-extended/pam/libpam_1.2.1.bb
@@ -28,7 +28,9 @@ SRC_URI = "http://linux-pam.org/library/Linux-PAM-${PV}.tar.bz2 \
SRC_URI[md5sum] = "9dc53067556d2dd567808fd509519dd6"
SRC_URI[sha256sum] = "342b1211c0d3b203a7df2540a5b03a428a087bd8a48c17e49ae268f992b334d9"
-SRC_URI_append_libc-uclibc = " file://pam-no-innetgr.patch"
+SRC_URI_append_libc-uclibc = " file://pam-no-innetgr.patch \
+ file://use-utmpx.patch"
+
SRC_URI_append_libc-musl = " file://pam-no-innetgr.patch"
DEPENDS = "bison flex flex-native cracklib"
diff --git a/meta/recipes-extended/quota/quota/remove_non_posix_types.patch b/meta/recipes-extended/quota/quota/remove_non_posix_types.patch
index 5442d98..06ff13c 100644
--- a/meta/recipes-extended/quota/quota/remove_non_posix_types.patch
+++ b/meta/recipes-extended/quota/quota/remove_non_posix_types.patch
@@ -183,3 +183,16 @@ Index: quota-tools/quot.h
} du_t;
#define NDU 60000
+Index: quota-tools/rquota_server.c
+===================================================================
+--- quota-tools.orig/rquota_server.c
++++ quota-tools/rquota_server.c
+@@ -60,7 +60,7 @@ extern char nfs_pseudoroot[PATH_MAX];
+ */
+ extern struct authunix_parms *unix_cred;
+
+-int in_group(gid_t * gids, u_int len, gid_t gid)
++int in_group(gid_t * gids, uint32_t len, gid_t gid)
+ {
+ gid_t *gidsp = gids + len;
+
diff --git a/meta/recipes-extended/quota/quota_4.02.bb b/meta/recipes-extended/quota/quota_4.02.bb
index 124b0a3..673d584 100644
--- a/meta/recipes-extended/quota/quota_4.02.bb
+++ b/meta/recipes-extended/quota/quota_4.02.bb
@@ -23,7 +23,7 @@ DEPENDS = "gettext-native e2fsprogs"
inherit autotools-brokensep gettext pkgconfig
-CFLAGS += "-I=${includedir}/tirpc"
+CFLAGS += "-I${STAGING_INCDIR}/tirpc"
LDFLAGS += "-ltirpc"
ASNEEDED = ""
EXTRA_OEMAKE += 'STRIP=""'
diff --git a/meta/recipes-extended/rpcbind/rpcbind/0001-uclibc-nss.patch b/meta/recipes-extended/rpcbind/rpcbind/0001-uclibc-nss.patch
deleted file mode 100644
index afa55f3..0000000
--- a/meta/recipes-extended/rpcbind/rpcbind/0001-uclibc-nss.patch
+++ /dev/null
@@ -1,30 +0,0 @@
-Upstream-Status: Pending
-
-From b8f0d7b7318ba344c25785d6f5cf3f8de98012d4 Mon Sep 17 00:00:00 2001
-From: Natanael Copa <ncopa at alpinelinux.org>
-Date: Tue, 2 Feb 2010 09:36:03 +0000
-Subject: [PATCH 1/2] uclibc-nss
-
----
- src/rpcbind.c | 4 ++++
- 1 files changed, 4 insertions(+), 0 deletions(-)
-
-diff --git a/src/rpcbind.c b/src/rpcbind.c
-index 525ffba..1fe1a60 100644
---- a/src/rpcbind.c
-+++ b/src/rpcbind.c
-@@ -67,7 +67,11 @@
- #include <pwd.h>
- #include <string.h>
- #include <errno.h>
-+#if defined(__UCLIBC__)
-+#define __nss_configure_lookup(x,y)
-+#else
- #include <nss.h>
-+#endif
- #include "config.h"
- #include "rpcbind.h"
-
---
-1.6.6.1
-
diff --git a/meta/recipes-extended/rpcbind/rpcbind/cve-2015-7236.patch b/meta/recipes-extended/rpcbind/rpcbind/cve-2015-7236.patch
new file mode 100644
index 0000000..f156290
--- /dev/null
+++ b/meta/recipes-extended/rpcbind/rpcbind/cve-2015-7236.patch
@@ -0,0 +1,83 @@
+commit 06f7ebb1dade2f0dbf872ea2bedf17cff4734bdd
+Author: Olaf Kirch <okir at ...e.de>
+Date: Thu Aug 6 16:27:20 2015 +0200
+
+ Fix memory corruption in PMAP_CALLIT code
+
+ - A PMAP_CALLIT call comes in on IPv4 UDP
+ - rpcbind duplicates the caller's address to a netbuf and stores it in
+ FINFO[0].caller_addr. caller_addr->buf now points to a memory region A
+ with a size of 16 bytes
+ - rpcbind forwards the call to the local service, receives a reply
+ - when processing the reply, it does this in xprt_set_caller:
+ xprt->xp_rtaddr = *FINFO[0].caller_addr
+ It sends out the reply, and then frees the netbuf caller_addr and
+ caller_addr.buf.
+ However, it does not clear xp_rtaddr, so xp_rtaddr.buf now refers
+ to memory region A, which is free.
+ - When the next call comes in on the UDP/IPv4 socket, svc_dg_recv will
+ be called, which will set xp_rtaddr to the client's address.
+ It will reuse the buffer inside xp_rtaddr, ie it will write a
+ sockaddr_in to region A
+
+ Some time down the road, an incoming TCP connection is accepted,
+ allocating a fresh SVCXPRT. The memory region A is inside the
+ new SVCXPRT
+
+ - While processing the TCP call, another UDP call comes in, again
+ overwriting region A with the client's address
+ - TCP client closes connection. In svc_destroy, we now trip over
+ the garbage left in region A
+
+ We ran into the case where a commercial scanner was triggering
+ occasional rpcbind segfaults. The core file that was captured showed
+ a corrupted xprt->xp_netid pointer that was really a sockaddr_in.
+
+ Signed-off-by: Olaf Kirch <okir at ...e.de>
+
+ Upstream-Status: Backport
+
+ Signed-off-by: Li Zhou <li.zhou at windriver.com>
+---
+ src/rpcb_svc_com.c | 23 ++++++++++++++++++++++-
+ 1 file changed, 22 insertions(+), 1 deletion(-)
+
+Index: rpcbind-0.1.6+git20080930/src/rpcb_svc_com.c
+===================================================================
+--- rpcbind-0.1.6+git20080930.orig/src/rpcb_svc_com.c
++++ rpcbind-0.1.6+git20080930/src/rpcb_svc_com.c
+@@ -1298,12 +1298,33 @@ check_rmtcalls(struct pollfd *pfds, int
+ return (ncallbacks_found);
+ }
+
++/*
++ * This is really a helper function defined in libtirpc, but unfortunately, it hasn't
++ * been exported yet.
++ */
++static struct netbuf *
++__rpc_set_netbuf(struct netbuf *nb, const void *ptr, size_t len)
++{
++ if (nb->len != len) {
++ if (nb->len)
++ mem_free(nb->buf, nb->len);
++ nb->buf = mem_alloc(len);
++ if (nb->buf == NULL)
++ return NULL;
++
++ nb->maxlen = nb->len = len;
++ }
++ memcpy(nb->buf, ptr, len);
++ return nb;
++}
++
+ static void
+ xprt_set_caller(SVCXPRT *xprt, struct finfo *fi)
+ {
++ const struct netbuf *caller = fi->caller_addr;
+ u_int32_t *xidp;
+
+- *(svc_getrpccaller(xprt)) = *(fi->caller_addr);
++ __rpc_set_netbuf(svc_getrpccaller(xprt), caller->buf, caller->len);
+ xidp = __rpcb_get_dg_xidp(xprt);
+ *xidp = fi->caller_xid;
+ }
diff --git a/meta/recipes-extended/rpcbind/rpcbind_0.2.3.bb b/meta/recipes-extended/rpcbind/rpcbind_0.2.3.bb
index 3336021..ecd3ba8 100644
--- a/meta/recipes-extended/rpcbind/rpcbind_0.2.3.bb
+++ b/meta/recipes-extended/rpcbind/rpcbind_0.2.3.bb
@@ -19,11 +19,10 @@ SRC_URI = "${SOURCEFORGE_MIRROR}/rpcbind/rpcbind-${PV}.tar.bz2 \
file://rpcbind.conf \
file://rpcbind.socket \
file://rpcbind.service \
+ file://cve-2015-7236.patch \
"
MUSLPATCHES_libc-musl = "file://musl-sunrpc.patch"
-UCLIBCPATCHES_libc-uclibc = "file://0001-uclibc-nss.patch \
- "
UCLIBCPATCHES ?= ""
MUSLPATCHES ?= ""
diff --git a/meta/recipes-extended/screen/screen/0001-Fix-stack-overflow-due-to-too-deep-recursion.patch b/meta/recipes-extended/screen/screen/0001-Fix-stack-overflow-due-to-too-deep-recursion.patch
new file mode 100644
index 0000000..2bc9a59
--- /dev/null
+++ b/meta/recipes-extended/screen/screen/0001-Fix-stack-overflow-due-to-too-deep-recursion.patch
@@ -0,0 +1,57 @@
+Bug: 45713
+
+How to reproduce:
+Run this command inside screen
+$ printf '\x1b[10000000T'
+
+screen will recursively call MScrollV to depth n/256.
+This is time consuming and will overflow stack if n is huge.
+
+Fixes CVE-2015-6806
+
+Upstream-Status: Backport
+
+Signed-off-by: Kuang-che Wu <kcwu at csie.org>
+Signed-off-by: Amadeusz Sławiński <amade at asmblr.net>
+Signed-off-by: Maxin B. John <maxin.john at intel.com>
+---
+diff -Naur screen-4.3.1-orig/ansi.c screen-4.3.1/ansi.c
+--- screen-4.3.1-orig/ansi.c 2015-06-29 00:22:55.000000000 +0300
++++ screen-4.3.1/ansi.c 2015-10-06 13:13:58.297648039 +0300
+@@ -2502,13 +2502,13 @@
+ return;
+ if (n > 0)
+ {
++ if (ye - ys + 1 < n)
++ n = ye - ys + 1;
+ if (n > 256)
+ {
+ MScrollV(p, n - 256, ys, ye, bce);
+ n = 256;
+ }
+- if (ye - ys + 1 < n)
+- n = ye - ys + 1;
+ #ifdef COPY_PASTE
+ if (compacthist)
+ {
+@@ -2562,15 +2562,15 @@
+ }
+ else
+ {
+- if (n < -256)
+- {
+- MScrollV(p, n + 256, ys, ye, bce);
+- n = -256;
+- }
+ n = -n;
+ if (ye - ys + 1 < n)
+ n = ye - ys + 1;
+
++ if (n > 256)
++ {
++ MScrollV(p, - (n - 256), ys, ye, bce);
++ n = 256;
++ }
+ ml = p->w_mlines + ye;
+ /* Clear lines */
+ for (i = ye; i > ye - n; i--, ml--)
diff --git a/meta/recipes-extended/screen/screen_4.3.1.bb b/meta/recipes-extended/screen/screen_4.3.1.bb
index 92457af..00d878b 100644
--- a/meta/recipes-extended/screen/screen_4.3.1.bb
+++ b/meta/recipes-extended/screen/screen_4.3.1.bb
@@ -24,6 +24,7 @@ SRC_URI = "${GNU_MIRROR}/screen/screen-${PV}.tar.gz \
file://Avoid-mis-identifying-systems-as-SVR4.patch \
file://0001-fix-for-multijob-build.patch \
file://0002-comm.h-now-depends-on-term.h.patch \
+ file://0001-Fix-stack-overflow-due-to-too-deep-recursion.patch \
"
SRC_URI[md5sum] = "5bb3b0ff2674e29378c31ad3411170ad"
diff --git a/meta/recipes-extended/sudo/sudo_1.8.14p3.bb b/meta/recipes-extended/sudo/sudo_1.8.14p3.bb
index 6b3cd6d..b93112f 100644
--- a/meta/recipes-extended/sudo/sudo_1.8.14p3.bb
+++ b/meta/recipes-extended/sudo/sudo_1.8.14p3.bb
@@ -22,7 +22,7 @@ EXTRA_OECONF += " \
do_install_append () {
if [ "${@bb.utils.contains('DISTRO_FEATURES', 'pam', 'pam', '', d)}" = "pam" ]; then
- install -D -m 664 ${WORKDIR}/sudo.pam ${D}/${sysconfdir}/pam.d/sudo
+ install -D -m 644 ${WORKDIR}/sudo.pam ${D}/${sysconfdir}/pam.d/sudo
fi
chmod 4111 ${D}${bindir}/sudo
diff --git a/meta/recipes-extended/sysstat/sysstat/0001-Include-needed-headers-explicitly.patch b/meta/recipes-extended/sysstat/sysstat/0001-Include-needed-headers-explicitly.patch
new file mode 100644
index 0000000..c126523
--- /dev/null
+++ b/meta/recipes-extended/sysstat/sysstat/0001-Include-needed-headers-explicitly.patch
@@ -0,0 +1,62 @@
+From 42325faa88d64cce799977d611b2792beb154643 Mon Sep 17 00:00:00 2001
+From: Khem Raj <raj.khem at gmail.com>
+Date: Mon, 14 Sep 2015 08:36:59 +0000
+Subject: [PATCH] Include needed headers explicitly
+
+on glibc these headers get pulled in indirectly via other .h files
+but right fix is to include them directly when used
+
+fixes
+
+error: use of undeclared identifier 'PATH_MAX'
+error: called object type 'unsigned int' is not a function or function pointer
+dm_major = major(aux.st_rdev);
+
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+---
+Upstream-Status: Pending
+
+ common.c | 1 +
+ ioconf.c | 1 +
+ sa_common.c | 1 +
+ 3 files changed, 3 insertions(+)
+
+diff --git a/common.c b/common.c
+index a23155b..ad86446 100644
+--- a/common.c
++++ b/common.c
+@@ -20,6 +20,7 @@
+ */
+
+ #include <stdio.h>
++#include <limits.h>
+ #include <string.h>
+ #include <stdlib.h>
+ #include <time.h>
+diff --git a/ioconf.c b/ioconf.c
+index 7d88c5d..6d67691 100644
+--- a/ioconf.c
++++ b/ioconf.c
+@@ -27,6 +27,7 @@
+ #include <errno.h>
+ #include <dirent.h>
+ #include <sys/stat.h>
++#include <sys/types.h>
+
+ #include "ioconf.h"
+ #include "common.h"
+diff --git a/sa_common.c b/sa_common.c
+index b7351d9..c9e3299 100644
+--- a/sa_common.c
++++ b/sa_common.c
+@@ -20,6 +20,7 @@
+ */
+
+ #include <stdio.h>
++#include <limits.h>
+ #include <string.h>
+ #include <stdlib.h>
+ #include <time.h>
+--
+2.5.2
+
diff --git a/meta/recipes-extended/sysstat/sysstat_11.1.5.bb b/meta/recipes-extended/sysstat/sysstat_11.1.5.bb
index 69d2ec2..bff8616 100644
--- a/meta/recipes-extended/sysstat/sysstat_11.1.5.bb
+++ b/meta/recipes-extended/sysstat/sysstat_11.1.5.bb
@@ -2,6 +2,8 @@ require sysstat.inc
LIC_FILES_CHKSUM = "file://COPYING;md5=8ca43cbc842c2336e835926c2166c28b"
+SRC_URI += "file://0001-Include-needed-headers-explicitly.patch"
+
SRC_URI[md5sum] = "4d8e6e72d057189a1660462a678d9ada"
SRC_URI[sha256sum] = "feb3a90d86ffd69cf5b88144a8876ae05bd42384f559676f08100671589fa2bb"
diff --git a/meta/recipes-extended/tar/tar.inc b/meta/recipes-extended/tar/tar.inc
index b339c43..93e4da1 100644
--- a/meta/recipes-extended/tar/tar.inc
+++ b/meta/recipes-extended/tar/tar.inc
@@ -22,10 +22,12 @@ do_install () {
}
do_install_append_class-target() {
- install -d ${D}${base_bindir}
- mv ${D}${bindir}/tar ${D}${base_bindir}/tar
- mv ${D}${bindir}/gtar ${D}${base_bindir}/gtar
- rmdir ${D}${bindir}/
+ if [ "${base_bindir}" != "${bindir}" ]; then
+ install -d ${D}${base_bindir}
+ mv ${D}${bindir}/tar ${D}${base_bindir}/tar
+ mv ${D}${bindir}/gtar ${D}${base_bindir}/gtar
+ rmdir ${D}${bindir}/
+ fi
}
PACKAGES =+ "${PN}-rmt"
diff --git a/meta/recipes-extended/texinfo/texinfo_6.0.bb b/meta/recipes-extended/texinfo/texinfo_6.0.bb
index 8fb715a..a8702cf 100644
--- a/meta/recipes-extended/texinfo/texinfo_6.0.bb
+++ b/meta/recipes-extended/texinfo/texinfo_6.0.bb
@@ -10,7 +10,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=d32239bcb673463ab874e80d47fae504"
PROVIDES_append_class-native = " texinfo-replacement-native"
def compress_pkg(d):
- if "compress_doc" in (d.getVar("INHERIT", True) or "").split():
+ if bb.data.inherits_class('compress_doc', d):
compress = d.getVar("DOC_COMPRESS", True)
if compress == "gz":
return "gzip"
diff --git a/meta/recipes-extended/tzcode/tzcode-native_2015f.bb b/meta/recipes-extended/tzcode/tzcode-native_2015f.bb
deleted file mode 100644
index a8865a3..0000000
--- a/meta/recipes-extended/tzcode/tzcode-native_2015f.bb
+++ /dev/null
@@ -1,25 +0,0 @@
-# note that we allow for us to use data later than our code version
-#
-DESCRIPTION = "tzcode, timezone zoneinfo utils -- zic, zdump, tzselect"
-LICENSE = "PD & BSD"
-
-LIC_FILES_CHKSUM = "file://${WORKDIR}/README;md5=d0ff93a73dd5bc3c6e724bb4343760f6"
-
-SRC_URI =" ftp://ftp.iana.org/tz/releases/tzcode${PV}.tar.gz;name=tzcode \
- ftp://ftp.iana.org/tz/releases/tzdata2015f.tar.gz;name=tzdata"
-
-SRC_URI[tzcode.md5sum] = "19578d432ba8b92f73406a17a9bc268d"
-SRC_URI[tzcode.sha256sum] = "0c95e0a42bb61141f790f4f5f204b954d7654c894aa54a594a215d6f38de84ae"
-SRC_URI[tzdata.md5sum] = "e3b82732d20e973e48af1c6f13df9a1d"
-SRC_URI[tzdata.sha256sum] = "959f81b541e042ecb13c50097d264ae92ff03a57979c478dbcf24d5da242531d"
-
-S = "${WORKDIR}"
-
-inherit native
-
-do_install () {
- install -d ${D}${bindir}/
- install -m 755 zic ${D}${bindir}/
- install -m 755 zdump ${D}${bindir}/
- install -m 755 tzselect ${D}${bindir}/
-}
diff --git a/meta/recipes-extended/tzcode/tzcode-native_2016a.bb b/meta/recipes-extended/tzcode/tzcode-native_2016a.bb
new file mode 100644
index 0000000..76f97f0
--- /dev/null
+++ b/meta/recipes-extended/tzcode/tzcode-native_2016a.bb
@@ -0,0 +1,25 @@
+# note that we allow for us to use data later than our code version
+#
+SUMMARY = "tzcode, timezone zoneinfo utils -- zic, zdump, tzselect"
+LICENSE = "PD & BSD & BSD-3-Clause"
+
+LIC_FILES_CHKSUM = "file://LICENSE;md5=76ae2becfcb9a685041c6f166b44c2c2"
+
+SRC_URI =" ftp://ftp.iana.org/tz/releases/tzcode${PV}.tar.gz;name=tzcode \
+ ftp://ftp.iana.org/tz/releases/tzdata${PV}.tar.gz;name=tzdata"
+
+SRC_URI[tzcode.md5sum] = "f5e0299925631da7cf82d8ce1205111d"
+SRC_URI[tzcode.sha256sum] = "11ae66d59b844e8c6c81914c9dd73b666627bd7792855ba9de195eee4520c28d"
+SRC_URI[tzdata.md5sum] = "0d3123eb1b453ec0620822bd65be4c42"
+SRC_URI[tzdata.sha256sum] = "5efa6b324e64ef921ef700ac3273a51895f672684a30e342f68e47871c6a8cd1"
+
+S = "${WORKDIR}"
+
+inherit native
+
+do_install () {
+ install -d ${D}${bindir}/
+ install -m 755 zic ${D}${bindir}/
+ install -m 755 zdump ${D}${bindir}/
+ install -m 755 tzselect ${D}${bindir}/
+}
diff --git a/meta/recipes-extended/tzdata/tzdata_2015f.bb b/meta/recipes-extended/tzdata/tzdata_2015f.bb
deleted file mode 100644
index 7cda40d..0000000
--- a/meta/recipes-extended/tzdata/tzdata_2015f.bb
+++ /dev/null
@@ -1,207 +0,0 @@
-DESCRIPTION = "Timezone data"
-HOMEPAGE = "http://www.iana.org/time-zones"
-SECTION = "base"
-LICENSE = "PD & BSD"
-LIC_FILES_CHKSUM = "file://asia;beginline=2;endline=3;md5=996a9811747aa48db91ed239e5b355a1"
-DEPENDS = "tzcode-native"
-
-SRC_URI = "ftp://ftp.iana.org/tz/releases/tzdata${PV}.tar.gz;name=tzdata"
-
-SRC_URI[tzdata.md5sum] = "e3b82732d20e973e48af1c6f13df9a1d"
-SRC_URI[tzdata.sha256sum] = "959f81b541e042ecb13c50097d264ae92ff03a57979c478dbcf24d5da242531d"
-
-inherit allarch
-
-RCONFLICTS_${PN} = "timezones timezone-africa timezone-america timezone-antarctica \
- timezone-arctic timezone-asia timezone-atlantic \
- timezone-australia timezone-europe timezone-indian \
- timezone-iso3166.tab timezone-pacific timezone-zone.tab"
-
-S = "${WORKDIR}"
-
-DEFAULT_TIMEZONE ?= "Universal"
-
-TZONES= "africa antarctica asia australasia europe northamerica southamerica \
- factory etcetera backward systemv \
- "
-# pacificnew
-
-do_compile () {
- for zone in ${TZONES}; do \
- ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo -L /dev/null \
- -y ${S}/yearistype.sh ${S}/${zone} ; \
- ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo/posix -L /dev/null \
- -y ${S}/yearistype.sh ${S}/${zone} ; \
- ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo/right -L ${S}/leapseconds \
- -y ${S}/yearistype.sh ${S}/${zone} ; \
- done
-}
-
-do_install () {
- install -d ${D}/$exec_prefix ${D}${datadir}/zoneinfo
- cp -pPR ${S}/$exec_prefix ${D}/
- # libc is removing zoneinfo files from package
- cp -pP "${S}/zone.tab" ${D}${datadir}/zoneinfo
- cp -pP "${S}/iso3166.tab" ${D}${datadir}/zoneinfo
-
- # Install default timezone
- if [ -e ${D}${datadir}/zoneinfo/${DEFAULT_TIMEZONE} ]; then
- install -d ${D}${sysconfdir}
- echo ${DEFAULT_TIMEZONE} > ${D}${sysconfdir}/timezone
- ln -s ${datadir}/zoneinfo/${DEFAULT_TIMEZONE} ${D}${sysconfdir}/localtime
- else
- bberror "DEFAULT_TIMEZONE is set to an invalid value."
- exit 1
- fi
-
- chown -R root:root ${D}
-}
-
-pkg_postinst_${PN} () {
- etc_lt="$D${sysconfdir}/localtime"
- src="$D${sysconfdir}/timezone"
-
- if [ -e ${src} ] ; then
- tz=$(sed -e 's:#.*::' -e 's:[[:space:]]*::g' -e '/^$/d' "${src}")
- fi
-
- if [ -z "${tz}" ] ; then
- exit 0
- fi
-
- if [ ! -e "$D${datadir}/zoneinfo/${tz}" ] ; then
- echo "You have an invalid TIMEZONE setting in ${src}"
- echo "Your ${etc_lt} has been reset to Universal; enjoy!"
- tz="Universal"
- echo "Updating ${etc_lt} with $D${datadir}/zoneinfo/${tz}"
- if [ -L ${etc_lt} ] ; then
- rm -f "${etc_lt}"
- fi
- ln -s "${datadir}/zoneinfo/${tz}" "${etc_lt}"
- fi
-}
-
-# Packages primarily organized by directory with a major city
-# in most time zones in the base package
-
-PACKAGES = "tzdata tzdata-misc tzdata-posix tzdata-right tzdata-africa \
- tzdata-americas tzdata-antarctica tzdata-arctic tzdata-asia \
- tzdata-atlantic tzdata-australia tzdata-europe tzdata-pacific"
-
-FILES_tzdata-africa += "${datadir}/zoneinfo/Africa/*"
-RPROVIDES_tzdata-africa = "tzdata-africa"
-
-FILES_tzdata-americas += "${datadir}/zoneinfo/America/* \
- ${datadir}/zoneinfo/US/* \
- ${datadir}/zoneinfo/Brazil/* \
- ${datadir}/zoneinfo/Canada/* \
- ${datadir}/zoneinfo/Mexico/* \
- ${datadir}/zoneinfo/Chile/*"
-RPROVIDES_tzdata-americas = "tzdata-americas"
-
-FILES_tzdata-antarctica += "${datadir}/zoneinfo/Antarctica/*"
-RPROVIDES_tzdata-antarctica = "tzdata-antarctica"
-
-FILES_tzdata-arctic += "${datadir}/zoneinfo/Arctic/*"
-RPROVIDES_tzdata-arctic = "tzdata-arctic"
-
-FILES_tzdata-asia += "${datadir}/zoneinfo/Asia/* \
- ${datadir}/zoneinfo/Indian/* \
- ${datadir}/zoneinfo/Mideast/*"
-RPROVIDES_tzdata-asia = "tzdata-asia"
-
-FILES_tzdata-atlantic += "${datadir}/zoneinfo/Atlantic/*"
-RPROVIDES_tzdata-atlantic = "tzdata-atlantic"
-
-FILES_tzdata-australia += "${datadir}/zoneinfo/Australia/*"
-RPROVIDES_tzdata-australia = "tzdata-australia"
-
-FILES_tzdata-europe += "${datadir}/zoneinfo/Europe/*"
-RPROVIDES_tzdata-europe = "tzdata-europe"
-
-FILES_tzdata-pacific += "${datadir}/zoneinfo/Pacific/*"
-RPROVIDES_tzdata-pacific = "tzdata-pacific"
-
-FILES_tzdata-posix += "${datadir}/zoneinfo/posix/*"
-RPROVIDES_tzdata-posix = "tzdata-posix"
-
-FILES_tzdata-right += "${datadir}/zoneinfo/right/*"
-RPROVIDES_tzdata-right = "tzdata-right"
-
-
-FILES_tzdata-misc += "${datadir}/zoneinfo/Cuba \
- ${datadir}/zoneinfo/Egypt \
- ${datadir}/zoneinfo/Eire \
- ${datadir}/zoneinfo/Factory \
- ${datadir}/zoneinfo/GB-Eire \
- ${datadir}/zoneinfo/Hongkong \
- ${datadir}/zoneinfo/Iceland \
- ${datadir}/zoneinfo/Iran \
- ${datadir}/zoneinfo/Israel \
- ${datadir}/zoneinfo/Jamaica \
- ${datadir}/zoneinfo/Japan \
- ${datadir}/zoneinfo/Kwajalein \
- ${datadir}/zoneinfo/Libya \
- ${datadir}/zoneinfo/Navajo \
- ${datadir}/zoneinfo/Poland \
- ${datadir}/zoneinfo/Portugal \
- ${datadir}/zoneinfo/Singapore \
- ${datadir}/zoneinfo/Turkey"
-RPROVIDES_tzdata-misc = "tzdata-misc"
-
-
-FILES_${PN} += "${datadir}/zoneinfo/Pacific/Honolulu \
- ${datadir}/zoneinfo/America/Anchorage \
- ${datadir}/zoneinfo/America/Los_Angeles \
- ${datadir}/zoneinfo/America/Denver \
- ${datadir}/zoneinfo/America/Chicago \
- ${datadir}/zoneinfo/America/New_York \
- ${datadir}/zoneinfo/America/Caracas \
- ${datadir}/zoneinfo/America/Sao_Paulo \
- ${datadir}/zoneinfo/Europe/London \
- ${datadir}/zoneinfo/Europe/Paris \
- ${datadir}/zoneinfo/Africa/Cairo \
- ${datadir}/zoneinfo/Europe/Moscow \
- ${datadir}/zoneinfo/Asia/Dubai \
- ${datadir}/zoneinfo/Asia/Karachi \
- ${datadir}/zoneinfo/Asia/Dhaka \
- ${datadir}/zoneinfo/Asia/Bankok \
- ${datadir}/zoneinfo/Asia/Hong_Kong \
- ${datadir}/zoneinfo/Asia/Tokyo \
- ${datadir}/zoneinfo/Australia/Darwin \
- ${datadir}/zoneinfo/Australia/Adelaide \
- ${datadir}/zoneinfo/Australia/Brisbane \
- ${datadir}/zoneinfo/Australia/Sydney \
- ${datadir}/zoneinfo/Pacific/Noumea \
- ${datadir}/zoneinfo/CET \
- ${datadir}/zoneinfo/CST6CDT \
- ${datadir}/zoneinfo/EET \
- ${datadir}/zoneinfo/EST \
- ${datadir}/zoneinfo/EST5EDT \
- ${datadir}/zoneinfo/GB \
- ${datadir}/zoneinfo/GMT \
- ${datadir}/zoneinfo/GMT+0 \
- ${datadir}/zoneinfo/GMT-0 \
- ${datadir}/zoneinfo/GMT0 \
- ${datadir}/zoneinfo/Greenwich \
- ${datadir}/zoneinfo/HST \
- ${datadir}/zoneinfo/MET \
- ${datadir}/zoneinfo/MST \
- ${datadir}/zoneinfo/MST7MDT \
- ${datadir}/zoneinfo/NZ \
- ${datadir}/zoneinfo/NZ-CHAT \
- ${datadir}/zoneinfo/PRC \
- ${datadir}/zoneinfo/PST8PDT \
- ${datadir}/zoneinfo/ROC \
- ${datadir}/zoneinfo/ROK \
- ${datadir}/zoneinfo/UCT \
- ${datadir}/zoneinfo/UTC \
- ${datadir}/zoneinfo/Universal \
- ${datadir}/zoneinfo/W-SU \
- ${datadir}/zoneinfo/WET \
- ${datadir}/zoneinfo/Zulu \
- ${datadir}/zoneinfo/zone.tab \
- ${datadir}/zoneinfo/iso3166.tab \
- ${datadir}/zoneinfo/Etc/*"
-
-CONFFILES_${PN} += "${sysconfdir}/timezone ${sysconfdir}/localtime"
diff --git a/meta/recipes-extended/tzdata/tzdata_2016a.bb b/meta/recipes-extended/tzdata/tzdata_2016a.bb
new file mode 100644
index 0000000..6ba5f81
--- /dev/null
+++ b/meta/recipes-extended/tzdata/tzdata_2016a.bb
@@ -0,0 +1,208 @@
+SUMMARY = "Timezone data"
+HOMEPAGE = "http://www.iana.org/time-zones"
+SECTION = "base"
+LICENSE = "PD & BSD & BSD-3-Clause"
+LIC_FILES_CHKSUM = "file://LICENSE;md5=76ae2becfcb9a685041c6f166b44c2c2"
+
+DEPENDS = "tzcode-native"
+
+SRC_URI = "ftp://ftp.iana.org/tz/releases/tzdata${PV}.tar.gz;name=tzdata"
+
+SRC_URI[tzdata.md5sum] = "0d3123eb1b453ec0620822bd65be4c42"
+SRC_URI[tzdata.sha256sum] = "5efa6b324e64ef921ef700ac3273a51895f672684a30e342f68e47871c6a8cd1"
+
+inherit allarch
+
+RCONFLICTS_${PN} = "timezones timezone-africa timezone-america timezone-antarctica \
+ timezone-arctic timezone-asia timezone-atlantic \
+ timezone-australia timezone-europe timezone-indian \
+ timezone-iso3166.tab timezone-pacific timezone-zone.tab"
+
+S = "${WORKDIR}"
+
+DEFAULT_TIMEZONE ?= "Universal"
+
+TZONES= "africa antarctica asia australasia europe northamerica southamerica \
+ factory etcetera backward systemv \
+ "
+# pacificnew
+
+do_compile () {
+ for zone in ${TZONES}; do \
+ ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo -L /dev/null \
+ -y ${S}/yearistype.sh ${S}/${zone} ; \
+ ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo/posix -L /dev/null \
+ -y ${S}/yearistype.sh ${S}/${zone} ; \
+ ${STAGING_BINDIR_NATIVE}/zic -d ${WORKDIR}${datadir}/zoneinfo/right -L ${S}/leapseconds \
+ -y ${S}/yearistype.sh ${S}/${zone} ; \
+ done
+}
+
+do_install () {
+ install -d ${D}/$exec_prefix ${D}${datadir}/zoneinfo
+ cp -pPR ${S}/$exec_prefix ${D}/
+ # libc is removing zoneinfo files from package
+ cp -pP "${S}/zone.tab" ${D}${datadir}/zoneinfo
+ cp -pP "${S}/iso3166.tab" ${D}${datadir}/zoneinfo
+
+ # Install default timezone
+ if [ -e ${D}${datadir}/zoneinfo/${DEFAULT_TIMEZONE} ]; then
+ install -d ${D}${sysconfdir}
+ echo ${DEFAULT_TIMEZONE} > ${D}${sysconfdir}/timezone
+ ln -s ${datadir}/zoneinfo/${DEFAULT_TIMEZONE} ${D}${sysconfdir}/localtime
+ else
+ bberror "DEFAULT_TIMEZONE is set to an invalid value."
+ exit 1
+ fi
+
+ chown -R root:root ${D}
+}
+
+pkg_postinst_${PN} () {
+ etc_lt="$D${sysconfdir}/localtime"
+ src="$D${sysconfdir}/timezone"
+
+ if [ -e ${src} ] ; then
+ tz=$(sed -e 's:#.*::' -e 's:[[:space:]]*::g' -e '/^$/d' "${src}")
+ fi
+
+ if [ -z "${tz}" ] ; then
+ exit 0
+ fi
+
+ if [ ! -e "$D${datadir}/zoneinfo/${tz}" ] ; then
+ echo "You have an invalid TIMEZONE setting in ${src}"
+ echo "Your ${etc_lt} has been reset to Universal; enjoy!"
+ tz="Universal"
+ echo "Updating ${etc_lt} with $D${datadir}/zoneinfo/${tz}"
+ if [ -L ${etc_lt} ] ; then
+ rm -f "${etc_lt}"
+ fi
+ ln -s "${datadir}/zoneinfo/${tz}" "${etc_lt}"
+ fi
+}
+
+# Packages primarily organized by directory with a major city
+# in most time zones in the base package
+
+PACKAGES = "tzdata tzdata-misc tzdata-posix tzdata-right tzdata-africa \
+ tzdata-americas tzdata-antarctica tzdata-arctic tzdata-asia \
+ tzdata-atlantic tzdata-australia tzdata-europe tzdata-pacific"
+
+FILES_tzdata-africa += "${datadir}/zoneinfo/Africa/*"
+RPROVIDES_tzdata-africa = "tzdata-africa"
+
+FILES_tzdata-americas += "${datadir}/zoneinfo/America/* \
+ ${datadir}/zoneinfo/US/* \
+ ${datadir}/zoneinfo/Brazil/* \
+ ${datadir}/zoneinfo/Canada/* \
+ ${datadir}/zoneinfo/Mexico/* \
+ ${datadir}/zoneinfo/Chile/*"
+RPROVIDES_tzdata-americas = "tzdata-americas"
+
+FILES_tzdata-antarctica += "${datadir}/zoneinfo/Antarctica/*"
+RPROVIDES_tzdata-antarctica = "tzdata-antarctica"
+
+FILES_tzdata-arctic += "${datadir}/zoneinfo/Arctic/*"
+RPROVIDES_tzdata-arctic = "tzdata-arctic"
+
+FILES_tzdata-asia += "${datadir}/zoneinfo/Asia/* \
+ ${datadir}/zoneinfo/Indian/* \
+ ${datadir}/zoneinfo/Mideast/*"
+RPROVIDES_tzdata-asia = "tzdata-asia"
+
+FILES_tzdata-atlantic += "${datadir}/zoneinfo/Atlantic/*"
+RPROVIDES_tzdata-atlantic = "tzdata-atlantic"
+
+FILES_tzdata-australia += "${datadir}/zoneinfo/Australia/*"
+RPROVIDES_tzdata-australia = "tzdata-australia"
+
+FILES_tzdata-europe += "${datadir}/zoneinfo/Europe/*"
+RPROVIDES_tzdata-europe = "tzdata-europe"
+
+FILES_tzdata-pacific += "${datadir}/zoneinfo/Pacific/*"
+RPROVIDES_tzdata-pacific = "tzdata-pacific"
+
+FILES_tzdata-posix += "${datadir}/zoneinfo/posix/*"
+RPROVIDES_tzdata-posix = "tzdata-posix"
+
+FILES_tzdata-right += "${datadir}/zoneinfo/right/*"
+RPROVIDES_tzdata-right = "tzdata-right"
+
+
+FILES_tzdata-misc += "${datadir}/zoneinfo/Cuba \
+ ${datadir}/zoneinfo/Egypt \
+ ${datadir}/zoneinfo/Eire \
+ ${datadir}/zoneinfo/Factory \
+ ${datadir}/zoneinfo/GB-Eire \
+ ${datadir}/zoneinfo/Hongkong \
+ ${datadir}/zoneinfo/Iceland \
+ ${datadir}/zoneinfo/Iran \
+ ${datadir}/zoneinfo/Israel \
+ ${datadir}/zoneinfo/Jamaica \
+ ${datadir}/zoneinfo/Japan \
+ ${datadir}/zoneinfo/Kwajalein \
+ ${datadir}/zoneinfo/Libya \
+ ${datadir}/zoneinfo/Navajo \
+ ${datadir}/zoneinfo/Poland \
+ ${datadir}/zoneinfo/Portugal \
+ ${datadir}/zoneinfo/Singapore \
+ ${datadir}/zoneinfo/Turkey"
+RPROVIDES_tzdata-misc = "tzdata-misc"
+
+
+FILES_${PN} += "${datadir}/zoneinfo/Pacific/Honolulu \
+ ${datadir}/zoneinfo/America/Anchorage \
+ ${datadir}/zoneinfo/America/Los_Angeles \
+ ${datadir}/zoneinfo/America/Denver \
+ ${datadir}/zoneinfo/America/Chicago \
+ ${datadir}/zoneinfo/America/New_York \
+ ${datadir}/zoneinfo/America/Caracas \
+ ${datadir}/zoneinfo/America/Sao_Paulo \
+ ${datadir}/zoneinfo/Europe/London \
+ ${datadir}/zoneinfo/Europe/Paris \
+ ${datadir}/zoneinfo/Africa/Cairo \
+ ${datadir}/zoneinfo/Europe/Moscow \
+ ${datadir}/zoneinfo/Asia/Dubai \
+ ${datadir}/zoneinfo/Asia/Karachi \
+ ${datadir}/zoneinfo/Asia/Dhaka \
+ ${datadir}/zoneinfo/Asia/Bankok \
+ ${datadir}/zoneinfo/Asia/Hong_Kong \
+ ${datadir}/zoneinfo/Asia/Tokyo \
+ ${datadir}/zoneinfo/Australia/Darwin \
+ ${datadir}/zoneinfo/Australia/Adelaide \
+ ${datadir}/zoneinfo/Australia/Brisbane \
+ ${datadir}/zoneinfo/Australia/Sydney \
+ ${datadir}/zoneinfo/Pacific/Noumea \
+ ${datadir}/zoneinfo/CET \
+ ${datadir}/zoneinfo/CST6CDT \
+ ${datadir}/zoneinfo/EET \
+ ${datadir}/zoneinfo/EST \
+ ${datadir}/zoneinfo/EST5EDT \
+ ${datadir}/zoneinfo/GB \
+ ${datadir}/zoneinfo/GMT \
+ ${datadir}/zoneinfo/GMT+0 \
+ ${datadir}/zoneinfo/GMT-0 \
+ ${datadir}/zoneinfo/GMT0 \
+ ${datadir}/zoneinfo/Greenwich \
+ ${datadir}/zoneinfo/HST \
+ ${datadir}/zoneinfo/MET \
+ ${datadir}/zoneinfo/MST \
+ ${datadir}/zoneinfo/MST7MDT \
+ ${datadir}/zoneinfo/NZ \
+ ${datadir}/zoneinfo/NZ-CHAT \
+ ${datadir}/zoneinfo/PRC \
+ ${datadir}/zoneinfo/PST8PDT \
+ ${datadir}/zoneinfo/ROC \
+ ${datadir}/zoneinfo/ROK \
+ ${datadir}/zoneinfo/UCT \
+ ${datadir}/zoneinfo/UTC \
+ ${datadir}/zoneinfo/Universal \
+ ${datadir}/zoneinfo/W-SU \
+ ${datadir}/zoneinfo/WET \
+ ${datadir}/zoneinfo/Zulu \
+ ${datadir}/zoneinfo/zone.tab \
+ ${datadir}/zoneinfo/iso3166.tab \
+ ${datadir}/zoneinfo/Etc/*"
+
+CONFFILES_${PN} += "${sysconfdir}/timezone ${sysconfdir}/localtime"
diff --git a/meta/recipes-extended/unzip/unzip/CVE-2015-7696.patch b/meta/recipes-extended/unzip/unzip/CVE-2015-7696.patch
new file mode 100644
index 0000000..ea93823
--- /dev/null
+++ b/meta/recipes-extended/unzip/unzip/CVE-2015-7696.patch
@@ -0,0 +1,38 @@
+Upstream-Status: Backport
+Signed-off-by: Tudor Florea <tudor.flore at enea.com>
+
+From 68efed87fabddd450c08f3112f62a73f61d493c9 Mon Sep 17 00:00:00 2001
+From: Petr Stodulka <pstodulk at redhat.com>
+Date: Mon, 14 Sep 2015 18:23:17 +0200
+Subject: [PATCH 1/2] upstream fix for heap overflow
+
+https://bugzilla.redhat.com/attachment.cgi?id=1073002
+---
+ crypt.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/crypt.c b/crypt.c
+index 784e411..a8975f2 100644
+--- a/crypt.c
++++ b/crypt.c
+@@ -465,7 +465,17 @@ int decrypt(__G__ passwrd)
+ GLOBAL(pInfo->encrypted) = FALSE;
+ defer_leftover_input(__G);
+ for (n = 0; n < RAND_HEAD_LEN; n++) {
+- b = NEXTBYTE;
++ /* 2012-11-23 SMS. (OUSPG report.)
++ * Quit early if compressed size < HEAD_LEN. The resulting
++ * error message ("unable to get password") could be improved,
++ * but it's better than trying to read nonexistent data, and
++ * then continuing with a negative G.csize. (See
++ * fileio.c:readbyte()).
++ */
++ if ((b = NEXTBYTE) == (ush)EOF)
++ {
++ return PK_ERR;
++ }
+ h[n] = (uch)b;
+ Trace((stdout, " (%02x)", h[n]));
+ }
+--
+2.4.6
diff --git a/meta/recipes-extended/unzip/unzip/CVE-2015-7697.patch b/meta/recipes-extended/unzip/unzip/CVE-2015-7697.patch
new file mode 100644
index 0000000..da68988
--- /dev/null
+++ b/meta/recipes-extended/unzip/unzip/CVE-2015-7697.patch
@@ -0,0 +1,31 @@
+Upstream-Status: Backport
+Signed-off-by: Tudor Florea <tudor.flore at enea.com>
+
+From bd8a743ee0a77e65ad07ef4196c4cd366add3f26 Mon Sep 17 00:00:00 2001
+From: Kamil Dudka <kdudka at redhat.com>
+Date: Mon, 14 Sep 2015 18:24:56 +0200
+Subject: [PATCH 2/2] fix infinite loop when extracting empty bzip2 data
+
+---
+ extract.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/extract.c b/extract.c
+index 7134bfe..29db027 100644
+--- a/extract.c
++++ b/extract.c
+@@ -2733,6 +2733,12 @@ __GDEF
+ int repeated_buf_err;
+ bz_stream bstrm;
+
++ if (G.incnt <= 0 && G.csize <= 0L) {
++ /* avoid an infinite loop */
++ Trace((stderr, "UZbunzip2() got empty input\n"));
++ return 2;
++ }
++
+ #if (defined(DLL) && !defined(NO_SLIDE_REDIR))
+ if (G.redirect_slide)
+ wsize = G.redirect_size, redirSlide = G.redirect_buffer;
+--
+2.4.6
diff --git a/meta/recipes-extended/unzip/unzip/cve-2014-9636.patch b/meta/recipes-extended/unzip/unzip/cve-2014-9636.patch
new file mode 100644
index 0000000..0a0bfbb
--- /dev/null
+++ b/meta/recipes-extended/unzip/unzip/cve-2014-9636.patch
@@ -0,0 +1,45 @@
+From 190040ebfcf5395a6ccedede2cc9343d34f0a108 Mon Sep 17 00:00:00 2001
+From: mancha <mancha1 AT zoho DOT com>
+Date: Wed, 11 Feb 2015
+Subject: Info-ZIP UnZip buffer overflow
+
+Upstream-Status: Backport
+
+By carefully crafting a corrupt ZIP archive with "extra fields" that
+purport to have compressed blocks larger than the corresponding
+uncompressed blocks in STORED no-compression mode, an attacker can
+trigger a heap overflow that can result in application crash or
+possibly have other unspecified impact.
+
+This patch ensures that when extra fields use STORED mode, the
+"compressed" and uncompressed block sizes match.
+
+Signed-off-by: mancha <mancha1 AT zoho DOT com>
+---
+ extract.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+--- a/extract.c
++++ b/extract.c
+@@ -2217,6 +2217,7 @@ static int test_compr_eb(__G__ eb, eb_si
+ ulg eb_ucsize;
+ uch *eb_ucptr;
+ int r;
++ ush method;
+
+ if (compr_offset < 4) /* field is not compressed: */
+ return PK_OK; /* do nothing and signal OK */
+@@ -2226,6 +2227,13 @@ static int test_compr_eb(__G__ eb, eb_si
+ eb_size <= (compr_offset + EB_CMPRHEADLEN)))
+ return IZ_EF_TRUNC; /* no compressed data! */
+
++ method = makeword(eb + (EB_HEADSIZE + compr_offset));
++ if ((method == STORED) &&
++ (eb_size - compr_offset - EB_CMPRHEADLEN != eb_ucsize))
++ return PK_ERR; /* compressed & uncompressed
++ * should match in STORED
++ * method */
++
+ if (
+ #ifdef INT_16BIT
+ (((ulg)(extent)eb_ucsize) != eb_ucsize) ||
diff --git a/meta/recipes-extended/unzip/unzip/unzip-6.0_overflow3.diff b/meta/recipes-extended/unzip/unzip/unzip-6.0_overflow3.diff
deleted file mode 100644
index 0a0bfbb..0000000
--- a/meta/recipes-extended/unzip/unzip/unzip-6.0_overflow3.diff
+++ /dev/null
@@ -1,45 +0,0 @@
-From 190040ebfcf5395a6ccedede2cc9343d34f0a108 Mon Sep 17 00:00:00 2001
-From: mancha <mancha1 AT zoho DOT com>
-Date: Wed, 11 Feb 2015
-Subject: Info-ZIP UnZip buffer overflow
-
-Upstream-Status: Backport
-
-By carefully crafting a corrupt ZIP archive with "extra fields" that
-purport to have compressed blocks larger than the corresponding
-uncompressed blocks in STORED no-compression mode, an attacker can
-trigger a heap overflow that can result in application crash or
-possibly have other unspecified impact.
-
-This patch ensures that when extra fields use STORED mode, the
-"compressed" and uncompressed block sizes match.
-
-Signed-off-by: mancha <mancha1 AT zoho DOT com>
----
- extract.c | 8 ++++++++
- 1 file changed, 8 insertions(+)
-
---- a/extract.c
-+++ b/extract.c
-@@ -2217,6 +2217,7 @@ static int test_compr_eb(__G__ eb, eb_si
- ulg eb_ucsize;
- uch *eb_ucptr;
- int r;
-+ ush method;
-
- if (compr_offset < 4) /* field is not compressed: */
- return PK_OK; /* do nothing and signal OK */
-@@ -2226,6 +2227,13 @@ static int test_compr_eb(__G__ eb, eb_si
- eb_size <= (compr_offset + EB_CMPRHEADLEN)))
- return IZ_EF_TRUNC; /* no compressed data! */
-
-+ method = makeword(eb + (EB_HEADSIZE + compr_offset));
-+ if ((method == STORED) &&
-+ (eb_size - compr_offset - EB_CMPRHEADLEN != eb_ucsize))
-+ return PK_ERR; /* compressed & uncompressed
-+ * should match in STORED
-+ * method */
-+
- if (
- #ifdef INT_16BIT
- (((ulg)(extent)eb_ucsize) != eb_ucsize) ||
diff --git a/meta/recipes-extended/unzip/unzip_6.0.bb b/meta/recipes-extended/unzip/unzip_6.0.bb
index 4a0a713..b386323 100644
--- a/meta/recipes-extended/unzip/unzip_6.0.bb
+++ b/meta/recipes-extended/unzip/unzip_6.0.bb
@@ -10,10 +10,12 @@ SRC_URI = "ftp://ftp.info-zip.org/pub/infozip/src/unzip60.tgz \
file://avoid-strip.patch \
file://define-ldflags.patch \
file://06-unzip60-alt-iconv-utf8_CVE-2015-1315.patch \
- file://unzip-6.0_overflow3.diff \
+ file://cve-2014-9636.patch \
file://09-cve-2014-8139-crc-overflow.patch \
file://10-cve-2014-8140-test-compr-eb.patch \
file://11-cve-2014-8141-getzip64data.patch \
+ file://CVE-2015-7696.patch \
+ file://CVE-2015-7697.patch \
"
SRC_URI[md5sum] = "62b490407489521db863b523a7f86375"
diff --git a/meta/recipes-extended/xz/xz_5.2.1.bb b/meta/recipes-extended/xz/xz_5.2.1.bb
index e0ae48f..cf7fba6 100644
--- a/meta/recipes-extended/xz/xz_5.2.1.bb
+++ b/meta/recipes-extended/xz/xz_5.2.1.bb
@@ -6,7 +6,7 @@ SECTION = "base"
# which is GPLv3 is an m4 macro which isn't shipped in any of our packages,
# and the LGPL bits are under lib/, which appears to be used for libgnu, which
# appears to be used for DOS builds. So we're left with GPLv2+ and PD.
-LICENSE = "GPLv2+ & GPLv3+ & LGPLv2.1+ & PD"
+LICENSE = "GPLv2+ & GPL-3.0-with-autoconf-exception & LGPLv2.1+ & PD"
LICENSE_${PN} = "GPLv2+"
LICENSE_${PN}-dev = "GPLv2+"
LICENSE_${PN}-staticdev = "GPLv2+"
diff --git a/meta/recipes-gnome/epiphany/epiphany_3.16.3.bb b/meta/recipes-gnome/epiphany/epiphany_3.16.3.bb
index 506fb25..c3745c0 100644
--- a/meta/recipes-gnome/epiphany/epiphany_3.16.3.bb
+++ b/meta/recipes-gnome/epiphany/epiphany_3.16.3.bb
@@ -5,7 +5,10 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe"
DEPENDS = "libsoup-2.4 webkitgtk gtk+3 iso-codes ca-certificates avahi libnotify gcr libwnck3 \
gsettings-desktop-schemas gnome-desktop3"
-inherit gnomebase gsettings
+inherit gnomebase gsettings distro_features_check
+# libwnck3 is x11 only
+REQUIRED_DISTRO_FEATURES = "x11"
+
SRC_URI += "file://0001-yelp.m4-drop-the-check-for-itstool.patch"
SRC_URI[archive.md5sum] = "3296af4532b8019775f4b40d21a341ae"
SRC_URI[archive.sha256sum] = "d527f1770779ec22d955aeb13b148a846a26144e433ff0480c981af80e2390b1"
diff --git a/meta/recipes-gnome/gcr/gcr_3.16.0.bb b/meta/recipes-gnome/gcr/gcr_3.16.0.bb
index 8b5b6e4..e50b3a8 100644
--- a/meta/recipes-gnome/gcr/gcr_3.16.0.bb
+++ b/meta/recipes-gnome/gcr/gcr_3.16.0.bb
@@ -7,7 +7,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=55ca817ccb7d5b5b66355690e9abc605"
DEPENDS = "gtk+3 p11-kit glib-2.0 libgcrypt vala"
-inherit autotools gnomebase gtk-icon-cache gtk-doc
+inherit autotools gnomebase gtk-icon-cache gtk-doc distro_features_check
+# depends on gtk+3, but also x11 through gtk+-x11
+REQUIRED_DISTRO_FEATURES = "x11"
SRC_URI[archive.md5sum] = "d5835680be0b6a838e02a528d5378d9c"
SRC_URI[archive.sha256sum] = "ecfe8df41cc88158364bb15addc670b11e539fe844742983629ba2323888d075"
@@ -16,3 +18,6 @@ FILES_${PN} += " \
${datadir}/dbus-1 \
${datadir}/gcr-3 \
"
+
+# http://errors.yoctoproject.org/Errors/Details/20229/
+ARM_INSTRUCTION_SET = "arm"
diff --git a/meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf/CVE-2015-7674.patch b/meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf/CVE-2015-7674.patch
new file mode 100644
index 0000000..d516e88
--- /dev/null
+++ b/meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf/CVE-2015-7674.patch
@@ -0,0 +1,39 @@
+From e9a5704edaa9aee9498f1fbf6e1b70fcce2e55aa Mon Sep 17 00:00:00 2001
+From: Benjamin Otte <otte at redhat.com>
+Date: Tue, 22 Sep 2015 22:44:51 +0200
+Subject: [PATCH] pixops: Don't overflow variables when shifting them
+
+If we shift by 16 bits we need to be sure those 16 bits actually exist.
+They do now.
+
+Upstream-status: Backport
+https://git.gnome.org/browse/gdk-pixbuf/commit/?id=e9a5704edaa9aee9498f1fbf6e1b70fcce2e55aa
+
+CVE: CVE-2015-7674
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ gdk-pixbuf/pixops/pixops.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+Index: gdk-pixbuf-2.30.8/gdk-pixbuf/pixops/pixops.c
+===================================================================
+--- gdk-pixbuf-2.30.8.orig/gdk-pixbuf/pixops/pixops.c
++++ gdk-pixbuf-2.30.8/gdk-pixbuf/pixops/pixops.c
+@@ -264,11 +264,11 @@ pixops_scale_nearest (guchar *des
+ double scale_x,
+ double scale_y)
+ {
+- int i;
+- int x;
+- int x_step = (1 << SCALE_SHIFT) / scale_x;
+- int y_step = (1 << SCALE_SHIFT) / scale_y;
+- int xmax, xstart, xstop, x_pos, y_pos;
++ gint64 i;
++ gint64 x;
++ gint64 x_step = (1 << SCALE_SHIFT) / scale_x;
++ gint64 y_step = (1 << SCALE_SHIFT) / scale_y;
++ gint64 xmax, xstart, xstop, x_pos, y_pos;
+ const guchar *p;
+
+ #define INNER_LOOP(SRC_CHANNELS,DEST_CHANNELS,ASSIGN_PIXEL) \
diff --git a/meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf_2.30.8.bb b/meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf_2.30.8.bb
index 07c2dce..dcd01b1 100644
--- a/meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf_2.30.8.bb
+++ b/meta/recipes-gnome/gdk-pixbuf/gdk-pixbuf_2.30.8.bb
@@ -9,7 +9,6 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=3bf50002aefd002f49e7bb854063f7e7 \
SECTION = "libs"
DEPENDS = "glib-2.0"
-DEPENDS_append_linuxstdbase = " virtual/libx11"
MAJ_VER = "${@oe.utils.trim_version("${PV}", 2)}"
@@ -19,6 +18,7 @@ SRC_URI = "${GNOME_MIRROR}/${BPN}/${MAJ_VER}/${BPN}-${PV}.tar.xz \
file://run-ptest \
file://fatal-loader.patch \
file://0001-pixops-Be-more-careful-about-integer-overflow.patch \
+ file://CVE-2015-7674.patch \
"
SRC_URI[md5sum] = "4fed0d54432f1b69fc6e66e608bd5542"
@@ -50,18 +50,19 @@ PACKAGES =+ "${PN}-xlib"
FILES_${PN}-xlib = "${libdir}/*pixbuf_xlib*${SOLIBS}"
ALLOW_EMPTY_${PN}-xlib = "1"
-FILES_${PN} = "${bindir}/gdk-pixbuf-query-loaders \
- ${bindir}/gdk-pixbuf-pixdata \
+FILES_${PN} = "${libdir}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders \
${libdir}/lib*.so.*"
FILES_${PN}-dev += " \
${bindir}/gdk-pixbuf-csource \
+ ${bindir}/gdk-pixbuf-pixdata \
${includedir}/* \
${libdir}/gdk-pixbuf-2.0/${LIBV}/loaders/*.la \
"
FILES_${PN}-dbg += " \
- ${libdir}/.debug/* \
+ ${libdir}/.debug/* \
+ ${libdir}/gdk-pixbuf-2.0/.debug/* \
${libdir}/gdk-pixbuf-2.0/${LIBV}/loaders/.debug/* \
"
@@ -81,6 +82,12 @@ python populate_packages_prepend () {
d.appendVar("RDEPENDS_gdk-pixbuf-ptest", " " + packages)
}
+do_install_append() {
+ # Move gdk-pixbuf-query-loaders into libdir so it is always available
+ # in multilib builds.
+ mv ${D}/${bindir}/gdk-pixbuf-query-loaders ${D}/${libdir}/gdk-pixbuf-2.0/
+}
+
do_install_append_class-native() {
find ${D}${libdir} -name "libpixbufloader-*.la" -exec rm \{\} \;
@@ -90,8 +97,17 @@ do_install_append_class-native() {
create_wrapper ${D}/${bindir}/gdk-pixbuf-pixdata \
GDK_PIXBUF_MODULE_FILE=${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/${LIBV}/loaders.cache
- create_wrapper ${D}/${bindir}/gdk-pixbuf-query-loaders \
+ create_wrapper ${D}/${libdir}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders \
GDK_PIXBUF_MODULE_FILE=${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/${LIBV}/loaders.cache \
GDK_PIXBUF_MODULEDIR=${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/${LIBV}/loaders
}
BBCLASSEXTEND = "native"
+
+SSTATEPREINSTFUNCS_append_class-native = " gdkpixbuf_sstate_preinst"
+SYSROOT_PREPROCESS_FUNCS_append_class-native = " gdkpixbuf_sstate_preinst"
+
+gdkpixbuf_sstate_preinst() {
+ if [ "${BB_CURRENTTASK}" = "populate_sysroot" ]; then
+ rm -rf ${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/${LIBV}/*
+ fi
+}
diff --git a/meta/recipes-gnome/gnome-desktop/gnome-desktop3_3.16.2.bb b/meta/recipes-gnome/gnome-desktop/gnome-desktop3_3.16.2.bb
index 1f2f06c..3765697 100644
--- a/meta/recipes-gnome/gnome-desktop/gnome-desktop3_3.16.2.bb
+++ b/meta/recipes-gnome/gnome-desktop/gnome-desktop3_3.16.2.bb
@@ -10,7 +10,10 @@ inherit gnome pkgconfig
SRC_URI[archive.md5sum] = "ab5bf4cc94ad63639f42adcc1542b1f0"
SRC_URI[archive.sha256sum] = "3a8f196b46eb9dbd3ba2afb8fb5fef6a8825539d449a02181311242e22227bd0"
-DEPENDS += "gsettings-desktop-schemas gconf libxrandr virtual/libx11 gtk+3 glib-2.0 gnome-doc-utils gnome-common startup-notification iso-codes"
+DEPENDS += "gsettings-desktop-schemas gconf libxrandr virtual/libx11 gtk+3 glib-2.0 gnome-doc-utils gnome-common startup-notification xkeyboard-config iso-codes"
+
+inherit distro_features_check
+REQUIRED_DISTRO_FEATURES = "x11"
EXTRA_OECONF = "--disable-desktop-docs"
diff --git a/meta/recipes-gnome/gnome/gnome-doc-utils.inc b/meta/recipes-gnome/gnome/gnome-doc-utils.inc
index 9587506..8adfac7 100644
--- a/meta/recipes-gnome/gnome/gnome-doc-utils.inc
+++ b/meta/recipes-gnome/gnome/gnome-doc-utils.inc
@@ -15,9 +15,6 @@ CLEANBROKEN = "1"
EXTRA_OECONF += "--disable-scrollkeeper"
do_install_append() {
- mkdir -p ${D}${datadir}/xml/gnome/xslt/
- cp -pPr ${S}/xslt/* ${D}${datadir}/xml/gnome/xslt/
-
chown -R root:root ${D}
}
diff --git a/meta/recipes-gnome/gtk+/gtk+.inc b/meta/recipes-gnome/gtk+/gtk+.inc
index be5273d..a197b9d 100644
--- a/meta/recipes-gnome/gtk+/gtk+.inc
+++ b/meta/recipes-gnome/gtk+/gtk+.inc
@@ -11,7 +11,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=3bf50002aefd002f49e7bb854063f7e7"
SECTION = "libs"
inherit distro_features_check
-ANY_OF_DISTRO_FEATURES = "directfb x11"
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
X11DEPENDS = "virtual/libx11 libxext libxcursor libxrandr libxdamage libxrender libxcomposite"
DEPENDS = "glib-2.0 pango atk jpeg libpng gdk-pixbuf-native docbook-utils-native \
diff --git a/meta/recipes-gnome/gtk+/gtk+3.inc b/meta/recipes-gnome/gtk+/gtk+3.inc
index f29f0d3..22a40d8 100644
--- a/meta/recipes-gnome/gtk+/gtk+3.inc
+++ b/meta/recipes-gnome/gtk+/gtk+3.inc
@@ -10,7 +10,8 @@ DEPENDS = "glib-2.0 cairo pango atk jpeg libpng gdk-pixbuf \
LICENSE = "LGPLv2 & LGPLv2+ & LGPLv2.1+"
-inherit autotools pkgconfig gtk-doc update-alternatives gtk-immodules-cache gsettings
+inherit autotools pkgconfig gtk-doc update-alternatives gtk-immodules-cache gsettings distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK3DISTROFEATURES}"
# This should be in autotools.bbclass, but until something elses uses it putting
# it here avoids rebuilding everything.
@@ -31,9 +32,11 @@ EXTRA_OECONF += " \
"
PACKAGECONFIG ??= "${@bb.utils.contains("DISTRO_FEATURES", "x11", "x11", "", d)} \
+ ${@bb.utils.contains("DISTRO_FEATURES", "opengl x11", "glx", "", d)} \
${@bb.utils.contains("DISTRO_FEATURES", "wayland", "wayland", "", d)}"
PACKAGECONFIG[x11] = "--enable-x11-backend,--disable-x11-backend,at-spi2-atk fontconfig libx11 libxext libxcursor libxi libxdamage libxrandr libxrender libxcomposite libxfixes"
+PACKAGECONFIG[glx] = "--enable-glx,--disable-glx,,libgl"
PACKAGECONFIG[wayland] = "--enable-wayland-backend,--disable-wayland-backend,wayland libxkbcommon virtual/mesa"
do_install_append() {
diff --git a/meta/recipes-gnome/gtk+/gtk+3/Do-not-try-to-initialize-GL-without-libGL.patch b/meta/recipes-gnome/gtk+/gtk+3/Do-not-try-to-initialize-GL-without-libGL.patch
new file mode 100644
index 0000000..c8c480c
--- /dev/null
+++ b/meta/recipes-gnome/gtk+/gtk+3/Do-not-try-to-initialize-GL-without-libGL.patch
@@ -0,0 +1,60 @@
+From fc22058a10db913534f11348f86681fe9e1838e5 Mon Sep 17 00:00:00 2001
+From: Jussi Kukkonen <jussi.kukkonen at intel.com>
+Date: Fri, 16 Oct 2015 16:35:16 +0300
+Subject: [PATCH] Do not try to initialize GL without libGL
+
+_gdk_x11_screen_update_visuals_for_gl() will end up calling epoxys
+GLX api which will exit() if libGL.so.1 is not present. We do not
+want that to happen and we don't want every app to have to set
+"GDK_GL=disabled" environment variable: so use #ifdef set based on
+opengl distro feature.
+
+Upstream is not interested in the fix as it is: Either epoxy should be
+fixed (to not exit) or GTK+ possibly could do some additional probing
+before calling epoxy APIs.
+
+Upstream-Status: Denied
+Signed-off-by: Jussi Kukkonen <jussi.kukkonen at intel.com>
+---
+ configure.ac | 7 +++++++
+ gdk/x11/gdkvisual-x11.c | 5 +++++
+ 2 files changed, 12 insertions(+)
+
+diff --git a/configure.ac b/configure.ac
+index 729a62e..58cc1ac 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -328,6 +328,13 @@ AC_ARG_ENABLE(mir-backend,
+ [enable the Mir gdk backend])],
+ [backend_set=yes])
+
++AC_ARG_ENABLE(glx,
++ [AS_HELP_STRING([--enable-glx],
++ [When enabled Gdk will try to initialize GLX])])
++AS_IF([test "x$enable_glx" != "xno"], [
++ AC_DEFINE([HAVE_GLX], [], [GLX will be available at runtime])
++])
++
+ if test -z "$backend_set"; then
+ if test "$platform_win32" = yes; then
+ enable_win32_backend=yes
+diff --git a/gdk/x11/gdkvisual-x11.c b/gdk/x11/gdkvisual-x11.c
+index f3b062d..c8243f4 100644
+--- a/gdk/x11/gdkvisual-x11.c
++++ b/gdk/x11/gdkvisual-x11.c
+@@ -345,7 +345,12 @@ _gdk_x11_screen_init_visuals (GdkScreen *screen)
+ /* If GL is available we want to pick better default/rgba visuals,
+ as we care about glx details such as alpha/depth/stencil depth,
+ stereo and double buffering */
++ /* update_visuals_for_gl() will end up calling epoxy GLX api which
++ will exit if libgl is not there: so only do this if we know GL
++ is available */
++#ifdef HAVE_GLX
+ _gdk_x11_screen_update_visuals_for_gl (screen);
++#endif
+ }
+
+ gint
+--
+2.1.4
+
diff --git a/meta/recipes-gnome/gtk+/gtk+3_3.16.6.bb b/meta/recipes-gnome/gtk+/gtk+3_3.16.6.bb
index 1d736a4..381e607 100644
--- a/meta/recipes-gnome/gtk+/gtk+3_3.16.6.bb
+++ b/meta/recipes-gnome/gtk+/gtk+3_3.16.6.bb
@@ -5,6 +5,7 @@ MAJ_VER = "${@oe.utils.trim_version("${PV}", 2)}"
SRC_URI = "http://ftp.gnome.org/pub/gnome/sources/gtk+/${MAJ_VER}/gtk+-${PV}.tar.xz \
file://hardcoded_libtool.patch \
file://Dont-force-csd.patch \
+ file://Do-not-try-to-initialize-GL-without-libGL.patch \
"
SRC_URI[md5sum] = "fc59e5c8b5a4585b60623dd708df400b"
diff --git a/meta/recipes-gnome/gtk-engines/gtk-engines_2.20.2.bb b/meta/recipes-gnome/gtk-engines/gtk-engines_2.20.2.bb
index c30454c..7c3a87e 100644
--- a/meta/recipes-gnome/gtk-engines/gtk-engines_2.20.2.bb
+++ b/meta/recipes-gnome/gtk-engines/gtk-engines_2.20.2.bb
@@ -6,7 +6,7 @@ LICENSE = "LGPLv2.1"
LIC_FILES_CHKSUM = "file://COPYING;md5=2d5025d4aa3495befef8f17206a5b0a1"
SECTION = "x11/base"
-DEPENDS = "intltool-native gtk+"
+DEPENDS = "intltool-native gtk+ gettext-native"
PR = "r3"
@@ -34,6 +34,9 @@ RDEPENDS_${PN}-dev = ""
inherit gnomebase
GNOME_COMPRESS_TYPE="bz2"
+inherit distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
+
python populate_packages_prepend() {
engines_root = os.path.join(d.getVar('libdir', True), "gtk-2.0/2.10.0/engines")
themes_root = os.path.join(d.getVar('datadir', True), "themes")
diff --git a/meta/recipes-gnome/gtk-theme-torturer/gtk-theme-torturer_git.bb b/meta/recipes-gnome/gtk-theme-torturer/gtk-theme-torturer_git.bb
index 889fd89..b67806d 100644
--- a/meta/recipes-gnome/gtk-theme-torturer/gtk-theme-torturer_git.bb
+++ b/meta/recipes-gnome/gtk-theme-torturer/gtk-theme-torturer_git.bb
@@ -13,6 +13,9 @@ S = "${WORKDIR}/git/gtk-theme-torturer"
CFLAGS += "-Wl,-rpath-link,${STAGING_LIBDIR}"
+inherit distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
+
do_install() {
install -d ${D}${bindir}
install -m 0755 torturer ${D}${bindir}
diff --git a/meta/recipes-gnome/libglade/libglade_2.6.4.bb b/meta/recipes-gnome/libglade/libglade_2.6.4.bb
index 15267ca..553e19c 100644
--- a/meta/recipes-gnome/libglade/libglade_2.6.4.bb
+++ b/meta/recipes-gnome/libglade/libglade_2.6.4.bb
@@ -11,7 +11,8 @@ SECTION = "libs"
PR = "r5"
DEPENDS = "zlib gdk-pixbuf gtk+"
-inherit autotools pkgconfig gnomebase gtk-doc
+inherit autotools pkgconfig gnomebase gtk-doc distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
GNOME_COMPRESS_TYPE="bz2"
SRC_URI += "file://glade-cruft.patch file://no-xml2.patch file://python_environment.patch"
diff --git a/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_1.patch b/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_1.patch
new file mode 100644
index 0000000..a3ba41f
--- /dev/null
+++ b/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_1.patch
@@ -0,0 +1,139 @@
+From d1c9191949747f6dcfd207831d15dd4ba00e31f2 Mon Sep 17 00:00:00 2001
+From: Benjamin Otte <otte at redhat.com>
+Date: Wed, 7 Oct 2015 05:31:08 +0200
+Subject: [PATCH] state: Store mask as reference
+
+Instead of immediately looking up the mask, store the reference and look
+it up on use.
+
+Upstream-status: Backport
+
+supporting patch
+https://git.gnome.org/browse/librsvg/commit/rsvg-styles.c?id=d1c9191949747f6dcfd207831d15dd4ba00e31f2
+
+CVE: CVE-2015-7558
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ rsvg-cairo-draw.c | 6 +++++-
+ rsvg-mask.c | 17 -----------------
+ rsvg-mask.h | 2 --
+ rsvg-styles.c | 12 ++++++++----
+ rsvg-styles.h | 2 +-
+ 5 files changed, 14 insertions(+), 25 deletions(-)
+
+Index: librsvg-2.40.10/rsvg-cairo-draw.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-cairo-draw.c
++++ librsvg-2.40.10/rsvg-cairo-draw.c
+@@ -825,7 +825,11 @@ rsvg_cairo_pop_render_stack (RsvgDrawing
+ cairo_set_operator (render->cr, state->comp_op);
+
+ if (state->mask) {
+- rsvg_cairo_generate_mask (render->cr, state->mask, ctx, &render->bbox);
++ RsvgNode *mask;
++
++ mask = rsvg_defs_lookup (ctx->defs, state->mask);
++ if (mask && RSVG_NODE_TYPE (mask) == RSVG_NODE_TYPE_MASK)
++ rsvg_cairo_generate_mask (render->cr, (RsvgMask *) mask, ctx, &render->bbox);
+ } else if (state->opacity != 0xFF)
+ cairo_paint_with_alpha (render->cr, (double) state->opacity / 255.0);
+ else
+Index: librsvg-2.40.10/rsvg-mask.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-mask.c
++++ librsvg-2.40.10/rsvg-mask.c
+@@ -103,23 +103,6 @@ rsvg_get_url_string (const char *str)
+ }
+
+ RsvgNode *
+-rsvg_mask_parse (const RsvgDefs * defs, const char *str)
+-{
+- char *name;
+-
+- name = rsvg_get_url_string (str);
+- if (name) {
+- RsvgNode *val;
+- val = rsvg_defs_lookup (defs, name);
+- g_free (name);
+-
+- if (val && RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_MASK)
+- return val;
+- }
+- return NULL;
+-}
+-
+-RsvgNode *
+ rsvg_clip_path_parse (const RsvgDefs * defs, const char *str)
+ {
+ char *name;
+Index: librsvg-2.40.10/rsvg-mask.h
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-mask.h
++++ librsvg-2.40.10/rsvg-mask.h
+@@ -48,8 +48,6 @@ struct _RsvgMask {
+
+ G_GNUC_INTERNAL
+ RsvgNode *rsvg_new_mask (void);
+-G_GNUC_INTERNAL
+-RsvgNode *rsvg_mask_parse (const RsvgDefs * defs, const char *str);
+
+ typedef struct _RsvgClipPath RsvgClipPath;
+
+Index: librsvg-2.40.10/rsvg-styles.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-styles.c
++++ librsvg-2.40.10/rsvg-styles.c
+@@ -221,6 +221,7 @@ rsvg_state_clone (RsvgState * dst, const
+
+ *dst = *src;
+ dst->parent = parent;
++ dst->mask = g_strdup (src->mask);
+ dst->font_family = g_strdup (src->font_family);
+ dst->lang = g_strdup (src->lang);
+ rsvg_paint_server_ref (dst->fill);
+@@ -356,7 +357,8 @@ rsvg_state_inherit_run (RsvgState * dst,
+
+ if (inherituninheritables) {
+ dst->clip_path_ref = src->clip_path_ref;
+- dst->mask = src->mask;
++ g_free (dst->mask);
++ dst->mask = g_strdup (src->mask);
+ dst->enable_background = src->enable_background;
+ dst->adobe_blend = src->adobe_blend;
+ dst->opacity = src->opacity;
+@@ -444,6 +446,7 @@ rsvg_state_inherit (RsvgState * dst, con
+ void
+ rsvg_state_finalize (RsvgState * state)
+ {
++ g_free (state->mask);
+ g_free (state->font_family);
+ g_free (state->lang);
+ rsvg_paint_server_unref (state->fill);
+@@ -517,9 +520,10 @@ rsvg_parse_style_pair (RsvgHandle * ctx,
+ state->adobe_blend = 11;
+ else
+ state->adobe_blend = 0;
+- } else if (g_str_equal (name, "mask"))
+- state->mask = rsvg_mask_parse (ctx->priv->defs, value);
+- else if (g_str_equal (name, "clip-path")) {
++ } else if (g_str_equal (name, "mask")) {
++ g_free (state->mask);
++ state->mask = rsvg_get_url_string (value);
++ } else if (g_str_equal (name, "clip-path")) {
+ state->clip_path_ref = rsvg_clip_path_parse (ctx->priv->defs, value);
+ } else if (g_str_equal (name, "overflow")) {
+ if (!g_str_equal (value, "inherit")) {
+Index: librsvg-2.40.10/rsvg-styles.h
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-styles.h
++++ librsvg-2.40.10/rsvg-styles.h
+@@ -80,7 +80,7 @@ struct _RsvgState {
+ cairo_matrix_t personal_affine;
+
+ RsvgFilter *filter;
+- void *mask;
++ char *mask;
+ void *clip_path_ref;
+ guint8 adobe_blend; /* 0..11 */
+ guint8 opacity; /* 0..255 */
diff --git a/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_2.patch b/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_2.patch
new file mode 100644
index 0000000..9f6820e
--- /dev/null
+++ b/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_2.patch
@@ -0,0 +1,230 @@
+From 6cfaab12c70cd4a34c4730837f1ecdf792593c90 Mon Sep 17 00:00:00 2001
+From: Benjamin Otte <otte at redhat.com>
+Date: Wed, 7 Oct 2015 07:57:39 +0200
+Subject: [PATCH] state: Look up clip path lazily
+
+Upstream-status: Backport
+
+supporting patch
+https://git.gnome.org/browse/librsvg/commit/rsvg-styles.c?id=6cfaab12c70cd4a34c4730837f1ecdf792593c90
+
+CVE: CVE-2015-7558
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ rsvg-cairo-draw.c | 56 +++++++++++++++++++++++++++++++++----------------------
+ rsvg-mask.c | 17 -----------------
+ rsvg-mask.h | 2 --
+ rsvg-styles.c | 10 +++++++---
+ rsvg-styles.h | 2 +-
+ 5 files changed, 42 insertions(+), 45 deletions(-)
+
+Index: librsvg-2.40.10/rsvg-cairo-draw.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-cairo-draw.c
++++ librsvg-2.40.10/rsvg-cairo-draw.c
+@@ -461,7 +461,7 @@ rsvg_cairo_render_path (RsvgDrawingCtx *
+ return;
+
+ need_tmpbuf = ((state->fill != NULL) && (state->stroke != NULL) && state->opacity != 0xff)
+- || state->clip_path_ref || state->mask || state->filter
++ || state->clip_path || state->mask || state->filter
+ || (state->comp_op != CAIRO_OPERATOR_OVER);
+
+ if (need_tmpbuf)
+@@ -708,18 +708,6 @@ rsvg_cairo_generate_mask (cairo_t * cr,
+ }
+
+ static void
+-rsvg_cairo_push_early_clips (RsvgDrawingCtx * ctx)
+-{
+- RsvgCairoRender *render = RSVG_CAIRO_RENDER (ctx->render);
+-
+- cairo_save (render->cr);
+- if (rsvg_current_state (ctx)->clip_path_ref)
+- if (((RsvgClipPath *) rsvg_current_state (ctx)->clip_path_ref)->units == userSpaceOnUse)
+- rsvg_cairo_clip (ctx, rsvg_current_state (ctx)->clip_path_ref, NULL);
+-
+-}
+-
+-static void
+ rsvg_cairo_push_render_stack (RsvgDrawingCtx * ctx)
+ {
+ /* XXX: Untested, probably needs help wrt filters */
+@@ -731,9 +719,27 @@ rsvg_cairo_push_render_stack (RsvgDrawin
+ RsvgState *state = rsvg_current_state (ctx);
+ gboolean lateclip = FALSE;
+
+- if (rsvg_current_state (ctx)->clip_path_ref)
+- if (((RsvgClipPath *) rsvg_current_state (ctx)->clip_path_ref)->units == objectBoundingBox)
+- lateclip = TRUE;
++ if (rsvg_current_state (ctx)->clip_path) {
++ RsvgNode *node;
++ node = rsvg_defs_lookup (ctx->defs, rsvg_current_state (ctx)->clip_path);
++ if (node && RSVG_NODE_TYPE (node) == RSVG_NODE_TYPE_CLIP_PATH) {
++ RsvgClipPath *clip_path = (RsvgClipPath *) node;
++
++ switch (clip_path->units) {
++ case userSpaceOnUse:
++ rsvg_cairo_clip (ctx, clip_path, NULL);
++ break;
++ case objectBoundingBox:
++ lateclip = TRUE;
++ break;
++
++ default:
++ g_assert_not_reached ();
++ break;
++ }
++
++ }
++ }
+
+ if (state->opacity == 0xFF
+ && !state->filter && !state->mask && !lateclip && (state->comp_op == CAIRO_OPERATOR_OVER)
+@@ -774,7 +780,9 @@ rsvg_cairo_push_render_stack (RsvgDrawin
+ void
+ rsvg_cairo_push_discrete_layer (RsvgDrawingCtx * ctx)
+ {
+- rsvg_cairo_push_early_clips (ctx);
++ RsvgCairoRender *render = RSVG_CAIRO_RENDER (ctx->render);
++
++ cairo_save (render->cr);
+ rsvg_cairo_push_render_stack (ctx);
+ }
+
+@@ -783,14 +791,18 @@ rsvg_cairo_pop_render_stack (RsvgDrawing
+ {
+ RsvgCairoRender *render = RSVG_CAIRO_RENDER (ctx->render);
+ cairo_t *child_cr = render->cr;
+- gboolean lateclip = FALSE;
++ RsvgClipPath *lateclip = NULL;
+ cairo_surface_t *surface = NULL;
+ RsvgState *state = rsvg_current_state (ctx);
+ gboolean nest;
+
+- if (rsvg_current_state (ctx)->clip_path_ref)
+- if (((RsvgClipPath *) rsvg_current_state (ctx)->clip_path_ref)->units == objectBoundingBox)
+- lateclip = TRUE;
++ if (rsvg_current_state (ctx)->clip_path) {
++ RsvgNode *node;
++ node = rsvg_defs_lookup (ctx->defs, rsvg_current_state (ctx)->clip_path);
++ if (node && RSVG_NODE_TYPE (node) == RSVG_NODE_TYPE_CLIP_PATH
++ && ((RsvgClipPath *) node)->units == objectBoundingBox)
++ lateclip = (RsvgClipPath *) node;
++ }
+
+ if (state->opacity == 0xFF
+ && !state->filter && !state->mask && !lateclip && (state->comp_op == CAIRO_OPERATOR_OVER)
+@@ -820,7 +832,7 @@ rsvg_cairo_pop_render_stack (RsvgDrawing
+ nest ? 0 : render->offset_y);
+
+ if (lateclip)
+- rsvg_cairo_clip (ctx, rsvg_current_state (ctx)->clip_path_ref, &render->bbox);
++ rsvg_cairo_clip (ctx, lateclip, &render->bbox);
+
+ cairo_set_operator (render->cr, state->comp_op);
+
+Index: librsvg-2.40.10/rsvg-mask.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-mask.c
++++ librsvg-2.40.10/rsvg-mask.c
+@@ -102,23 +102,6 @@ rsvg_get_url_string (const char *str)
+ return NULL;
+ }
+
+-RsvgNode *
+-rsvg_clip_path_parse (const RsvgDefs * defs, const char *str)
+-{
+- char *name;
+-
+- name = rsvg_get_url_string (str);
+- if (name) {
+- RsvgNode *val;
+- val = rsvg_defs_lookup (defs, name);
+- g_free (name);
+-
+- if (val && RSVG_NODE_TYPE (val) == RSVG_NODE_TYPE_CLIP_PATH)
+- return val;
+- }
+- return NULL;
+-}
+-
+ static void
+ rsvg_clip_path_set_atts (RsvgNode * self, RsvgHandle * ctx, RsvgPropertyBag * atts)
+ {
+Index: librsvg-2.40.10/rsvg-mask.h
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-mask.h
++++ librsvg-2.40.10/rsvg-mask.h
+@@ -58,8 +58,6 @@ struct _RsvgClipPath {
+
+ G_GNUC_INTERNAL
+ RsvgNode *rsvg_new_clip_path (void);
+-G_GNUC_INTERNAL
+-RsvgNode *rsvg_clip_path_parse (const RsvgDefs * defs, const char *str);
+
+ G_END_DECLS
+ #endif
+Index: librsvg-2.40.10/rsvg-styles.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-styles.c
++++ librsvg-2.40.10/rsvg-styles.c
+@@ -149,7 +149,7 @@ rsvg_state_init (RsvgState * state)
+ state->visible = TRUE;
+ state->cond_true = TRUE;
+ state->filter = NULL;
+- state->clip_path_ref = NULL;
++ state->clip_path = NULL;
+ state->startMarker = NULL;
+ state->middleMarker = NULL;
+ state->endMarker = NULL;
+@@ -222,6 +222,7 @@ rsvg_state_clone (RsvgState * dst, const
+ *dst = *src;
+ dst->parent = parent;
+ dst->mask = g_strdup (src->mask);
++ dst->clip_path = g_strdup (src->clip_path);
+ dst->font_family = g_strdup (src->font_family);
+ dst->lang = g_strdup (src->lang);
+ rsvg_paint_server_ref (dst->fill);
+@@ -356,7 +357,8 @@ rsvg_state_inherit_run (RsvgState * dst,
+ }
+
+ if (inherituninheritables) {
+- dst->clip_path_ref = src->clip_path_ref;
++ g_free (dst->clip_path);
++ dst->clip_path = g_strdup (src->clip_path);
+ g_free (dst->mask);
+ dst->mask = g_strdup (src->mask);
+ dst->enable_background = src->enable_background;
+@@ -447,6 +449,7 @@ void
+ rsvg_state_finalize (RsvgState * state)
+ {
+ g_free (state->mask);
++ g_free (state->clip_path);
+ g_free (state->font_family);
+ g_free (state->lang);
+ rsvg_paint_server_unref (state->fill);
+@@ -524,7 +527,8 @@ rsvg_parse_style_pair (RsvgHandle * ctx,
+ g_free (state->mask);
+ state->mask = rsvg_get_url_string (value);
+ } else if (g_str_equal (name, "clip-path")) {
+- state->clip_path_ref = rsvg_clip_path_parse (ctx->priv->defs, value);
++ g_free (state->clip_path);
++ state->clip_path = rsvg_get_url_string (value);
+ } else if (g_str_equal (name, "overflow")) {
+ if (!g_str_equal (value, "inherit")) {
+ state->overflow = rsvg_css_parse_overflow (value, &state->has_overflow);
+Index: librsvg-2.40.10/rsvg-styles.h
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-styles.h
++++ librsvg-2.40.10/rsvg-styles.h
+@@ -81,7 +81,7 @@ struct _RsvgState {
+
+ RsvgFilter *filter;
+ char *mask;
+- void *clip_path_ref;
++ char *clip_path;
+ guint8 adobe_blend; /* 0..11 */
+ guint8 opacity; /* 0..255 */
+
diff --git a/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_3.patch b/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_3.patch
new file mode 100644
index 0000000..dd67ab7
--- /dev/null
+++ b/meta/recipes-gnome/librsvg/librsvg/CVE-2015-7558_3.patch
@@ -0,0 +1,223 @@
+From a51919f7e1ca9c535390a746fbf6e28c8402dc61 Mon Sep 17 00:00:00 2001
+From: Benjamin Otte <otte at redhat.com>
+Date: Wed, 7 Oct 2015 08:45:37 +0200
+Subject: [PATCH] rsvg: Add rsvg_acquire_node()
+
+This function does proper recursion checks when looking up resources
+from URLs and thereby helps avoiding infinite loops when cyclic
+references span multiple types of elements.
+
+Upstream-status: Backport
+
+https://git.gnome.org/browse/librsvg/commit/rsvg-styles.c?id=a51919f7e1ca9c535390a746fbf6e28c8402dc61
+
+CVE: CVE-2015-7558
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ rsvg-base.c | 55 +++++++++++++++++++++++++++++++++++++++++++++++++++++
+ rsvg-cairo-draw.c | 15 +++++++++++----
+ rsvg-cairo-render.c | 1 +
+ rsvg-filter.c | 9 +++++++--
+ rsvg-private.h | 5 +++++
+ 5 files changed, 79 insertions(+), 6 deletions(-)
+
+Index: librsvg-2.40.10/rsvg-base.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-base.c
++++ librsvg-2.40.10/rsvg-base.c
+@@ -1236,6 +1236,8 @@ rsvg_drawing_ctx_free (RsvgDrawingCtx *
+ g_slist_free (handle->drawsub_stack);
+
+ g_slist_free (handle->ptrs);
++ g_warn_if_fail (handle->acquired_nodes == NULL);
++ g_slist_free (handle->acquired_nodes);
+
+ if (handle->base_uri)
+ g_free (handle->base_uri);
+@@ -2018,6 +2020,59 @@ rsvg_push_discrete_layer (RsvgDrawingCtx
+ ctx->render->push_discrete_layer (ctx);
+ }
+
++/*
++ * rsvg_acquire_node:
++ * @ctx: The drawing context in use
++ * @url: The IRI to lookup
++ *
++ * Use this function when looking up urls to other nodes. This
++ * function does proper recursion checking and thereby avoids
++ * infinite loops.
++ *
++ * Nodes acquired by this function must be released using
++ * rsvg_release_node() in reverse acquiring order.
++ *
++ * Returns: The node referenced by @url or %NULL if the @url
++ * does not reference a node.
++ */
++RsvgNode *
++rsvg_acquire_node (RsvgDrawingCtx * ctx, const char *url)
++{
++ RsvgNode *node;
++
++ node = rsvg_defs_lookup (ctx->defs, url);
++ if (node == NULL)
++ return NULL;
++
++ if (g_slist_find (ctx->acquired_nodes, node))
++ return NULL;
++
++ ctx->acquired_nodes = g_slist_prepend (ctx->acquired_nodes, node);
++
++ return node;
++}
++
++/*
++ * rsvg_release_node:
++ * @ctx: The drawing context the node was acquired from
++ * @node: Node to release
++ *
++ * Releases a node previously acquired via rsvg_acquire_node().
++ *
++ * if @node is %NULL, this function does nothing.
++ */
++void
++rsvg_release_node (RsvgDrawingCtx * ctx, RsvgNode *node)
++{
++ if (node == NULL)
++ return;
++
++ g_return_if_fail (ctx->acquired_nodes != NULL);
++ g_return_if_fail (ctx->acquired_nodes->data == node);
++
++ ctx->acquired_nodes = g_slist_remove (ctx->acquired_nodes, node);
++}
++
+ void
+ rsvg_render_path (RsvgDrawingCtx * ctx, const cairo_path_t *path)
+ {
+Index: librsvg-2.40.10/rsvg-cairo-draw.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-cairo-draw.c
++++ librsvg-2.40.10/rsvg-cairo-draw.c
+@@ -721,7 +721,7 @@ rsvg_cairo_push_render_stack (RsvgDrawin
+
+ if (rsvg_current_state (ctx)->clip_path) {
+ RsvgNode *node;
+- node = rsvg_defs_lookup (ctx->defs, rsvg_current_state (ctx)->clip_path);
++ node = rsvg_acquire_node (ctx, rsvg_current_state (ctx)->clip_path);
+ if (node && RSVG_NODE_TYPE (node) == RSVG_NODE_TYPE_CLIP_PATH) {
+ RsvgClipPath *clip_path = (RsvgClipPath *) node;
+
+@@ -739,6 +739,8 @@ rsvg_cairo_push_render_stack (RsvgDrawin
+ }
+
+ }
++
++ rsvg_release_node (ctx, node);
+ }
+
+ if (state->opacity == 0xFF
+@@ -798,10 +800,12 @@ rsvg_cairo_pop_render_stack (RsvgDrawing
+
+ if (rsvg_current_state (ctx)->clip_path) {
+ RsvgNode *node;
+- node = rsvg_defs_lookup (ctx->defs, rsvg_current_state (ctx)->clip_path);
++ node = rsvg_acquire_node (ctx, rsvg_current_state (ctx)->clip_path);
+ if (node && RSVG_NODE_TYPE (node) == RSVG_NODE_TYPE_CLIP_PATH
+ && ((RsvgClipPath *) node)->units == objectBoundingBox)
+ lateclip = (RsvgClipPath *) node;
++ else
++ rsvg_release_node (ctx, node);
+ }
+
+ if (state->opacity == 0xFF
+@@ -831,17 +835,20 @@ rsvg_cairo_pop_render_stack (RsvgDrawing
+ nest ? 0 : render->offset_x,
+ nest ? 0 : render->offset_y);
+
+- if (lateclip)
++ if (lateclip) {
+ rsvg_cairo_clip (ctx, lateclip, &render->bbox);
++ rsvg_release_node (ctx, (RsvgNode *) lateclip);
++ }
+
+ cairo_set_operator (render->cr, state->comp_op);
+
+ if (state->mask) {
+ RsvgNode *mask;
+
+- mask = rsvg_defs_lookup (ctx->defs, state->mask);
++ mask = rsvg_acquire_node (ctx, state->mask);
+ if (mask && RSVG_NODE_TYPE (mask) == RSVG_NODE_TYPE_MASK)
+ rsvg_cairo_generate_mask (render->cr, (RsvgMask *) mask, ctx, &render->bbox);
++ rsvg_release_node (ctx, mask);
+ } else if (state->opacity != 0xFF)
+ cairo_paint_with_alpha (render->cr, (double) state->opacity / 255.0);
+ else
+Index: librsvg-2.40.10/rsvg-cairo-render.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-cairo-render.c
++++ librsvg-2.40.10/rsvg-cairo-render.c
+@@ -155,6 +155,7 @@ rsvg_cairo_new_drawing_ctx (cairo_t * cr
+ draw->pango_context = NULL;
+ draw->drawsub_stack = NULL;
+ draw->ptrs = NULL;
++ draw->acquired_nodes = NULL;
+
+ rsvg_state_push (draw);
+ state = rsvg_current_state (draw);
+Index: librsvg-2.40.10/rsvg-filter.c
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-filter.c
++++ librsvg-2.40.10/rsvg-filter.c
+@@ -3921,6 +3921,7 @@ rsvg_filter_primitive_image_render_in (R
+ RsvgDrawingCtx *ctx;
+ RsvgFilterPrimitiveImage *upself;
+ RsvgNode *drawable;
++ cairo_surface_t *result;
+
+ ctx = context->ctx;
+
+@@ -3929,13 +3930,17 @@ rsvg_filter_primitive_image_render_in (R
+ if (!upself->href)
+ return NULL;
+
+- drawable = rsvg_defs_lookup (ctx->defs, upself->href->str);
++ drawable = rsvg_acquire_node (ctx, upself->href->str);
+ if (!drawable)
+ return NULL;
+
+ rsvg_current_state (ctx)->affine = context->paffine;
+
+- return rsvg_get_surface_of_node (ctx, drawable, context->width, context->height);
++ result = rsvg_get_surface_of_node (ctx, drawable, context->width, context->height);
++
++ rsvg_release_node (ctx, drawable);
++
++ return result;
+ }
+
+ static cairo_surface_t *
+Index: librsvg-2.40.10/rsvg-private.h
+===================================================================
+--- librsvg-2.40.10.orig/rsvg-private.h
++++ librsvg-2.40.10/rsvg-private.h
+@@ -200,6 +200,7 @@ struct RsvgDrawingCtx {
+ GSList *vb_stack;
+ GSList *drawsub_stack;
+ GSList *ptrs;
++ GSList *acquired_nodes;
+ };
+
+ /*Abstract base class for context for our backends (one as yet)*/
+@@ -360,6 +361,10 @@ void rsvg_pop_discrete_layer (RsvgDra
+ G_GNUC_INTERNAL
+ void rsvg_push_discrete_layer (RsvgDrawingCtx * ctx);
+ G_GNUC_INTERNAL
++RsvgNode *rsvg_acquire_node (RsvgDrawingCtx * ctx, const char *url);
++G_GNUC_INTERNAL
++void rsvg_release_node (RsvgDrawingCtx * ctx, RsvgNode *node);
++G_GNUC_INTERNAL
+ void rsvg_render_path (RsvgDrawingCtx * ctx, const cairo_path_t *path);
+ G_GNUC_INTERNAL
+ void rsvg_render_surface (RsvgDrawingCtx * ctx, cairo_surface_t *surface,
diff --git a/meta/recipes-gnome/librsvg/librsvg_2.40.10.bb b/meta/recipes-gnome/librsvg/librsvg_2.40.10.bb
index a8b0e4f..cb8a73c 100644
--- a/meta/recipes-gnome/librsvg/librsvg_2.40.10.bb
+++ b/meta/recipes-gnome/librsvg/librsvg_2.40.10.bb
@@ -12,11 +12,17 @@ BBCLASSEXTEND = "native"
inherit autotools pkgconfig gnomebase gtk-doc pixbufcache
-SRC_URI += "file://gtk-option.patch"
+SRC_URI += "file://gtk-option.patch \
+ file://CVE-2015-7558_1.patch \
+ file://CVE-2015-7558_2.patch \
+ file://CVE-2015-7558_3.patch \
+ "
SRC_URI[archive.md5sum] = "fadebe2e799ab159169ee3198415ff85"
SRC_URI[archive.sha256sum] = "965c807438ce90b204e930ff80c92eba1606a2f6fd5ccfd09335c99896dd3479"
+CACHED_CONFIGUREVARS = "ac_cv_path_GDK_PIXBUF_QUERYLOADERS=${STAGING_LIBDIR_NATIVE}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders"
+
EXTRA_OECONF = "--disable-introspection --disable-vala"
# The older ld (2.22) on the host (Centos 6.5) doesn't have the
diff --git a/meta/recipes-gnome/libsecret/libsecret_0.18.2.bb b/meta/recipes-gnome/libsecret/libsecret_0.18.2.bb
index cebc83b..8fc0018 100644
--- a/meta/recipes-gnome/libsecret/libsecret_0.18.2.bb
+++ b/meta/recipes-gnome/libsecret/libsecret_0.18.2.bb
@@ -4,9 +4,12 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=23c2a5e0106b99d75238986559bb5fc6"
inherit gnomebase gtk-doc
-DEPENDS = "glib-2.0 libgcrypt"
+DEPENDS = "glib-2.0 libgcrypt gettext-native"
EXTRA_OECONF += "--disable-manpages"
SRC_URI[archive.md5sum] = "23cdf8267d11a26f88f0dbec1e2022ad"
SRC_URI[archive.sha256sum] = "12fd288b012e1b2b1b54d586cd4c6507885715534644b4534b7ef7d7079ba443"
+
+# http://errors.yoctoproject.org/Errors/Details/20228/
+ARM_INSTRUCTION_SET = "arm"
diff --git a/meta/recipes-gnome/libwnck/libwnck3_3.14.0.bb b/meta/recipes-gnome/libwnck/libwnck3_3.14.0.bb
index d0f5175..3ee1ae9 100644
--- a/meta/recipes-gnome/libwnck/libwnck3_3.14.0.bb
+++ b/meta/recipes-gnome/libwnck/libwnck3_3.14.0.bb
@@ -13,3 +13,8 @@ PACKAGECONFIG[startup-notification] = "--enable-startup-notification,--disable-s
inherit gnomebase
SRC_URI[archive.md5sum] = "4538672e0d775fadedf10abeb8020047"
SRC_URI[archive.sha256sum] = "f5080076346609b4c36394b879f3a86b92ced3b90a37cb54c8e9a14f00e7921c"
+
+inherit distro_features_check
+# libxres means x11 only
+REQUIRED_DISTRO_FEATURES = "x11"
+
diff --git a/meta/recipes-graphics/cairo/cairo.inc b/meta/recipes-graphics/cairo/cairo.inc
index 1e45318..45651ba 100644
--- a/meta/recipes-graphics/cairo/cairo.inc
+++ b/meta/recipes-graphics/cairo/cairo.inc
@@ -9,11 +9,14 @@ Extension."
HOMEPAGE = "http://cairographics.org"
BUGTRACKER = "http://bugs.freedesktop.org"
SECTION = "libs"
+
LICENSE = "MPL-1 & LGPLv2.1 & GPLv3+"
LICENSE_${PN} = "MPL-1 & LGPLv2.1"
LICENSE_${PN}-dev = "MPL-1 & LGPLv2.1"
LICENSE_${PN}-gobject = "MPL-1 & LGPLv2.1"
+LICENSE_${PN}-script-interpreter = "MPL-1 & LGPLv2.1"
LICENSE_${PN}-perf-utils = "GPLv3+"
+
X11DEPENDS = "virtual/libx11 libsm libxrender libxext"
DEPENDS = "libpng fontconfig pixman glib-2.0 zlib"
diff --git a/meta/recipes-graphics/cairo/cairo/Manually-transpose-the-matrix-in-_cairo_gl_shader_bi.patch b/meta/recipes-graphics/cairo/cairo/Manually-transpose-the-matrix-in-_cairo_gl_shader_bi.patch
new file mode 100644
index 0000000..955b7d4
--- /dev/null
+++ b/meta/recipes-graphics/cairo/cairo/Manually-transpose-the-matrix-in-_cairo_gl_shader_bi.patch
@@ -0,0 +1,49 @@
+Upstream-Status: Backport
+
+ http://lists.cairographics.org/archives/cairo/2015-May/026253.html
+ http://cgit.freedesktop.org/cairo/commit/?id=f52f0e2feb1ad0a4de23c475a8c020d41a1764a8
+
+Signed-off-by: Andre McCurdy <armccurdy at gmail.com>
+
+
+From f52f0e2feb1ad0a4de23c475a8c020d41a1764a8 Mon Sep 17 00:00:00 2001
+From: Zan Dobersek <zdobersek at igalia.com>
+Date: Fri, 8 May 2015 01:50:25 -0700
+Subject: [PATCH] Manually transpose the matrix in _cairo_gl_shader_bind_matrix()
+
+To maintain compatibility with OpenGL ES 2.0, the matrix in
+_cairo_gl_shader_bind_matrix() should be manually transposed,
+and GL_FALSE passed as the transpose argument to the
+glUniformMatrix3fv() call as it is the only valid value for
+that parameter in OpenGL ES 2.0.
+
+Reviewed-by: Bryce Harrington <bryce at osg.samsung.com>
+Acked-by: "Henry (Yu) Song" <henry.song at samsung.com>
+---
+ src/cairo-gl-shaders.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/src/cairo-gl-shaders.c b/src/cairo-gl-shaders.c
+index 2710606..fe975d2 100644
+--- a/src/cairo-gl-shaders.c
++++ b/src/cairo-gl-shaders.c
+@@ -973,12 +973,12 @@ _cairo_gl_shader_bind_matrix (cairo_gl_context_t *ctx,
+ {
+ cairo_gl_dispatch_t *dispatch = &ctx->dispatch;
+ float gl_m[9] = {
+- m->xx, m->xy, m->x0,
+- m->yx, m->yy, m->y0,
+- 0, 0, 1
++ m->xx, m->yx, 0,
++ m->xy, m->yy, 0,
++ m->x0, m->y0, 1
+ };
+ assert (location != -1);
+- dispatch->UniformMatrix3fv (location, 1, GL_TRUE, gl_m);
++ dispatch->UniformMatrix3fv (location, 1, GL_FALSE, gl_m);
+ }
+
+ void
+--
+1.9.1
+
diff --git a/meta/recipes-graphics/cairo/cairo_1.14.2.bb b/meta/recipes-graphics/cairo/cairo_1.14.2.bb
index 3817dbf..75cde0a 100644
--- a/meta/recipes-graphics/cairo/cairo_1.14.2.bb
+++ b/meta/recipes-graphics/cairo/cairo_1.14.2.bb
@@ -3,6 +3,7 @@ require cairo.inc
LIC_FILES_CHKSUM = "file://COPYING;md5=e73e999e0c72b5ac9012424fa157ad77"
SRC_URI = "http://cairographics.org/releases/cairo-${PV}.tar.xz"
+SRC_URI += "file://Manually-transpose-the-matrix-in-_cairo_gl_shader_bi.patch"
SRC_URI[md5sum] = "e1cdfaf1c6c995c4d4c54e07215b0118"
SRC_URI[sha256sum] = "c919d999ddb1bbbecd4bbe65299ca2abd2079c7e13d224577895afa7005ecceb"
diff --git a/meta/recipes-graphics/directfb/directfb.inc b/meta/recipes-graphics/directfb/directfb.inc
index 446aaea..cbd4014 100644
--- a/meta/recipes-graphics/directfb/directfb.inc
+++ b/meta/recipes-graphics/directfb/directfb.inc
@@ -22,6 +22,9 @@ S = "${WORKDIR}/DirectFB-${PV}"
LDFLAGS_append =" -lts -lm"
+# Workaround for linking issues seen with armv7a + gold
+LDFLAGS_append_armv7a = "${@base_contains('DISTRO_FEATURES', 'ld-is-gold', ' -fuse-ld=bfd ', '', d)}"
+
BINCONFIG = "${bindir}/directfb-config"
inherit autotools binconfig-disabled pkgconfig
diff --git a/meta/recipes-graphics/libsdl/libsdl_1.2.15.bb b/meta/recipes-graphics/libsdl/libsdl_1.2.15.bb
index 266bd42..c0d5c6a 100644
--- a/meta/recipes-graphics/libsdl/libsdl_1.2.15.bb
+++ b/meta/recipes-graphics/libsdl/libsdl_1.2.15.bb
@@ -13,8 +13,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=27818cd7fd83877a8e3ef82b82798ef4"
PROVIDES = "virtual/libsdl"
DEPENDS = "${@bb.utils.contains('DISTRO_FEATURES', 'directfb', 'directfb', '', d)} \
- ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'virtual/libgl libglu', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'virtual/libgl', '', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'virtual/libx11 libxext libxrandr libxrender', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'x11 opengl', 'libglu', '', d)} \
tslib"
DEPENDS_class-nativesdk = "${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'virtual/nativesdk-libx11 nativesdk-libxrandr nativesdk-libxrender nativesdk-libxext', '', d)}"
diff --git a/meta/recipes-graphics/libsdl2/libsdl2_2.0.3.bb b/meta/recipes-graphics/libsdl2/libsdl2_2.0.3.bb
index 97f64f3..f138f97 100644
--- a/meta/recipes-graphics/libsdl2/libsdl2_2.0.3.bb
+++ b/meta/recipes-graphics/libsdl2/libsdl2_2.0.3.bb
@@ -39,7 +39,7 @@ PACKAGECONFIG ??= " \
${@bb.utils.contains('DISTRO_FEATURES', 'alsa', 'alsa', '', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'directfb', 'directfb', '', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'pulseaudio', 'pulseaudio', '', d)} \
- ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)} \
+ ${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland gles2', '', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)} \
"
PACKAGECONFIG[alsa] = "--enable-alsa --disable-alsatest,--disable-alsa,alsa-lib,"
diff --git a/meta/recipes-graphics/mesa/mesa-demos/0010-sharedtex_mt-fix-rendering-thread-hang.patch b/meta/recipes-graphics/mesa/mesa-demos/0010-sharedtex_mt-fix-rendering-thread-hang.patch
new file mode 100644
index 0000000..04e1b44
--- /dev/null
+++ b/meta/recipes-graphics/mesa/mesa-demos/0010-sharedtex_mt-fix-rendering-thread-hang.patch
@@ -0,0 +1,43 @@
+From 525fa9ded72d22b53c5eb366f61e2ac1d407a2db Mon Sep 17 00:00:00 2001
+From: Awais Belal <awais_belal at mentor.com>
+Date: Thu, 8 Oct 2015 13:49:31 +0500
+Subject: [PATCH] sharedtex_mt: fix rendering thread hang
+
+XNextEvent is a blocking call which locks up the display mutex
+this causes the rendering threads to hang when they try call
+glXSwapBuffers() as that tries to take the same mutex in
+underlying calls through XCopyArea().
+So we only go to XNextEvent when it has at least one event
+and we wouldn't lock indefinitely.
+
+Signed-off-by: Awais Belal <awais_belal at mentor.com>
+Upstream-Status: Backport (2b304e765695d385fd3bf414e6e444020bedb0a8)
+
+---
+ src/xdemos/sharedtex_mt.c | 9 +++++++--
+ 1 file changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/src/xdemos/sharedtex_mt.c b/src/xdemos/sharedtex_mt.c
+index a90903a..1d503c4 100644
+--- a/src/xdemos/sharedtex_mt.c
++++ b/src/xdemos/sharedtex_mt.c
+@@ -420,9 +420,14 @@ Resize(struct window *h, unsigned int width, unsigned int height)
+ static void
+ EventLoop(void)
+ {
++ int i;
++ XEvent event;
+ while (1) {
+- int i;
+- XEvent event;
++ /* Do we have an event? */
++ if (XPending(gDpy) == 0) {
++ usleep(10000);
++ continue;
++ }
+ XNextEvent(gDpy, &event);
+ for (i = 0; i < NumWindows; i++) {
+ struct window *h = &Windows[i];
+--
+1.9.1
+
diff --git a/meta/recipes-graphics/mesa/mesa-demos_8.2.0.bb b/meta/recipes-graphics/mesa/mesa-demos_8.2.0.bb
index e451642..0094f55 100644
--- a/meta/recipes-graphics/mesa/mesa-demos_8.2.0.bb
+++ b/meta/recipes-graphics/mesa/mesa-demos_8.2.0.bb
@@ -19,6 +19,7 @@ SRC_URI = "ftp://ftp.freedesktop.org/pub/mesa/demos/${PV}/${BPN}-${PV}.tar.bz2 \
file://0007-Install-few-more-test-programs.patch \
file://0008-glsl-perf-Add-few-missing-.glsl-.vert-.frag-files-to.patch \
file://0009-glsl-perf-Install-.glsl-.vert-.frag-files.patch \
+ file://0010-sharedtex_mt-fix-rendering-thread-hang.patch \
"
SRC_URI[md5sum] = "72613a2c8c013716db02e3ff59d29061"
SRC_URI[sha256sum] = "e4bfecb5816ddd4b7b37c1bc876b63f1f7f06fda5879221a9774d0952f90ba92"
diff --git a/meta/recipes-graphics/piglit/piglit_git.bb b/meta/recipes-graphics/piglit/piglit_git.bb
index 0d825c9..55ad78c 100644
--- a/meta/recipes-graphics/piglit/piglit_git.bb
+++ b/meta/recipes-graphics/piglit/piglit_git.bb
@@ -18,6 +18,12 @@ inherit cmake pythonnative distro_features_check
# depends on virtual/libx11
REQUIRED_DISTRO_FEATURES = "x11"
+# The built scripts go into the temporary directory according to tempfile
+# (typically /tmp) which can race if multiple builds happen on the same machine,
+# so tell it to use a directory in ${B} to avoid overwriting.
+export TEMP = "${B}/temp/"
+do_compile[dirs] =+ "${B}/temp/"
+
PACKAGECONFIG ??= ""
PACKAGECONFIG[freeglut] = "-DPIGLIT_USE_GLUT=1,-DPIGLIT_USE_GLUT=0,freeglut,"
diff --git a/meta/recipes-graphics/waffle/waffle/0001-third_party-threads-Use-PTHREAD_MUTEX_RECURSIVE-by-d.patch b/meta/recipes-graphics/waffle/waffle/0001-third_party-threads-Use-PTHREAD_MUTEX_RECURSIVE-by-d.patch
new file mode 100644
index 0000000..a0c826e
--- /dev/null
+++ b/meta/recipes-graphics/waffle/waffle/0001-third_party-threads-Use-PTHREAD_MUTEX_RECURSIVE-by-d.patch
@@ -0,0 +1,54 @@
+From 3b9b8f5f6d1b99af43e95ec0868404e552a85b73 Mon Sep 17 00:00:00 2001
+From: Emil Velikov <emil.l.velikov at gmail.com>
+Date: Thu, 19 Mar 2015 22:26:11 +0000
+Subject: [PATCH] third_party/threads: Use PTHREAD_MUTEX_RECURSIVE by default
+
+PTHREAD_MUTEX_RECURSIVE_NP was used for compatibility with old glibc.
+Although due to the_GNU_SOURCES define the portable,
+PTHREAD_MUTEX_RECURSIVE will be available for Linuxes since at least
+1998. Simplify things giving us compatibility with musl which
+apparently does not provide the non-portable define.
+
+Inspired by almost identical commit in mesa aead7fe2e2b(c11/threads: Use
+PTHREAD_MUTEX_RECURSIVE by default) by Felix Janda.
+
+Signed-off-by: Emil Velikov <emil.l.velikov at gmail.com>
+Reviewed-by: Chad Versace <chad.versace at intel.com>
+---
+Upstream-Status: Backport
+
+ third_party/threads/threads_posix.c | 10 ++++------
+ 1 file changed, 4 insertions(+), 6 deletions(-)
+
+diff --git a/third_party/threads/threads_posix.c b/third_party/threads/threads_posix.c
+index 5835e43..e122bf9 100644
+--- a/third_party/threads/threads_posix.c
++++ b/third_party/threads/threads_posix.c
+@@ -26,6 +26,9 @@
+ * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
+ * DEALINGS IN THE SOFTWARE.
+ */
++
++#define _GNU_SOURCE
++
+ #include <stdlib.h>
+ #ifndef assert
+ #include <assert.h>
+@@ -150,13 +153,8 @@ int mtx_init(mtx_t *mtx, int type)
+ && type != (mtx_try|mtx_recursive))
+ return thrd_error;
+ pthread_mutexattr_init(&attr);
+- if ((type & mtx_recursive) != 0) {
+-#if defined(__linux__) || defined(__linux)
+- pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE_NP);
+-#else
++ if ((type & mtx_recursive) != 0)
+ pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_RECURSIVE);
+-#endif
+- }
+ pthread_mutex_init(mtx, &attr);
+ pthread_mutexattr_destroy(&attr);
+ return thrd_success;
+--
+2.5.2
+
diff --git a/meta/recipes-graphics/waffle/waffle_1.5.1.bb b/meta/recipes-graphics/waffle/waffle_1.5.1.bb
index b8aa05a..af84020 100644
--- a/meta/recipes-graphics/waffle/waffle_1.5.1.bb
+++ b/meta/recipes-graphics/waffle/waffle_1.5.1.bb
@@ -3,7 +3,9 @@ LICENSE = "BSD-2-Clause"
LIC_FILES_CHKSUM = "file://LICENSE.txt;md5=4c5154407c2490750dd461c50ad94797 \
file://include/waffle/waffle.h;endline=24;md5=61dbf8697f61c78645e75a93c585b1bf"
-SRC_URI = "http://waffle-gl.org/files/release/${BPN}-${PV}/${BPN}-${PV}.tar.xz"
+SRC_URI = "http://waffle-gl.org/files/release/${BPN}-${PV}/${BPN}-${PV}.tar.xz \
+ file://0001-third_party-threads-Use-PTHREAD_MUTEX_RECURSIVE-by-d.patch \
+ "
SRC_URI[md5sum] = "c0d802bc3d0aba87c51e423a3a8bdd69"
SRC_URI[sha256sum] = "cbab0e926515064e818bf089a5af04be33307e5f40d07659fb40d59b2bfe20aa"
diff --git a/meta/recipes-graphics/xorg-app/xwininfo_1.1.3.bb b/meta/recipes-graphics/xorg-app/xwininfo_1.1.3.bb
index 7a45241..0c23d19 100644
--- a/meta/recipes-graphics/xorg-app/xwininfo_1.1.3.bb
+++ b/meta/recipes-graphics/xorg-app/xwininfo_1.1.3.bb
@@ -7,7 +7,7 @@ windows. Information may include window position, size, color depth, \
and a number of other items."
LIC_FILES_CHKSUM = "file://COPYING;md5=78976cd3115f6faf615accc4e094d90e"
-DEPENDS += "libxext libxmu"
+DEPENDS += "libxext libxmu gettext-native"
PE = "0"
diff --git a/meta/recipes-graphics/xorg-lib/libxcb.inc b/meta/recipes-graphics/xorg-lib/libxcb.inc
index fe31f20..e40ae77 100644
--- a/meta/recipes-graphics/xorg-lib/libxcb.inc
+++ b/meta/recipes-graphics/xorg-lib/libxcb.inc
@@ -14,7 +14,9 @@ DEPENDS = "xcb-proto xproto libxau xcb-proto-native libpthread-stubs"
SRC_URI = "http://xcb.freedesktop.org/dist/libxcb-${PV}.tar.bz2 \
file://xcbincludedir.patch \
- file://disable-check.patch"
+ file://disable-check.patch \
+ file://gcc-mips-pr68302-mips-workaround.patch \
+ "
PACKAGES_DYNAMIC = "^libxcb-.*"
diff --git a/meta/recipes-graphics/xorg-lib/libxcb/gcc-mips-pr68302-mips-workaround.patch b/meta/recipes-graphics/xorg-lib/libxcb/gcc-mips-pr68302-mips-workaround.patch
new file mode 100644
index 0000000..698d038
--- /dev/null
+++ b/meta/recipes-graphics/xorg-lib/libxcb/gcc-mips-pr68302-mips-workaround.patch
@@ -0,0 +1,22 @@
+Reduce debug info for xcb.c since on mips we run into a gcc5 bug
+
+https://gcc.gnu.org/bugzilla/show_bug.cgi?id=68302
+
+This patch is a workaround to get past the gcc bug until its resolved.
+it should have minimal impact on libxcb while make it work.
+
+Upstream-Status: Inappropriate [OE-Specific]
+Signed-off-by: Khem Raj <raj.khem at gmail.com>
+
+Index: libxcb-1.11.1/src/Makefile.am
+===================================================================
+--- libxcb-1.11.1.orig/src/Makefile.am
++++ libxcb-1.11.1/src/Makefile.am
+@@ -188,6 +188,7 @@ EXTSOURCES += xkb.c
+ if BUILD_XKB
+ lib_LTLIBRARIES += libxcb-xkb.la
+ libxcb_xkb_la_LDFLAGS = -version-info 1:0:0 -no-undefined
++CFLAGS += -g1
+ libxcb_xkb_la_LIBADD = $(XCB_LIBS)
+ nodist_libxcb_xkb_la_SOURCES = xkb.c xkb.h
+ endif
diff --git a/meta/recipes-graphics/xorg-lib/pixman/0001-v3-test-add-a-check-for-FE_DIVBYZERO.patch b/meta/recipes-graphics/xorg-lib/pixman/0001-v3-test-add-a-check-for-FE_DIVBYZERO.patch
new file mode 100644
index 0000000..a60df5f
--- /dev/null
+++ b/meta/recipes-graphics/xorg-lib/pixman/0001-v3-test-add-a-check-for-FE_DIVBYZERO.patch
@@ -0,0 +1,65 @@
+From fcd5eb9bd0e8674a6f4987a8fce7dc1ba8f9320c Mon Sep 17 00:00:00 2001
+From: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
+Date: Thu, 17 Sep 2015 03:08:36 +0200
+Subject: [PATCH] [v3] test: add a check for FE_DIVBYZERO
+
+Some architectures, such as Microblaze and Nios2, currently do not
+implement FE_DIVBYZERO, even though they have <fenv.h> and
+feenableexcept(). This commit adds a configure.ac check to verify
+whether FE_DIVBYZERO is defined or not, and if not, disables the
+problematic code in test/utils.c.
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
+Signed-off-by: Marek Vasut <marex at denx.de>
+Upstream-Status: Submitted
+---
+Changes v1 -> v2:
+
+ * Use the ac_cv_have_decl_FE_DIVBYZERO variable, which is
+ automatically set by AC_CHECK_DECL, to decide whether or not
+ HAVE_FEDIVBYZERO should be defined.
+
+Changes v2 -> v3:
+
+ * Use action-if-yes of AC_CHECK_DECL as suggested in
+ http://lists.freedesktop.org/archives/pixman/2014-February/003176.html
+---
+ configure.ac | 5 +++++
+ test/utils.c | 2 ++
+ 2 files changed, 7 insertions(+)
+
+diff --git a/configure.ac b/configure.ac
+index f93cc30..424bfd3 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -891,6 +891,11 @@ if test x$have_feenableexcept = xyes; then
+ AC_DEFINE(HAVE_FEENABLEEXCEPT, 1, [Whether we have feenableexcept()])
+ fi
+
++AC_CHECK_DECL([FE_DIVBYZERO],
++ [AC_DEFINE(HAVE_FEDIVBYZERO, 1, [Whether we have FE_DIVBYZERO])],
++ [],
++ [[#include <fenv.h>]])
++
+ AC_CHECK_FUNC(gettimeofday, have_gettimeofday=yes, have_gettimeofday=no)
+ AC_CHECK_HEADER(sys/time.h, have_sys_time_h=yes, have_sys_time_h=no)
+ if test x$have_gettimeofday = xyes && test x$have_sys_time_h = xyes; then
+diff --git a/test/utils.c b/test/utils.c
+index 222d4d5..8657966 100644
+--- a/test/utils.c
++++ b/test/utils.c
+@@ -966,9 +966,11 @@ enable_divbyzero_exceptions (void)
+ {
+ #ifdef HAVE_FENV_H
+ #ifdef HAVE_FEENABLEEXCEPT
++#ifdef HAVE_FEDIVBYZERO
+ feenableexcept (FE_DIVBYZERO);
++#endif
+ #endif
+ #endif
+ }
+
+ void
+--
+2.1.4
+
diff --git a/meta/recipes-graphics/xorg-lib/pixman_0.32.6.bb b/meta/recipes-graphics/xorg-lib/pixman_0.32.6.bb
index eae59b6..317a568 100644
--- a/meta/recipes-graphics/xorg-lib/pixman_0.32.6.bb
+++ b/meta/recipes-graphics/xorg-lib/pixman_0.32.6.bb
@@ -31,6 +31,7 @@ SRC_URI += "\
file://0001-ARM-qemu-related-workarounds-in-cpu-features-detecti.patch \
file://mips-export-revert.patch \
file://asm_include.patch \
+ file://0001-v3-test-add-a-check-for-FE_DIVBYZERO.patch \
"
SRC_URI[md5sum] = "8a9e8f14743a39cf303803f369c1f344"
diff --git a/meta/recipes-graphics/xorg-xserver/xserver-xorg.inc b/meta/recipes-graphics/xorg-xserver/xserver-xorg.inc
index cc1c02b..9881c94 100644
--- a/meta/recipes-graphics/xorg-xserver/xserver-xorg.inc
+++ b/meta/recipes-graphics/xorg-xserver/xserver-xorg.inc
@@ -23,6 +23,9 @@ S = "${WORKDIR}/${XORG_PN}-${PV}"
inherit autotools pkgconfig
+inherit distro_features_check
+REQUIRED_DISTRO_FEATURES = "x11"
+
PROTO_DEPS = "randrproto renderproto fixesproto damageproto xextproto xproto xf86dgaproto xf86miscproto xf86vidmodeproto compositeproto recordproto resourceproto videoproto scrnsaverproto xineramaproto fontsproto kbproto inputproto bigreqsproto xcmiscproto presentproto"
LIB_DEPS = "pixman libxfont xtrans libxau libxext libxdmcp libdrm libxkbfile libpciaccess openssl libgcrypt"
DEPENDS = "${PROTO_DEPS} ${LIB_DEPS} font-util"
diff --git a/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb b/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
index 4753094..445d03a 100644
--- a/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
+++ b/meta/recipes-kernel/kern-tools/kern-tools-native_git.bb
@@ -4,7 +4,7 @@ LIC_FILES_CHKSUM = "file://git/tools/kgit;beginline=5;endline=9;md5=d8d1d729a70c
DEPENDS = "git-native"
-SRCREV = "bd144d43ca5b1eaf9e727bced4ce3b61b642297c"
+SRCREV = "17d89d1861b532bbf1a81c1f024953e440db8de7"
PR = "r12"
PV = "0.2+git${SRCPV}"
diff --git a/meta/recipes-kernel/kmod/kmod.inc b/meta/recipes-kernel/kmod/kmod.inc
index e9aa67d..71ffdf8 100644
--- a/meta/recipes-kernel/kmod/kmod.inc
+++ b/meta/recipes-kernel/kmod/kmod.inc
@@ -16,7 +16,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=a6f89e2100d9b6cdffcea4f398e37343 \
"
inherit autotools gtk-doc
-SRCREV = "0d833715eaa65636dda2705b89359a1e0154dc58"
+SRCREV = "114ec87c85c35a2bd3682f9f891e494127be6fb5"
# Lookout for PV bump too when SRCREV is changed
PV = "21+git${SRCPV}"
diff --git a/meta/recipes-kernel/linux-firmware/linux-firmware_git.bb b/meta/recipes-kernel/linux-firmware/linux-firmware_git.bb
index 4939ca6..0878ab1 100644
--- a/meta/recipes-kernel/linux-firmware/linux-firmware_git.bb
+++ b/meta/recipes-kernel/linux-firmware/linux-firmware_git.bb
@@ -260,10 +260,10 @@ FILES_${PN}-rtl-license = " \
/lib/firmware/LICENCE.rtlwifi_firmware.txt \
"
FILES_${PN}-rtl8192cu = " \
- /lib/firmware/rtlwifi/rtl8192cufw.bin \
+ /lib/firmware/rtlwifi/rtl8192cufw*.bin \
"
FILES_${PN}-rtl8192ce = " \
- /lib/firmware/rtlwifi/rtl8192cfw.bin \
+ /lib/firmware/rtlwifi/rtl8192cfw*.bin \
"
FILES_${PN}-rtl8192su = " \
/lib/firmware/rtlwifi/rtl8712u.bin \
diff --git a/meta/recipes-kernel/linux/linux-yocto-rt_3.14.bb b/meta/recipes-kernel/linux/linux-yocto-rt_3.14.bb
index 4d3d5c8..bfeabbe 100644
--- a/meta/recipes-kernel/linux/linux-yocto-rt_3.14.bb
+++ b/meta/recipes-kernel/linux/linux-yocto-rt_3.14.bb
@@ -5,7 +5,7 @@ require recipes-kernel/linux/linux-yocto.inc
SRCREV_machine ?= "8281915527ba8d79e59906c02f28e7aa11424723"
SRCREV_machine_qemuppc ?= "5e7d372ebc327f28656fc972fab55605eea8aec3"
-SRCREV_meta ?= "3a09b38a9f5015c56d99d17aa7c2f200c566249b"
+SRCREV_meta ?= "060fa80b7996250001ee90c50a4978c8fdb87fc4"
SRC_URI = "git://git.yoctoproject.org/linux-yocto-3.14.git;branch=${KBRANCH};name=machine \
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-3.14;destsuffix=${KMETA}"
@@ -24,5 +24,6 @@ COMPATIBLE_MACHINE = "(qemux86|qemux86-64|qemuarm|qemuppc|qemumips)"
# Functionality flags
KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc"
diff --git a/meta/recipes-kernel/linux/linux-yocto-rt_4.1.bb b/meta/recipes-kernel/linux/linux-yocto-rt_4.1.bb
index 06483c3..b441bf6 100644
--- a/meta/recipes-kernel/linux/linux-yocto-rt_4.1.bb
+++ b/meta/recipes-kernel/linux/linux-yocto-rt_4.1.bb
@@ -1,14 +1,14 @@
-KBRANCH ?= "standard/preempt-rt"
+KBRANCH ?= "standard/preempt-rt/base"
require recipes-kernel/linux/linux-yocto.inc
-SRCREV_machine ?= "59b8c4f5e8ddb9c33c62fff22204fe2b0d8c703e"
-SRCREV_meta ?= "429f9e2ff0649b8c9341345622545d874d5e303a"
+SRCREV_machine ?= "3188436876d5eaff8d48f82064367d4a65c3aa97"
+SRCREV_meta ?= "46bb64d605fd336d99fa05bab566b9553b40b4b4"
SRC_URI = "git://git.yoctoproject.org/linux-yocto-4.1.git;branch=${KBRANCH};name=machine \
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-4.1;destsuffix=${KMETA}"
-LINUX_VERSION ?= "4.1.6"
+LINUX_VERSION ?= "4.1.15"
PV = "${LINUX_VERSION}+git${SRCPV}"
@@ -22,5 +22,6 @@ COMPATIBLE_MACHINE = "(qemux86|qemux86-64|qemuarm|qemuppc|qemumips)"
# Functionality flags
KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc features/taskstats/taskstats.scc"
KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc"
diff --git a/meta/recipes-kernel/linux/linux-yocto-tiny_3.14.bb b/meta/recipes-kernel/linux/linux-yocto-tiny_3.14.bb
index 412c817..e13cb80 100644
--- a/meta/recipes-kernel/linux/linux-yocto-tiny_3.14.bb
+++ b/meta/recipes-kernel/linux/linux-yocto-tiny_3.14.bb
@@ -10,7 +10,7 @@ KMETA = "kernel-meta"
KCONF_BSP_AUDIT_LEVEL = "2"
SRCREV_machine ?= "578602a722dbfb260801f3b37c6eafd2abb2340d"
-SRCREV_meta ?= "3a09b38a9f5015c56d99d17aa7c2f200c566249b"
+SRCREV_meta ?= "060fa80b7996250001ee90c50a4978c8fdb87fc4"
PV = "${LINUX_VERSION}+git${SRCPV}"
diff --git a/meta/recipes-kernel/linux/linux-yocto-tiny_4.1.bb b/meta/recipes-kernel/linux/linux-yocto-tiny_4.1.bb
index 061205e..4caa252 100644
--- a/meta/recipes-kernel/linux/linux-yocto-tiny_4.1.bb
+++ b/meta/recipes-kernel/linux/linux-yocto-tiny_4.1.bb
@@ -4,13 +4,13 @@ KCONFIG_MODE = "--allnoconfig"
require recipes-kernel/linux/linux-yocto.inc
-LINUX_VERSION ?= "4.1.6"
+LINUX_VERSION ?= "4.1.15"
KMETA = "kernel-meta"
KCONF_BSP_AUDIT_LEVEL = "2"
-SRCREV_machine ?= "59b8c4f5e8ddb9c33c62fff22204fe2b0d8c703e"
-SRCREV_meta ?= "429f9e2ff0649b8c9341345622545d874d5e303a"
+SRCREV_machine ?= "788dfc9859321c09f1c58696bf8998f90ccb4f51"
+SRCREV_meta ?= "46bb64d605fd336d99fa05bab566b9553b40b4b4"
PV = "${LINUX_VERSION}+git${SRCPV}"
diff --git a/meta/recipes-kernel/linux/linux-yocto.inc b/meta/recipes-kernel/linux/linux-yocto.inc
index 3b41a61..81ffa24 100644
--- a/meta/recipes-kernel/linux/linux-yocto.inc
+++ b/meta/recipes-kernel/linux/linux-yocto.inc
@@ -11,6 +11,10 @@ DEPENDS_append_aarch64 = " libgcc"
KERNEL_CC_append_aarch64 = " ${TOOLCHAIN_OPTIONS}"
KERNEL_LD_append_aarch64 = " ${TOOLCHAIN_OPTIONS}"
+DEPENDS_append_nios2 = " libgcc"
+KERNEL_CC_append_nios2 = " ${TOOLCHAIN_OPTIONS}"
+KERNEL_LD_append_nios2 = " ${TOOLCHAIN_OPTIONS}"
+
# A KMACHINE is the mapping of a yocto $MACHINE to what is built
# by the kernel. This is typically the branch that should be built,
# and it can be specific to the machine or shared
diff --git a/meta/recipes-kernel/linux/linux-yocto_3.14.bb b/meta/recipes-kernel/linux/linux-yocto_3.14.bb
index b6b2e5a..db93d23 100644
--- a/meta/recipes-kernel/linux/linux-yocto_3.14.bb
+++ b/meta/recipes-kernel/linux/linux-yocto_3.14.bb
@@ -15,16 +15,18 @@ SRCREV_machine_qemuarm ?= "4817747912b5c50ce5c31ef25658340ca615e1b4"
SRCREV_machine_qemuarm64 ?= "578602a722dbfb260801f3b37c6eafd2abb2340d"
SRCREV_machine_qemumips ?= "6ed76ec26b120f65f8547c8612b7334bd2745ec9"
SRCREV_machine_qemuppc ?= "a86ade84b2e142c0fd7536d96477107b6d07db5c"
-SRCREV_machine_qemux86 ?= "af1f7f586bd32d39c057f17606991b887eadb389"
-SRCREV_machine_qemux86-64 ?= "578602a722dbfb260801f3b37c6eafd2abb2340d"
+SRCREV_machine_qemux86 ?= "d9bf859dfae6f88b88b157119c20ae4d5e51420a"
+SRCREV_machine_qemux86-64 ?= "93b2b800d85c1565af7d96f3776dc38c85ae1902"
SRCREV_machine_qemumips64 ?= "a63d40b860a6d255005a541894d53729090b40ea"
SRCREV_machine ?= "578602a722dbfb260801f3b37c6eafd2abb2340d"
-SRCREV_meta ?= "3a09b38a9f5015c56d99d17aa7c2f200c566249b"
+SRCREV_meta ?= "060fa80b7996250001ee90c50a4978c8fdb87fc4"
SRC_URI = "git://git.yoctoproject.org/linux-yocto-3.14.git;branch=${KBRANCH};name=machine; \
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-3.14;destsuffix=${KMETA}"
LINUX_VERSION ?= "3.14.36"
+LINUX_VERSION_qemux86 ?= "3.14.39"
+LINUX_VERSION_qemux86-64 ?= "3.14.39"
PV = "${LINUX_VERSION}+git${SRCPV}"
@@ -36,6 +38,7 @@ COMPATIBLE_MACHINE = "qemuarm|qemuarm64|qemux86|qemuppc|qemumips|qemumips64|qemu
# Functionality flags
KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
KERNEL_FEATURES_append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "" ,d)}"
diff --git a/meta/recipes-kernel/linux/linux-yocto_3.19.bb b/meta/recipes-kernel/linux/linux-yocto_3.19.bb
index e8c1640..baa575b 100644
--- a/meta/recipes-kernel/linux/linux-yocto_3.19.bb
+++ b/meta/recipes-kernel/linux/linux-yocto_3.19.bb
@@ -11,14 +11,14 @@ KBRANCH_qemux86 ?= "standard/common-pc"
KBRANCH_qemux86-64 ?= "standard/common-pc-64/base"
KBRANCH_qemumips64 ?= "standard/mti-malta64"
-SRCREV_machine_qemuarm ?= "963b4df663dba2584ac864e0c016825de0046558"
+SRCREV_machine_qemuarm ?= "857048f10bfe7089ca6007e72431f1c098b07115"
SRCREV_machine_qemuarm64 ?= "e152349de59b43b2a75f2c332b44171df461d5a0"
SRCREV_machine_qemumips ?= "cedbbc7b5e72df2e820bb9e7885f12132c5e2fff"
SRCREV_machine_qemuppc ?= "23a83386e10986a63e6cef712a045445499d002b"
-SRCREV_machine_qemux86 ?= "e152349de59b43b2a75f2c332b44171df461d5a0"
-SRCREV_machine_qemux86-64 ?= "e152349de59b43b2a75f2c332b44171df461d5a0"
+SRCREV_machine_qemux86 ?= "1583bf79b946cd5581d84d8c369b819a5ecb94b4"
+SRCREV_machine_qemux86-64 ?= "1583bf79b946cd5581d84d8c369b819a5ecb94b4"
SRCREV_machine_qemumips64 ?= "3eb70cea3532e22ab1b6da9864446621229e6616"
-SRCREV_machine ?= "e152349de59b43b2a75f2c332b44171df461d5a0"
+SRCREV_machine ?= "151571a39785218a57c3ae3355cd63694890cc8d"
SRCREV_meta ?= "1016714868249d64fc16692fd7679672b1efa17b"
SRC_URI = "git://git.yoctoproject.org/linux-yocto-3.19.git;name=machine;branch=${KBRANCH}; \
@@ -36,6 +36,7 @@ COMPATIBLE_MACHINE = "qemuarm|qemuarm64|qemux86|qemuppc|qemumips|qemumips64|qemu
# Functionality flags
KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
KERNEL_FEATURES_append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "" ,d)}"
diff --git a/meta/recipes-kernel/linux/linux-yocto_4.1.bb b/meta/recipes-kernel/linux/linux-yocto_4.1.bb
index 46d4616..1bb7336 100644
--- a/meta/recipes-kernel/linux/linux-yocto_4.1.bb
+++ b/meta/recipes-kernel/linux/linux-yocto_4.1.bb
@@ -11,20 +11,22 @@ KBRANCH_qemux86 ?= "standard/base"
KBRANCH_qemux86-64 ?= "standard/base"
KBRANCH_qemumips64 ?= "standard/mti-malta64"
-SRCREV_machine_qemuarm ?= "3c1245d162ccb55de1af42bcf3dbf690457bf9e4"
-SRCREV_machine_qemuarm64 ?= "59b8c4f5e8ddb9c33c62fff22204fe2b0d8c703e"
-SRCREV_machine_qemumips ?= "4132a691d0908d10b8f07ce7ece02e6dc94e17bc"
-SRCREV_machine_qemuppc ?= "59b8c4f5e8ddb9c33c62fff22204fe2b0d8c703e"
-SRCREV_machine_qemux86 ?= "59b8c4f5e8ddb9c33c62fff22204fe2b0d8c703e"
-SRCREV_machine_qemux86-64 ?= "59b8c4f5e8ddb9c33c62fff22204fe2b0d8c703e"
-SRCREV_machine_qemumips64 ?= "033e1aa633465449edf544eb81adda0caf16ec60"
-SRCREV_machine ?= "59b8c4f5e8ddb9c33c62fff22204fe2b0d8c703e"
-SRCREV_meta ?= "429f9e2ff0649b8c9341345622545d874d5e303a"
+SRCREV_machine_qemuarm ?= "cf760f381c5e1e58d0c3372d66f4dfdc33f0984c"
+SRCREV_machine_qemuarm64 ?= "788dfc9859321c09f1c58696bf8998f90ccb4f51"
+SRCREV_machine_qemumips ?= "aa46295ab927bd5c960930c377855dbc4e57b195"
+SRCREV_machine_qemuppc ?= "788dfc9859321c09f1c58696bf8998f90ccb4f51"
+SRCREV_machine_qemux86 ?= "2e0ac7b6c4e3ada23a84756287e9b7051ace939a"
+SRCREV_machine_qemux86-64 ?= "2e0ac7b6c4e3ada23a84756287e9b7051ace939a"
+SRCREV_machine_qemumips64 ?= "949c0f2cbb4cf902478d009a7d38b6e4fb29e7c4"
+SRCREV_machine ?= "788dfc9859321c09f1c58696bf8998f90ccb4f51"
+SRCREV_meta ?= "46bb64d605fd336d99fa05bab566b9553b40b4b4"
SRC_URI = "git://git.yoctoproject.org/linux-yocto-4.1.git;name=machine;branch=${KBRANCH}; \
git://git.yoctoproject.org/yocto-kernel-cache;type=kmeta;name=meta;branch=yocto-4.1;destsuffix=${KMETA}"
-LINUX_VERSION ?= "4.1.6"
+LINUX_VERSION ?= "4.1.15"
+LINUX_VERSION_qemux86 ?= "4.1.17"
+LINUX_VERSION_qemux86-64 ?= "4.1.17"
PV = "${LINUX_VERSION}+git${SRCPV}"
@@ -36,6 +38,7 @@ COMPATIBLE_MACHINE = "qemuarm|qemuarm64|qemux86|qemuppc|qemumips|qemumips64|qemu
# Functionality flags
KERNEL_EXTRA_FEATURES ?= "features/netfilter/netfilter.scc"
KERNEL_FEATURES_append = " ${KERNEL_EXTRA_FEATURES}"
+KERNEL_FEATURES_append_qemuall=" cfg/virtio.scc"
KERNEL_FEATURES_append_qemux86=" cfg/sound.scc cfg/paravirt_kvm.scc"
KERNEL_FEATURES_append_qemux86-64=" cfg/sound.scc cfg/paravirt_kvm.scc"
KERNEL_FEATURES_append = " ${@bb.utils.contains("TUNE_FEATURES", "mx32", " cfg/x32.scc", "" ,d)}"
diff --git a/meta/recipes-kernel/lttng/lttng-tools/0001-Fix-sessiond-disable-match-app-event-by-name.patch b/meta/recipes-kernel/lttng/lttng-tools/0001-Fix-sessiond-disable-match-app-event-by-name.patch
new file mode 100644
index 0000000..ac1f34b
--- /dev/null
+++ b/meta/recipes-kernel/lttng/lttng-tools/0001-Fix-sessiond-disable-match-app-event-by-name.patch
@@ -0,0 +1,58 @@
+From 700c5a9d4dc7b552926b8ddcbba91cc13312aba0 Mon Sep 17 00:00:00 2001
+From: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
+Date: Wed, 9 Sep 2015 17:08:20 -0400
+Subject: [PATCH] Fix: sessiond: disable: match app event by name
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+The use of a simple lookup and match on event name is insufficient
+to identify the corresponding ust app event.
+
+Fixes #914
+
+Signed-off-by: Jonathan Rajotte <jonathan.rajotte-julien at efficios.com>
+Signed-off-by: Jérémie Galarneau <jeremie.galarneau at efficios.com>
+
+Upstream-Status: Backport
+
+Signed-off-by: Li Zhou <li.zhou at windriver.com>
+---
+ src/bin/lttng-sessiond/ust-app.c | 10 +++++-----
+ 1 file changed, 5 insertions(+), 5 deletions(-)
+
+diff --git a/src/bin/lttng-sessiond/ust-app.c b/src/bin/lttng-sessiond/ust-app.c
+index 4066b06..53a6f93 100644
+--- a/src/bin/lttng-sessiond/ust-app.c
++++ b/src/bin/lttng-sessiond/ust-app.c
+@@ -3873,7 +3873,7 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
+ {
+ int ret = 0;
+ struct lttng_ht_iter iter, uiter;
+- struct lttng_ht_node_str *ua_chan_node, *ua_event_node;
++ struct lttng_ht_node_str *ua_chan_node;
+ struct ust_app *app;
+ struct ust_app_session *ua_sess;
+ struct ust_app_channel *ua_chan;
+@@ -3910,14 +3910,14 @@ int ust_app_disable_event_glb(struct ltt_ust_session *usess,
+ }
+ ua_chan = caa_container_of(ua_chan_node, struct ust_app_channel, node);
+
+- lttng_ht_lookup(ua_chan->events, (void *)uevent->attr.name, &uiter);
+- ua_event_node = lttng_ht_iter_get_node_str(&uiter);
+- if (ua_event_node == NULL) {
++ ua_event = find_ust_app_event(ua_chan->events, uevent->attr.name,
++ uevent->filter, uevent->attr.loglevel,
++ uevent->exclusion);
++ if (ua_event == NULL) {
+ DBG2("Event %s not found in channel %s for app pid %d."
+ "Skipping", uevent->attr.name, uchan->name, app->pid);
+ continue;
+ }
+- ua_event = caa_container_of(ua_event_node, struct ust_app_event, node);
+
+ ret = disable_ust_app_event(ua_sess, ua_event, app);
+ if (ret < 0) {
+--
+1.7.9.5
+
diff --git a/meta/recipes-kernel/lttng/lttng-tools_2.6.0.bb b/meta/recipes-kernel/lttng/lttng-tools_2.6.0.bb
index 6397a98..909acc3 100644
--- a/meta/recipes-kernel/lttng/lttng-tools_2.6.0.bb
+++ b/meta/recipes-kernel/lttng/lttng-tools_2.6.0.bb
@@ -28,6 +28,7 @@ SRC_URI = "git://git.lttng.org/lttng-tools.git;branch=stable-2.6 \
file://extern-decls.patch \
file://run-ptest \
file://lttng-tools-Fix-live-timer-calculation-error.patch \
+ file://0001-Fix-sessiond-disable-match-app-event-by-name.patch \
"
S = "${WORKDIR}/git"
@@ -37,8 +38,6 @@ inherit autotools-brokensep ptest pkgconfig useradd
USERADD_PACKAGES = "${PN}"
GROUPADD_PARAM_${PN} = "tracing"
-export KERNELDIR="${STAGING_KERNEL_DIR}"
-
FILES_${PN} += "${libdir}/lttng/libexec/* ${datadir}/xml/lttng \
${libdir}/python${PYTHON_BASEVERSION}/site-packages/*"
FILES_${PN}-dbg += "${libdir}/lttng/libexec/.debug \
diff --git a/meta/recipes-kernel/oprofile/oprofileui-server_git.bb b/meta/recipes-kernel/oprofile/oprofileui-server_git.bb
index eb3b78b..cc3477b 100644
--- a/meta/recipes-kernel/oprofile/oprofileui-server_git.bb
+++ b/meta/recipes-kernel/oprofile/oprofileui-server_git.bb
@@ -9,7 +9,7 @@ SRC_URI = "git://git.yoctoproject.org/oprofileui \
file://init \
file://oprofileui-server.service "
-DEPENDS += "intltool-native"
+DEPENDS += "intltool-native gettext-native"
EXTRA_OECONF += "--disable-client --enable-server"
diff --git a/meta/recipes-kernel/oprofile/oprofileui_git.bb b/meta/recipes-kernel/oprofile/oprofileui_git.bb
index bb69d54..86f3d8e 100644
--- a/meta/recipes-kernel/oprofile/oprofileui_git.bb
+++ b/meta/recipes-kernel/oprofile/oprofileui_git.bb
@@ -1,6 +1,9 @@
require oprofileui.inc
-DEPENDS += "gtk+ libglade libxml2 avahi-ui gconf"
+DEPENDS += "gtk+ libglade libxml2 avahi-ui gconf gettext-native"
+
+inherit distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
SRCREV = "389e1875af4721d52c7e65cf9cfffb69b0ed6a59"
PV = "0.0+git${SRCPV}"
diff --git a/meta/recipes-kernel/sysprof/sysprof_git.bb b/meta/recipes-kernel/sysprof/sysprof_git.bb
index 19c3e10..7d87efe 100644
--- a/meta/recipes-kernel/sysprof/sysprof_git.bb
+++ b/meta/recipes-kernel/sysprof/sysprof_git.bb
@@ -19,7 +19,8 @@ SRC_URI_append_mips64n32 = " file://rmb-mips.patch"
S = "${WORKDIR}/git"
-inherit autotools pkgconfig
+inherit autotools pkgconfig distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
# We do not yet work for aarch64.
#
diff --git a/meta/recipes-kernel/trace-cmd/kernelshark_git.bb b/meta/recipes-kernel/trace-cmd/kernelshark_git.bb
index 9deccae..563182c 100644
--- a/meta/recipes-kernel/trace-cmd/kernelshark_git.bb
+++ b/meta/recipes-kernel/trace-cmd/kernelshark_git.bb
@@ -9,6 +9,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=751419260aa954499f7abaabaa882bbe \
DEPENDS = "gtk+ libxml2"
RDEPENDS_${PN} = "trace-cmd"
+inherit distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
+
EXTRA_OEMAKE = "\
'prefix=${prefix}' \
'bindir_relative=${@oe.path.relative(prefix, bindir)}' \
diff --git a/meta/recipes-lsb4/libpng/libpng12_1.2.53.bb b/meta/recipes-lsb4/libpng/libpng12_1.2.53.bb
index bf861a7..24f6aff 100644
--- a/meta/recipes-lsb4/libpng/libpng12_1.2.53.bb
+++ b/meta/recipes-lsb4/libpng/libpng12_1.2.53.bb
@@ -9,7 +9,7 @@ DEPENDS = "zlib"
PN = "libpng12"
S = "${WORKDIR}/libpng-${PV}"
-SRC_URI = "${SOURCEFORGE_MIRROR}/project/libpng/libpng12/${PV}/libpng-${PV}.tar.xz"
+SRC_URI = "${SOURCEFORGE_MIRROR}/project/libpng/libpng12/older-releases/${PV}/libpng-${PV}.tar.xz"
SRC_URI[md5sum] = "7d18a74e6fd2029aee76ccd00e00a9e6"
SRC_URI[sha256sum] = "b45e49f689e7451bd576569e6a344f7e0d11c02ecbb797f4da0e431526765c0a"
diff --git a/meta/recipes-multimedia/gstreamer/gst-player_git.bb b/meta/recipes-multimedia/gstreamer/gst-player_git.bb
index 54cfbbc..9850242 100644
--- a/meta/recipes-multimedia/gstreamer/gst-player_git.bb
+++ b/meta/recipes-multimedia/gstreamer/gst-player_git.bb
@@ -16,7 +16,9 @@ SRCREV = "5386c5b984d40ef5434673ed62204e69aaf52645"
S = "${WORKDIR}/git"
-inherit autotools gtk-doc lib_package pkgconfig
+inherit autotools gtk-doc lib_package pkgconfig distro_features_check
+
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
do_configure_prepend() {
touch ${S}/ChangeLog
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.4.5.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.4.5.bb
index 97fc7ec..5d74a2e 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.4.5.bb
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-libav_1.4.5.bb
@@ -25,3 +25,6 @@ LIBAV_EXTRA_CONFIGURE_COMMON_ARG = "--target-os=linux \
S = "${WORKDIR}/gst-libav-${PV}"
+# http://errors.yoctoproject.org/Errors/Details/20493/
+ARM_INSTRUCTION_SET_armv4 = "arm"
+ARM_INSTRUCTION_SET_armv5 = "arm"
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc b/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc
index d698904..26c1336 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-omx.inc
@@ -20,11 +20,10 @@ EXTRA_OECONF += "--disable-valgrind --with-omx-target=${GSTREAMER_1_0_OMX_TARGET
python __anonymous () {
omx_target = d.getVar("GSTREAMER_1_0_OMX_TARGET", True)
if omx_target in ['generic', 'bellagio']:
- srcdir = d.getVar("S", True)
# Bellagio headers are incomplete (they are missing the OMX_VERSION_MAJOR,#
# OMX_VERSION_MINOR, OMX_VERSION_REVISION, and OMX_VERSION_STEP macros);
# appending a directory path to gst-omx' internal OpenMAX IL headers fixes this
- d.appendVar("CFLAGS", " -I%s/omx/openmax" % srcdir)
+ d.appendVar("CFLAGS", " -I${S}/omx/openmax")
elif omx_target == "rpi":
# Dedicated Raspberry Pi OpenMAX IL support makes this package machine specific
d.setVar("PACKAGE_ARCH", d.getVar("MACHINE_ARCH", True))
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc
index cdedb60..b4f01af 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad.inc
@@ -20,7 +20,7 @@ PACKAGECONFIG ??= " \
${@bb.utils.contains('DISTRO_FEATURES', 'wayland', 'wayland', '', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'bluetooth', 'bluez', '', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'directfb', 'directfb', '', d)} \
- orc curl uvch264 neon sndfile \
+ orc curl neon sndfile \
hls sbc dash bz2 smoothstreaming \
"
@@ -38,7 +38,7 @@ PACKAGECONFIG[opus] = "--enable-opus,--disable-opus,libopus"
PACKAGECONFIG[flite] = "--enable-flite,--disable-flite,flite-alsa"
PACKAGECONFIG[opencv] = "--enable-opencv,--disable-opencv,opencv"
PACKAGECONFIG[wayland] = "--enable-wayland --enable-egl,--disable-wayland --disable-egl,wayland virtual/egl"
-PACKAGECONFIG[uvch264] = "--enable-uvch264,--disable-uvch264,libusb1 udev"
+PACKAGECONFIG[uvch264] = "--enable-uvch264,--disable-uvch264,libusb1 libgudev"
PACKAGECONFIG[directfb] = "--enable-directfb,--disable-directfb,directfb"
PACKAGECONFIG[neon] = "--enable-neon,--disable-neon,neon"
PACKAGECONFIG[openal] = "--enable-openal,--disable-openal,openal-soft"
@@ -55,6 +55,9 @@ PACKAGECONFIG[sndfile] = "--enable-sndfile,--disable-sndfile,libsndfile1
PACKAGECONFIG[webp] = "--enable-webp,--disable-webp,libwebp"
PACKAGECONFIG[rtmp] = "--enable-rtmp,--disable-rtmp,rtmpdump"
PACKAGECONFIG[libssh2] = "--enable-libssh2,--disable-libssh2,libssh2"
+PACKAGECONFIG[voamrwbenc] = "--enable-voamrwbenc,--disable-voamrwbenc,vo-amrwbenc"
+PACKAGECONFIG[voaacenc] = "--enable-voaacenc,--disable-voaacenc,vo-aacenc"
+PACKAGECONFIG[resindvd] = "--enable-resindvd,--disable-resindvd,libdvdnav libdvdread"
# these plugins have not been ported to 1.0 (yet):
# directdraw vcd apexsink dc1394 lv2 linsys musepack mythtv
@@ -66,8 +69,8 @@ PACKAGECONFIG[libssh2] = "--enable-libssh2,--disable-libssh2,libssh2"
# these plugins have no corresponding library in OE-core or meta-openembedded:
# openni2 winks direct3d directdraw directsound winscreencap osx_video
# apple_media android_media avc chromaprint daala dts gme gsm kate ladspa mimic
-# mpeg2enc mplex ofa openjpeg opensles pvr resindvd rtmp soundtouch spandsp spc
-# srtp vdpau voaacenc voamrwbenc wasapi zbar
+# mpeg2enc mplex ofa openjpeg opensles pvr rtmp soundtouch spandsp spc
+# srtp vdpau wasapi zbar
EXTRA_OECONF += " \
--enable-dvb \
@@ -106,7 +109,6 @@ EXTRA_OECONF += " \
--disable-osx_video \
--disable-pvr \
--disable-quicktime \
- --disable-resindvd \
--disable-sdl \
--disable-sdltest \
--disable-sndio \
@@ -118,8 +120,6 @@ EXTRA_OECONF += " \
--disable-timidity \
--disable-vcd \
--disable-vdpau \
- --disable-voaacenc \
- --disable-voamrwbenc \
--disable-wasapi \
--disable-wildmidi \
--disable-wininet \
@@ -133,3 +133,4 @@ ARM_INSTRUCTION_SET = "arm"
FILES_gstreamer1.0-plugins-bad-opencv += "${datadir}/gst-plugins-bad/1.0/opencv*"
+FILES_${PN}-voamrwbenc += "${datadir}/gstreamer-${LIBV}/presets/GstVoAmrwbEnc.prs"
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-glimagesink-Downrank-to-marginal.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-glimagesink-Downrank-to-marginal.patch
new file mode 100644
index 0000000..f677603
--- /dev/null
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad/0001-glimagesink-Downrank-to-marginal.patch
@@ -0,0 +1,32 @@
+From c6b37a80806f9128de47f1ccc3f2354f8d436bb6 Mon Sep 17 00:00:00 2001
+From: Alexander Kanavin <alex.kanavin at gmail.com>
+Date: Thu, 24 Sep 2015 19:47:32 +0300
+Subject: [PATCH] glimagesink: Downrank to marginal
+
+On desktop, where there is good OpenGL, xvimagesink will come up first,
+on other platforms, OpenGL can't be trusted because it's either software (like
+in a VM) or broken (like on embedded)., so let ximagesink come above.
+
+Upstream-Status: Submitted [https://bugzilla.gnome.org/show_bug.cgi?id=751684]
+
+Signed-off-by: Alexander Kanavin <alex.kanavin at gmail.com>
+---
+ ext/gl/gstopengl.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/ext/gl/gstopengl.c b/ext/gl/gstopengl.c
+index a4b2540..0ccaacd 100644
+--- a/ext/gl/gstopengl.c
++++ b/ext/gl/gstopengl.c
+@@ -101,7 +101,7 @@ plugin_init (GstPlugin * plugin)
+ #endif
+
+ if (!gst_element_register (plugin, "glimagesink",
+- GST_RANK_SECONDARY, GST_TYPE_GLIMAGE_SINK)) {
++ GST_RANK_MARGINAL, GST_TYPE_GLIMAGE_SINK)) {
+ return FALSE;
+ }
+
+--
+2.1.4
+
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.4.5.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.4.5.bb
index 59065de..6873669 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.4.5.bb
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-bad_1.4.5.bb
@@ -5,7 +5,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=73a5855a8119deb017f5f13cf327095d \
file://COPYING.LIB;md5=21682e4e8fea52413fd26c60acb907e5 \
file://gst/tta/crc32.h;beginline=12;endline=29;md5=27db269c575d1e5317fffca2d33b3b50"
-SRC_URI += "file://0001-gl-do-not-check-for-GL-GLU-EGL-GLES2-libs-if-disable.patch"
+SRC_URI += "file://0001-gl-do-not-check-for-GL-GLU-EGL-GLES2-libs-if-disable.patch \
+ file://0001-glimagesink-Downrank-to-marginal.patch \
+ "
SRC_URI[md5sum] = "e0bb39412cf4a48fe0397bcf3a7cd451"
SRC_URI[sha256sum] = "152fad7250683d72f9deb36c5685428338365fe4a4c87ffe15e38783b14f983c"
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base.inc b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base.inc
index 47f3f40..4909b10 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base.inc
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-base.inc
@@ -25,13 +25,12 @@ PACKAGECONFIG[ogg] = "--enable-ogg,--disable-ogg,libogg"
PACKAGECONFIG[theora] = "--enable-theora,--disable-theora,libtheora"
PACKAGECONFIG[vorbis] = "--enable-vorbis,--disable-vorbis,libvorbis"
PACKAGECONFIG[pango] = "--enable-pango,--disable-pango,pango"
+# libvisual do not seem to exist anywhere in OE
+PACKAGECONFIG[visual] = "--enable-libvisual,--disable-libvisual,libvisual"
+PACKAGECONFIG[cdparanoia] = "--enable-cdparanoia,--disable-cdparanoia,cdparanoia"
-
-# cdparanoia and libvisual do not seem to exist anywhere in OE
EXTRA_OECONF += " \
--disable-freetypetest \
- --disable-cdparanoia \
- --disable-libvisual \
"
FILES_${MLPREFIX}libgsttag-1.0 += "${datadir}/gst-plugins-base/1.0/license-translations.dict"
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc
index 6e316de..edaafe8 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0-plugins-good.inc
@@ -11,7 +11,7 @@ inherit gettext
PACKAGECONFIG ??= " \
${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'x11', '', d)} \
${@bb.utils.contains('DISTRO_FEATURES', 'pulseaudio', 'pulseaudio', '', d)} \
- orc cairo flac gdk-pixbuf gudev jpeg libpng soup speex taglib \
+ orc cairo flac gdk-pixbuf jpeg libpng soup speex taglib v4l2\
"
X11DEPENDS = "virtual/libx11 libsm libxrender libxfixes libxdamage"
@@ -22,7 +22,8 @@ PACKAGECONFIG[pulseaudio] = "--enable-pulse,--disable-pulse,pulseaudio"
PACKAGECONFIG[cairo] = "--enable-cairo,--disable-cairo,cairo"
PACKAGECONFIG[flac] = "--enable-flac,--disable-flac,flac"
PACKAGECONFIG[gdk-pixbuf] = "--enable-gdk_pixbuf,--disable-gdk_pixbuf,gdk-pixbuf"
-PACKAGECONFIG[gudev] = "--with-gudev,--without-gudev,udev"
+PACKAGECONFIG[gudev] = "--with-gudev,--without-gudev,libgudev"
+PACKAGECONFIG[libv4l2] = "--with-libv4l2,--without-libv4l2,libv4l2"
PACKAGECONFIG[jack] = "--enable-jack,--disable-jack,jack"
PACKAGECONFIG[jpeg] = "--enable-jpeg,--disable-jpeg,jpeg"
PACKAGECONFIG[libpng] = "--enable-libpng,--disable-libpng,libpng"
@@ -31,15 +32,11 @@ PACKAGECONFIG[speex] = "--enable-speex,--disable-speex,speex"
PACKAGECONFIG[taglib] = "--enable-taglib,--disable-taglib,taglib"
PACKAGECONFIG[vpx] = "--enable-vpx,--disable-vpx,libvpx"
PACKAGECONFIG[wavpack] = "--enable-wavpack,--disable-wavpack,wavpack"
-
-# the 1394 plugins require both libraw1394 and libiec61883
-# the former is included in meta-oe, the latter isn't
-# -> disabled
+PACKAGECONFIG[dv1394] = "--enable-dv1394,--disable-dv1394,libraw1394 libiec61883 libavc1394"
+PACKAGECONFIG[v4l2] = "--enable-gst_v4l2,--disable-gst_v4l2"
EXTRA_OECONF += " \
--enable-oss \
- --enable-gst_v4l2 \
- --without-libv4l2 \
--disable-directsound \
--disable-waveform \
--disable-oss4 \
@@ -51,7 +48,6 @@ EXTRA_OECONF += " \
--disable-libdv \
--disable-shout2 \
--disable-examples \
- --disable-dv1394 \
"
FILES_${PN}-equalizer += "${datadir}/gstreamer-1.0/presets/*.prs"
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0/0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch b/meta/recipes-multimedia/gstreamer/gstreamer1.0/0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch
new file mode 100755
index 0000000..d682ee6
--- /dev/null
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0/0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch
@@ -0,0 +1,30 @@
+From 73df2b5c0aea58015788f5a94a3ec65296a688d3 Mon Sep 17 00:00:00 2001
+From: Song Bing <b06498 at freescale.com>
+Date: Thu, 2 Jul 2015 14:32:21 +0800
+Subject: [PATCH] basesink: Shouldn't drop buffer when sync=false
+
+Shouldn't drop buffer when sync=false
+
+Upstream-Status: Accepted
+
+https://bugzilla.gnome.org/show_bug.cgi?id=751819
+---
+ libs/gst/base/gstbasesink.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/libs/gst/base/gstbasesink.c b/libs/gst/base/gstbasesink.c
+index d44e8fc..cd759ac 100644
+--- a/libs/gst/base/gstbasesink.c
++++ b/libs/gst/base/gstbasesink.c
+@@ -3423,7 +3423,7 @@ gst_base_sink_chain_unlocked (GstBaseSink * basesink, GstPad * pad,
+ if (G_UNLIKELY (stepped))
+ goto dropped;
+
+- if (syncable && do_sync) {
++ if (syncable && do_sync && gst_base_sink_get_sync (basesink)) {
+ GstClock *clock;
+
+ GST_OBJECT_LOCK (basesink);
+--
+1.7.9.5
+
diff --git a/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.4.5.bb b/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.4.5.bb
index db58754..73a4a99 100644
--- a/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.4.5.bb
+++ b/meta/recipes-multimedia/gstreamer/gstreamer1.0_1.4.5.bb
@@ -9,6 +9,7 @@ SRC_URI = " \
file://0001-gstinfo-Shorten-__FILE__-on-all-platforms.patch \
file://inputselector-sticky-events-haven-t-send-out-when-ac-1-4-1.patch \
file://0002-basesink-Fix-QoS-lateness-checking-if-subclass-imple.patch \
+ file://0003-basesink-Shouldn-t-drop-buffer-when-sync-false.patch \
"
SRC_URI[md5sum] = "88a9289c64a4950ebb4f544980234289"
SRC_URI[sha256sum] = "40801aa7f979024526258a0e94707ba42b8ab6f7d2206e56adbc4433155cb0ae"
diff --git a/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_1.patch b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_1.patch
new file mode 100644
index 0000000..25fe136
--- /dev/null
+++ b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_1.patch
@@ -0,0 +1,91 @@
+From 81f44665cce4cb1373f049a76f3904e981b7a766 Mon Sep 17 00:00:00 2001
+From: Glenn Randers-Pehrson <glennrp at users.sourceforge.net>
+Date: Thu, 29 Oct 2015 09:26:41 -0500
+Subject: [PATCH] [libpng16] Reject attempt to write over-length PLTE chunk
+
+Upstream-Status: Backport
+https://github.com/glennrp/libpng/commit/81f44665cce4cb1373f049a76f3904e981b7a766
+
+CVE: CVE-2015-8126 patch #1
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ libpng-manual.txt | 5 +++++
+ libpng.3 | 5 +++++
+ pngwrite.c | 4 ++--
+ pngwutil.c | 7 +++++--
+ 4 files changed, 17 insertions(+), 4 deletions(-)
+
+Index: libpng-1.6.17/libpng-manual.txt
+===================================================================
+--- libpng-1.6.17.orig/libpng-manual.txt
++++ libpng-1.6.17/libpng-manual.txt
+@@ -5109,6 +5109,11 @@ length, which resulted in PNG files that
+ chunk. This error was fixed in libpng-1.6.3, and a tool (called
+ contrib/tools/png-fix-itxt) has been added to the libpng distribution.
+
++Starting with libpng-1.6.19, attempting to write an over-length PLTE chunk
++is an error. Previously this requirement of the PNG specification was not
++enforced. Libpng continues to accept over-length PLTE chunks when reading,
++but does not make any use of the extra entries.
++
+ XIII. Detecting libpng
+
+ The png_get_io_ptr() function has been present since libpng-0.88, has never
+Index: libpng-1.6.17/libpng.3
+===================================================================
+--- libpng-1.6.17.orig/libpng.3
++++ libpng-1.6.17/libpng.3
+@@ -5613,6 +5613,11 @@ length, which resulted in PNG files that
+ chunk. This error was fixed in libpng-1.6.3, and a tool (called
+ contrib/tools/png-fix-itxt) has been added to the libpng distribution.
+
++Starting with libpng-1.6.19, attempting to write an over-length PLTE chunk
++is an error. Previously this requirement of the PNG specification was not
++enforced. Libpng continues to accept over-length PLTE chunks when reading,
++but does not make any use of the extra entries.
++
+ .SH XIII. Detecting libpng
+
+ The png_get_io_ptr() function has been present since libpng-0.88, has never
+Index: libpng-1.6.17/pngwrite.c
+===================================================================
+--- libpng-1.6.17.orig/pngwrite.c
++++ libpng-1.6.17/pngwrite.c
+@@ -205,7 +205,7 @@ png_write_info(png_structrp png_ptr, png
+ png_write_PLTE(png_ptr, info_ptr->palette,
+ (png_uint_32)info_ptr->num_palette);
+
+- else if ((info_ptr->color_type == PNG_COLOR_TYPE_PALETTE) !=0)
++ else if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ png_error(png_ptr, "Valid palette required for paletted images");
+
+ #ifdef PNG_WRITE_tRNS_SUPPORTED
+Index: libpng-1.6.17/pngwutil.c
+===================================================================
+--- libpng-1.6.17.orig/pngwutil.c
++++ libpng-1.6.17/pngwutil.c
+@@ -922,17 +922,20 @@ void /* PRIVATE */
+ png_write_PLTE(png_structrp png_ptr, png_const_colorp palette,
+ png_uint_32 num_pal)
+ {
+- png_uint_32 i;
++ png_uint_32 max_num_pal, i;
+ png_const_colorp pal_ptr;
+ png_byte buf[3];
+
+ png_debug(1, "in png_write_PLTE");
+
++ max_num_pal = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
++ (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
++
+ if ((
+ #ifdef PNG_MNG_FEATURES_SUPPORTED
+ (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0 &&
+ #endif
+- num_pal == 0) || num_pal > 256)
++ num_pal == 0) || num_pal > max_num_pal)
+ {
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ {
diff --git a/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_2.patch b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_2.patch
new file mode 100644
index 0000000..4aa9170
--- /dev/null
+++ b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_2.patch
@@ -0,0 +1,134 @@
+From a901eb3ce6087e0afeef988247f1a1aa208cb54d Mon Sep 17 00:00:00 2001
+From: Glenn Randers-Pehrson <glennrp at users.sourceforge.net>
+Date: Fri, 30 Oct 2015 07:57:49 -0500
+Subject: [PATCH] [libpng16] Prevent reading over-length PLTE chunk (Cosmin
+ Truta).
+
+Upstream-Status: Backport
+https://github.com/glennrp/libpng/commit/a901eb3ce6087e0afeef988247f1a1aa208cb54d
+
+Many changes involved date and version updates with don't apply in this case.
+
+CVE: CVE-2015-8126 patch #2
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ANNOUNCE | 6 +++---
+ CHANGES | 4 ++--
+ libpng-manual.txt | 11 +++++------
+ libpng.3 | 19 +++++++++----------
+ pngrutil.c | 3 +++
+ pngset.c | 13 +++++++++----
+ pngwutil.c | 6 +++---
+ 7 files changed, 34 insertions(+), 28 deletions(-)
+
+Index: libpng-1.6.17/libpng-manual.txt
+===================================================================
+--- libpng-1.6.17.orig/libpng-manual.txt
++++ libpng-1.6.17/libpng-manual.txt
+@@ -5109,10 +5109,9 @@ length, which resulted in PNG files that
+ chunk. This error was fixed in libpng-1.6.3, and a tool (called
+ contrib/tools/png-fix-itxt) has been added to the libpng distribution.
+
+-Starting with libpng-1.6.19, attempting to write an over-length PLTE chunk
++Starting with libpng-1.6.19, attempting to set an over-length PLTE chunk
+ is an error. Previously this requirement of the PNG specification was not
+-enforced. Libpng continues to accept over-length PLTE chunks when reading,
+-but does not make any use of the extra entries.
++enforced, and the palette was always limited to 256 entries.
+
+ XIII. Detecting libpng
+
+Index: libpng-1.6.17/libpng.3
+===================================================================
+--- libpng-1.6.17.orig/libpng.3
++++ libpng-1.6.17/libpng.3
+@@ -5613,10 +5613,9 @@ length, which resulted in PNG files that
+ chunk. This error was fixed in libpng-1.6.3, and a tool (called
+ contrib/tools/png-fix-itxt) has been added to the libpng distribution.
+
+-Starting with libpng-1.6.19, attempting to write an over-length PLTE chunk
++Starting with libpng-1.6.19, attempting to set an over-length PLTE chunk
+ is an error. Previously this requirement of the PNG specification was not
+-enforced. Libpng continues to accept over-length PLTE chunks when reading,
+-but does not make any use of the extra entries.
++enforced, and the palette was always limited to 256 entries.
+
+ .SH XIII. Detecting libpng
+
+Index: libpng-1.6.17/pngrutil.c
+===================================================================
+--- libpng-1.6.17.orig/pngrutil.c
++++ libpng-1.6.17/pngrutil.c
+@@ -997,6 +997,9 @@ png_handle_PLTE(png_structrp png_ptr, pn
+ * confusing.
+ *
+ * Fix this by not sharing the palette in this way.
++ *
++ * Starting with libpng-1.6.19, png_set_PLTE() also issues a png_error() when
++ * it attempts to set a palette length that is too large for the bit depth.
+ */
+ png_set_PLTE(png_ptr, info_ptr, palette, num);
+
+Index: libpng-1.6.17/pngset.c
+===================================================================
+--- libpng-1.6.17.orig/pngset.c
++++ libpng-1.6.17/pngset.c
+@@ -513,12 +513,17 @@ png_set_PLTE(png_structrp png_ptr, png_i
+ png_const_colorp palette, int num_palette)
+ {
+
++ png_uint_32 max_palette_length;
++
+ png_debug1(1, "in %s storage function", "PLTE");
+
+ if (png_ptr == NULL || info_ptr == NULL)
+ return;
+
+- if (num_palette < 0 || num_palette > PNG_MAX_PALETTE_LENGTH)
++ max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
++ (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
++
++ if (num_palette < 0 || num_palette > max_palette_length)
+ {
+ if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ png_error(png_ptr, "Invalid palette length");
+@@ -551,8 +556,8 @@ png_set_PLTE(png_structrp png_ptr, png_i
+ png_free_data(png_ptr, info_ptr, PNG_FREE_PLTE, 0);
+
+ /* Changed in libpng-1.2.1 to allocate PNG_MAX_PALETTE_LENGTH instead
+- * of num_palette entries, in case of an invalid PNG file that has
+- * too-large sample values.
++ * of num_palette entries, in case of an invalid PNG file or incorrect
++ * call to png_set_PLTE() with too-large sample values.
+ */
+ png_ptr->palette = png_voidcast(png_colorp, png_calloc(png_ptr,
+ PNG_MAX_PALETTE_LENGTH * (sizeof (png_color))));
+Index: libpng-1.6.17/pngwutil.c
+===================================================================
+--- libpng-1.6.17.orig/pngwutil.c
++++ libpng-1.6.17/pngwutil.c
+@@ -922,20 +922,20 @@ void /* PRIVATE */
+ png_write_PLTE(png_structrp png_ptr, png_const_colorp palette,
+ png_uint_32 num_pal)
+ {
+- png_uint_32 max_num_pal, i;
++ png_uint_32 max_palette_length, i;
+ png_const_colorp pal_ptr;
+ png_byte buf[3];
+
+ png_debug(1, "in png_write_PLTE");
+
+- max_num_pal = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
++ max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
+ (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
+
+ if ((
+ #ifdef PNG_MNG_FEATURES_SUPPORTED
+ (png_ptr->mng_features_permitted & PNG_FLAG_MNG_EMPTY_PLTE) == 0 &&
+ #endif
+- num_pal == 0) || num_pal > max_num_pal)
++ num_pal == 0) || num_pal > max_palette_length)
+ {
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ {
diff --git a/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_3.patch b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_3.patch
new file mode 100644
index 0000000..0e0ad23
--- /dev/null
+++ b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_3.patch
@@ -0,0 +1,79 @@
+From 1bef8e97995c33123665582e57d3ed40b57d5978 Mon Sep 17 00:00:00 2001
+From: Glenn Randers-Pehrson <glennrp at users.sourceforge.net>
+Date: Fri, 30 Oct 2015 11:34:37 -0500
+Subject: [PATCH] [libpng16] Silently truncate over-length PLTE chunk while
+ reading.
+
+Upstream-Status: Backport
+https://github.com/glennrp/libpng/commit/1bef8e97995c33123665582e57d3ed40b57d5978
+
+Normal Issues is date and version conflicts not applied.
+
+CVE: CVE-2015-8i26 patch #3
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+
+---
+ ANNOUNCE | 3 ++-
+ CHANGES | 3 ++-
+ pngrutil.c | 15 +++++++++++----
+ pngset.c | 2 +-
+ 4 files changed, 16 insertions(+), 7 deletions(-)
+
+Index: libpng-1.6.17/pngrutil.c
+===================================================================
+--- libpng-1.6.17.orig/pngrutil.c
++++ libpng-1.6.17/pngrutil.c
+@@ -867,7 +867,7 @@ void /* PRIVATE */
+ png_handle_PLTE(png_structrp png_ptr, png_inforp info_ptr, png_uint_32 length)
+ {
+ png_color palette[PNG_MAX_PALETTE_LENGTH];
+- int num, i;
++ int max_palette_length, num, i;
+ #ifdef PNG_POINTER_INDEXING_SUPPORTED
+ png_colorp pal_ptr;
+ #endif
+@@ -925,9 +925,19 @@ png_handle_PLTE(png_structrp png_ptr, pn
+ return;
+ }
+
++ max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
++ (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
++
+ /* The cast is safe because 'length' is less than 3*PNG_MAX_PALETTE_LENGTH */
+ num = (int)length / 3;
+
++ /* If the palette has 256 or fewer entries but is too large for the bit depth,
++ * we don't issue an error, to preserve the behavior of previous libpng versions.
++ * We silently truncate the unused extra palette entries here.
++ */
++ if (num > max_palette_length)
++ num = max_palette_length;
++
+ #ifdef PNG_POINTER_INDEXING_SUPPORTED
+ for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++)
+ {
+@@ -997,9 +1007,6 @@ png_handle_PLTE(png_structrp png_ptr, pn
+ * confusing.
+ *
+ * Fix this by not sharing the palette in this way.
+- *
+- * Starting with libpng-1.6.19, png_set_PLTE() also issues a png_error() when
+- * it attempts to set a palette length that is too large for the bit depth.
+ */
+ png_set_PLTE(png_ptr, info_ptr, palette, num);
+
+Index: libpng-1.6.17/pngset.c
+===================================================================
+--- libpng-1.6.17.orig/pngset.c
++++ libpng-1.6.17/pngset.c
+@@ -523,7 +523,7 @@ png_set_PLTE(png_structrp png_ptr, png_i
+ max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
+ (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
+
+- if (num_palette < 0 || num_palette > max_palette_length)
++ if (num_palette < 0 || num_palette > (int) max_palette_length)
+ {
+ if (info_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ png_error(png_ptr, "Invalid palette length");
diff --git a/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_4.patch b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_4.patch
new file mode 100644
index 0000000..2622630
--- /dev/null
+++ b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8126_4.patch
@@ -0,0 +1,48 @@
+From 83f4c735c88e7f451541c1528d8043c31ba3b466 Mon Sep 17 00:00:00 2001
+From: Glenn Randers-Pehrson <glennrp at users.sourceforge.net>
+Date: Thu, 5 Nov 2015 11:18:44 -0600
+Subject: [PATCH] [libpng16] Clean up coding style in png_handle_PLTE()
+
+Upstream-Status: Backport
+https://github.com/glennrp/libpng/commit/83f4c735c88e7f451541c1528d8043c31ba3b466
+
+CVE: CVE-2015-8126 patch #4
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ pngrutil.c | 17 ++++++++++-------
+ 1 file changed, 10 insertions(+), 7 deletions(-)
+
+Index: libpng-1.6.17/pngrutil.c
+===================================================================
+--- libpng-1.6.17.orig/pngrutil.c
++++ libpng-1.6.17/pngrutil.c
+@@ -925,18 +925,21 @@ png_handle_PLTE(png_structrp png_ptr, pn
+ return;
+ }
+
+- max_palette_length = (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE) ?
+- (1 << png_ptr->bit_depth) : PNG_MAX_PALETTE_LENGTH;
+-
+ /* The cast is safe because 'length' is less than 3*PNG_MAX_PALETTE_LENGTH */
+ num = (int)length / 3;
+
+- /* If the palette has 256 or fewer entries but is too large for the bit depth,
+- * we don't issue an error, to preserve the behavior of previous libpng versions.
+- * We silently truncate the unused extra palette entries here.
++ /* If the palette has 256 or fewer entries but is too large for the bit
++ * depth, we don't issue an error, to preserve the behavior of previous
++ * libpng versions. We silently truncate the unused extra palette entries
++ * here.
+ */
++ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
++ max_palette_length = (1 << png_ptr->bit_depth);
++ else
++ max_palette_length = PNG_MAX_PALETTE_LENGTH;
++
+ if (num > max_palette_length)
+- num = max_palette_length;
++ num = max_palette_length;
+
+ #ifdef PNG_POINTER_INDEXING_SUPPORTED
+ for (i = 0, pal_ptr = palette; i < num; i++, pal_ptr++)
diff --git a/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8472.patch b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8472.patch
new file mode 100644
index 0000000..404f012
--- /dev/null
+++ b/meta/recipes-multimedia/libpng/libpng-1.6.17/CVE-2015-8472.patch
@@ -0,0 +1,29 @@
+From 9f2ad4928e47036cf1ac9b8fe45a491f15be2324 Mon Sep 17 00:00:00 2001
+From: Glenn Randers-Pehrson <glennrp at users.sourceforge.net>
+Date: Wed, 4 Nov 2015 23:47:42 -0600
+Subject: [PATCH] [libpng16] Fixed new bug with CRC error after reading an
+ over-length palette.
+
+Upstream-Status: Backport
+CVE: CVE-2015-8472
+
+https://github.com/glennrp/libpng/commit/9f2ad4928e47036cf1ac9b8fe45a491f15be2324
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ pngrutil.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+Index: libpng-1.6.17/pngrutil.c
+===================================================================
+--- libpng-1.6.17.orig/pngrutil.c
++++ libpng-1.6.17/pngrutil.c
+@@ -973,7 +973,7 @@ png_handle_PLTE(png_structrp png_ptr, pn
+ if (png_ptr->color_type == PNG_COLOR_TYPE_PALETTE)
+ #endif
+ {
+- png_crc_finish(png_ptr, 0);
++ png_crc_finish(png_ptr, (int) length - num * 3);
+ }
+
+ #ifndef PNG_READ_OPT_PLTE_SUPPORTED
diff --git a/meta/recipes-multimedia/libpng/libpng_1.6.17.bb b/meta/recipes-multimedia/libpng/libpng_1.6.17.bb
index 00e5808..cc288c7 100644
--- a/meta/recipes-multimedia/libpng/libpng_1.6.17.bb
+++ b/meta/recipes-multimedia/libpng/libpng_1.6.17.bb
@@ -8,8 +8,16 @@ LIC_FILES_CHKSUM = "file://LICENSE;md5=b9b75399b72e4a8656cf3a6ddfc86d9a \
DEPENDS = "zlib"
LIBV = "16"
-SRC_URI = "${SOURCEFORGE_MIRROR}/project/libpng/libpng${LIBV}/${PV}/libpng-${PV}.tar.xz \
+SRC_URI = "${SOURCEFORGE_MIRROR}/project/libpng/libpng${LIBV}/older-releases/${PV}/libpng-${PV}.tar.xz \
"
+SRC_URI += "\
+ file://CVE-2015-8126_1.patch \
+ file://CVE-2015-8126_2.patch \
+ file://CVE-2015-8126_3.patch \
+ file://CVE-2015-8126_4.patch \
+ file://CVE-2015-8472.patch \
+ "
+
SRC_URI[md5sum] = "430a9b76b78533235cd4b9b26ce75c7e"
SRC_URI[sha256sum] = "98507b55fbe5cd43c51981f2924e4671fd81fe35d52dc53357e20f2c77fa5dfd"
diff --git a/meta/recipes-multimedia/libsndfile/files/libsndfile-fix-CVE-2014-9756.patch b/meta/recipes-multimedia/libsndfile/files/libsndfile-fix-CVE-2014-9756.patch
new file mode 100644
index 0000000..b54b3ba
--- /dev/null
+++ b/meta/recipes-multimedia/libsndfile/files/libsndfile-fix-CVE-2014-9756.patch
@@ -0,0 +1,24 @@
+src/file_io.c : Prevent potential divide-by-zero.
+
+Closes: https://github.com/erikd/libsndfile/issues/92
+
+Upstream-Status: Backport
+
+Fixes CVE-2014-9756
+
+Signed-off-by: Erik de Castro Lopo <erikd at mega-nerd.com>
+Signed-off-by: Maxin B. John <maxin.john at intel.com>
+---
+diff -Naur libsndfile-1.0.25-orig/src/file_io.c libsndfile-1.0.25/src/file_io.c
+--- libsndfile-1.0.25-orig/src/file_io.c 2011-01-19 12:12:28.000000000 +0200
++++ libsndfile-1.0.25/src/file_io.c 2015-11-04 15:02:04.337395618 +0200
+@@ -358,6 +358,9 @@
+ { sf_count_t total = 0 ;
+ ssize_t count ;
+
++ if (bytes == 0 || items == 0)
++ return 0 ;
++
+ if (psf->virtual_io)
+ return psf->vio.write (ptr, bytes*items, psf->vio_user_data) / bytes ;
+
diff --git a/meta/recipes-multimedia/libsndfile/libsndfile1_1.0.25.bb b/meta/recipes-multimedia/libsndfile/libsndfile1_1.0.25.bb
index 3e02f4e..be875c2 100644
--- a/meta/recipes-multimedia/libsndfile/libsndfile1_1.0.25.bb
+++ b/meta/recipes-multimedia/libsndfile/libsndfile1_1.0.25.bb
@@ -9,6 +9,7 @@ PR = "r2"
SRC_URI = "http://www.mega-nerd.com/libsndfile/files/libsndfile-${PV}.tar.gz \
file://0001-src-sd2.c-Fix-segfault-in-SD2-RSRC-parser.patch \
file://0001-src-sd2.c-Fix-two-potential-buffer-read-overflows.patch \
+ file://libsndfile-fix-CVE-2014-9756.patch \
"
SRC_URI[md5sum] = "e2b7bb637e01022c7d20f95f9c3990a2"
diff --git a/meta/recipes-multimedia/libtiff/files/CVE-2015-8781.patch b/meta/recipes-multimedia/libtiff/files/CVE-2015-8781.patch
new file mode 100644
index 0000000..bdbe696
--- /dev/null
+++ b/meta/recipes-multimedia/libtiff/files/CVE-2015-8781.patch
@@ -0,0 +1,196 @@
+From aaab5c3c9d2a2c6984f23ccbc79702610439bc65 Mon Sep 17 00:00:00 2001
+From: erouault <erouault>
+Date: Sun, 27 Dec 2015 16:25:11 +0000
+Subject: [PATCH] * libtiff/tif_luv.c: fix potential out-of-bound writes in
+ decode functions in non debug builds by replacing assert()s by regular if
+ checks (bugzilla #2522). Fix potential out-of-bound reads in case of short
+ input data.
+
+Upstream-Status: Backport
+
+https://github.com/vadz/libtiff/commit/aaab5c3c9d2a2c6984f23ccbc79702610439bc65
+hand applied Changelog changes
+
+CVE: CVE-2015-8781
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+---
+ ChangeLog | 7 +++++++
+ libtiff/tif_luv.c | 55 ++++++++++++++++++++++++++++++++++++++++++++-----------
+ 2 files changed, 51 insertions(+), 11 deletions(-)
+
+Index: tiff-4.0.4/ChangeLog
+===================================================================
+--- tiff-4.0.4.orig/ChangeLog
++++ tiff-4.0.4/ChangeLog
+@@ -1,3 +1,11 @@
++2015-12-27 Even Rouault <even.rouault at spatialys.com>
++
++ * libtiff/tif_luv.c: fix potential out-of-bound writes in decode
++ functions in non debug builds by replacing assert()s by regular if
++ checks (bugzilla #2522).
++ Fix potential out-of-bound reads in case of short input data.
++
++
+ 2015-06-21 Bob Friesenhahn <bfriesen at simple.dallas.tx.us>
+
+ * libtiff 4.0.4 released.
+Index: tiff-4.0.4/libtiff/tif_luv.c
+===================================================================
+--- tiff-4.0.4.orig/libtiff/tif_luv.c
++++ tiff-4.0.4/libtiff/tif_luv.c
+@@ -202,7 +202,11 @@ LogL16Decode(TIFF* tif, uint8* op, tmsiz
+ if (sp->user_datafmt == SGILOGDATAFMT_16BIT)
+ tp = (int16*) op;
+ else {
+- assert(sp->tbuflen >= npixels);
++ if(sp->tbuflen < npixels) {
++ TIFFErrorExt(tif->tif_clientdata, module,
++ "Translation buffer too short");
++ return (0);
++ }
+ tp = (int16*) sp->tbuf;
+ }
+ _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0]));
+@@ -211,9 +215,11 @@ LogL16Decode(TIFF* tif, uint8* op, tmsiz
+ cc = tif->tif_rawcc;
+ /* get each byte string */
+ for (shft = 2*8; (shft -= 8) >= 0; ) {
+- for (i = 0; i < npixels && cc > 0; )
++ for (i = 0; i < npixels && cc > 0; ) {
+ if (*bp >= 128) { /* run */
+- rc = *bp++ + (2-128); /* TODO: potential input buffer overrun when decoding corrupt or truncated data */
++ if( cc < 2 )
++ break;
++ rc = *bp++ + (2-128);
+ b = (int16)(*bp++ << shft);
+ cc -= 2;
+ while (rc-- && i < npixels)
+@@ -223,6 +229,7 @@ LogL16Decode(TIFF* tif, uint8* op, tmsiz
+ while (--cc && rc-- && i < npixels)
+ tp[i++] |= (int16)*bp++ << shft;
+ }
++ }
+ if (i != npixels) {
+ #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
+ TIFFErrorExt(tif->tif_clientdata, module,
+@@ -268,13 +275,17 @@ LogLuvDecode24(TIFF* tif, uint8* op, tms
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32 *)op;
+ else {
+- assert(sp->tbuflen >= npixels);
++ if(sp->tbuflen < npixels) {
++ TIFFErrorExt(tif->tif_clientdata, module,
++ "Translation buffer too short");
++ return (0);
++ }
+ tp = (uint32 *) sp->tbuf;
+ }
+ /* copy to array of uint32 */
+ bp = (unsigned char*) tif->tif_rawcp;
+ cc = tif->tif_rawcc;
+- for (i = 0; i < npixels && cc > 0; i++) {
++ for (i = 0; i < npixels && cc >= 3; i++) {
+ tp[i] = bp[0] << 16 | bp[1] << 8 | bp[2];
+ bp += 3;
+ cc -= 3;
+@@ -325,7 +336,11 @@ LogLuvDecode32(TIFF* tif, uint8* op, tms
+ if (sp->user_datafmt == SGILOGDATAFMT_RAW)
+ tp = (uint32*) op;
+ else {
+- assert(sp->tbuflen >= npixels);
++ if(sp->tbuflen < npixels) {
++ TIFFErrorExt(tif->tif_clientdata, module,
++ "Translation buffer too short");
++ return (0);
++ }
+ tp = (uint32*) sp->tbuf;
+ }
+ _TIFFmemset((void*) tp, 0, npixels*sizeof (tp[0]));
+@@ -334,11 +349,13 @@ LogLuvDecode32(TIFF* tif, uint8* op, tms
+ cc = tif->tif_rawcc;
+ /* get each byte string */
+ for (shft = 4*8; (shft -= 8) >= 0; ) {
+- for (i = 0; i < npixels && cc > 0; )
++ for (i = 0; i < npixels && cc > 0; ) {
+ if (*bp >= 128) { /* run */
++ if( cc < 2 )
++ break;
+ rc = *bp++ + (2-128);
+ b = (uint32)*bp++ << shft;
+- cc -= 2; /* TODO: potential input buffer overrun when decoding corrupt or truncated data */
++ cc -= 2;
+ while (rc-- && i < npixels)
+ tp[i++] |= b;
+ } else { /* non-run */
+@@ -346,6 +363,7 @@ LogLuvDecode32(TIFF* tif, uint8* op, tms
+ while (--cc && rc-- && i < npixels)
+ tp[i++] |= (uint32)*bp++ << shft;
+ }
++ }
+ if (i != npixels) {
+ #if defined(__WIN32__) && (defined(_MSC_VER) || defined(__MINGW32__))
+ TIFFErrorExt(tif->tif_clientdata, module,
+@@ -413,6 +431,7 @@ LogLuvDecodeTile(TIFF* tif, uint8* bp, t
+ static int
+ LogL16Encode(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+ {
++ static const char module[] = "LogL16Encode";
+ LogLuvState* sp = EncoderState(tif);
+ int shft;
+ tmsize_t i;
+@@ -433,7 +452,11 @@ LogL16Encode(TIFF* tif, uint8* bp, tmsiz
+ tp = (int16*) bp;
+ else {
+ tp = (int16*) sp->tbuf;
+- assert(sp->tbuflen >= npixels);
++ if(sp->tbuflen < npixels) {
++ TIFFErrorExt(tif->tif_clientdata, module,
++ "Translation buffer too short");
++ return (0);
++ }
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* compress each byte string */
+@@ -506,6 +529,7 @@ LogL16Encode(TIFF* tif, uint8* bp, tmsiz
+ static int
+ LogLuvEncode24(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+ {
++ static const char module[] = "LogLuvEncode24";
+ LogLuvState* sp = EncoderState(tif);
+ tmsize_t i;
+ tmsize_t npixels;
+@@ -521,7 +545,11 @@ LogLuvEncode24(TIFF* tif, uint8* bp, tms
+ tp = (uint32*) bp;
+ else {
+ tp = (uint32*) sp->tbuf;
+- assert(sp->tbuflen >= npixels);
++ if(sp->tbuflen < npixels) {
++ TIFFErrorExt(tif->tif_clientdata, module,
++ "Translation buffer too short");
++ return (0);
++ }
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* write out encoded pixels */
+@@ -553,6 +581,7 @@ LogLuvEncode24(TIFF* tif, uint8* bp, tms
+ static int
+ LogLuvEncode32(TIFF* tif, uint8* bp, tmsize_t cc, uint16 s)
+ {
++ static const char module[] = "LogLuvEncode32";
+ LogLuvState* sp = EncoderState(tif);
+ int shft;
+ tmsize_t i;
+@@ -574,7 +603,11 @@ LogLuvEncode32(TIFF* tif, uint8* bp, tms
+ tp = (uint32*) bp;
+ else {
+ tp = (uint32*) sp->tbuf;
+- assert(sp->tbuflen >= npixels);
++ if(sp->tbuflen < npixels) {
++ TIFFErrorExt(tif->tif_clientdata, module,
++ "Translation buffer too short");
++ return (0);
++ }
+ (*sp->tfunc)(sp, bp, npixels);
+ }
+ /* compress each byte string */
diff --git a/meta/recipes-multimedia/libtiff/files/CVE-2015-8784.patch b/meta/recipes-multimedia/libtiff/files/CVE-2015-8784.patch
new file mode 100644
index 0000000..cf37fd3
--- /dev/null
+++ b/meta/recipes-multimedia/libtiff/files/CVE-2015-8784.patch
@@ -0,0 +1,73 @@
+From b18012dae552f85dcc5c57d3bf4e997a15b1cc1c Mon Sep 17 00:00:00 2001
+From: erouault <erouault>
+Date: Sun, 27 Dec 2015 16:55:20 +0000
+Subject: [PATCH] * libtiff/tif_next.c: fix potential out-of-bound write in
+ NeXTDecode() triggered by http://lcamtuf.coredump.cx/afl/vulns/libtiff5.tif
+ (bugzilla #2508)
+
+Upstream-Status: Backport
+https://github.com/vadz/libtiff/commit/b18012dae552f85dcc5c57d3bf4e997a15b1cc1c
+hand applied Changelog changes
+
+CVE: CVE-2015-8784
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ ChangeLog | 6 ++++++
+ libtiff/tif_next.c | 10 ++++++++--
+ 2 files changed, 14 insertions(+), 2 deletions(-)
+
+Index: tiff-4.0.4/ChangeLog
+===================================================================
+--- tiff-4.0.4.orig/ChangeLog
++++ tiff-4.0.4/ChangeLog
+@@ -1,5 +1,11 @@
+ 2015-12-27 Even Rouault <even.rouault at spatialys.com>
+
++ * libtiff/tif_next.c: fix potential out-of-bound write in NeXTDecode()
++ triggered by http://lcamtuf.coredump.cx/afl/vulns/libtiff5.tif
++ (bugzilla #2508)
++
++2015-12-27 Even Rouault <even.rouault at spatialys.com>
++
+ * libtiff/tif_luv.c: fix potential out-of-bound writes in decode
+ functions in non debug builds by replacing assert()s by regular if
+ checks (bugzilla #2522).
+Index: tiff-4.0.4/libtiff/tif_next.c
+===================================================================
+--- tiff-4.0.4.orig/libtiff/tif_next.c
++++ tiff-4.0.4/libtiff/tif_next.c
+@@ -37,7 +37,7 @@
+ case 0: op[0] = (unsigned char) ((v) << 6); break; \
+ case 1: op[0] |= (v) << 4; break; \
+ case 2: op[0] |= (v) << 2; break; \
+- case 3: *op++ |= (v); break; \
++ case 3: *op++ |= (v); op_offset++; break; \
+ } \
+ }
+
+@@ -106,6 +106,7 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize
+ uint32 imagewidth = tif->tif_dir.td_imagewidth;
+ if( isTiled(tif) )
+ imagewidth = tif->tif_dir.td_tilewidth;
++ tmsize_t op_offset = 0;
+
+ /*
+ * The scanline is composed of a sequence of constant
+@@ -122,10 +123,15 @@ NeXTDecode(TIFF* tif, uint8* buf, tmsize
+ * bounds, potentially resulting in a security
+ * issue.
+ */
+- while (n-- > 0 && npixels < imagewidth)
++ while (n-- > 0 && npixels < imagewidth && op_offset < scanline)
+ SETPIXEL(op, grey);
+ if (npixels >= imagewidth)
+ break;
++ if (op_offset >= scanline ) {
++ TIFFErrorExt(tif->tif_clientdata, module, "Invalid data for scanline %ld",
++ (long) tif->tif_row);
++ return (0);
++ }
+ if (cc == 0)
+ goto bad;
+ n = *bp++, cc--;
diff --git a/meta/recipes-multimedia/libtiff/tiff_4.0.4.bb b/meta/recipes-multimedia/libtiff/tiff_4.0.4.bb
index cf3a5f0..f1f5a7e 100644
--- a/meta/recipes-multimedia/libtiff/tiff_4.0.4.bb
+++ b/meta/recipes-multimedia/libtiff/tiff_4.0.4.bb
@@ -5,6 +5,8 @@ HOMEPAGE = "http://www.remotesensing.org/libtiff/"
SRC_URI = "ftp://ftp.remotesensing.org/pub/libtiff/tiff-${PV}.tar.gz \
file://libtool2.patch \
+ file://CVE-2015-8781.patch \
+ file://CVE-2015-8784.patch \
"
SRC_URI[md5sum] = "9aee7107408a128c0c7b24286c0db900"
diff --git a/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-card-add-pa_card_profile.ports.patch b/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-card-add-pa_card_profile.ports.patch
new file mode 100644
index 0000000..97b2e40
--- /dev/null
+++ b/meta/recipes-multimedia/pulseaudio/pulseaudio/0001-card-add-pa_card_profile.ports.patch
@@ -0,0 +1,245 @@
+From 6f814b40a01d03f93b36184c19339033949de472 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen <tanuk at iki.fi>
+Date: Fri, 23 Oct 2015 12:23:13 +0300
+Subject: [PATCH 1/4] card: add pa_card_profile.ports
+
+Having ports accessible from pa_card_profile allows checking whether all ports
+of a profile are unavailable, and therefore helps with managing the profile
+availability (implemented in a later patch).
+
+http://bugzilla.yoctoproject.org/show_bug.cgi?id=8448
+
+Upstream-Status: Submitted [http://lists.freedesktop.org/archives/pulseaudio-discuss/2015-October/024614.html]
+Signed-off-by: Jussi Kukkonen <jussi.kukkonen at intel.com>
+---
+ src/modules/alsa/alsa-mixer.c | 4 +++-
+ src/modules/alsa/alsa-ucm.c | 1 +
+ src/modules/bluetooth/module-bluez4-device.c | 6 ++++++
+ src/modules/bluetooth/module-bluez5-device.c | 6 ++++++
+ src/pulsecore/card.c | 16 ++++++++++++++++
+ src/pulsecore/card.h | 18 ++++++++++++------
+ src/pulsecore/device-port.c | 7 ++++++-
+ 7 files changed, 50 insertions(+), 8 deletions(-)
+
+diff --git a/src/modules/alsa/alsa-mixer.c b/src/modules/alsa/alsa-mixer.c
+index 47cbd14..c5b82b0 100644
+--- a/src/modules/alsa/alsa-mixer.c
++++ b/src/modules/alsa/alsa-mixer.c
+@@ -4654,8 +4654,10 @@ static pa_device_port* device_port_alsa_init(pa_hashmap *ports, /* card ports */
+ path->port = p;
+ }
+
+- if (cp)
++ if (cp) {
+ pa_hashmap_put(p->profiles, cp->name, cp);
++ pa_card_profile_add_port(cp, p);
++ }
+
+ if (extra) {
+ pa_hashmap_put(extra, p->name, p);
+diff --git a/src/modules/alsa/alsa-ucm.c b/src/modules/alsa/alsa-ucm.c
+index aa2d601..c8199d6 100644
+--- a/src/modules/alsa/alsa-ucm.c
++++ b/src/modules/alsa/alsa-ucm.c
+@@ -761,6 +761,7 @@ static void ucm_add_port_combination(
+ if (cp) {
+ pa_log_debug("Adding profile %s to port %s.", cp->name, port->name);
+ pa_hashmap_put(port->profiles, cp->name, cp);
++ pa_card_profile_add_port(cp, port);
+ }
+
+ if (hash) {
+diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c
+index db69d34..b40c6a0 100644
+--- a/src/modules/bluetooth/module-bluez4-device.c
++++ b/src/modules/bluetooth/module-bluez4-device.c
+@@ -2183,6 +2183,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
+ p->max_sink_channels = 2;
+ p->max_source_channels = 0;
+ pa_hashmap_put(output_port->profiles, p->name, p);
++ pa_card_profile_add_port(p, output_port);
+
+ d = PA_CARD_PROFILE_DATA(p);
+ *d = PA_BLUEZ4_PROFILE_A2DP;
+@@ -2194,6 +2195,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
+ p->max_sink_channels = 0;
+ p->max_source_channels = 2;
+ pa_hashmap_put(input_port->profiles, p->name, p);
++ pa_card_profile_add_port(p, input_port);
+
+ d = PA_CARD_PROFILE_DATA(p);
+ *d = PA_BLUEZ4_PROFILE_A2DP_SOURCE;
+@@ -2206,6 +2208,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
+ p->max_source_channels = 1;
+ pa_hashmap_put(input_port->profiles, p->name, p);
+ pa_hashmap_put(output_port->profiles, p->name, p);
++ pa_card_profile_add_port(p, input_port);
++ pa_card_profile_add_port(p, output_port);
+
+ d = PA_CARD_PROFILE_DATA(p);
+ *d = PA_BLUEZ4_PROFILE_HSP;
+@@ -2218,6 +2222,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
+ p->max_source_channels = 1;
+ pa_hashmap_put(input_port->profiles, p->name, p);
+ pa_hashmap_put(output_port->profiles, p->name, p);
++ pa_card_profile_add_port(p, input_port);
++ pa_card_profile_add_port(p, output_port);
+
+ d = PA_CARD_PROFILE_DATA(p);
+ *d = PA_BLUEZ4_PROFILE_HFGW;
+diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
+index 7238e6f..3321785 100644
+--- a/src/modules/bluetooth/module-bluez5-device.c
++++ b/src/modules/bluetooth/module-bluez5-device.c
+@@ -1790,6 +1790,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
+ cp->max_sink_channels = 2;
+ cp->max_source_channels = 0;
+ pa_hashmap_put(output_port->profiles, cp->name, cp);
++ pa_card_profile_add_port(cp, output_port);
+
+ p = PA_CARD_PROFILE_DATA(cp);
+ *p = PA_BLUETOOTH_PROFILE_A2DP_SINK;
+@@ -1801,6 +1802,7 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
+ cp->max_sink_channels = 0;
+ cp->max_source_channels = 2;
+ pa_hashmap_put(input_port->profiles, cp->name, cp);
++ pa_card_profile_add_port(cp, input_port);
+
+ p = PA_CARD_PROFILE_DATA(cp);
+ *p = PA_BLUETOOTH_PROFILE_A2DP_SOURCE;
+@@ -1813,6 +1815,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
+ cp->max_source_channels = 1;
+ pa_hashmap_put(input_port->profiles, cp->name, cp);
+ pa_hashmap_put(output_port->profiles, cp->name, cp);
++ pa_card_profile_add_port(cp, input_port);
++ pa_card_profile_add_port(cp, output_port);
+
+ p = PA_CARD_PROFILE_DATA(cp);
+ *p = PA_BLUETOOTH_PROFILE_HEADSET_HEAD_UNIT;
+@@ -1825,6 +1829,8 @@ static pa_card_profile *create_card_profile(struct userdata *u, const char *uuid
+ cp->max_source_channels = 1;
+ pa_hashmap_put(input_port->profiles, cp->name, cp);
+ pa_hashmap_put(output_port->profiles, cp->name, cp);
++ pa_card_profile_add_port(cp, input_port);
++ pa_card_profile_add_port(cp, output_port);
+
+ p = PA_CARD_PROFILE_DATA(cp);
+ *p = PA_BLUETOOTH_PROFILE_HEADSET_AUDIO_GATEWAY;
+diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c
+index 6f9391e..cc4c784 100644
+--- a/src/pulsecore/card.c
++++ b/src/pulsecore/card.c
+@@ -50,6 +50,7 @@ pa_card_profile *pa_card_profile_new(const char *name, const char *description,
+ c->n_sinks = c->n_sources = 0;
+ c->max_sink_channels = c->max_source_channels = 0;
+ c->available = PA_AVAILABLE_UNKNOWN;
++ c->ports = pa_hashmap_new(pa_idxset_string_hash_func, pa_idxset_string_compare_func);
+
+ return c;
+ }
+@@ -57,11 +58,25 @@ pa_card_profile *pa_card_profile_new(const char *name, const char *description,
+ void pa_card_profile_free(pa_card_profile *c) {
+ pa_assert(c);
+
++ if (c->ports) {
++ pa_device_port *port;
++ void *state;
++ PA_HASHMAP_FOREACH(port, c->ports, state)
++ pa_hashmap_remove (port->profiles, c->name);
++ pa_hashmap_free(c->ports);
++ }
++
+ pa_xfree(c->name);
+ pa_xfree(c->description);
+ pa_xfree(c);
+ }
+
++void pa_card_profile_add_port(pa_card_profile *profile, pa_device_port *port) {
++ pa_assert(profile);
++
++ pa_hashmap_put(profile->ports, port->name, port);
++}
++
+ void pa_card_profile_set_available(pa_card_profile *c, pa_available_t available) {
+ pa_core *core;
+
+@@ -198,6 +213,7 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
+
+ c->userdata = NULL;
+ c->set_profile = NULL;
++ c->active_profile = NULL;
+
+ pa_device_init_description(c->proplist, c);
+ pa_device_init_icon(c->proplist, true);
+diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h
+index 3e2c004..1c33958 100644
+--- a/src/pulsecore/card.h
++++ b/src/pulsecore/card.h
+@@ -22,19 +22,21 @@
+
+ typedef struct pa_card pa_card;
+
+-#include <pulse/proplist.h>
+-#include <pulsecore/core.h>
+-#include <pulsecore/module.h>
+-#include <pulsecore/idxset.h>
+-
+ /* This enum replaces pa_port_available_t (defined in pulse/def.h) for
+- * internal use, so make sure both enum types stay in sync. */
++ * internal use, so make sure both enum types stay in sync. This is defined
++ * before the #includes, because device-port.h depends on this enum. */
+ typedef enum pa_available {
+ PA_AVAILABLE_UNKNOWN = 0,
+ PA_AVAILABLE_NO = 1,
+ PA_AVAILABLE_YES = 2,
+ } pa_available_t;
+
++#include <pulse/proplist.h>
++#include <pulsecore/core.h>
++#include <pulsecore/device-port.h>
++#include <pulsecore/module.h>
++#include <pulsecore/idxset.h>
++
+ typedef struct pa_card_profile {
+ pa_card *card;
+ char *name;
+@@ -43,6 +45,8 @@ typedef struct pa_card_profile {
+ unsigned priority;
+ pa_available_t available; /* PA_AVAILABLE_UNKNOWN, PA_AVAILABLE_NO or PA_AVAILABLE_YES */
+
++ pa_hashmap *ports; /* port name -> pa_device_port */
++
+ /* We probably want to have different properties later on here */
+ unsigned n_sinks;
+ unsigned n_sources;
+@@ -100,6 +104,8 @@ typedef struct pa_card_new_data {
+ pa_card_profile *pa_card_profile_new(const char *name, const char *description, size_t extra);
+ void pa_card_profile_free(pa_card_profile *c);
+
++void pa_card_profile_add_port(pa_card_profile *profile, pa_device_port *port);
++
+ /* The profile's available status has changed */
+ void pa_card_profile_set_available(pa_card_profile *c, pa_available_t available);
+
+diff --git a/src/pulsecore/device-port.c b/src/pulsecore/device-port.c
+index cfe2a80..f16ecef 100644
+--- a/src/pulsecore/device-port.c
++++ b/src/pulsecore/device-port.c
+@@ -95,8 +95,13 @@ static void device_port_free(pa_object *o) {
+ if (p->proplist)
+ pa_proplist_free(p->proplist);
+
+- if (p->profiles)
++ if (p->profiles) {
++ pa_card_profile *profile;
++ void *state;
++ PA_HASHMAP_FOREACH(profile, p->profiles, state)
++ pa_hashmap_remove (profile->ports, p->name);
+ pa_hashmap_free(p->profiles);
++ }
+
+ pa_xfree(p->name);
+ pa_xfree(p->description);
+--
+2.1.4
+
diff --git a/meta/recipes-multimedia/pulseaudio/pulseaudio/0002-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch b/meta/recipes-multimedia/pulseaudio/pulseaudio/0002-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch
new file mode 100644
index 0000000..c3f217b
--- /dev/null
+++ b/meta/recipes-multimedia/pulseaudio/pulseaudio/0002-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch
@@ -0,0 +1,60 @@
+From 339eb179baa7810113f6456accc05b3a32c1cdba Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen <tanuk at iki.fi>
+Date: Fri, 23 Oct 2015 12:36:34 +0300
+Subject: [PATCH 2/4] alsa, bluetooth: fail if user-requested profile doesn't
+ exist
+
+If we can't fulfill the user request fully, I think we shouldn't
+fulfill it at all, to make it clear that the requested operation
+didn't succeed.
+
+http://bugzilla.yoctoproject.org/show_bug.cgi?id=8448
+
+Upstream-Status: Submitted [http://lists.freedesktop.org/archives/pulseaudio-discuss/2015-October/024614.html]
+Signed-off-by: Jussi Kukkonen <jussi.kukkonen at intel.com>
+---
+ src/modules/alsa/module-alsa-card.c | 10 ++++++++--
+ src/modules/bluetooth/module-bluez4-device.c | 6 ++++--
+ 2 files changed, 12 insertions(+), 4 deletions(-)
+
+diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
+index a7fec04..32f517e 100644
+--- a/src/modules/alsa/module-alsa-card.c
++++ b/src/modules/alsa/module-alsa-card.c
+@@ -754,8 +754,14 @@ int pa__init(pa_module *m) {
+ goto fail;
+ }
+
+- if ((profile = pa_modargs_get_value(u->modargs, "profile", NULL)))
+- pa_card_new_data_set_profile(&data, profile);
++ if ((profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
++ if (pa_hashmap_get(data.profiles, profile))
++ pa_card_new_data_set_profile(&data, profile);
++ else {
++ pa_log("No such profile: %s", profile);
++ goto fail;
++ }
++ }
+
+ u->card = pa_card_new(m->core, &data);
+ pa_card_new_data_done(&data);
+diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c
+index b40c6a0..94e6988 100644
+--- a/src/modules/bluetooth/module-bluez4-device.c
++++ b/src/modules/bluetooth/module-bluez4-device.c
+@@ -2310,8 +2310,10 @@ static int add_card(struct userdata *u) {
+ if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
+ if (pa_hashmap_get(data.profiles, default_profile))
+ pa_card_new_data_set_profile(&data, default_profile);
+- else
+- pa_log_warn("Profile '%s' not valid or not supported by device.", default_profile);
++ else {
++ pa_log("Profile '%s' not valid or not supported by device.", default_profile);
++ return -1;
++ }
+ }
+
+ u->card = pa_card_new(u->core, &data);
+--
+2.1.4
+
diff --git a/meta/recipes-multimedia/pulseaudio/pulseaudio/0003-card-move-profile-selection-after-pa_card_new.patch b/meta/recipes-multimedia/pulseaudio/pulseaudio/0003-card-move-profile-selection-after-pa_card_new.patch
new file mode 100644
index 0000000..9585f3d
--- /dev/null
+++ b/meta/recipes-multimedia/pulseaudio/pulseaudio/0003-card-move-profile-selection-after-pa_card_new.patch
@@ -0,0 +1,363 @@
+From cc41c8a3149ef04d4aa2db3d15032605a5504658 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen <tanuk at iki.fi>
+Date: Fri, 23 Oct 2015 12:59:53 +0300
+Subject: [PATCH 3/4] card: move profile selection after pa_card_new()
+
+I want module-alsa-card to set the availability of unavailable
+profiles before the initial card profile gets selected, so that the
+selection logic can use correct availability information.
+module-alsa-card initializes the jack state after calling
+pa_card_new(), however, and the profile selection happens in
+pa_card_new(). This patch solves that by introducing pa_card_put() and
+moving the profile selection code there.
+
+An alternative solution would have been to move the jack
+initialization to happen before pa_card_new() and use pa_card_new_data
+instead of pa_card in the jack initialization code, but I disliked
+that idea (I want to get rid of the "new data" pattern eventually).
+
+The CARD_NEW hook is used when applying the initial profile policy, so
+that was moved to pa_card_put(). That required changing the hook data
+from pa_card_new_data to pa_card. module-card-restore now uses
+pa_card_set_profile() instead of pa_card_new_data_set_profile(). That
+required adding a state variable to pa_card, because
+pa_card_set_profile() needs to distinguish between setting the initial
+profile and setting the profile in other situations.
+
+The order in which the initial profile policy is applied is reversed
+in this patch. Previously the first one to set it won, now the last
+one to set it wins. I think this is better, because if you have N
+parties that want to set the profile, we avoid checking N times
+whether someone else has already set the profile.
+
+http://bugzilla.yoctoproject.org/show_bug.cgi?id=8448
+
+Upstream-Status: Submitted [http://lists.freedesktop.org/archives/pulseaudio-discuss/2015-October/024614.html]
+Signed-off-by: Jussi Kukkonen <jussi.kukkonen at intel.com>
+---
+ src/modules/alsa/module-alsa-card.c | 19 +++---
+ src/modules/bluetooth/module-bluez4-device.c | 18 +++---
+ src/modules/bluetooth/module-bluez5-device.c | 1 +
+ src/modules/macosx/module-coreaudio-device.c | 1 +
+ src/modules/module-card-restore.c | 24 ++++----
+ src/pulsecore/card.c | 86 +++++++++++++++-------------
+ src/pulsecore/card.h | 7 +++
+ 7 files changed, 87 insertions(+), 69 deletions(-)
+
+diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
+index 32f517e..5b39654 100644
+--- a/src/modules/alsa/module-alsa-card.c
++++ b/src/modules/alsa/module-alsa-card.c
+@@ -754,15 +754,6 @@ int pa__init(pa_module *m) {
+ goto fail;
+ }
+
+- if ((profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
+- if (pa_hashmap_get(data.profiles, profile))
+- pa_card_new_data_set_profile(&data, profile);
+- else {
+- pa_log("No such profile: %s", profile);
+- goto fail;
+- }
+- }
+-
+ u->card = pa_card_new(m->core, &data);
+ pa_card_new_data_done(&data);
+
+@@ -773,6 +764,16 @@ int pa__init(pa_module *m) {
+ u->card->set_profile = card_set_profile;
+
+ init_jacks(u);
++ pa_card_put(u->card);
++
++ if ((profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
++ u->card->active_profile = pa_hashmap_get(u->card->profiles, profile);
++ if (!u->card->active_profile) {
++ pa_log("No such profile: %s", profile);
++ goto fail;
++ }
++ }
++
+ init_profile(u);
+ init_eld_ctls(u);
+
+diff --git a/src/modules/bluetooth/module-bluez4-device.c b/src/modules/bluetooth/module-bluez4-device.c
+index 94e6988..5efc5dc 100644
+--- a/src/modules/bluetooth/module-bluez4-device.c
++++ b/src/modules/bluetooth/module-bluez4-device.c
+@@ -2307,15 +2307,6 @@ static int add_card(struct userdata *u) {
+ *d = PA_BLUEZ4_PROFILE_OFF;
+ pa_hashmap_put(data.profiles, p->name, p);
+
+- if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
+- if (pa_hashmap_get(data.profiles, default_profile))
+- pa_card_new_data_set_profile(&data, default_profile);
+- else {
+- pa_log("Profile '%s' not valid or not supported by device.", default_profile);
+- return -1;
+- }
+- }
+-
+ u->card = pa_card_new(u->core, &data);
+ pa_card_new_data_done(&data);
+
+@@ -2326,6 +2317,15 @@ static int add_card(struct userdata *u) {
+
+ u->card->userdata = u;
+ u->card->set_profile = card_set_profile;
++ pa_card_put(u->card);
++
++ if ((default_profile = pa_modargs_get_value(u->modargs, "profile", NULL))) {
++ u->card->active_profile = pa_hashmap_get(u->card->profiles, default_profile);
++ if (!u->card->active_profile) {
++ pa_log("Profile '%s' not valid or not supported by device.", default_profile);
++ return -1;
++ }
++ }
+
+ d = PA_CARD_PROFILE_DATA(u->card->active_profile);
+
+diff --git a/src/modules/bluetooth/module-bluez5-device.c b/src/modules/bluetooth/module-bluez5-device.c
+index 3321785..0081a21 100644
+--- a/src/modules/bluetooth/module-bluez5-device.c
++++ b/src/modules/bluetooth/module-bluez5-device.c
+@@ -1959,6 +1959,7 @@ static int add_card(struct userdata *u) {
+
+ u->card->userdata = u;
+ u->card->set_profile = set_profile_cb;
++ pa_card_put(u->card);
+
+ p = PA_CARD_PROFILE_DATA(u->card->active_profile);
+ u->profile = *p;
+diff --git a/src/modules/macosx/module-coreaudio-device.c b/src/modules/macosx/module-coreaudio-device.c
+index 4bbb5d5..41f151f 100644
+--- a/src/modules/macosx/module-coreaudio-device.c
++++ b/src/modules/macosx/module-coreaudio-device.c
+@@ -764,6 +764,7 @@ int pa__init(pa_module *m) {
+ pa_card_new_data_done(&card_new_data);
+ u->card->userdata = u;
+ u->card->set_profile = card_set_profile;
++ pa_card_put(u->card);
+
+ u->rtpoll = pa_rtpoll_new();
+ pa_thread_mq_init(&u->thread_mq, m->core->mainloop, u->rtpoll);
+diff --git a/src/modules/module-card-restore.c b/src/modules/module-card-restore.c
+index baa2f4f..0501ac8 100644
+--- a/src/modules/module-card-restore.c
++++ b/src/modules/module-card-restore.c
+@@ -485,34 +485,38 @@ static pa_hook_result_t port_offset_change_callback(pa_core *c, pa_device_port *
+ return PA_HOOK_OK;
+ }
+
+-static pa_hook_result_t card_new_hook_callback(pa_core *c, pa_card_new_data *new_data, struct userdata *u) {
++static pa_hook_result_t card_new_hook_callback(pa_core *c, pa_card *card, struct userdata *u) {
+ struct entry *e;
+ void *state;
+ pa_device_port *p;
+ struct port_info *p_info;
+
+- pa_assert(new_data);
++ pa_assert(c);
++ pa_assert(card);
++ pa_assert(u);
+
+- if (!(e = entry_read(u, new_data->name)))
++ if (!(e = entry_read(u, card->name)))
+ return PA_HOOK_OK;
+
+ if (e->profile[0]) {
+- if (!new_data->active_profile) {
+- pa_card_new_data_set_profile(new_data, e->profile);
+- pa_log_info("Restored profile '%s' for card %s.", new_data->active_profile, new_data->name);
+- new_data->save_profile = true;
++ pa_card_profile *profile;
+
++ profile = pa_hashmap_get(card->profiles, e->profile);
++ if (profile) {
++ pa_card_set_profile(card, profile, true);
++ pa_log_info("Restored profile '%s' for card %s.", card->active_profile->name, card->name);
+ } else
+- pa_log_debug("Not restoring profile for card %s, because already set.", new_data->name);
++ pa_log_debug("Tried to restore profile %s for card %s, but the card doesn't have such profile.",
++ e->profile, card->name);
+ }
+
+ /* Always restore the latency offsets because their
+ * initial value is always 0 */
+
+- pa_log_info("Restoring port latency offsets for card %s.", new_data->name);
++ pa_log_info("Restoring port latency offsets for card %s.", card->name);
+
+ PA_HASHMAP_FOREACH(p_info, e->ports, state)
+- if ((p = pa_hashmap_get(new_data->ports, p_info->name)))
++ if ((p = pa_hashmap_get(card->ports, p_info->name)))
+ p->latency_offset = p_info->offset;
+
+ entry_free(e);
+diff --git a/src/pulsecore/card.c b/src/pulsecore/card.c
+index cc4c784..1b7f71b 100644
+--- a/src/pulsecore/card.c
++++ b/src/pulsecore/card.c
+@@ -151,6 +151,7 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
+ pa_assert(!pa_hashmap_isempty(data->profiles));
+
+ c = pa_xnew(pa_card, 1);
++ c->state = PA_CARD_STATE_INIT;
+
+ if (!(name = pa_namereg_register(core, data->name, PA_NAMEREG_CARD, c, data->namereg_fail))) {
+ pa_xfree(c);
+@@ -159,12 +160,6 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
+
+ pa_card_new_data_set_name(data, name);
+
+- if (pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_NEW], data) < 0) {
+- pa_xfree(c);
+- pa_namereg_unregister(core, name);
+- return NULL;
+- }
+-
+ c->core = core;
+ c->name = pa_xstrdup(data->name);
+ c->proplist = pa_proplist_copy(data->proplist);
+@@ -187,30 +182,6 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
+ PA_HASHMAP_FOREACH(port, c->ports, state)
+ port->card = c;
+
+- c->active_profile = NULL;
+- c->save_profile = false;
+-
+- if (data->active_profile)
+- if ((c->active_profile = pa_hashmap_get(c->profiles, data->active_profile)))
+- c->save_profile = data->save_profile;
+-
+- if (!c->active_profile) {
+- PA_HASHMAP_FOREACH(profile, c->profiles, state) {
+- if (profile->available == PA_AVAILABLE_NO)
+- continue;
+-
+- if (!c->active_profile || profile->priority > c->active_profile->priority)
+- c->active_profile = profile;
+- }
+- /* If all profiles are not available, then we still need to pick one */
+- if (!c->active_profile) {
+- PA_HASHMAP_FOREACH(profile, c->profiles, state)
+- if (!c->active_profile || profile->priority > c->active_profile->priority)
+- c->active_profile = profile;
+- }
+- pa_assert(c->active_profile);
+- }
+-
+ c->userdata = NULL;
+ c->set_profile = NULL;
+ c->active_profile = NULL;
+@@ -219,13 +190,39 @@ pa_card *pa_card_new(pa_core *core, pa_card_new_data *data) {
+ pa_device_init_icon(c->proplist, true);
+ pa_device_init_intended_roles(c->proplist);
+
+- pa_assert_se(pa_idxset_put(core->cards, c, &c->index) >= 0);
++ return c;
++}
+
+- pa_log_info("Created %u \"%s\"", c->index, c->name);
+- pa_subscription_post(core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, c->index);
++void pa_card_put(pa_card *card) {
++ pa_card_profile *profile;
++ void *state;
+
+- pa_hook_fire(&core->hooks[PA_CORE_HOOK_CARD_PUT], c);
+- return c;
++ pa_assert(card);
++
++ PA_HASHMAP_FOREACH(profile, card->profiles, state) {
++ if (profile->available == PA_AVAILABLE_NO)
++ continue;
++
++ if (!card->active_profile || profile->priority > card->active_profile->priority)
++ card->active_profile = profile;
++ }
++
++ /* If all profiles are unavailable, then we still need to pick one */
++ if (!card->active_profile) {
++ PA_HASHMAP_FOREACH(profile, card->profiles, state)
++ if (!card->active_profile || profile->priority > card->active_profile->priority)
++ card->active_profile = profile;
++ }
++ pa_assert(card->active_profile);
++
++ pa_hook_fire(&card->core->hooks[PA_CORE_HOOK_CARD_NEW], card);
++
++ pa_assert_se(pa_idxset_put(card->core->cards, card, &card->index) >= 0);
++ card->state = PA_CARD_STATE_LINKED;
++
++ pa_log_info("Created %u \"%s\"", card->index, card->name);
++ pa_hook_fire(&card->core->hooks[PA_CORE_HOOK_CARD_PUT], card);
++ pa_subscription_post(card->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_NEW, card->index);
+ }
+
+ void pa_card_free(pa_card *c) {
+@@ -292,17 +289,24 @@ int pa_card_set_profile(pa_card *c, pa_card_profile *profile, bool save) {
+ return 0;
+ }
+
+- if ((r = c->set_profile(c, profile)) < 0)
++ /* If we're setting the initial profile, we shouldn't call set_profile(),
++ * because the implementations don't expect that (for historical reasons).
++ * We should just set c->active_profile, and the implementations will
++ * properly set up that profile after pa_card_put() has returned. It would
++ * be probably good to change this so that also the initial profile can be
++ * set up in set_profile(), but if set_profile() fails, that would need
++ * some better handling than what we do here currently. */
++ if (c->state != PA_CARD_STATE_INIT && (r = c->set_profile(c, profile)) < 0)
+ return r;
+
+- pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, c->index);
+-
+- pa_log_info("Changed profile of card %u \"%s\" to %s", c->index, c->name, profile->name);
+-
+ c->active_profile = profile;
+ c->save_profile = save;
+
+- pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], c);
++ if (c->state != PA_CARD_STATE_INIT) {
++ pa_log_info("Changed profile of card %u \"%s\" to %s", c->index, c->name, profile->name);
++ pa_hook_fire(&c->core->hooks[PA_CORE_HOOK_CARD_PROFILE_CHANGED], c);
++ pa_subscription_post(c->core, PA_SUBSCRIPTION_EVENT_CARD|PA_SUBSCRIPTION_EVENT_CHANGE, c->index);
++ }
+
+ return 0;
+ }
+diff --git a/src/pulsecore/card.h b/src/pulsecore/card.h
+index 1c33958..dbbc1c2 100644
+--- a/src/pulsecore/card.h
++++ b/src/pulsecore/card.h
+@@ -37,6 +37,11 @@ typedef enum pa_available {
+ #include <pulsecore/module.h>
+ #include <pulsecore/idxset.h>
+
++typedef enum pa_card_state {
++ PA_CARD_STATE_INIT,
++ PA_CARD_STATE_LINKED,
++} pa_card_state_t;
++
+ typedef struct pa_card_profile {
+ pa_card *card;
+ char *name;
+@@ -61,6 +66,7 @@ typedef struct pa_card_profile {
+
+ struct pa_card {
+ uint32_t index;
++ pa_card_state_t state;
+ pa_core *core;
+
+ char *name;
+@@ -115,6 +121,7 @@ void pa_card_new_data_set_profile(pa_card_new_data *data, const char *profile);
+ void pa_card_new_data_done(pa_card_new_data *data);
+
+ pa_card *pa_card_new(pa_core *c, pa_card_new_data *data);
++void pa_card_put(pa_card *c);
+ void pa_card_free(pa_card *c);
+
+ void pa_card_add_profile(pa_card *c, pa_card_profile *profile);
+--
+2.1.4
+
diff --git a/meta/recipes-multimedia/pulseaudio/pulseaudio/0004-alsa-set-availability-for-some-unavailable-profiles.patch b/meta/recipes-multimedia/pulseaudio/pulseaudio/0004-alsa-set-availability-for-some-unavailable-profiles.patch
new file mode 100644
index 0000000..bb318aa
--- /dev/null
+++ b/meta/recipes-multimedia/pulseaudio/pulseaudio/0004-alsa-set-availability-for-some-unavailable-profiles.patch
@@ -0,0 +1,75 @@
+From 0136b73158f60d5dc630ae348b18df3b59a2a5c2 Mon Sep 17 00:00:00 2001
+From: Tanu Kaskinen <tanuk at iki.fi>
+Date: Fri, 23 Oct 2015 13:37:11 +0300
+Subject: [PATCH 4/4] alsa: set availability for (some) unavailable profiles
+
+The alsa card hasn't so far set any availability for profiles. That
+caused an issue with some HDMI hardware: the sound card has two HDMI
+outputs, but only the second of them is actually usable. The
+unavailable port is marked as unavailable and the available port is
+marked as available, but this information isn't propagated to the
+profile availability. Without profile availability information, the
+initial profile policy picks the unavailable one, since it has a
+higher priority value.
+
+This patch adds simple logic for marking some profiles unavailable:
+if the profile only contains unavailable ports, the profile is
+unavailable too. This can be improved in the future so that if a
+profile contains sinks or sources that only contain unavailable ports,
+the profile should be marked as unavailable. Implementing that
+requires adding more information about the sinks and sources to
+pa_card_profile, however.
+
+BugLink: https://bugzilla.yoctoproject.org/show_bug.cgi?id=8448
+
+Upstream-Status: Submitted [http://lists.freedesktop.org/archives/pulseaudio-discuss/2015-October/024614.html]
+Signed-off-by: Jussi Kukkonen <jussi.kukkonen at intel.com>
+---
+ src/modules/alsa/module-alsa-card.c | 24 ++++++++++++++++++++++++
+ 1 file changed, 24 insertions(+)
+
+diff --git a/src/modules/alsa/module-alsa-card.c b/src/modules/alsa/module-alsa-card.c
+index 5b39654..73a846c 100644
+--- a/src/modules/alsa/module-alsa-card.c
++++ b/src/modules/alsa/module-alsa-card.c
+@@ -366,6 +366,7 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
+ void *state;
+ pa_alsa_jack *jack;
+ pa_device_port *port;
++ pa_card_profile *profile;
+
+ pa_assert(u);
+
+@@ -396,6 +397,29 @@ static int report_jack_state(snd_mixer_elem_t *melem, unsigned int mask) {
+ }
+ report_port_state(port, u);
+ }
++
++ /* Update profile availabilities. The logic could be improved; for now we
++ * only set obviously unavailable profiles (those that contain only
++ * unavailable ports) to PA_AVAILABLE_NO and all others to
++ * PA_AVAILABLE_UNKNOWN. */
++ PA_HASHMAP_FOREACH(profile, u->card->profiles, state) {
++ void *state2;
++ pa_available_t available = PA_AVAILABLE_NO;
++
++ /* Don't touch the "off" profile. */
++ if (pa_hashmap_size(profile->ports) == 0)
++ continue;
++
++ PA_HASHMAP_FOREACH(port, profile->ports, state2) {
++ if (port->available != PA_AVAILABLE_NO) {
++ available = PA_AVAILABLE_UNKNOWN;
++ break;
++ }
++ }
++
++ pa_card_profile_set_available(profile, available);
++ }
++
+ return 0;
+ }
+
+--
+2.1.4
+
diff --git a/meta/recipes-multimedia/pulseaudio/pulseaudio_6.0.bb b/meta/recipes-multimedia/pulseaudio/pulseaudio_6.0.bb
index 31e9096..ec629aa 100644
--- a/meta/recipes-multimedia/pulseaudio/pulseaudio_6.0.bb
+++ b/meta/recipes-multimedia/pulseaudio/pulseaudio_6.0.bb
@@ -6,6 +6,10 @@ SRC_URI = "http://freedesktop.org/software/pulseaudio/releases/${BP}.tar.xz \
file://0001-conf-parser-add-support-for-.d-directories.patch \
file://fix-git-version-gen.patch \
file://volatiles.04_pulse \
+ file://0001-card-add-pa_card_profile.ports.patch \
+ file://0002-alsa-bluetooth-fail-if-user-requested-profile-doesn-.patch \
+ file://0003-card-move-profile-selection-after-pa_card_new.patch \
+ file://0004-alsa-set-availability-for-some-unavailable-profiles.patch \
"
SRC_URI[md5sum] = "b691e83b7434c678dffacfa3a027750e"
SRC_URI[sha256sum] = "b50640e0b80b1607600accfad2e45aabb79d379bf6354c9671efa2065477f6f6"
diff --git a/meta/recipes-qt/qt4/qt4-4.8.7.inc b/meta/recipes-qt/qt4/qt4-4.8.7.inc
index 5257e76..d165514 100644
--- a/meta/recipes-qt/qt4/qt4-4.8.7.inc
+++ b/meta/recipes-qt/qt4/qt4-4.8.7.inc
@@ -21,10 +21,10 @@ SRC_URI = "http://download.qt-project.org/official_releases/qt/4.8/${PV}/qt-ever
file://0018-configure-make-pulseaudio-a-configurable-option.patch \
file://0019-Fixes-for-gcc-4.7.0-particularly-on-qemux86.patch \
file://0027-tools.pro-disable-qmeegographicssystemhelper.patch \
- file://0028-Don-t-crash-on-broken-GIF-images.patch \
file://0030-aarch64_arm64_qatomic_support.patch \
file://0031-aarch64_arm64_mkspecs.patch \
file://0032-aarch64_add_header.patch \
+ file://0034-Fix-kmap2qmap-build-with-clang.patch \
file://Fix-QWSLock-invalid-argument-logs.patch \
file://add_check_for_aarch64_32.patch \
file://g++.conf \
diff --git a/meta/recipes-qt/qt4/qt4-4.8.7/0028-Don-t-crash-on-broken-GIF-images.patch b/meta/recipes-qt/qt4/qt4-4.8.7/0028-Don-t-crash-on-broken-GIF-images.patch
deleted file mode 100644
index 906e2fd..0000000
--- a/meta/recipes-qt/qt4/qt4-4.8.7/0028-Don-t-crash-on-broken-GIF-images.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From f1b76c126c476c155af8c404b97c42cd1a709333 Mon Sep 17 00:00:00 2001
-From: Lars Knoll <lars.knoll at digia.com>
-Date: Thu, 24 Apr 2014 15:33:27 +0200
-Subject: [PATCH] Don't crash on broken GIF images
-
-Broken GIF images could set invalid width and height
-values inside the image, leading to Qt creating a null
-QImage for it. In that case we need to abort decoding
-the image and return an error.
-
-Initial patch by Rich Moore.
-
-Backport of Id82a4036f478bd6e49c402d6598f57e7e5bb5e1e from Qt 5
-
-Task-number: QTBUG-38367
-Change-Id: I0680740018aaa8356d267b7af3f01fac3697312a
-Security-advisory: CVE-2014-0190
-Reviewed-by: Richard J. Moore <rich at kde.org>
-
-Upstream-Status: Backport
-Signed-off-by: Paul Eggleton <paul.eggleton at linux.intel.com>
-
----
- src/gui/image/qgifhandler.cpp | 7 +++++++
- 1 file changed, 7 insertions(+)
-
-diff --git a/src/gui/image/qgifhandler.cpp b/src/gui/image/qgifhandler.cpp
-index 3324f04..5199dd3 100644
---- a/src/gui/image/qgifhandler.cpp
-+++ b/src/gui/image/qgifhandler.cpp
-@@ -359,6 +359,13 @@ int QGIFFormat::decode(QImage *image, const uchar *buffer, int length,
- memset(bits, 0, image->byteCount());
- }
-
-+ // Check if the previous attempt to create the image failed. If it
-+ // did then the image is broken and we should give up.
-+ if (image->isNull()) {
-+ state = Error;
-+ return -1;
-+ }
-+
- disposePrevious(image);
- disposed = false;
-
---
-1.9.3
-
diff --git a/meta/recipes-qt/qt4/qt4-4.8.7/0034-Fix-kmap2qmap-build-with-clang.patch b/meta/recipes-qt/qt4/qt4-4.8.7/0034-Fix-kmap2qmap-build-with-clang.patch
new file mode 100644
index 0000000..f47a1d9
--- /dev/null
+++ b/meta/recipes-qt/qt4/qt4-4.8.7/0034-Fix-kmap2qmap-build-with-clang.patch
@@ -0,0 +1,34 @@
+From: Samuel Gaist <samuel.gaist at edeltech.ch>
+Date: Wed, 4 Mar 2015 20:16:50 +0000 (+0100)
+Subject: Fix kmap2qmap build on OS X
+X-Git-Tag: v5.4.2~6
+X-Git-Url: https://codereview.qt-project.org/gitweb?p=qt%2Fqttools.git;a=commitdiff_plain;h=cf196a2565235f649b88fac55b53270bea23458d;hp=3070815a24239bd0f469bfeb8d0a1f091974e28e
+
+Fix kmap2qmap build on OS X
+
+Currently kmap2qmap fails to build on OS X (clang) This patch aims to
+fix this.
+
+Change-Id: I61c985dc7ad1f2486368c39aa976599d274942ab
+Reviewed-by: Friedemann Kleint <Friedemann.Kleint at theqtcompany.com>
+---
+Upstream-Status: Backport
+Index: qt-everywhere-opensource-src-4.8.7/tools/kmap2qmap/main.cpp
+===================================================================
+--- qt-everywhere-opensource-src-4.8.7.orig/tools/kmap2qmap/main.cpp
++++ qt-everywhere-opensource-src-4.8.7/tools/kmap2qmap/main.cpp
+@@ -385,9 +385,11 @@ static const int symbol_synonyms_size =
+
+ // makes the generated array in --header mode a bit more human readable
+ QT_BEGIN_NAMESPACE
+-static bool operator<(const QWSKeyboard::Mapping &m1, const QWSKeyboard::Mapping &m2)
+-{
+- return m1.keycode != m2.keycode ? m1.keycode < m2.keycode : m1.modifiers < m2.modifiers;
++namespace QWSKeyboard {
++ static bool operator<(const Mapping &m1, const Mapping &m2)
++ {
++ return m1.keycode != m2.keycode ? m1.keycode < m2.keycode : m1.modifiers < m2.modifiers;
++ }
+ }
+ QT_END_NAMESPACE
+
diff --git a/meta/recipes-sato/gtk-engines/gtk-sato-engine.inc b/meta/recipes-sato/gtk-engines/gtk-sato-engine.inc
index 4e37ff2..fa6b2b2 100644
--- a/meta/recipes-sato/gtk-engines/gtk-sato-engine.inc
+++ b/meta/recipes-sato/gtk-engines/gtk-sato-engine.inc
@@ -8,6 +8,9 @@ SECTION = "x11/base"
DEPENDS = "gtk+"
RDEPENDS_gtk-theme-sato = "gtk-sato-engine"
+inherit distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
+
PACKAGES += "gtk-theme-sato"
FILES_${PN} = "${libdir}/gtk-2.0/*/engines/*.so "
FILES_${PN}-dev = "${libdir}/gtk-2.0/*/engines/*.la"
diff --git a/meta/recipes-sato/leafpad/leafpad_0.8.18.1.bb b/meta/recipes-sato/leafpad/leafpad_0.8.18.1.bb
index f715149..093b89f 100644
--- a/meta/recipes-sato/leafpad/leafpad_0.8.18.1.bb
+++ b/meta/recipes-sato/leafpad/leafpad_0.8.18.1.bb
@@ -6,7 +6,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=94d55d512a9ba36caa9b7df079bae19f \
file://src/leafpad.h;endline=20;md5=d3d6a89f5e61e8b13bdea537511ba1fa \
file://src/utils.c;endline=20;md5=0d2cc6584ba3202448bb274f62739571"
-DEPENDS = "gtk+ intltool-native libowl"
+DEPENDS = "gtk+ intltool-native libowl gettext-native"
# The libowl requires x11 in DISTRO_FEATURES
REQUIRED_DISTRO_FEATURES = "x11"
diff --git a/meta/recipes-sato/matchbox-terminal/matchbox-terminal_git.bb b/meta/recipes-sato/matchbox-terminal/matchbox-terminal_git.bb
index 91fd150..c8cbd57 100644
--- a/meta/recipes-sato/matchbox-terminal/matchbox-terminal_git.bb
+++ b/meta/recipes-sato/matchbox-terminal/matchbox-terminal_git.bb
@@ -15,4 +15,6 @@ SRC_URI = "git://git.yoctoproject.org/${BPN}"
S = "${WORKDIR}/git"
-inherit autotools pkgconfig
+inherit autotools pkgconfig distro_features_check
+
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
diff --git a/meta/recipes-sato/pcmanfm/pcmanfm_1.2.3.bb b/meta/recipes-sato/pcmanfm/pcmanfm_1.2.3.bb
index 4467303..b63db87 100644
--- a/meta/recipes-sato/pcmanfm/pcmanfm_1.2.3.bb
+++ b/meta/recipes-sato/pcmanfm/pcmanfm_1.2.3.bb
@@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
file://src/gseal-gtk-compat.h;endline=21;md5=46922c8691f58d124f9420fe16149ce2"
SECTION = "x11"
-DEPENDS = "gtk+ startup-notification libfm intltool-native"
+DEPENDS = "gtk+ startup-notification libfm intltool-native gettext-native"
DEPENDS_append_poky = " libowl"
diff --git a/meta/recipes-sato/puzzles/oh-puzzles_git.bb b/meta/recipes-sato/puzzles/oh-puzzles_git.bb
index 36cd2cc..9876fe0 100644
--- a/meta/recipes-sato/puzzles/oh-puzzles_git.bb
+++ b/meta/recipes-sato/puzzles/oh-puzzles_git.bb
@@ -8,7 +8,7 @@ LIC_FILES_CHKSUM = "file://LICENCE;md5=f56ec6772dd1c7c367067bbea8ea1675 \
file://src/tree234.c;endline=28;md5=b4feb1976feebf8f1379093ed52f2945"
SECTION = "x11"
-DEPENDS = "gtk+ gconf intltool-native librsvg"
+DEPENDS = "gtk+ gconf intltool-native librsvg gettext-native"
# libowl requires x11 in DISTRO_FEATURES
DEPENDS_append_poky = " ${@bb.utils.contains('DISTRO_FEATURES', 'x11', 'libowl', '', d)}"
diff --git a/meta/recipes-sato/webkit/webkitgtk_2.8.5.bb b/meta/recipes-sato/webkit/webkitgtk_2.8.5.bb
index 82d670d..e29666a 100644
--- a/meta/recipes-sato/webkit/webkitgtk_2.8.5.bb
+++ b/meta/recipes-sato/webkit/webkitgtk_2.8.5.bb
@@ -18,7 +18,10 @@ SRC_URI = "\
SRC_URI[md5sum] = "df79991848a5096d3a75289ebce547ae"
SRC_URI[sha256sum] = "3d1f0c534935f43fd74df90f2648fcee672d60f1f57a30fa557a77891ae04d20"
-inherit cmake lib_package pkgconfig perlnative pythonnative
+inherit cmake lib_package pkgconfig perlnative pythonnative distro_features_check
+
+# depends on libxt
+REQUIRED_DISTRO_FEATURES = "x11"
DEPENDS = "zlib enchant libsoup-2.4 curl libxml2 cairo libxslt libxt libidn gnutls \
gtk+ gtk+3 gstreamer1.0 gstreamer1.0-plugins-base flex-native gperf-native sqlite3 \
@@ -26,33 +29,46 @@ DEPENDS = "zlib enchant libsoup-2.4 curl libxml2 cairo libxslt libxt libidn gnut
atk udev harfbuzz jpeg libpng pulseaudio librsvg libtheora libvorbis libxcomposite libxtst \
ruby-native libsecret libnotify gstreamer1.0-plugins-bad \
"
-DEPENDS += " ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', 'virtual/libgl', '', d)}"
+
+PACKAGECONFIG ??= "${@base_contains('DISTRO_FEATURES', 'x11', 'x11', 'wayland' ,d)} \
+ ${@base_contains('DISTRO_FEATURES', 'opengl', 'webgl', '' ,d)}"
+
+PACKAGECONFIG[wayland] = "-DENABLE_WAYLAND_TARGET=ON,-DENABLE_WAYLAND_TARGET=OFF,wayland"
+PACKAGECONFIG[x11] = "-DENABLE_X11_TARGET=ON,-DENABLE_X11_TARGET=OFF,virtual/libx11"
+PACKAGECONFIG[geoclue] = "-DENABLE_GEOLOCATION=ON,-DENABLE_GEOLOCATION=OFF,geoclue"
+PACKAGECONFIG[enchant] = "-DENABLE_SPELLCHECK=ON,-DENABLE_SPELLCHECK=OFF,enchant"
+PACKAGECONFIG[gtk2] = "-DENABLE_PLUGIN_PROCESS_GTK2=ON,-DENABLE_PLUGIN_PROCESS_GTK2=OFF,gtk+"
+PACKAGECONFIG[gles2] = "-DENABLE_GLES2=ON,-DENABLE_GLES2=OFF,virtual/libgles2"
+PACKAGECONFIG[webgl] = "-DENABLE_WEBGL=ON,-DENABLE_WEBGL=OFF,virtual/libgl"
+PACKAGECONFIG[libsecret] = "-DENABLE_CREDENTIAL_STORAGE=ON,-DENABLE_CREDENTIAL_STORAGE=OFF,libsecret"
EXTRA_OECMAKE = " \
-DPORT=GTK \
-DCMAKE_BUILD_TYPE=Release \
- -DENABLE_INTROSPECTION=False \
- -DENABLE_MINIBROWSER=True \
- ${@bb.utils.contains('DISTRO_FEATURES', 'opengl', '-DENABLE_WEBGL=True', '-DENABLE_WEBGL=False', d)} \
+ -DENABLE_INTROSPECTION=OFF \
+ -DENABLE_GTKDOC=OFF \
+ -DENABLE_MINIBROWSER=ON \
"
# Javascript JIT is not supported on powerpc
-EXTRA_OECMAKE_append_powerpc = " -DENABLE_JIT=False "
-EXTRA_OECMAKE_append_powerpc64 = " -DENABLE_JIT=False "
+EXTRA_OECMAKE_append_powerpc = " -DENABLE_JIT=OFF "
+EXTRA_OECMAKE_append_powerpc64 = " -DENABLE_JIT=OFF "
# ARM JIT code does not build on ARMv5/6 anymore, apparently they test only on v7 onwards
-EXTRA_OECMAKE_append_armv5 = " -DENABLE_JIT=False "
-EXTRA_OECMAKE_append_armv6 = " -DENABLE_JIT=False "
+EXTRA_OECMAKE_append_armv5 = " -DENABLE_JIT=OFF "
+EXTRA_OECMAKE_append_armv6 = " -DENABLE_JIT=OFF "
# binutils 2.25.1 has a bug on aarch64:
# https://sourceware.org/bugzilla/show_bug.cgi?id=18430
-EXTRA_OECMAKE_append_aarch64 = " -DUSE_LD_GOLD=False "
+EXTRA_OECMAKE_append_aarch64 = " -DUSE_LD_GOLD=OFF "
# JIT not supported on MIPS either
-EXTRA_OECMAKE_append_mips = " -DENABLE_JIT=False "
-EXTRA_OECMAKE_append_mips64 = " -DENABLE_JIT=False "
+EXTRA_OECMAKE_append_mips = " -DENABLE_JIT=OFF "
+EXTRA_OECMAKE_append_mips64 = " -DENABLE_JIT=OFF "
FILES_${PN} += "${libdir}/webkit2gtk-4.0/injected-bundle/libwebkit2gtkinjectedbundle.so"
FILES_${PN}-dbg += "${libdir}/webkit2gtk-4.0/injected-bundle/.debug/libwebkit2gtkinjectedbundle.so"
FILES_${PN}-dbg += "${libdir}/webkitgtk/webkit2gtk-4.0/.debug/*"
+# http://errors.yoctoproject.org/Errors/Details/20370/
+ARM_INSTRUCTION_SET = "arm"
diff --git a/meta/recipes-support/apr/apr-util_1.5.4.bb b/meta/recipes-support/apr/apr-util_1.5.4.bb
index 6a14d14..a36f13d 100644
--- a/meta/recipes-support/apr/apr-util_1.5.4.bb
+++ b/meta/recipes-support/apr/apr-util_1.5.4.bb
@@ -60,6 +60,12 @@ do_configure_append_class-nativesdk() {
sed -i "s#\(LIBTOOL=\$(apr_builddir)\).*#\1/libtool#" ${S}/build/rules.mk
}
+do_install_append_class-target() {
+ sed -i -e 's,${STAGING_DIR_HOST},,g' \
+ -e 's,APU_SOURCE_DIR=.*,APR_SOURCE_DIR=,g' \
+ -e 's,APU_BUILD_DIR=.*,APR_BUILD_DIR=,g' ${D}${bindir}/apu-1-config
+}
+
FILES_${PN} += "${libdir}/apr-util-1/apr_dbm_gdbm-1.so"
FILES_${PN}-dev += "${libdir}/aprutil.exp ${libdir}/apr-util-1/apr_dbm_gdbm.so* ${libdir}/apr-util-1/apr_dbm_gdbm.la"
FILES_${PN}-dbg += "${libdir}/apr-util-1/.debug/*"
diff --git a/meta/recipes-support/apr/apr_1.5.2.bb b/meta/recipes-support/apr/apr_1.5.2.bb
index c1f7f38..1c61e84 100644
--- a/meta/recipes-support/apr/apr_1.5.2.bb
+++ b/meta/recipes-support/apr/apr_1.5.2.bb
@@ -32,6 +32,11 @@ CACHED_CONFIGUREVARS += "apr_cv_mutex_recursive=yes"
#
CACHED_CONFIGUREVARS += "ac_cv_header_netinet_sctp_h=no ac_cv_header_netinet_sctp_uio_h=no"
+# Otherwise libtool fails to compile apr-utils
+# x86_64-linux-libtool: compile: unable to infer tagged configuration
+# x86_64-linux-libtool: error: specify a tag with '--tag'
+CCACHE = ""
+
do_configure_prepend() {
# Avoid absolute paths for grep since it causes failures
# when using sstate between different hosts with different
@@ -55,7 +60,13 @@ do_configure_append() {
do_install_append() {
oe_multilib_header apr.h
install -d ${D}${datadir}/apr
- cp ${S}/${HOST_SYS}-libtool ${D}${datadir}/build-1/libtool
+}
+
+do_install_append_class-target() {
+ sed -i -e 's,${STAGING_DIR_HOST},,g' ${D}${datadir}/build-1/apr_rules.mk
+ sed -i -e 's,${STAGING_DIR_HOST},,g' \
+ -e 's,APR_SOURCE_DIR=.*,APR_SOURCE_DIR=,g' \
+ -e 's,APR_BUILD_DIR=.*,APR_BUILD_DIR=,g' ${D}${bindir}/apr-1-config
}
SSTATE_SCAN_FILES += "apr_rules.mk libtool"
@@ -73,6 +84,7 @@ apr_sysroot_preprocess () {
cp ${S}/build/mkdir.sh $d/
cp ${S}/build/make_exports.awk $d/
cp ${S}/build/make_var_export.awk $d/
+ cp ${S}/${HOST_SYS}-libtool ${SYSROOT_DESTDIR}${datadir}/build-1/libtool
}
do_compile_ptest() {
diff --git a/meta/recipes-support/atk/at-spi2-core_2.16.0.bb b/meta/recipes-support/atk/at-spi2-core_2.16.0.bb
index 933cbe7..7c12b54 100644
--- a/meta/recipes-support/atk/at-spi2-core_2.16.0.bb
+++ b/meta/recipes-support/atk/at-spi2-core_2.16.0.bb
@@ -11,7 +11,7 @@ SRC_URI = "${GNOME_MIRROR}/${BPN}/${MAJ_VER}/${BPN}-${PV}.tar.xz \
SRC_URI[md5sum] = "be6eeea370f913b7639b609913b2cf02"
SRC_URI[sha256sum] = "1c0b77fb8ce81abbf1d80c0afee9858b3f9229f673b7881995fe0fc16b1a74d0"
-DEPENDS = "dbus glib-2.0 virtual/libx11 libxi libxtst intltool-native"
+DEPENDS = "dbus glib-2.0 virtual/libx11 libxi libxtst intltool-native gettext-native"
inherit autotools gtk-doc pkgconfig distro_features_check
# depends on virtual/libx11
diff --git a/meta/recipes-support/curl/curl/CVE-2016-0754.patch b/meta/recipes-support/curl/curl/CVE-2016-0754.patch
new file mode 100644
index 0000000..f0402de
--- /dev/null
+++ b/meta/recipes-support/curl/curl/CVE-2016-0754.patch
@@ -0,0 +1,417 @@
+From b1bb4ca6d8777683b6a549fb61dba36759da26f4 Mon Sep 17 00:00:00 2001
+From: Ray Satiro <raysatiro at yahoo.com>
+Date: Tue, 26 Jan 2016 23:23:15 +0100
+Subject: [PATCH] curl: avoid local drive traversal when saving file (Windows)
+
+curl does not sanitize colons in a remote file name that is used as the
+local file name. This may lead to a vulnerability on systems where the
+colon is a special path character. Currently Windows/DOS is the only OS
+where this vulnerability applies.
+
+CVE-2016-0754
+
+Bug: http://curl.haxx.se/docs/adv_20160127B.html
+
+Upstream-Status: Backport
+http://curl.haxx.se/CVE-2016-0754.patch
+
+CVE: CVE-2016-0754
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ src/tool_cb_hdr.c | 40 ++++++------
+ src/tool_doswin.c | 174 ++++++++++++++++++++++++++++++++++++++++++++---------
+ src/tool_doswin.h | 2 +-
+ src/tool_operate.c | 29 ++++++---
+ 4 files changed, 187 insertions(+), 58 deletions(-)
+
+diff --git a/src/tool_cb_hdr.c b/src/tool_cb_hdr.c
+index fd208e8..0fca39f 100644
+--- a/src/tool_cb_hdr.c
++++ b/src/tool_cb_hdr.c
+@@ -26,10 +26,11 @@
+ #define ENABLE_CURLX_PRINTF
+ /* use our own printf() functions */
+ #include "curlx.h"
+
+ #include "tool_cfgable.h"
++#include "tool_doswin.h"
+ #include "tool_msgs.h"
+ #include "tool_cb_hdr.h"
+
+ #include "memdebug.h" /* keep this as LAST include */
+
+@@ -112,22 +113,28 @@ size_t tool_header_cb(void *ptr, size_t size, size_t nmemb, void *userdata)
+ /* this expression below typecasts 'cb' only to avoid
+ warning: signed and unsigned type in conditional expression
+ */
+ len = (ssize_t)cb - (p - str);
+ filename = parse_filename(p, len);
+- if(filename) {
+- outs->filename = filename;
+- outs->alloc_filename = TRUE;
+- outs->is_cd_filename = TRUE;
+- outs->s_isreg = TRUE;
+- outs->fopened = FALSE;
+- outs->stream = NULL;
+- hdrcbdata->honor_cd_filename = FALSE;
+- break;
+- }
+- else
++ if(!filename)
++ return failure;
++
++#if defined(MSDOS) || defined(WIN32)
++ if(sanitize_file_name(&filename)) {
++ free(filename);
+ return failure;
++ }
++#endif /* MSDOS || WIN32 */
++
++ outs->filename = filename;
++ outs->alloc_filename = TRUE;
++ outs->is_cd_filename = TRUE;
++ outs->s_isreg = TRUE;
++ outs->fopened = FALSE;
++ outs->stream = NULL;
++ hdrcbdata->honor_cd_filename = FALSE;
++ break;
+ }
+ }
+
+ return cb;
+ }
+@@ -179,19 +186,16 @@ static char *parse_filename(const char *ptr, size_t len)
+ return NULL;
+ }
+ }
+
+ /* scan for the end letter and stop there */
+- q = p;
+- while(*q) {
+- if(q[1] && (q[0] == '\\'))
+- q++;
+- else if(q[0] == stop)
++ for(q = p; *q; ++q) {
++ if(*q == stop) {
++ *q = '\0';
+ break;
+- q++;
++ }
+ }
+- *q = '\0';
+
+ /* make sure the file name doesn't end in \r or \n */
+ q = strchr(p, '\r');
+ if(q)
+ *q = '\0';
+diff --git a/src/tool_doswin.c b/src/tool_doswin.c
+index dd6e8bb..9c6a7a3 100644
+--- a/src/tool_doswin.c
++++ b/src/tool_doswin.c
+@@ -83,46 +83,110 @@ __pragma(warning(pop))
+ # define _use_lfn(f) ALWAYS_FALSE /* long file names never available */
+ #elif defined(__DJGPP__)
+ # include <fcntl.h> /* _use_lfn(f) prototype */
+ #endif
+
+-static const char *msdosify (const char *file_name);
+-static char *rename_if_dos_device_name (char *file_name);
++static char *msdosify(const char *file_name);
++static char *rename_if_dos_device_name(const char *file_name);
+
+-/*
+- * sanitize_dos_name: returns a newly allocated string holding a
+- * valid file name which will be a transformation of given argument
+- * in case this wasn't already a valid file name.
+- *
+- * This function takes ownership of given argument, free'ing it before
+- * returning. Caller is responsible of free'ing returned string. Upon
+- * out of memory condition function returns NULL.
+- */
+
+-char *sanitize_dos_name(char *file_name)
++/*
++Sanitize *file_name.
++Success: (CURLE_OK) *file_name points to a sanitized version of the original.
++ This function takes ownership of the original *file_name and frees it.
++Failure: (!= CURLE_OK) *file_name is unchanged.
++*/
++CURLcode sanitize_file_name(char **file_name)
+ {
+- char new_name[PATH_MAX];
++ size_t len;
++ char *p, *sanitized;
++
++ /* Calculate the maximum length of a filename.
++ FILENAME_MAX is often the same as PATH_MAX, in other words it does not
++ discount the path information. PATH_MAX size is calculated based on:
++ <drive-letter><colon><path-sep><max-filename-len><NULL> */
++ const size_t max_filename_len = PATH_MAX - 3 - 1;
++
++ if(!file_name || !*file_name)
++ return CURLE_BAD_FUNCTION_ARGUMENT;
++
++ len = strlen(*file_name);
++
++ if(len >= max_filename_len)
++ len = max_filename_len - 1;
+
+- if(!file_name)
+- return NULL;
++ sanitized = malloc(len + 1);
+
+- if(strlen(file_name) >= PATH_MAX)
+- file_name[PATH_MAX-1] = '\0'; /* truncate it */
++ if(!sanitized)
++ return CURLE_OUT_OF_MEMORY;
+
+- strcpy(new_name, msdosify(file_name));
++ strncpy(sanitized, *file_name, len);
++ sanitized[len] = '\0';
+
+- Curl_safefree(file_name);
++ for(p = sanitized; *p; ++p ) {
++ const char *banned;
++ if(1 <= *p && *p <= 31) {
++ *p = '_';
++ continue;
++ }
++ for(banned = "|<>/\\\":?*"; *banned; ++banned) {
++ if(*p == *banned) {
++ *p = '_';
++ break;
++ }
++ }
++ }
+
+- return strdup(rename_if_dos_device_name(new_name));
++#ifdef MSDOS
++ /* msdosify checks for more banned characters for MSDOS, however it allows
++ for some path information to pass through. since we are sanitizing only a
++ filename and cannot allow a path it's important this call be done in
++ addition to and not instead of the banned character check above. */
++ p = msdosify(sanitized);
++ if(!p) {
++ free(sanitized);
++ return CURLE_BAD_FUNCTION_ARGUMENT;
++ }
++ sanitized = p;
++ len = strlen(sanitized);
++#endif
++
++ p = rename_if_dos_device_name(sanitized);
++ if(!p) {
++ free(sanitized);
++ return CURLE_BAD_FUNCTION_ARGUMENT;
++ }
++ sanitized = p;
++ len = strlen(sanitized);
++
++ /* dos_device_name rename will rename a device name, possibly changing the
++ length. If the length is too long now we can't truncate it because we
++ could end up with a device name. In practice this shouldn't be a problem
++ because device names are short, but you never know. */
++ if(len >= max_filename_len) {
++ free(sanitized);
++ return CURLE_BAD_FUNCTION_ARGUMENT;
++ }
++
++ *file_name = sanitized;
++ return CURLE_OK;
+ }
+
+-/* The following functions are taken with modification from the DJGPP
+- * port of tar 1.12. They use algorithms originally from DJTAR. */
++/* The functions msdosify, rename_if_dos_device_name and __crt0_glob_function
++ * were taken with modification from the DJGPP port of tar 1.12. They use
++ * algorithms originally from DJTAR.
++ */
+
+-static const char *msdosify (const char *file_name)
++/*
++Extra sanitization MSDOS for file_name.
++Returns a copy of file_name that is sanitized by MSDOS standards.
++Warning: path information may pass through. For sanitizing a filename use
++sanitize_file_name which calls this function after sanitizing path info.
++*/
++static char *msdosify(const char *file_name)
+ {
+- static char dos_name[PATH_MAX];
++ char dos_name[PATH_MAX];
+ static const char illegal_chars_dos[] = ".+, ;=[]" /* illegal in DOS */
+ "|<>\\\":?*"; /* illegal in DOS & W95 */
+ static const char *illegal_chars_w95 = &illegal_chars_dos[8];
+ int idx, dot_idx;
+ const char *s = file_name;
+@@ -199,39 +263,89 @@ static const char *msdosify (const char *file_name)
+ else
+ idx++;
+ }
+
+ *d = '\0';
+- return dos_name;
++ return strdup(dos_name);
+ }
+
+-static char *rename_if_dos_device_name (char *file_name)
++/*
++Rename file_name if it's a representation of a device name.
++Returns a copy of file_name, and the copy will have contents different from the
++original if a device name was found.
++*/
++static char *rename_if_dos_device_name(const char *file_name)
+ {
+ /* We could have a file whose name is a device on MS-DOS. Trying to
+ * retrieve such a file would fail at best and wedge us at worst. We need
+ * to rename such files. */
+- char *base;
++ char *p, *base;
+ struct_stat st_buf;
+ char fname[PATH_MAX];
+
+ strncpy(fname, file_name, PATH_MAX-1);
+ fname[PATH_MAX-1] = '\0';
+ base = basename(fname);
+ if(((stat(base, &st_buf)) == 0) && (S_ISCHR(st_buf.st_mode))) {
+ size_t blen = strlen(base);
+
+- if(strlen(fname) >= PATH_MAX-1) {
++ if(strlen(fname) == PATH_MAX-1) {
+ /* Make room for the '_' */
+ blen--;
+ base[blen] = '\0';
+ }
+ /* Prepend a '_'. */
+ memmove(base + 1, base, blen + 1);
+ base[0] = '_';
+- strcpy(file_name, fname);
+ }
+- return file_name;
++
++ /* The above stat check does not identify devices for me in Windows 7. For
++ example a stat on COM1 returns a regular file S_IFREG. According to MSDN
++ stat doc that is the correct behavior, so I assume the above code is
++ legacy, maybe MSDOS or DJGPP specific? */
++
++ /* Rename devices.
++ Examples: CON => _CON, CON.EXT => CON_EXT, CON:ADS => CON_ADS */
++ for(p = fname; p; p = (p == fname && fname != base ? base : NULL)) {
++ size_t p_len;
++ int x = (curl_strnequal(p, "CON", 3) ||
++ curl_strnequal(p, "PRN", 3) ||
++ curl_strnequal(p, "AUX", 3) ||
++ curl_strnequal(p, "NUL", 3)) ? 3 :
++ (curl_strnequal(p, "CLOCK$", 6)) ? 6 :
++ (curl_strnequal(p, "COM", 3) || curl_strnequal(p, "LPT", 3)) ?
++ (('1' <= p[3] && p[3] <= '9') ? 4 : 3) : 0;
++
++ if(!x)
++ continue;
++
++ /* the devices may be accessible with an extension or ADS, for
++ example CON.AIR and CON:AIR both access console */
++ if(p[x] == '.' || p[x] == ':') {
++ p[x] = '_';
++ continue;
++ }
++ else if(p[x]) /* no match */
++ continue;
++
++ p_len = strlen(p);
++
++ if(strlen(fname) == PATH_MAX-1) {
++ /* Make room for the '_' */
++ p_len--;
++ p[p_len] = '\0';
++ }
++ /* Prepend a '_'. */
++ memmove(p + 1, p, p_len + 1);
++ p[0] = '_';
++
++ /* if fname was just modified then the basename pointer must be updated */
++ if(p == fname)
++ base = basename(fname);
++ }
++
++ return strdup(fname);
+ }
+
+ #if defined(MSDOS) && (defined(__DJGPP__) || defined(__GO32__))
+
+ /*
+diff --git a/src/tool_doswin.h b/src/tool_doswin.h
+index cd216db..fc83f16 100644
+--- a/src/tool_doswin.h
++++ b/src/tool_doswin.h
+@@ -23,11 +23,11 @@
+ ***************************************************************************/
+ #include "tool_setup.h"
+
+ #if defined(MSDOS) || defined(WIN32)
+
+-char *sanitize_dos_name(char *file_name);
++CURLcode sanitize_file_name(char **filename);
+
+ #if defined(MSDOS) && (defined(__DJGPP__) || defined(__GO32__))
+
+ char **__crt0_glob_function(char *arg);
+
+diff --git a/src/tool_operate.c b/src/tool_operate.c
+index 30d60cb..272ebd4 100644
+--- a/src/tool_operate.c
++++ b/src/tool_operate.c
+@@ -541,30 +541,41 @@ static CURLcode operate_do(struct GlobalConfig *global,
+ if(!outfile) {
+ /* extract the file name from the URL */
+ result = get_url_file_name(&outfile, this_url);
+ if(result)
+ goto show_error;
++
++#if defined(MSDOS) || defined(WIN32)
++ result = sanitize_file_name(&outfile);
++ if(result) {
++ Curl_safefree(outfile);
++ goto show_error;
++ }
++#endif /* MSDOS || WIN32 */
++
+ if(!*outfile && !config->content_disposition) {
+ helpf(global->errors, "Remote file name has no length!\n");
+ result = CURLE_WRITE_ERROR;
+ goto quit_urls;
+ }
+-#if defined(MSDOS) || defined(WIN32)
+- /* For DOS and WIN32, we do some major replacing of
+- bad characters in the file name before using it */
+- outfile = sanitize_dos_name(outfile);
+- if(!outfile) {
+- result = CURLE_OUT_OF_MEMORY;
+- goto show_error;
+- }
+-#endif /* MSDOS || WIN32 */
+ }
+ else if(urls) {
+ /* fill '#1' ... '#9' terms from URL pattern */
+ char *storefile = outfile;
+ result = glob_match_url(&outfile, storefile, urls);
+ Curl_safefree(storefile);
++
++#if defined(MSDOS) || defined(WIN32)
++ if(!result) {
++ result = sanitize_file_name(&outfile);
++ if(result) {
++ Curl_safefree(outfile);
++ goto show_error;
++ }
++ }
++#endif /* MSDOS || WIN32 */
++
+ if(result) {
+ /* bad globbing */
+ warnf(config->global, "bad output glob!\n");
+ goto quit_urls;
+ }
+--
+2.7.0
+
diff --git a/meta/recipes-support/curl/curl/CVE-2016-0755.patch b/meta/recipes-support/curl/curl/CVE-2016-0755.patch
new file mode 100644
index 0000000..44b9d9a
--- /dev/null
+++ b/meta/recipes-support/curl/curl/CVE-2016-0755.patch
@@ -0,0 +1,138 @@
+From d41dcba4e9b69d6b761e3460cc6ae7e8fd8f621f Mon Sep 17 00:00:00 2001
+From: Isaac Boukris <iboukris at gmail.com>
+Date: Wed, 13 Jan 2016 11:05:51 +0200
+Subject: [PATCH] NTLM: Fix ConnectionExists to compare Proxy credentials
+
+Proxy NTLM authentication should compare credentials when
+re-using a connection similar to host authentication, as it
+authenticate the connection.
+
+Example:
+curl -v -x http://proxy:port http://host/ -U good_user:good_pwd
+ --proxy-ntlm --next -x http://proxy:port http://host/
+ [-U fake_user:fake_pwd --proxy-ntlm]
+
+CVE-2016-0755
+
+Bug: http://curl.haxx.se/docs/adv_20160127A.html
+
+Upstream-Status: Backport
+http://curl.haxx.se/CVE-2016-0755.patch
+
+CVE: CVE-2016-0755
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ lib/url.c | 62 ++++++++++++++++++++++++++++++++++++++++----------------------
+ 1 file changed, 40 insertions(+), 22 deletions(-)
+
+Index: curl-7.44.0/lib/url.c
+===================================================================
+--- curl-7.44.0.orig/lib/url.c
++++ curl-7.44.0/lib/url.c
+@@ -3107,12 +3107,17 @@ ConnectionExists(struct SessionHandle *d
+ struct connectdata *check;
+ struct connectdata *chosen = 0;
+ bool canPipeline = IsPipeliningPossible(data, needle);
++ struct connectbundle *bundle;
++
+ #ifdef USE_NTLM
+- bool wantNTLMhttp = ((data->state.authhost.want & CURLAUTH_NTLM) ||
+- (data->state.authhost.want & CURLAUTH_NTLM_WB)) &&
+- (needle->handler->protocol & PROTO_FAMILY_HTTP) ? TRUE : FALSE;
++ bool wantNTLMhttp = ((data->state.authhost.want &
++ (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) &&
++ (needle->handler->protocol & PROTO_FAMILY_HTTP));
++ bool wantProxyNTLMhttp = (needle->bits.proxy_user_passwd &&
++ ((data->state.authproxy.want &
++ (CURLAUTH_NTLM | CURLAUTH_NTLM_WB)) &&
++ (needle->handler->protocol & PROTO_FAMILY_HTTP)));
+ #endif
+- struct connectbundle *bundle;
+
+ *force_reuse = FALSE;
+ *waitpipe = FALSE;
+@@ -3152,9 +3157,6 @@ ConnectionExists(struct SessionHandle *d
+ curr = bundle->conn_list->head;
+ while(curr) {
+ bool match = FALSE;
+-#if defined(USE_NTLM)
+- bool credentialsMatch = FALSE;
+-#endif
+ size_t pipeLen;
+
+ /*
+@@ -3262,21 +3264,14 @@ ConnectionExists(struct SessionHandle *d
+ continue;
+ }
+
+- if((!(needle->handler->flags & PROTOPT_CREDSPERREQUEST))
+-#ifdef USE_NTLM
+- || (wantNTLMhttp || check->ntlm.state != NTLMSTATE_NONE)
+-#endif
+- ) {
+- /* This protocol requires credentials per connection or is HTTP+NTLM,
++ if(!(needle->handler->flags & PROTOPT_CREDSPERREQUEST)) {
++ /* This protocol requires credentials per connection,
+ so verify that we're using the same name and password as well */
+ if(!strequal(needle->user, check->user) ||
+ !strequal(needle->passwd, check->passwd)) {
+ /* one of them was different */
+ continue;
+ }
+-#if defined(USE_NTLM)
+- credentialsMatch = TRUE;
+-#endif
+ }
+
+ if(!needle->bits.httpproxy || needle->handler->flags&PROTOPT_SSL ||
+@@ -3335,20 +3330,43 @@ ConnectionExists(struct SessionHandle *d
+ possible. (Especially we must not reuse the same connection if
+ partway through a handshake!) */
+ if(wantNTLMhttp) {
+- if(credentialsMatch && check->ntlm.state != NTLMSTATE_NONE) {
+- chosen = check;
++ if(!strequal(needle->user, check->user) ||
++ !strequal(needle->passwd, check->passwd))
++ continue;
++ }
++ else if(check->ntlm.state != NTLMSTATE_NONE) {
++ /* Connection is using NTLM auth but we don't want NTLM */
++ continue;
++ }
++
++ /* Same for Proxy NTLM authentication */
++ if(wantProxyNTLMhttp) {
++ if(!strequal(needle->proxyuser, check->proxyuser) ||
++ !strequal(needle->proxypasswd, check->proxypasswd))
++ continue;
++ }
++ else if(check->proxyntlm.state != NTLMSTATE_NONE) {
++ /* Proxy connection is using NTLM auth but we don't want NTLM */
++ continue;
++ }
+
++ if(wantNTLMhttp || wantProxyNTLMhttp) {
++ /* Credentials are already checked, we can use this connection */
++ chosen = check;
++
++ if((wantNTLMhttp &&
++ (check->ntlm.state != NTLMSTATE_NONE)) ||
++ (wantProxyNTLMhttp &&
++ (check->proxyntlm.state != NTLMSTATE_NONE))) {
+ /* We must use this connection, no other */
+ *force_reuse = TRUE;
+ break;
+ }
+- else if(credentialsMatch)
+- /* this is a backup choice */
+- chosen = check;
++
++ /* Continue look up for a better connection */
+ continue;
+ }
+ #endif
+-
+ if(canPipeline) {
+ /* We can pipeline if we want to. Let's continue looking for
+ the optimal connection to use, i.e the shortest pipe that is not
diff --git a/meta/recipes-support/curl/curl_7.44.0.bb b/meta/recipes-support/curl/curl_7.44.0.bb
index b293303..419ed83 100644
--- a/meta/recipes-support/curl/curl_7.44.0.bb
+++ b/meta/recipes-support/curl/curl_7.44.0.bb
@@ -12,7 +12,9 @@ SRC_URI = "http://curl.haxx.se/download/curl-${PV}.tar.bz2 \
# curl likes to set -g0 in CFLAGS, so we stop it
# from mucking around with debug options
#
-SRC_URI += " file://configure_ac.patch"
+SRC_URI += " file://configure_ac.patch \
+ file://CVE-2016-0754.patch \
+ file://CVE-2016-0755.patch"
SRC_URI[md5sum] = "6b952ca00e5473b16a11f05f06aa8dae"
SRC_URI[sha256sum] = "1e2541bae6582bb697c0fbae49e1d3e6fad5d05d5aa80dbd6f072e0a44341814"
@@ -45,6 +47,11 @@ do_install_append() {
oe_multilib_header curl/curlbuild.h
}
+do_install_append_class-target() {
+ # cleanup buildpaths from curl-config
+ sed -i -e 's,${STAGING_DIR_HOST},,g' ${D}${bindir}/curl-config
+}
+
PACKAGES =+ "lib${BPN}"
FILES_lib${BPN} = "${libdir}/lib*.so.*"
diff --git a/meta/recipes-support/gmp/gmp-4.2.1/Use-__gnu_inline__-attribute.patch b/meta/recipes-support/gmp/gmp-4.2.1/Use-__gnu_inline__-attribute.patch
new file mode 100644
index 0000000..627d71a
--- /dev/null
+++ b/meta/recipes-support/gmp/gmp-4.2.1/Use-__gnu_inline__-attribute.patch
@@ -0,0 +1,36 @@
+From 3cb33502bafd04b8ad4ca3454fab16d5ff313297 Mon Sep 17 00:00:00 2001
+From: Jussi Kukkonen <jussi.kukkonen at intel.com>
+Date: Tue, 22 Sep 2015 13:16:23 +0300
+Subject: [PATCH] Use __gnu_inline__ attribute
+
+gcc5 uses C11 inline rules. This means the old "extern inline"
+semantics are not available without a special attribute.
+
+See: https://gcc.gnu.org/gcc-5/porting_to.html
+
+Upstream-Status: Inappropriate [Fixed in current versions]
+Signed-off-by: Jussi Kukkonen <jussi.kukkonen at intel.com>
+---
+ gmp-h.in | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/gmp-h.in b/gmp-h.in
+index eed6fe4..361dd1d 100644
+--- a/gmp-h.in
++++ b/gmp-h.in
+@@ -419,8 +419,11 @@ typedef __mpq_struct *mpq_ptr;
+ /* gcc has __inline__ in all modes, including strict ansi. Give a prototype
+ for an inline too, so as to correctly specify "dllimport" on windows, in
+ case the function is called rather than inlined. */
++
++/* Use __gnu_inline__ attribute: later gcc uses different "extern inline"
++ behaviour */
+ #ifdef __GNUC__
+-#define __GMP_EXTERN_INLINE extern __inline__
++#define __GMP_EXTERN_INLINE extern __inline__ __attribute__ ((__gnu_inline__))
+ #define __GMP_INLINE_PROTOTYPES 1
+ #endif
+
+--
+2.1.4
+
diff --git a/meta/recipes-support/gmp/gmp-4.2.1/disable-stdc.patch b/meta/recipes-support/gmp/gmp-4.2.1/disable-stdc.patch
deleted file mode 100644
index 5decb1c..0000000
--- a/meta/recipes-support/gmp/gmp-4.2.1/disable-stdc.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-This patch was removed in f181c6ce8b3 when gmp 4.2.1 was mistakenly
-dropped.
-
-Upstream is not interested in patches for ancient versions.
-
-Upstream-Status: Inappropriate
-Signed-off-by: Jussi Kukkonen <jussi.kukkonen at intel.com>
-
-# "extern inline" in traditional gcc means that the function should be
-# inlined wherever it's seen, while in C99, "extern inline" means that i
-# the function should only be inlined where the inline definition is
-# seen while in other places it's not inlined:
-# http://gcc.gnu.org/ml/gcc/2006-11/msg00006.html
-#
-# gmp checks "--std=gnu99" to use C99 convention however it internally
-# defines some "extern inline" functions in gmp.h, which is included
-# by mainly .c files and finally lead a flood of redefinition function
-# errors when linking objects together.
-#
-# So disable C99/ANSI detection to stick to tranditional gcc behavior
-#
-# by Kevin Tian <kevin.tian at intel.com>, 2010-08-13
-#
-# (this patch is licensed under GPLv2+)
-
-diff --git a/configure.in b/configure.in
-index 450cc92..aab0b59 100644
---- a/configure.in
-+++ b/configure.in
-@@ -1869,9 +1869,7 @@ AC_SUBST(DEFN_LONG_LONG_LIMB)
-
- # The C compiler and preprocessor, put into ANSI mode if possible.
- AC_PROG_CC
--AC_PROG_CC_STDC
- AC_PROG_CPP
--GMP_H_ANSI
-
-
- # The C compiler on the build system, and associated tests.
diff --git a/meta/recipes-support/gmp/gmp_4.2.1.bb b/meta/recipes-support/gmp/gmp_4.2.1.bb
index 928c01a..bfc6a38 100644
--- a/meta/recipes-support/gmp/gmp_4.2.1.bb
+++ b/meta/recipes-support/gmp/gmp_4.2.1.bb
@@ -7,7 +7,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=892f569a555ba9c07a568a7c0c4fa63a \
file://COPYING.LIB;md5=fbc093901857fcd118f065f900982c24 \
file://gmp-h.in;beginline=6;endline=21;md5=e056f74a12c3277d730dbcfb85d2ca34"
-SRC_URI += "file://disable-stdc.patch \
+SRC_URI += "file://Use-__gnu_inline__-attribute.patch \
file://gmp_fix_for_automake-1.12.patch \
"
diff --git a/meta/recipes-support/icu/icu/fix-install-manx.patch b/meta/recipes-support/icu/icu/fix-install-manx.patch
new file mode 100644
index 0000000..ec63f50
--- /dev/null
+++ b/meta/recipes-support/icu/icu/fix-install-manx.patch
@@ -0,0 +1,48 @@
+The generic recursive target calls target-local so also adding it to the
+dependency list results in races due to install-local being executed twice in
+parallel. For example, install-manx can fail if the two install processes race
+and one process tries to chown a file that the other process has just deleted.
+
+Also install-manx should be a phony target, and for clarity use $^ instead of $?
+in the install command.
+
+Upstream-Status: Pending
+Signed-off-by: Ross Burton <ross.burton at intel.com>
+
+
+diff --git a/Makefile.in b/Makefile.in
+index 9db6c52..3441afa 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -71,7 +71,7 @@ EXTRA_DATA =
+
+ ## List of phony targets
+ .PHONY : all all-local all-recursive install install-local install-udata install-udata-files install-udata-dlls \
+-install-recursive clean clean-local clean-recursive distclean \
++install-recursive install-manx clean clean-local clean-recursive distclean \
+ distclean-local distclean-recursive doc dist dist-local dist-recursive \
+ check check-local check-recursive clean-recursive-with-twist install-icu \
+ doc install-doc tests icu4j-data icu4j-data-install update-windows-makefiles xcheck-local xcheck-recursive xperf xcheck xperf-recursive \
+@@ -82,10 +82,10 @@ check-exhaustive check-exhaustive-local check-exhaustive-recursive releaseDist
+
+ ## List of standard targets
+ all: all-local all-recursive
+-install: install-recursive install-local
++install: install-recursive
+ clean: clean-recursive-with-twist clean-local
+-distclean : distclean-recursive distclean-local
+-dist: dist-recursive dist-local
++distclean : distclean-recursive
++dist: dist-recursive
+ check: all check-recursive
+ check-recursive: all
+ xcheck: all xcheck-recursive
+@@ -352,7 +352,7 @@ config.status: $(srcdir)/configure $(srcdir)/common/unicode/uvernum.h
+
+ install-manx: $(MANX_FILES)
+ $(MKINSTALLDIRS) $(DESTDIR)$(mandir)/man$(SECTION)
+- $(INSTALL_DATA) $? $(DESTDIR)$(mandir)/man$(SECTION)
++ $(INSTALL_DATA) $^ $(DESTDIR)$(mandir)/man$(SECTION)
+
+ config/%.$(SECTION): $(srcdir)/config/%.$(SECTION).in
+ cd $(top_builddir) \
diff --git a/meta/recipes-support/icu/icu_55.1.bb b/meta/recipes-support/icu/icu_55.1.bb
index f63a9bd..e91b6f3 100644
--- a/meta/recipes-support/icu/icu_55.1.bb
+++ b/meta/recipes-support/icu/icu_55.1.bb
@@ -8,9 +8,14 @@ def icu_download_version(d):
ICU_PV = "${@icu_download_version(d)}"
+# http://errors.yoctoproject.org/Errors/Details/20486/
+ARM_INSTRUCTION_SET_armv4 = "arm"
+ARM_INSTRUCTION_SET_armv5 = "arm"
+
BASE_SRC_URI = "http://download.icu-project.org/files/icu4c/${PV}/icu4c-${ICU_PV}-src.tgz"
SRC_URI = "${BASE_SRC_URI} \
file://icu-pkgdata-large-cmd.patch \
+ file://fix-install-manx.patch \
"
SRC_URI_append_class-target = "\
diff --git a/meta/recipes-support/libbsd/files/CVE-2016-2090.patch b/meta/recipes-support/libbsd/files/CVE-2016-2090.patch
new file mode 100644
index 0000000..2eaae13
--- /dev/null
+++ b/meta/recipes-support/libbsd/files/CVE-2016-2090.patch
@@ -0,0 +1,50 @@
+From c8f0723d2b4520bdd6b9eb7c3e7976de726d7ff7 Mon Sep 17 00:00:00 2001
+From: Hanno Boeck <hanno at hboeck.de>
+Date: Wed, 27 Jan 2016 15:10:11 +0100
+Subject: [PATCH] Fix heap buffer overflow in fgetwln()
+
+In the function fgetwln() there's a 4 byte heap overflow.
+
+There is a while loop that has this check to see whether there's still
+enough space in the buffer:
+
+ if (!fb->len || wused > fb->len) {
+
+If this is true more memory gets allocated. However this test won't be
+true if wused == fb->len, but at that point wused already points out
+of the buffer. Some lines later there's a write to the buffer:
+
+ fb->wbuf[wused++] = wc;
+
+This bug was found with the help of address sanitizer.
+
+Warned-by: ASAN
+Fixes: https://bugs.freedesktop.org/show_bug.cgi?id=93881
+Signed-off-by: Guillem Jover <guillem at hadrons.org>
+
+Upstream-Status: Backport
+http://cgit.freedesktop.org/libbsd/commit/?id=c8f0723d2b4520bdd6b9eb7c3e7976de726d7ff7
+
+CVE: CVE-2016-2090
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ src/fgetwln.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/src/fgetwln.c b/src/fgetwln.c
+index 9ee0776..aa3f927 100644
+--- a/src/fgetwln.c
++++ b/src/fgetwln.c
+@@ -60,7 +60,7 @@ fgetwln(FILE *stream, size_t *lenp)
+ fb->fp = stream;
+
+ while ((wc = fgetwc(stream)) != WEOF) {
+- if (!fb->len || wused > fb->len) {
++ if (!fb->len || wused >= fb->len) {
+ wchar_t *wp;
+
+ if (fb->len)
+--
+2.3.5
+
diff --git a/meta/recipes-support/libbsd/libbsd_0.7.0.bb b/meta/recipes-support/libbsd/libbsd_0.7.0.bb
index 902666d..8d9a708 100644
--- a/meta/recipes-support/libbsd/libbsd_0.7.0.bb
+++ b/meta/recipes-support/libbsd/libbsd_0.7.0.bb
@@ -13,7 +13,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=f1530ea92aeaa1c5e2547cfd43905d8c"
SECTION = "libs"
DEPENDS = ""
-SRC_URI = "http://libbsd.freedesktop.org/releases/${BPN}-${PV}.tar.xz"
+SRC_URI = "http://libbsd.freedesktop.org/releases/${BPN}-${PV}.tar.xz \
+ file://CVE-2016-2090.patch \
+ "
SRC_URI[md5sum] = "fcceb4e66fd448ca4ed42ba22a8babb0"
SRC_URI[sha256sum] = "0f3b0e17e5c34c038126e0a04351b11e23c6101a7d0ce3beeab29bb6415c10bb"
diff --git a/meta/recipes-support/libfm/libfm-extra_1.2.3.bb b/meta/recipes-support/libfm/libfm-extra_1.2.3.bb
index 46d2d62..3675269 100644
--- a/meta/recipes-support/libfm/libfm-extra_1.2.3.bb
+++ b/meta/recipes-support/libfm/libfm-extra_1.2.3.bb
@@ -5,7 +5,7 @@ LICENSE = "LGPLv2+"
LIC_FILES_CHKSUM = "file://src/fm-extra.h;beginline=8;endline=21;md5=ef1f84da64b3c01cca447212f7ef6007"
SECTION = "x11/libs"
-DEPENDS = "glib-2.0 intltool-native"
+DEPENDS = "glib-2.0 intltool-native gettext-native"
SRC_URI = "${SOURCEFORGE_MIRROR}/pcmanfm/libfm-${PV}.tar.xz \
file://0001-nls.m4-Take-it-from-gettext-0.15.patch \
diff --git a/meta/recipes-support/libfm/libfm_1.2.3.bb b/meta/recipes-support/libfm/libfm_1.2.3.bb
index 629502f..e9ff656 100644
--- a/meta/recipes-support/libfm/libfm_1.2.3.bb
+++ b/meta/recipes-support/libfm/libfm_1.2.3.bb
@@ -9,7 +9,7 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
SECTION = "x11/libs"
-DEPENDS = "glib-2.0 pango gtk+ menu-cache intltool-native libexif libfm-extra"
+DEPENDS = "glib-2.0 pango gtk+ menu-cache intltool-native libexif libfm-extra gettext-native"
SRC_URI = "${SOURCEFORGE_MIRROR}/pcmanfm/libfm-${PV}.tar.xz"
@@ -18,7 +18,8 @@ SRC_URI[sha256sum] = "c692f1624a4cbc8d1dd55f3b3f3369fbf5d26f63a916e2c295230b2344
PR = "r1"
-inherit autotools pkgconfig gtk-doc
+inherit autotools pkgconfig gtk-doc distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
do_configure[dirs] =+ "${S}/m4"
diff --git a/meta/recipes-support/libgcrypt/files/CVE-2015-7511_1.patch b/meta/recipes-support/libgcrypt/files/CVE-2015-7511_1.patch
new file mode 100644
index 0000000..14c25b9
--- /dev/null
+++ b/meta/recipes-support/libgcrypt/files/CVE-2015-7511_1.patch
@@ -0,0 +1,245 @@
+From 2ef48ba59c32bfa1a9265d5eea8ab225a658903a Mon Sep 17 00:00:00 2001
+From: Werner Koch <wk at gnupg.org>
+Date: Thu, 9 Jan 2014 19:14:09 +0100
+Subject: [PATCH] ecc: Make a macro shorter.
+
+* src/mpi.h (MPI_EC_TWISTEDEDWARDS): Rename to MPI_EC_EDWARDS. CHnage
+all users.
+* cipher/ecc-curves.c (domain_parms): Add parameters for Curve3617 as
+comment.
+* mpi/ec.c (dup_point_twistededwards): Rename to dup_point_edwards.
+(add_points_twistededwards): Rename to add_points_edwards.
+
+Signed-off-by: Werner Koch <wk at gnupg.org>
+
+Upstream-Status: Backport
+2ef48ba59c32bfa1a9265d5eea8ab225a658903a
+
+CVE: CVE-2015-7511 depend patch
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ cipher/ecc-curves.c | 22 +++++++++++++++++++---
+ cipher/ecc-misc.c | 4 ++--
+ cipher/ecc.c | 8 ++++----
+ mpi/ec.c | 22 +++++++++++-----------
+ src/mpi.h | 11 ++++++++---
+ 5 files changed, 44 insertions(+), 23 deletions(-)
+
+Index: libgcrypt-1.6.3/cipher/ecc-curves.c
+===================================================================
+--- libgcrypt-1.6.3.orig/cipher/ecc-curves.c
++++ libgcrypt-1.6.3/cipher/ecc-curves.c
+@@ -105,7 +105,7 @@ static const ecc_domain_parms_t domain_p
+ {
+ /* (-x^2 + y^2 = 1 + dx^2y^2) */
+ "Ed25519", 256, 0,
+- MPI_EC_TWISTEDEDWARDS, ECC_DIALECT_ED25519,
++ MPI_EC_EDWARDS, ECC_DIALECT_ED25519,
+ "0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFED",
+ "-0x01",
+ "-0x2DFC9311D490018C7338BF8688861767FF8FF5B2BEBE27548A14B235ECA6874A",
+@@ -113,6 +113,22 @@ static const ecc_domain_parms_t domain_p
+ "0x216936D3CD6E53FEC0A4E231FDD6DC5C692CC7609525A7B2C9562D608F25D51A",
+ "0x6666666666666666666666666666666666666666666666666666666666666658"
+ },
++#if 0 /* No real specs yet found. */
++ {
++ /* x^2 + y^2 = 1 + 3617x^2y^2 mod 2^414 - 17 */
++ "Curve3617",
++ "0x3FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF"
++ "FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEF",
++ MPI_EC_EDWARDS, 0,
++ "0x01",
++ "0x0e21",
++ "0x07FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEB3CC92414CF"
++ "706022B36F1C0338AD63CF181B0E71A5E106AF79",
++ "0x1A334905141443300218C0631C326E5FCD46369F44C03EC7F57FF35498A4AB4D"
++ "6D6BA111301A73FAA8537C64C4FD3812F3CBC595",
++ "0x22"
++ },
++#endif /*0*/
+ {
+ "NIST P-192", 192, 1,
+ MPI_EC_WEIERSTRASS, ECC_DIALECT_STANDARD,
+@@ -404,7 +420,7 @@ _gcry_ecc_fill_in_curve (unsigned int nb
+ switch (domain_parms[idx].model)
+ {
+ case MPI_EC_WEIERSTRASS:
+- case MPI_EC_TWISTEDEDWARDS:
++ case MPI_EC_EDWARDS:
+ break;
+ case MPI_EC_MONTGOMERY:
+ return GPG_ERR_NOT_SUPPORTED;
+@@ -1039,7 +1055,7 @@ _gcry_ecc_get_mpi (const char *name, mpi
+ if (name[1] != '@')
+ return _gcry_mpi_ec_ec2os (ec->Q, ec);
+
+- if (!strcmp (name+2, "eddsa") && ec->model == MPI_EC_TWISTEDEDWARDS)
++ if (!strcmp (name+2, "eddsa") && ec->model == MPI_EC_EDWARDS)
+ {
+ unsigned char *encpk;
+ unsigned int encpklen;
+Index: libgcrypt-1.6.3/cipher/ecc-misc.c
+===================================================================
+--- libgcrypt-1.6.3.orig/cipher/ecc-misc.c
++++ libgcrypt-1.6.3/cipher/ecc-misc.c
+@@ -79,7 +79,7 @@ _gcry_ecc_model2str (enum gcry_mpi_ec_mo
+ {
+ case MPI_EC_WEIERSTRASS: str = "Weierstrass"; break;
+ case MPI_EC_MONTGOMERY: str = "Montgomery"; break;
+- case MPI_EC_TWISTEDEDWARDS: str = "Twisted Edwards"; break;
++ case MPI_EC_EDWARDS: str = "Edwards"; break;
+ }
+ return str;
+ }
+@@ -252,7 +252,7 @@ _gcry_ecc_compute_public (mpi_point_t Q,
+
+ if (!d || !G || !ec->p || !ec->a)
+ return NULL;
+- if (ec->model == MPI_EC_TWISTEDEDWARDS && !ec->b)
++ if (ec->model == MPI_EC_EDWARDS && !ec->b)
+ return NULL;
+
+ if (ec->dialect == ECC_DIALECT_ED25519
+Index: libgcrypt-1.6.3/cipher/ecc.c
+===================================================================
+--- libgcrypt-1.6.3.orig/cipher/ecc.c
++++ libgcrypt-1.6.3/cipher/ecc.c
+@@ -642,7 +642,7 @@ ecc_check_secret_key (gcry_sexp_t keypar
+ if (!curvename)
+ {
+ sk.E.model = ((flags & PUBKEY_FLAG_EDDSA)
+- ? MPI_EC_TWISTEDEDWARDS
++ ? MPI_EC_EDWARDS
+ : MPI_EC_WEIERSTRASS);
+ sk.E.dialect = ((flags & PUBKEY_FLAG_EDDSA)
+ ? ECC_DIALECT_ED25519
+@@ -774,7 +774,7 @@ ecc_sign (gcry_sexp_t *r_sig, gcry_sexp_
+ if (!curvename)
+ {
+ sk.E.model = ((ctx.flags & PUBKEY_FLAG_EDDSA)
+- ? MPI_EC_TWISTEDEDWARDS
++ ? MPI_EC_EDWARDS
+ : MPI_EC_WEIERSTRASS);
+ sk.E.dialect = ((ctx.flags & PUBKEY_FLAG_EDDSA)
+ ? ECC_DIALECT_ED25519
+@@ -938,7 +938,7 @@ ecc_verify (gcry_sexp_t s_sig, gcry_sexp
+ if (!curvename)
+ {
+ pk.E.model = ((sigflags & PUBKEY_FLAG_EDDSA)
+- ? MPI_EC_TWISTEDEDWARDS
++ ? MPI_EC_EDWARDS
+ : MPI_EC_WEIERSTRASS);
+ pk.E.dialect = ((sigflags & PUBKEY_FLAG_EDDSA)
+ ? ECC_DIALECT_ED25519
+@@ -1528,7 +1528,7 @@ compute_keygrip (gcry_md_hd_t md, gcry_s
+ if (!curvename)
+ {
+ model = ((flags & PUBKEY_FLAG_EDDSA)
+- ? MPI_EC_TWISTEDEDWARDS
++ ? MPI_EC_EDWARDS
+ : MPI_EC_WEIERSTRASS);
+ dialect = ((flags & PUBKEY_FLAG_EDDSA)
+ ? ECC_DIALECT_ED25519
+Index: libgcrypt-1.6.3/mpi/ec.c
+===================================================================
+--- libgcrypt-1.6.3.orig/mpi/ec.c
++++ libgcrypt-1.6.3/mpi/ec.c
+@@ -605,7 +605,7 @@ _gcry_mpi_ec_get_affine (gcry_mpi_t x, g
+ }
+ return -1;
+
+- case MPI_EC_TWISTEDEDWARDS:
++ case MPI_EC_EDWARDS:
+ {
+ gcry_mpi_t z;
+
+@@ -725,7 +725,7 @@ dup_point_montgomery (mpi_point_t result
+
+ /* RESULT = 2 * POINT (Twisted Edwards version). */
+ static void
+-dup_point_twistededwards (mpi_point_t result, mpi_point_t point, mpi_ec_t ctx)
++dup_point_edwards (mpi_point_t result, mpi_point_t point, mpi_ec_t ctx)
+ {
+ #define X1 (point->x)
+ #define Y1 (point->y)
+@@ -811,8 +811,8 @@ _gcry_mpi_ec_dup_point (mpi_point_t resu
+ case MPI_EC_MONTGOMERY:
+ dup_point_montgomery (result, point, ctx);
+ break;
+- case MPI_EC_TWISTEDEDWARDS:
+- dup_point_twistededwards (result, point, ctx);
++ case MPI_EC_EDWARDS:
++ dup_point_edwards (result, point, ctx);
+ break;
+ }
+ }
+@@ -977,9 +977,9 @@ add_points_montgomery (mpi_point_t resul
+
+ /* RESULT = P1 + P2 (Twisted Edwards version).*/
+ static void
+-add_points_twistededwards (mpi_point_t result,
+- mpi_point_t p1, mpi_point_t p2,
+- mpi_ec_t ctx)
++add_points_edwards (mpi_point_t result,
++ mpi_point_t p1, mpi_point_t p2,
++ mpi_ec_t ctx)
+ {
+ #define X1 (p1->x)
+ #define Y1 (p1->y)
+@@ -1087,8 +1087,8 @@ _gcry_mpi_ec_add_points (mpi_point_t res
+ case MPI_EC_MONTGOMERY:
+ add_points_montgomery (result, p1, p2, ctx);
+ break;
+- case MPI_EC_TWISTEDEDWARDS:
+- add_points_twistededwards (result, p1, p2, ctx);
++ case MPI_EC_EDWARDS:
++ add_points_edwards (result, p1, p2, ctx);
+ break;
+ }
+ }
+@@ -1106,7 +1106,7 @@ _gcry_mpi_ec_mul_point (mpi_point_t resu
+ unsigned int i, loops;
+ mpi_point_struct p1, p2, p1inv;
+
+- if (ctx->model == MPI_EC_TWISTEDEDWARDS)
++ if (ctx->model == MPI_EC_EDWARDS)
+ {
+ /* Simple left to right binary method. GECC Algorithm 3.27 */
+ unsigned int nbits;
+@@ -1269,7 +1269,7 @@ _gcry_mpi_ec_curve_point (gcry_mpi_point
+ log_fatal ("%s: %s not yet supported\n",
+ "_gcry_mpi_ec_curve_point", "Montgomery");
+ break;
+- case MPI_EC_TWISTEDEDWARDS:
++ case MPI_EC_EDWARDS:
+ {
+ /* a · x^2 + y^2 - 1 - b · x^2 · y^2 == 0 */
+ ec_pow2 (x, x, ctx);
+Index: libgcrypt-1.6.3/src/mpi.h
+===================================================================
+--- libgcrypt-1.6.3.orig/src/mpi.h
++++ libgcrypt-1.6.3/src/mpi.h
+@@ -245,13 +245,18 @@ void _gcry_mpi_snatch_point (gcry_mpi_t
+ /* Models describing an elliptic curve. */
+ enum gcry_mpi_ec_models
+ {
+-
++ /* The Short Weierstrass equation is
++ y^2 = x^3 + ax + b
++ */
+ MPI_EC_WEIERSTRASS = 0,
++ /* The Montgomery equation is
++ by^2 = x^3 + ax^2 + x
++ */
+ MPI_EC_MONTGOMERY,
+- MPI_EC_TWISTEDEDWARDS
+- /* The equation for Twisted Edwards curves is
++ /* The Twisted Edwards equation is
+ ax^2 + y^2 = 1 + bx^2y^2
+ Note that we use 'b' instead of the commonly used 'd'. */
++ MPI_EC_EDWARDS
+ };
+
+ /* Dialects used with elliptic curves. It is easier to keep the
diff --git a/meta/recipes-support/libgcrypt/files/CVE-2015-7511_2.patch b/meta/recipes-support/libgcrypt/files/CVE-2015-7511_2.patch
new file mode 100644
index 0000000..8093a18
--- /dev/null
+++ b/meta/recipes-support/libgcrypt/files/CVE-2015-7511_2.patch
@@ -0,0 +1,55 @@
+From 88e1358962e902ff1cbec8d53ba3eee46407851a Mon Sep 17 00:00:00 2001
+From: NIIBE Yutaka <gniibe at fsij.org>
+Date: Wed, 25 Nov 2015 12:46:19 +0900
+Subject: [PATCH] ecc: Constant-time multiplication for Weierstrass curve.
+
+* mpi/ec.c (_gcry_mpi_ec_mul_point): Use simple left-to-right binary
+method for Weierstrass curve when SCALAR is secure.
+
+Upstream-Status: Backport
+
+http://git.gnupg.org/cgi-bin/gitweb.cgi?p=libgcrypt.git;a=commit;h=88e1358962e902ff1cbec8d53ba3eee46407851a
+
+CVE: CVE-2015-7511 fix
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ mpi/ec.c | 19 +++++++++++++++----
+ 1 file changed, 15 insertions(+), 4 deletions(-)
+
+Index: libgcrypt-1.6.3/mpi/ec.c
+===================================================================
+--- libgcrypt-1.6.3.orig/mpi/ec.c
++++ libgcrypt-1.6.3/mpi/ec.c
+@@ -1106,16 +1106,27 @@ _gcry_mpi_ec_mul_point (mpi_point_t resu
+ unsigned int i, loops;
+ mpi_point_struct p1, p2, p1inv;
+
+- if (ctx->model == MPI_EC_EDWARDS)
++ if (ctx->model == MPI_EC_EDWARDS
++ || (ctx->model == MPI_EC_WEIERSTRASS
++ && mpi_is_secure (scalar)))
+ {
+ /* Simple left to right binary method. GECC Algorithm 3.27 */
+ unsigned int nbits;
+ int j;
+
+ nbits = mpi_get_nbits (scalar);
+- mpi_set_ui (result->x, 0);
+- mpi_set_ui (result->y, 1);
+- mpi_set_ui (result->z, 1);
++ if (ctx->model == MPI_EC_WEIERSTRASS)
++ {
++ mpi_set_ui (result->x, 1);
++ mpi_set_ui (result->y, 1);
++ mpi_set_ui (result->z, 0);
++ }
++ else
++ {
++ mpi_set_ui (result->x, 0);
++ mpi_set_ui (result->y, 1);
++ mpi_set_ui (result->z, 1);
++ }
+
+ if (mpi_is_secure (scalar))
+ {
diff --git a/meta/recipes-support/libgcrypt/libgcrypt_1.6.3.bb b/meta/recipes-support/libgcrypt/libgcrypt_1.6.3.bb
index cd06ce7..db89faf 100644
--- a/meta/recipes-support/libgcrypt/libgcrypt_1.6.3.bb
+++ b/meta/recipes-support/libgcrypt/libgcrypt_1.6.3.bb
@@ -1,4 +1,8 @@
require libgcrypt.inc
+SRC_URI += "\
+ file://CVE-2015-7511_1.patch \
+ file://CVE-2015-7511_2.patch \
+ "
SRC_URI[md5sum] = "de03b867d02fdf115a1bac8bb8b5c3a3"
SRC_URI[sha256sum] = "69e94e1a7084d94e1a6ca26d436068cb74862d10a7353cfae579a2d88674ff09"
diff --git a/meta/recipes-support/libgpg-error/libgpg-error/0001-libgpg-error-Add-nios2-support.patch b/meta/recipes-support/libgpg-error/libgpg-error/0001-libgpg-error-Add-nios2-support.patch
new file mode 100644
index 0000000..dab1c13
--- /dev/null
+++ b/meta/recipes-support/libgpg-error/libgpg-error/0001-libgpg-error-Add-nios2-support.patch
@@ -0,0 +1,46 @@
+From b2af652f43991e4ce6297917da542a9eb5135939 Mon Sep 17 00:00:00 2001
+From: Marek Vasut <marex at denx.de>
+Date: Thu, 17 Sep 2015 03:28:06 +0200
+Subject: [PATCH] libgpg-error: Add nios2 support
+
+Add configuration for the NIOS2 processor.
+
+Signed-off-by: Marek Vasut <marex at denx.de>
+Upstream-Status: Submitted
+---
+ src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h | 23 +++++++++++++++++++++++
+ 1 file changed, 23 insertions(+)
+ create mode 100644 src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h
+
+diff --git a/src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h b/src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h
+new file mode 100644
+index 0000000..3a24571
+--- /dev/null
++++ b/src/syscfg/lock-obj-pub.nios2-unknown-linux-gnu.h
+@@ -0,0 +1,23 @@
++## lock-obj-pub.nios2-unknown-linux-gnu.h
++## File created by gen-posix-lock-obj - DO NOT EDIT
++## To be included by mkheader into gpg-error.h
++
++typedef struct
++{
++ long _vers;
++ union {
++ volatile char _priv[24];
++ long _x_align;
++ long *_xp_align;
++ } u;
++} gpgrt_lock_t;
++
++#define GPGRT_LOCK_INITIALIZER {1,{{0,0,0,0,0,0,0,0, \
++ 0,0,0,0,0,0,0,0, \
++ 0,0,0,0,0,0,0,0}}}
++##
++## Local Variables:
++## mode: c
++## buffer-read-only: t
++## End:
++##
+--
+2.5.1
+
diff --git a/meta/recipes-support/libgpg-error/libgpg-error_1.19.bb b/meta/recipes-support/libgpg-error/libgpg-error_1.19.bb
index 39dbbcf..c69930a 100644
--- a/meta/recipes-support/libgpg-error/libgpg-error_1.19.bb
+++ b/meta/recipes-support/libgpg-error/libgpg-error_1.19.bb
@@ -12,7 +12,9 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=59530bdf33659b29e73d4adb9f9f6552 \
SECTION = "libs"
SRC_URI = "ftp://ftp.gnupg.org/gcrypt/libgpg-error/libgpg-error-${PV}.tar.bz2 \
- file://pkgconfig.patch"
+ file://pkgconfig.patch \
+ file://0001-libgpg-error-Add-nios2-support.patch \
+ "
SRC_URI[md5sum] = "c04c16245b92829281f43b5bef7d16da"
SRC_URI[sha256sum] = "53120e1333d5c5d28d87ff2854e9e98719c8e214152f17ad5291704d25c4978b"
diff --git a/meta/recipes-support/libksba/libksba/ksba-add-pkgconfig-support.patch b/meta/recipes-support/libksba/libksba/ksba-add-pkgconfig-support.patch
index b5886c5..d28dfd9 100644
--- a/meta/recipes-support/libksba/libksba/ksba-add-pkgconfig-support.patch
+++ b/meta/recipes-support/libksba/libksba/ksba-add-pkgconfig-support.patch
@@ -51,7 +51,7 @@ Index: libksba-1.3.0/ksba.pc.in
+Requires:
+Version: @VERSION@
+Libs: -L${libdir} -lksba
-+Libs.private: -L{libdir} -lgpg-error
++Libs.private: -L${libdir} -lgpg-error
+Cflags: -I${includedir}
+
Index: libksba-1.3.0/src/ksba.m4
diff --git a/meta/recipes-support/libpcre/libpcre_8.37.bb b/meta/recipes-support/libpcre/libpcre_8.37.bb
deleted file mode 100644
index bcfc9e9..0000000
--- a/meta/recipes-support/libpcre/libpcre_8.37.bb
+++ /dev/null
@@ -1,73 +0,0 @@
-DESCRIPTION = "The PCRE library is a set of functions that implement regular \
-expression pattern matching using the same syntax and semantics as Perl 5. PCRE \
-has its own native API, as well as a set of wrapper functions that correspond \
-to the POSIX regular expression API."
-SUMMARY = "Perl Compatible Regular Expressions"
-HOMEPAGE = "http://www.pcre.org"
-SECTION = "devel"
-LICENSE = "BSD"
-LIC_FILES_CHKSUM = "file://LICENCE;md5=7e4937814aee14758c1c95b59c80c44d"
-SRC_URI = "${SOURCEFORGE_MIRROR}/project/pcre/pcre/${PV}/pcre-${PV}.tar.bz2 \
- file://pcre-cross.patch \
- file://fix-pcre-name-collision.patch \
- file://run-ptest \
- file://Makefile \
-"
-
-SRC_URI[md5sum] = "ed91be292cb01d21bc7e526816c26981"
-SRC_URI[sha256sum] = "51679ea8006ce31379fb0860e46dd86665d864b5020fc9cd19e71260eef4789d"
-
-S = "${WORKDIR}/pcre-${PV}"
-
-PROVIDES += "pcre"
-DEPENDS += "bzip2 zlib"
-
-PACKAGECONFIG[pcretest-readline] = "--enable-pcretest-libreadline,--disable-pcretest-libreadline,readline,"
-
-BINCONFIG = "${bindir}/pcre-config"
-
-inherit autotools binconfig-disabled ptest
-
-EXTRA_OECONF = "\
- --enable-newline-is-lf \
- --enable-rebuild-chartables \
- --enable-utf8 \
- --with-link-size=2 \
- --with-match-limit=10000000 \
-"
-
-# Set LINK_SIZE in BUILD_CFLAGS given that the autotools bbclass use it to
-# set CFLAGS_FOR_BUILD, required for the libpcre build.
-BUILD_CFLAGS =+ "-DLINK_SIZE=2 -I${B}"
-CFLAGS += "-D_REENTRANT"
-CXXFLAGS_append_powerpc = " -lstdc++"
-
-PACKAGES =+ "libpcrecpp libpcreposix pcregrep pcregrep-doc pcretest pcretest-doc"
-
-SUMMARY_libpcrecpp = "${SUMMARY} - C++ wrapper functions"
-SUMMARY_libpcreposix = "${SUMMARY} - C wrapper functions based on the POSIX regex API"
-SUMMARY_pcregrep = "grep utility that uses perl 5 compatible regexes"
-SUMMARY_pcregrep-doc = "grep utility that uses perl 5 compatible regexes - docs"
-SUMMARY_pcretest = "program for testing Perl-comatible regular expressions"
-SUMMARY_pcretest-doc = "program for testing Perl-comatible regular expressions - docs"
-
-FILES_libpcrecpp = "${libdir}/libpcrecpp.so.*"
-FILES_libpcreposix = "${libdir}/libpcreposix.so.*"
-FILES_pcregrep = "${bindir}/pcregrep"
-FILES_pcregrep-doc = "${mandir}/man1/pcregrep.1"
-FILES_pcretest = "${bindir}/pcretest"
-FILES_pcretest-doc = "${mandir}/man1/pcretest.1"
-
-BBCLASSEXTEND = "native nativesdk"
-
-do_install_ptest() {
- t=${D}${PTEST_PATH}
- cp ${WORKDIR}/Makefile $t
- cp -r ${S}/testdata $t
- for i in pcre_stringpiece_unittest pcregrep pcretest; \
- do cp ${B}/.libs/$i $t; \
- done
- for i in RunTest RunGrepTest test-driver; \
- do cp ${S}/$i $t; \
- done
-}
diff --git a/meta/recipes-support/libpcre/libpcre_8.38.bb b/meta/recipes-support/libpcre/libpcre_8.38.bb
new file mode 100644
index 0000000..c567607
--- /dev/null
+++ b/meta/recipes-support/libpcre/libpcre_8.38.bb
@@ -0,0 +1,78 @@
+DESCRIPTION = "The PCRE library is a set of functions that implement regular \
+expression pattern matching using the same syntax and semantics as Perl 5. PCRE \
+has its own native API, as well as a set of wrapper functions that correspond \
+to the POSIX regular expression API."
+SUMMARY = "Perl Compatible Regular Expressions"
+HOMEPAGE = "http://www.pcre.org"
+SECTION = "devel"
+LICENSE = "BSD"
+LIC_FILES_CHKSUM = "file://LICENCE;md5=7e4937814aee14758c1c95b59c80c44d"
+SRC_URI = "${SOURCEFORGE_MIRROR}/project/pcre/pcre/${PV}/pcre-${PV}.tar.bz2 \
+ file://pcre-cross.patch \
+ file://fix-pcre-name-collision.patch \
+ file://run-ptest \
+ file://Makefile \
+"
+
+SRC_URI[md5sum] = "00aabbfe56d5a48b270f999b508c5ad2"
+SRC_URI[sha256sum] = "b9e02d36e23024d6c02a2e5b25204b3a4fa6ade43e0a5f869f254f49535079df"
+
+S = "${WORKDIR}/pcre-${PV}"
+
+PROVIDES += "pcre"
+DEPENDS += "bzip2 zlib"
+
+PACKAGECONFIG ??= "pcre8"
+
+PACKAGECONFIG[pcre8] = "--enable-pcre8,--disable-pcre8"
+PACKAGECONFIG[pcre16] = "--enable-pcre16,--disable-pcre16"
+PACKAGECONFIG[pcre32] = "--enable-pcre32,--disable-pcre32"
+PACKAGECONFIG[pcretest-readline] = "--enable-pcretest-libreadline,--disable-pcretest-libreadline,readline,"
+
+BINCONFIG = "${bindir}/pcre-config"
+
+inherit autotools binconfig-disabled ptest
+
+EXTRA_OECONF = "\
+ --enable-newline-is-lf \
+ --enable-rebuild-chartables \
+ --enable-utf8 \
+ --with-link-size=2 \
+ --with-match-limit=10000000 \
+"
+
+# Set LINK_SIZE in BUILD_CFLAGS given that the autotools bbclass use it to
+# set CFLAGS_FOR_BUILD, required for the libpcre build.
+BUILD_CFLAGS =+ "-DLINK_SIZE=2 -I${B}"
+CFLAGS += "-D_REENTRANT"
+CXXFLAGS_append_powerpc = " -lstdc++"
+
+PACKAGES =+ "libpcrecpp libpcreposix pcregrep pcregrep-doc pcretest pcretest-doc"
+
+SUMMARY_libpcrecpp = "${SUMMARY} - C++ wrapper functions"
+SUMMARY_libpcreposix = "${SUMMARY} - C wrapper functions based on the POSIX regex API"
+SUMMARY_pcregrep = "grep utility that uses perl 5 compatible regexes"
+SUMMARY_pcregrep-doc = "grep utility that uses perl 5 compatible regexes - docs"
+SUMMARY_pcretest = "program for testing Perl-comatible regular expressions"
+SUMMARY_pcretest-doc = "program for testing Perl-comatible regular expressions - docs"
+
+FILES_libpcrecpp = "${libdir}/libpcrecpp.so.*"
+FILES_libpcreposix = "${libdir}/libpcreposix.so.*"
+FILES_pcregrep = "${bindir}/pcregrep"
+FILES_pcregrep-doc = "${mandir}/man1/pcregrep.1"
+FILES_pcretest = "${bindir}/pcretest"
+FILES_pcretest-doc = "${mandir}/man1/pcretest.1"
+
+BBCLASSEXTEND = "native nativesdk"
+
+do_install_ptest() {
+ t=${D}${PTEST_PATH}
+ cp ${WORKDIR}/Makefile $t
+ cp -r ${S}/testdata $t
+ for i in pcre_stringpiece_unittest pcregrep pcretest; \
+ do cp ${B}/.libs/$i $t; \
+ done
+ for i in RunTest RunGrepTest test-driver; \
+ do cp ${S}/$i $t; \
+ done
+}
diff --git a/meta/recipes-support/libunwind/libunwind-1.1/Add-AO_REQUIRE_CAS-to-fix-build-on-ARM-v6.patch b/meta/recipes-support/libunwind/libunwind-1.1/Add-AO_REQUIRE_CAS-to-fix-build-on-ARM-v6.patch
new file mode 100644
index 0000000..d552502
--- /dev/null
+++ b/meta/recipes-support/libunwind/libunwind-1.1/Add-AO_REQUIRE_CAS-to-fix-build-on-ARM-v6.patch
@@ -0,0 +1,61 @@
+From 24484e80b3e329c9edee1995e102f8612eedb79c Mon Sep 17 00:00:00 2001
+From: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
+Date: Tue, 13 May 2014 23:32:27 +0200
+Subject: [PATCH] Add AO_REQUIRE_CAS to fix build on ARM < v6
+
+ARM earlier than ARMv6, such as ARMv4 and ARMv5 do not provide
+optimize atomic operations in libatomic_ops. Since libunwind is using
+such operations, it should define AO_REQUIRE_CAS before including
+<atomic_ops.h> so that libatomic_ops knows it should use emulated
+atomic operations instead (even though they are obviously a lot more
+expensive).
+
+Also, while real atomic operations are all inline functions and
+therefore linking against libatomic_ops was not required, the emulated
+atomic operations actually require linking against libatomic_ops, so
+the commented AC_CHECK_LIB test in acinclude.m4 is uncommented to make
+sure we link against libatomic_ops.
+
+Signed-off-by: Thomas Petazzoni <thomas.petazzoni at free-electrons.com>
+
+Upstream-Status: Pending
+Taken from:
+https://raw.githubusercontent.com/rdnetto/teapot-buildroot/master/package/libunwind/libunwind-02-Add-AO_REQUIRE_CAS-to-fix-build-on-ARM-v6.patch
+
+---
+ acinclude.m4 | 8 +-------
+ include/libunwind_i.h | 1 +
+ 2 files changed, 2 insertions(+), 7 deletions(-)
+
+diff --git a/acinclude.m4 b/acinclude.m4
+index 497f7c2..9c15af1 100644
+--- a/acinclude.m4
++++ b/acinclude.m4
+@@ -22,11 +22,5 @@ fi])
+ AC_DEFUN([CHECK_ATOMIC_OPS],
+ [dnl Check whether the system has the atomic_ops package installed.
+ AC_CHECK_HEADERS(atomic_ops.h)
+-#
+-# Don't link against libatomic_ops for now. We don't want libunwind
+-# to depend on libatomic_ops.so. Fortunately, none of the platforms
+-# we care about so far need libatomic_ops.a (everything is done via
+-# inline macros).
+-#
+-# AC_CHECK_LIB(atomic_ops, main)
++ AC_CHECK_LIB(atomic_ops, main)
+ ])
+diff --git a/include/libunwind_i.h b/include/libunwind_i.h
+index 23f615e..deabdfd 100644
+--- a/include/libunwind_i.h
++++ b/include/libunwind_i.h
+@@ -95,6 +95,7 @@ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+ (pthread_mutex_unlock != NULL ? pthread_mutex_unlock (l) : 0)
+
+ #ifdef HAVE_ATOMIC_OPS_H
++# define AO_REQUIRE_CAS
+ # include <atomic_ops.h>
+ static inline int
+ cmpxchg_ptr (void *addr, void *old, void *new)
+--
+1.9.2
+
diff --git a/meta/recipes-support/libunwind/libunwind_1.1.bb b/meta/recipes-support/libunwind/libunwind_1.1.bb
index 8282c1b..aa62bcc 100644
--- a/meta/recipes-support/libunwind/libunwind_1.1.bb
+++ b/meta/recipes-support/libunwind/libunwind_1.1.bb
@@ -6,7 +6,12 @@ SRC_URI += "\
file://Fix-test-case-link-failure-on-PowerPC-systems-with-Altivec.patch \
file://Link-libunwind-to-libgcc_s-rather-than-libgcc.patch \
file://0001-Invalid-dwarf-opcodes-can-cause-references-beyond-th.patch \
+ file://Add-AO_REQUIRE_CAS-to-fix-build-on-ARM-v6.patch \
"
SRC_URI[md5sum] = "fb4ea2f6fbbe45bf032cd36e586883ce"
SRC_URI[sha256sum] = "9dfe0fcae2a866de9d3942c66995e4b460230446887dbdab302d41a8aee8d09a"
+
+# http://errors.yoctoproject.org/Errors/Details/20487/
+ARM_INSTRUCTION_SET_armv4 = "arm"
+ARM_INSTRUCTION_SET_armv5 = "arm"
diff --git a/meta/recipes-support/libxslt/libxslt/CVE-2015-7995.patch b/meta/recipes-support/libxslt/libxslt/CVE-2015-7995.patch
new file mode 100644
index 0000000..e4d09c2
--- /dev/null
+++ b/meta/recipes-support/libxslt/libxslt/CVE-2015-7995.patch
@@ -0,0 +1,33 @@
+From 7ca19df892ca22d9314e95d59ce2abdeff46b617 Mon Sep 17 00:00:00 2001
+From: Daniel Veillard <veillard at redhat.com>
+Date: Thu, 29 Oct 2015 19:33:23 +0800
+Subject: Fix for type confusion in preprocessing attributes
+
+CVE-2015-7995 http://www.openwall.com/lists/oss-security/2015/10/27/10
+We need to check that the parent node is an element before dereferencing
+its namespace
+
+Upstream-Status: Backport
+
+https://git.gnome.org/browse/libxslt/commit/?id=7ca19df892ca22d9314e95d59ce2abdeff46b617
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+---
+ libxslt/preproc.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+Index: libxslt-1.1.28/libxslt/preproc.c
+===================================================================
+--- libxslt-1.1.28.orig/libxslt/preproc.c
++++ libxslt-1.1.28/libxslt/preproc.c
+@@ -2245,7 +2245,8 @@ xsltStylePreCompute(xsltStylesheetPtr st
+ } else if (IS_XSLT_NAME(inst, "attribute")) {
+ xmlNodePtr parent = inst->parent;
+
+- if ((parent == NULL) || (parent->ns == NULL) ||
++ if ((parent == NULL) ||
++ (parent->type != XML_ELEMENT_NODE) || (parent->ns == NULL) ||
+ ((parent->ns != inst->ns) &&
+ (!xmlStrEqual(parent->ns->href, inst->ns->href))) ||
+ (!xmlStrEqual(parent->name, BAD_CAST "attribute-set"))) {
diff --git a/meta/recipes-support/libxslt/libxslt_1.1.28.bb b/meta/recipes-support/libxslt/libxslt_1.1.28.bb
index 166bcd8..87fabec 100644
--- a/meta/recipes-support/libxslt/libxslt_1.1.28.bb
+++ b/meta/recipes-support/libxslt/libxslt_1.1.28.bb
@@ -10,7 +10,8 @@ DEPENDS = "libxml2"
SRC_URI = "ftp://xmlsoft.org/libxslt//libxslt-${PV}.tar.gz \
file://pkgconfig_fix.patch \
- file://pkgconfig.patch"
+ file://pkgconfig.patch \
+ file://CVE-2015-7995.patch"
SRC_URI[md5sum] = "9667bf6f9310b957254fdcf6596600b7"
SRC_URI[sha256sum] = "5fc7151a57b89c03d7b825df5a0fae0a8d5f05674c0e7cf2937ecec4d54a028c"
diff --git a/meta/recipes-support/nettle/nettle-3.1.1/CVE-2015-8803_8805.patch b/meta/recipes-support/nettle/nettle-3.1.1/CVE-2015-8803_8805.patch
new file mode 100644
index 0000000..b4ff228
--- /dev/null
+++ b/meta/recipes-support/nettle/nettle-3.1.1/CVE-2015-8803_8805.patch
@@ -0,0 +1,71 @@
+Upstream-Status: Backport
+https://git.lysator.liu.se/nettle/nettle/commit/c71d2c9d20eeebb985e3872e4550137209e3ce4d
+
+CVE: CVE-2015-8803
+CVE: CVE-2015-8805
+
+Same fix for both.
+
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+Index: nettle-3.1.1/ecc-256.c
+===================================================================
+--- nettle-3.1.1.orig/ecc-256.c
++++ nettle-3.1.1/ecc-256.c
+@@ -113,8 +113,19 @@ ecc_256_modp (const struct ecc_modulo *p
+
+ assert (q2 < 2);
+
+- /* We multiply by two low limbs of p, 2^96 - 1, so we could use
+- shifts rather than mul. */
++ /*
++ n-1 n-2 n-3 n-4
++ +---+---+---+---+
++ | u1| u0| u low |
++ +---+---+---+---+
++ - | q1(2^96-1)|
++ +-------+---+
++ |q2(2^.)|
++ +-------+
++
++ We multiply by two low limbs of p, 2^96 - 1, so we could use
++ shifts rather than mul.
++ */
+ t = mpn_submul_1 (rp + n - 4, p->m, 2, q1);
+ t += cnd_sub_n (q2, rp + n - 3, p->m, 1);
+ t += (-q2) & 0xffffffff;
+@@ -124,7 +135,10 @@ ecc_256_modp (const struct ecc_modulo *p
+ u0 -= t;
+ t = (u1 < cy);
+ u1 -= cy;
+- u1 += cnd_add_n (t, rp + n - 4, p->m, 3);
++
++ cy = cnd_add_n (t, rp + n - 4, p->m, 2);
++ u0 += cy;
++ u1 += (u0 < cy);
+ u1 -= (-t) & 0xffffffff;
+ }
+ rp[2] = u0;
+@@ -211,7 +225,7 @@ ecc_256_modq (const struct ecc_modulo *q
+
+ /* Conditional add of p */
+ u1 += t;
+- u2 += (t<<32) + (u0 < t);
++ u2 += (t<<32) + (u1 < t);
+
+ t = cnd_add_n (t, rp + n - 4, q->m, 2);
+ u1 += t;
+Index: nettle-3.1.1/ChangeLog
+===================================================================
+--- nettle-3.1.1.orig/ChangeLog
++++ nettle-3.1.1/ChangeLog
+@@ -1,3 +1,9 @@
++2015-12-10 Niels Möller <nisse at lysator.liu.se>
++
++ * ecc-256.c (ecc_256_modp): Fixed carry propagation bug. Problem
++ reported by Hanno Böck.
++ (ecc_256_modq): Fixed another carry propagation bug.
++
+ 2015-04-24 Niels Möller <nisse at lysator.liu.se>
+
+ * Released nettle-3.1.1.
diff --git a/meta/recipes-support/nettle/nettle-3.1.1/CVE-2015-8804.patch b/meta/recipes-support/nettle/nettle-3.1.1/CVE-2015-8804.patch
new file mode 100644
index 0000000..1d34db7
--- /dev/null
+++ b/meta/recipes-support/nettle/nettle-3.1.1/CVE-2015-8804.patch
@@ -0,0 +1,281 @@
+Upstream-Status: Backport
+ https://git.lysator.liu.se/nettle/nettle/commit/fa269b6ad06dd13c901dbd84a12e52b918a09cd7
+
+CVE: CVE-2015-8804
+Signed-off-by: Armin Kuster <akuster at mvista.com>
+
+Index: nettle-3.1.1/ChangeLog
+===================================================================
+--- nettle-3.1.1.orig/ChangeLog
++++ nettle-3.1.1/ChangeLog
+@@ -1,3 +1,11 @@
++2015-12-15 Niels Möller <nisse at lysator.liu.se>
++
++ * x86_64/ecc-384-modp.asm: Fixed carry propagation bug. Problem
++ reported by Hanno Böck. Simplified the folding to always use
++ non-negative carry, the old code attempted to add in a carry which
++ could be either positive or negative, but didn't get that case
++ right.
++
+ 2015-12-10 Niels Möller <nisse at lysator.liu.se>
+
+ * ecc-256.c (ecc_256_modp): Fixed carry propagation bug. Problem
+Index: nettle-3.1.1/x86_64/ecc-384-modp.asm
+===================================================================
+--- nettle-3.1.1.orig/x86_64/ecc-384-modp.asm
++++ nettle-3.1.1/x86_64/ecc-384-modp.asm
+@@ -1,7 +1,7 @@
+ C x86_64/ecc-384-modp.asm
+
+ ifelse(<
+- Copyright (C) 2013 Niels Möller
++ Copyright (C) 2013, 2015 Niels Möller
+
+ This file is part of GNU Nettle.
+
+@@ -33,7 +33,7 @@ ifelse(<
+ .file "ecc-384-modp.asm"
+
+ define(<RP>, <%rsi>)
+-define(<D4>, <%rax>)
++define(<D5>, <%rax>)
+ define(<T0>, <%rbx>)
+ define(<T1>, <%rcx>)
+ define(<T2>, <%rdx>)
+@@ -48,8 +48,8 @@ define(<H4>, <%r13>)
+ define(<H5>, <%r14>)
+ define(<C2>, <%r15>)
+ define(<C0>, H5) C Overlap
+-define(<D0>, RP) C Overlap
+-define(<TMP>, H4) C Overlap
++define(<TMP>, RP) C Overlap
++
+
+ PROLOGUE(nettle_ecc_384_modp)
+ W64_ENTRY(2, 0)
+@@ -61,34 +61,38 @@ PROLOGUE(nettle_ecc_384_modp)
+ push %r14
+ push %r15
+
+- C First get top 2 limbs, which need folding twice
++ C First get top 2 limbs, which need folding twice.
++ C B^10 = B^6 + B^4 + 2^32 (B-1)B^4.
++ C We handle the terms as follow:
+ C
+- C H5 H4
+- C -H5
+- C ------
+- C H0 D4
++ C B^6: Folded immediatly.
+ C
+- C Then shift right, (H1,H0,D4) <-- (H0,D4) << 32
+- C and add
++ C B^4: Delayed, added in in the next folding.
+ C
+- C H5 H4
+- C H1 H0
+- C ----------
+- C C2 H1 H0
+-
+- mov 80(RP), D4
+- mov 88(RP), H0
+- mov D4, H4
+- mov H0, H5
+- sub H0, D4
+- sbb $0, H0
+-
+- mov D4, T2
+- mov H0, H1
+- shl $32, H0
+- shr $32, T2
++ C 2^32(B-1) B^4: Low half limb delayed until the next
++ C folding. Top 1.5 limbs subtracted and shifter now, resulting
++ C in 2.5 limbs. The low limb saved in D5, high 1.5 limbs added
++ C in.
++
++ mov 80(RP), H4
++ mov 88(RP), H5
++ C Shift right 32 bits, into H1, H0
++ mov H4, H0
++ mov H5, H1
++ mov H5, D5
+ shr $32, H1
+- or T2, H0
++ shl $32, D5
++ shr $32, H0
++ or D5, H0
++
++ C H1 H0
++ C - H1 H0
++ C --------
++ C H1 H0 D5
++ mov H0, D5
++ neg D5
++ sbb H1, H0
++ sbb $0, H1
+
+ xor C2, C2
+ add H4, H0
+@@ -127,118 +131,95 @@ PROLOGUE(nettle_ecc_384_modp)
+ adc H3, T5
+ adc $0, C0
+
+- C H3 H2 H1 H0 0
+- C - H4 H3 H2 H1 H0
+- C ---------------
+- C H3 H2 H1 H0 D0
+-
+- mov XREG(D4), XREG(D4)
+- mov H0, D0
+- neg D0
+- sbb H1, H0
+- sbb H2, H1
+- sbb H3, H2
+- sbb H4, H3
+- sbb $0, D4
+-
+- C Shift right. High bits are sign, to be added to C0.
+- mov D4, TMP
+- sar $32, TMP
+- shl $32, D4
+- add TMP, C0
+-
++ C Shift left, including low half of H4
+ mov H3, TMP
++ shl $32, H4
+ shr $32, TMP
+- shl $32, H3
+- or TMP, D4
++ or TMP, H4
+
+ mov H2, TMP
++ shl $32, H3
+ shr $32, TMP
+- shl $32, H2
+ or TMP, H3
+
+ mov H1, TMP
++ shl $32, H2
+ shr $32, TMP
+- shl $32, H1
+ or TMP, H2
+
+ mov H0, TMP
++ shl $32, H1
+ shr $32, TMP
+- shl $32, H0
+ or TMP, H1
+
+- mov D0, TMP
+- shr $32, TMP
+- shl $32, D0
+- or TMP, H0
++ shl $32, H0
++
++ C H4 H3 H2 H1 H0 0
++ C - H4 H3 H2 H1 H0
++ C ---------------
++ C H4 H3 H2 H1 H0 TMP
+
+- add D0, T0
++ mov H0, TMP
++ neg TMP
++ sbb H1, H0
++ sbb H2, H1
++ sbb H3, H2
++ sbb H4, H3
++ sbb $0, H4
++
++ add TMP, T0
+ adc H0, T1
+ adc H1, T2
+ adc H2, T3
+ adc H3, T4
+- adc D4, T5
++ adc H4, T5
+ adc $0, C0
+
+ C Remains to add in C2 and C0
+- C C0 C0<<32 (-2^32+1)C0
+- C C2 C2<<32 (-2^32+1)C2
+- C where C2 is always positive, while C0 may be -1.
++ C Set H1, H0 = (2^96 - 2^32 + 1) C0
+ mov C0, H0
+ mov C0, H1
+- mov C0, H2
+- sar $63, C0 C Get sign
+ shl $32, H1
+- sub H1, H0 C Gives borrow iff C0 > 0
++ sub H1, H0
+ sbb $0, H1
+- add C0, H2
+
++ C Set H3, H2 = (2^96 - 2^32 + 1) C2
++ mov C2, H2
++ mov C2, H3
++ shl $32, H3
++ sub H3, H2
++ sbb $0, H3
++ add C0, H2 C No carry. Could use lea trick
++
++ xor C0, C0
+ add H0, T0
+ adc H1, T1
+- adc $0, H2
+- adc $0, C0
+-
+- C Set (H1 H0) <-- C2 << 96 - C2 << 32 + 1
+- mov C2, H0
+- mov C2, H1
+- shl $32, H1
+- sub H1, H0
+- sbb $0, H1
+-
+- add H2, H0
+- adc C0, H1
+- adc C2, C0
+- mov C0, H2
+- sar $63, C0
+- add H0, T2
+- adc H1, T3
+- adc H2, T4
+- adc C0, T5
+- sbb C0, C0
++ adc H2, T2
++ adc H3, T3
++ adc C2, T4
++ adc D5, T5 C Value delayed from initial folding
++ adc $0, C0 C Use sbb and switch sign?
+
+ C Final unlikely carry
+ mov C0, H0
+ mov C0, H1
+- mov C0, H2
+- sar $63, C0
+ shl $32, H1
+ sub H1, H0
+ sbb $0, H1
+- add C0, H2
+
+ pop RP
+
+- sub H0, T0
++ add H0, T0
+ mov T0, (RP)
+- sbb H1, T1
++ adc H1, T1
+ mov T1, 8(RP)
+- sbb H2, T2
++ adc C0, T2
+ mov T2, 16(RP)
+- sbb C0, T3
++ adc $0, T3
+ mov T3, 24(RP)
+- sbb C0, T4
++ adc $0, T4
+ mov T4, 32(RP)
+- sbb C0, T5
++ adc $0, T5
+ mov T5, 40(RP)
+
+ pop %r15
diff --git a/meta/recipes-support/nettle/nettle_3.1.1.bb b/meta/recipes-support/nettle/nettle_3.1.1.bb
index 7d7134f..4a40e9a 100644
--- a/meta/recipes-support/nettle/nettle_3.1.1.bb
+++ b/meta/recipes-support/nettle/nettle_3.1.1.bb
@@ -7,5 +7,10 @@ LIC_FILES_CHKSUM = "file://COPYING.LESSERv3;md5=6a6a8e020838b23406c81b19c1d46df6
file://serpent-decrypt.c;beginline=14;endline=36;md5=ca0d220bc413e1842ecc507690ce416e \
file://serpent-set-key.c;beginline=14;endline=36;md5=ca0d220bc413e1842ecc507690ce416e"
+SRC_URI += "\
+ file://CVE-2015-8803_8805.patch \
+ file://CVE-2015-8804.patch \
+ "
+
SRC_URI[md5sum] = "b40fa88dc32f37a182b6b42092ebb144"
SRC_URI[sha256sum] = "5fd4d25d64d8ddcb85d0d897572af73b05b4d163c6cc49438a5bfbb8ff293d4c"
diff --git a/meta/recipes-support/p11-kit/p11-kit_0.22.1.bb b/meta/recipes-support/p11-kit/p11-kit_0.22.1.bb
index 7ad9626..ee77951 100644
--- a/meta/recipes-support/p11-kit/p11-kit_0.22.1.bb
+++ b/meta/recipes-support/p11-kit/p11-kit_0.22.1.bb
@@ -10,6 +10,8 @@ SRC_URI = "http://p11-glue.freedesktop.org/releases/${BP}.tar.gz"
SRC_URI[md5sum] = "4e9bea1106628ffb820bdad24a819fac"
SRC_URI[sha256sum] = "ef3a339fcf6aa0e32c8c23f79ba7191e57312be2bda8b24e6d121c2670539a5c"
+EXTRA_OECONF = "--without-trust-paths"
+
FILES_${PN}-dev += " \
${libdir}/p11-kit-proxy.so \
${libdir}/pkcs11/p11-kit-trust.so \
diff --git a/meta/recipes-support/pinentry/pinentry_0.9.2.bb b/meta/recipes-support/pinentry/pinentry_0.9.2.bb
index c836ca4..d6b7130 100644
--- a/meta/recipes-support/pinentry/pinentry_0.9.2.bb
+++ b/meta/recipes-support/pinentry/pinentry_0.9.2.bb
@@ -10,6 +10,8 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=cbbd794e2a0a289b9dfcc9f513d1996e"
inherit autotools
+DEPENDS = "gettext-native"
+
SRC_URI = "ftp://ftp.gnupg.org/gcrypt/${BPN}/${BPN}-${PV}.tar.bz2"
SRC_URI[md5sum] = "f51d454f921111b5156a2291cbf70278"
diff --git a/meta/recipes-support/user-creation/files/system-xuser.conf b/meta/recipes-support/user-creation/files/system-xuser.conf
new file mode 100644
index 0000000..d42e3d1
--- /dev/null
+++ b/meta/recipes-support/user-creation/files/system-xuser.conf
@@ -0,0 +1,11 @@
+<!DOCTYPE busconfig PUBLIC "-//freedesktop//DTD D-BUS Bus Configuration 1.0//EN"
+ "http://www.freedesktop.org/standards/dbus/1.0/busconfig.dtd">
+<busconfig>
+ <policy user="xuser">
+ <allow send_destination="net.connman"/>
+ <allow send_destination="net.connman.vpn"/>
+ <allow send_destination="org.ofono"/>
+ <allow send_destination="org.bluez"/>
+ </policy>
+</busconfig>
+
diff --git a/meta/recipes-support/user-creation/xuser-account_0.1.bb b/meta/recipes-support/user-creation/xuser-account_0.1.bb
index 77ba97d..13ba677 100644
--- a/meta/recipes-support/user-creation/xuser-account_0.1.bb
+++ b/meta/recipes-support/user-creation/xuser-account_0.1.bb
@@ -2,7 +2,7 @@ SUMMARY = "Creates an 'xuser' account used for running X11"
LICENSE = "MIT"
LIC_FILES_CHKSUM = "file://${COREBASE}/meta/COPYING.MIT;md5=3da9cfbcb788c80a0384361b4de20420"
-SRC_URI = ""
+SRC_URI = "file://system-xuser.conf"
inherit allarch useradd
@@ -15,9 +15,11 @@ do_compile() {
}
do_install() {
- :
+ install -D -m 0644 ${WORKDIR}/system-xuser.conf ${D}${sysconfdir}/dbus-1/system.d/system-xuser.conf
}
+FILES_${PN} = "${sysconfdir}/dbus-1/system.d/system-xuser.conf"
+
USERADD_PACKAGES = "${PN}"
GROUPADD_PARAM_${PN} = "--system shutdown"
USERADD_PARAM_${PN} = "--create-home \
diff --git a/meta/recipes-support/vte/vte-0.28.2/cve-2012-2738.patch b/meta/recipes-support/vte/vte-0.28.2/cve-2012-2738.patch
new file mode 100644
index 0000000..2407771
--- /dev/null
+++ b/meta/recipes-support/vte/vte-0.28.2/cve-2012-2738.patch
@@ -0,0 +1,135 @@
+Upstream-Status: Backport
+Signed-off-by: Ross Burton <ross.burton at intel.com>
+
+From e524b0b3bd8fad844ffa73927c199545b892cdbd Mon Sep 17 00:00:00 2001
+From: Christian Persch <chpe at gnome.org>
+Date: Sat, 19 May 2012 19:36:09 +0200
+Subject: [PATCH 1/2] emulation: Limit integer arguments to 65535
+
+To guard against malicious sequences containing excessively big numbers,
+limit all parsed numbers to 16 bit range. Doing this here in the parsing
+routine is a catch-all guard; this doesn't preclude enforcing
+more stringent limits in the handlers themselves.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=676090
+---
+ src/table.c | 2 +-
+ src/vteseq.c | 2 +-
+ 2 files changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/src/table.c b/src/table.c
+index 140e8c8..85cf631 100644
+--- a/src/table.c
++++ b/src/table.c
+@@ -550,7 +550,7 @@ _vte_table_extract_numbers(GValueArray **array,
+ if (G_UNLIKELY (*array == NULL)) {
+ *array = g_value_array_new(1);
+ }
+- g_value_set_long(&value, total);
++ g_value_set_long(&value, CLAMP (total, 0, G_MAXUSHORT));
+ g_value_array_append(*array, &value);
+ } while (i++ < arginfo->length);
+ g_value_unset(&value);
+diff --git a/src/vteseq.c b/src/vteseq.c
+index 7ef4c8c..10991db 100644
+--- a/src/vteseq.c
++++ b/src/vteseq.c
+@@ -557,7 +557,7 @@ vte_sequence_handler_multiple(VteTerminal *terminal,
+ GValueArray *params,
+ VteTerminalSequenceHandler handler)
+ {
+- vte_sequence_handler_multiple_limited(terminal, params, handler, G_MAXLONG);
++ vte_sequence_handler_multiple_limited(terminal, params, handler, G_MAXUSHORT);
+ }
+
+ static void
+--
+2.4.9 (Apple Git-60)
+
+
+From cf1ad453a8def873c49cf6d88162593402f32bb2 Mon Sep 17 00:00:00 2001
+From: Christian Persch <chpe at gnome.org>
+Date: Sat, 19 May 2012 20:04:12 +0200
+Subject: [PATCH 2/2] emulation: Limit repetitions
+
+Don't allow malicious sequences to cause excessive repetitions.
+
+https://bugzilla.gnome.org/show_bug.cgi?id=676090
+---
+ src/vteseq.c | 25 ++++++++++++++++++-------
+ 1 file changed, 18 insertions(+), 7 deletions(-)
+
+diff --git a/src/vteseq.c b/src/vteseq.c
+index 10991db..209522f 100644
+--- a/src/vteseq.c
++++ b/src/vteseq.c
+@@ -1392,7 +1392,7 @@ vte_sequence_handler_dc (VteTerminal *terminal, GValueArray *params)
+ static void
+ vte_sequence_handler_DC (VteTerminal *terminal, GValueArray *params)
+ {
+- vte_sequence_handler_multiple(terminal, params, vte_sequence_handler_dc);
++ vte_sequence_handler_multiple_r(terminal, params, vte_sequence_handler_dc);
+ }
+
+ /* Delete a line at the current cursor position. */
+@@ -1785,7 +1785,7 @@ vte_sequence_handler_reverse_index (VteTerminal *terminal, GValueArray *params)
+ static void
+ vte_sequence_handler_RI (VteTerminal *terminal, GValueArray *params)
+ {
+- vte_sequence_handler_multiple(terminal, params, vte_sequence_handler_nd);
++ vte_sequence_handler_multiple_r(terminal, params, vte_sequence_handler_nd);
+ }
+
+ /* Save cursor (position). */
+@@ -2777,8 +2777,7 @@ vte_sequence_handler_insert_lines (VteTerminal *terminal, GValueArray *params)
+ {
+ GValue *value;
+ VteScreen *screen;
+- long param, end, row;
+- int i;
++ long param, end, row, i, limit;
+ screen = terminal->pvt->screen;
+ /* The default is one. */
+ param = 1;
+@@ -2796,7 +2795,13 @@ vte_sequence_handler_insert_lines (VteTerminal *terminal, GValueArray *params)
+ } else {
+ end = screen->insert_delta + terminal->row_count - 1;
+ }
+- /* Insert the new lines at the cursor. */
++
++ /* Only allow to insert as many lines as there are between this row
++ * and the end of the scrolling region. See bug #676090.
++ */
++ limit = end - row + 1;
++ param = MIN (param, limit);
++
+ for (i = 0; i < param; i++) {
+ /* Clear a line off the end of the region and add one to the
+ * top of the region. */
+@@ -2817,8 +2822,7 @@ vte_sequence_handler_delete_lines (VteTerminal *terminal, GValueArray *params)
+ {
+ GValue *value;
+ VteScreen *screen;
+- long param, end, row;
+- int i;
++ long param, end, row, i, limit;
+
+ screen = terminal->pvt->screen;
+ /* The default is one. */
+@@ -2837,6 +2841,13 @@ vte_sequence_handler_delete_lines (VteTerminal *terminal, GValueArray *params)
+ } else {
+ end = screen->insert_delta + terminal->row_count - 1;
+ }
++
++ /* Only allow to delete as many lines as there are between this row
++ * and the end of the scrolling region. See bug #676090.
++ */
++ limit = end - row + 1;
++ param = MIN (param, limit);
++
+ /* Clear them from below the current cursor. */
+ for (i = 0; i < param; i++) {
+ /* Insert a line at the end of the region and remove one from
+--
+2.4.9 (Apple Git-60)
+
diff --git a/meta/recipes-support/vte/vte.inc b/meta/recipes-support/vte/vte.inc
index 874062a..07b9e10 100644
--- a/meta/recipes-support/vte/vte.inc
+++ b/meta/recipes-support/vte/vte.inc
@@ -4,7 +4,8 @@ LICENSE = "LGPLv2.0"
DEPENDS = " glib-2.0 gtk+ intltool-native ncurses gobject-introspection-stub"
RDEPENDS_libvte = "vte-termcap"
-inherit gnome gtk-doc
+inherit gnome gtk-doc distro_features_check
+ANY_OF_DISTRO_FEATURES = "${GTK2DISTROFEATURES}"
EXTRA_OECONF = "--disable-python --disable-introspection"
diff --git a/meta/recipes-support/vte/vte_0.28.2.bb b/meta/recipes-support/vte/vte_0.28.2.bb
index b1025cb..8b4e7f7 100644
--- a/meta/recipes-support/vte/vte_0.28.2.bb
+++ b/meta/recipes-support/vte/vte_0.28.2.bb
@@ -4,7 +4,8 @@ LIC_FILES_CHKSUM = "file://COPYING;md5=3bf50002aefd002f49e7bb854063f7e7"
PR = "r6"
-SRC_URI += "file://obsolete_automake_macros.patch"
+SRC_URI += "file://obsolete_automake_macros.patch \
+ file://cve-2012-2738.patch"
CFLAGS += "-D_GNU_SOURCE"
diff --git a/meta/site/nios2-linux b/meta/site/nios2-linux
new file mode 100644
index 0000000..9e53e5d
--- /dev/null
+++ b/meta/site/nios2-linux
@@ -0,0 +1,395 @@
+ac_cv_func_lstat_dereferences_slashed_symlink=${ac_cv_func_lstat_dereferences_slashed_symlink=yes}
+ac_cv_func_lstat_empty_string_bug=${ac_cv_func_lstat_empty_string_bug=no}
+ac_cv_func_stat_empty_string_bug=${ac_cv_func_stat_empty_string_bug=no}
+ac_cv_func_stat_ignores_trailing_slash=${ac_cv_func_stat_ignores_trailing_slash=no}
+ac_cv_header_netinet_sctp_h=${ac_cv_header_netinet_sctp_h=no}
+ac_cv_header_netinet_sctp_uio_h=${ac_cv_header_netinet_sctp_uio_h=no}
+ac_cv_sctp=${ac_cv_sctp=no}
+
+# apache
+ac_cv_func_pthread_key_delete=${ac_cv_func_pthread_key_delete=yes}
+apr_cv_process_shared_works=${apr_cv_process_shared_works=no}
+ac_cv_sizeof_ssize_t=${ac_cv_sizeof_ssize_t=4}
+apr_cv_tcp_nodelay_with_cork=${apr_cv_tcp_nodelay_with_cork=yes}
+
+# bash
+ac_cv_c_long_double=${ac_cv_c_long_double=yes}
+bash_cv_func_sigsetjmp=${bash_cv_func_sigsetjmp=missing}
+
+# coreutils
+utils_cv_sys_open_max=${utils_cv_sys_open_max=1019}
+
+# cvs
+cvs_cv_func_printf_ptr=${cvs_cv_func_printf_ptr=yes}
+
+# db (sleepycat)
+db_cv_fcntl_f_setfd=${db_cv_fcntl_f_setfd=yes}
+db_cv_sprintf_count=${db_cv_sprintf_count=yes}
+db_cv_path_ar=${db_cv_path_ar=/usr/bin/ar}
+db_cv_path_chmod=${db_cv_path_chmod=/bin/chmod}
+db_cv_path_cp=${db_cv_path_cp=/bin/cp}
+db_cv_path_ln=${db_cv_path_ln=/bin/ln}
+db_cv_path_mkdir=${db_cv_path_mkdir=/bin/mkdir}
+db_cv_path_ranlib=${db_cv_path_ranlib=/usr/bin/ranlib}
+db_cv_path_rm=${db_cv_path_rm=/bin/rm}
+db_cv_path_sh=${db_cv_path_sh=/bin/sh}
+db_cv_path_strip=${db_cv_path_strip=/usr/bin/strip}
+db_cv_align_t=${db_cv_align_t='unsigned long long'}
+db_cv_alignp_t=${db_cv_alignp_t='unsigned long'}
+db_cv_mutex=${db_cv_mutex=ARM/gcc-assembly}
+db_cv_posixmutexes=${db_cv_posixmutexes=no}
+db_cv_uimutexes=${db_cv_uimutexes=no}
+
+# D-BUS
+ac_cv_func_posix_getpwnam_r=${ac_cv_func_posix_getpwnam_r=yes}
+
+# edb
+db_cv_spinlocks=${db_cv_spinlocks=no}
+
+# ettercap
+ettercap_cv_type_socklen_t=${ettercap_cv_type_socklen_t=yes}
+
+# fget
+compat_cv_func_snprintf_works=${compat_cv_func_snprintf_works=yes}
+compat_cv_func_basename_works=${compat_cv_func_basename_works=no}
+compat_cv_func_dirname_works=${compat_cv_func_dirname_works=no}
+
+# fnmatch
+ac_cv_func_fnmatch_works=${ac_cv_func_fnmatch_works=yes}
+
+# gettext
+am_cv_func_working_getline=${am_cv_func_working_getline=yes}
+
+# gio
+ac_cv_func_getgrgid_r=${ac_cv_func_getgrgid_r=yes}
+
+# glib
+glib_cv_sizeof_gmutex=${glib_cv_sizeof_gmutex=24}
+glib_cv_sizeof_system_thread=${glib_cv_sizeof_system_thread=4}
+glib_cv_stack_grows=${glib_cv_stack_grows=no}
+glib_cv_uscore=${glib_cv_uscore=no}
+glib_cv_use_pid_surrogate=${glib_cv_use_pid_surrogate=yes}
+glib_cv_has__inline=${glib_cv_has__inline=yes}
+glib_cv_has__inline__=${glib_cv_has__inline__=yes}
+glib_cv_hasinline=${glib_cv_hasinline=yes}
+glib_cv_sane_realloc=${glib_cv_sane_realloc=yes}
+glib_cv_sizeof_gmutex=${glib_cv_sizeof_gmutex=24}
+glib_cv_uscore=${glib_cv_uscore=no}
+glib_cv_va_copy=${glib_cv_va_copy=yes}
+glib_cv_va_val_copy=${glib_cv_va_val_copy=yes}
+glib_cv___va_copy=${glib_cv___va_copy=yes}
+glib_cv_rtldglobal_broken=${glib_cv_rtldglobal_broken=no}
+ac_cv_func_getpwuid_r=${ac_cv_func_getpwuid_r=yes}
+glib_cv_sys_pthread_mutex_trylock_posix=${glib_cv_sys_pthread_mutex_trylock_posix=yes}
+glib_cv_sys_pthread_getspecific_posix=${glib_cv_sys_pthread_getspecific_posix=yes}
+glib_cv_sys_pthread_cond_timedwait_posix=${glib_cv_sys_pthread_cond_timedwait_posix=yes}
+
+# glib-2.0
+glib_cv_long_long_format=${glib_cv_long_long_format=ll}
+glib_cv_sizeof_gmutex=${glib_cv_sizeof_gmutex=24}
+glib_cv_sizeof_intmax_t=${glib_cv_sizeof_intmax_t=8}
+glib_cv_sizeof_ptrdiff_t=${glib_cv_sizeof_ptrdiff_t=4}
+glib_cv_sizeof_size_t=${glib_cv_sizeof_size_t=4}
+glib_cv_sizeof_system_thread=${glib_cv_sizeof_system_thread=4}
+glib_cv_sys_use_pid_niceness_surrogate=${glib_cv_sys_use_pid_niceness_surrogate=yes}
+
+#gstreamer
+as_cv_unaligned_access=${as_cv_unaligned_access=no}
+
+# httppc
+ac_cv_strerror_r_SUSv3=${ac_cv_strerror_r_SUSv3=no}
+
+# ipsec-tools
+ac_cv_va_copy=${ac_cv_va_copy=yes}
+ac_cv___va_copy=${ac_cv___va_copy=yes}
+ac_cv_va_val_copy=${ac_cv_va_val_copy=yes}
+racoon_cv_bug_getaddrinfo=${racoon_cv_bug_getaddrinfo=no}
+
+# jikes
+ac_cv_sizeof_wchar_t=4
+
+# lftp
+ac_cv_need_trio=${ac_cv_need_trio=no}
+lftp_cv_va_copy=${lftp_cv_va_copy=yes}
+lftp_cv_va_val_copy=${lftp_cv_va_val_copy=yes}
+lftp_cv___va_copy=${lftp_cv___va_copy=yes}
+
+# libesmtp
+acx_working_snprintf=${acx_working_snprintf=yes}
+
+# libidl
+libIDL_cv_long_long_format=${libIDL_cv_long_long_format=ll}
+
+# libnet
+ac_libnet_have_packet_socket=${ac_libnet_have_packet_socket=yes}
+
+# libpcap
+ac_cv_linux_vers=${ac_cv_linux_vers=2}
+
+# libxfce4util
+with_broken_putenv=${with_broken_putenv=no}
+
+# links
+ac_cv_lib_png_png_create_info_struct=${ac_cv_lib_png_png_create_info_struct=yes}
+
+# mono
+cv_mono_sizeof_sunpath=108
+mono_cv_sizeof_sunpath=108
+
+# mysql
+mysql_cv_func_atomic_sub=${mysql_cv_func_atomic_sub=no}
+mysql_cv_func_atomic_add=${mysql_cv_func_atomic_add=no}
+
+# nano
+ac_cv_regexec_segfault_emptystr=${ac_cv_regexec_segfault_emptystr=no}
+nano_cv_func_regexec_segv_emptystr=${nano_cv_func_regexec_segv_emptystr=no}
+
+# ORBit2
+ac_cv_alignof_CORBA_boolean=1
+ac_cv_alignof_CORBA_char=1
+ac_cv_alignof_CORBA_double=8
+ac_cv_alignof_CORBA_float=4
+ac_cv_alignof_CORBA_long=4
+ac_cv_alignof_CORBA_long_double=8
+ac_cv_alignof_CORBA_long_long=8
+ac_cv_alignof_CORBA_octet=1
+ac_cv_alignof_CORBA_pointer=4
+ac_cv_alignof_CORBA_short=2
+ac_cv_alignof_CORBA_struct=1
+ac_cv_alignof_CORBA_wchar=2
+ac_cv_func_getaddrinfo=${ac_cv_func_getaddrinfo=yes}
+
+# php
+ac_cv_pread=${ac_cv_pread=no}
+ac_cv_pwrite=${ac_cv_pwrite=no}
+php_cv_lib_cookie_io_functions_use_off64_t=${php_cv_lib_cookie_io_functions_use_off64_t=yes}
+cv_php_mbstring_stdarg=${cv_php_mbstring_stdarg=yes}
+
+# rsync
+rsync_cv_HAVE_BROKEN_LARGEFILE=${rsync_cv_HAVE_BROKEN_LARGEFILE=no}
+rsync_cv_HAVE_SOCKETPAIR=${rsync_cv_HAVE_SOCKETPAIR=yes}
+rsync_cv_HAVE_LONGLONG=${rsync_cv_HAVE_LONGLONG=yes}
+rsync_cv_HAVE_OFF64_T=${rsync_cv_HAVE_OFF64_T=no}
+rsync_cv_HAVE_SHORT_INO_T=${rsync_cv_HAVE_SHORT_INO_T=no}
+rsync_cv_HAVE_UNSIGNED_CHAR=${rsync_cv_HAVE_UNSIGNED_CHAR=no}
+rsync_cv_HAVE_BROKEN_READDIR=${rsync_cv_HAVE_BROKEN_READDIR=no}
+rsync_cv_HAVE_GETTIMEOFDAY_TZ=${rsync_cv_HAVE_GETTIMEOFDAY_TZ=yes}
+rsync_cv_HAVE_C99_VSNPRINTF=${rsync_cv_HAVE_C99_VSNPRINTF=yes}
+rsync_cv_HAVE_SECURE_MKSTEMP=${rsync_cv_HAVE_SECURE_MKSTEMP=yes}
+rsync_cv_REPLACE_INET_NTOA=${rsync_cv_REPLACE_INET_NTOA=no}
+rsync_cv_REPLACE_INET_ATON=${rsync_cv_REPLACE_INET_ATON=no}
+
+# screen
+screen_cv_sys_bcopy_overlap=${screen_cv_sys_bcopy_overlap=no}
+screen_cv_sys_memcpy_overlap=${screen_cv_sys_memcpy_overlap=no}
+screen_cv_sys_memmove_overlap=${screen_cv_sys_memmove_overlap=no}
+screen_cv_sys_fifo_broken_impl=${screen_cv_sys_fifo_broken_impl=yes}
+screen_cv_sys_fifo_usable=${screen_cv_sys_fifo_usable=yes}
+screen_cv_sys_select_broken_retval=${screen_cv_sys_select_broken_retval=no}
+screen_cv_sys_sockets_nofs=${screen_cv_sys_sockets_nofs=no}
+screen_cv_sys_sockets_usable=${screen_cv_sys_sockets_usable=yes}
+screen_cv_sys_terminfo_used=${screen_cv_sys_terminfo_used=yes}
+
+# slrn
+slrn_cv___va_copy=${slrn_cv___va_copy=yes}
+slrn_cv_va_copy=${slrn_cv_va_copy=yes}
+slrn_cv_va_val_copy=${slrn_cv_va_val_copy=yes}
+ac_cv_func_realloc_works=${ac_cv_func_realloc_works=yes}
+ac_cv_func_realloc_0_nonnull=${ac_cv_func_realloc_0_nonnull=yes}
+ac_cv_func_malloc_works=${ac_cv_func_malloc_works=yes}
+ac_cv_func_malloc_0_nonnull=${ac_cv_func_malloc_0_nonnull=yes}
+
+# socat
+ac_cv_ispeed_offset=${ac_cv_ispeed_offset=13}
+sc_cv_termios_ispeed=${sc_cv_termios_ispeed=yes}
+
+# ssh
+ac_cv_have_space_d_name_in_struct_dirent=${ac_cv_dirent_have_space_d_name=yes}
+ac_cv_have_broken_snprintf=${ac_cv_have_broken_snprintf=no}
+ac_cv_have_accrights_in_msghdr=${ac_cv_have_accrights_in_msghdr=no}
+ac_cv_have_control_in_msghdr=${ac_cv_have_control_in_msghdr=yes}
+ac_cv_have_openpty_ctty_bug=${ac_cv_have_openpty_ctty_bug=yes}
+
+# startup-notification
+lf_cv_sane_realloc=yes
+
+# sudo
+sudo_cv_uid_t_len=${sudo_cv_uid_t_len=10}
+
+# xffm
+jm_cv_func_working_readdir=yes
+
+# dpkg
+dpkg_cv_va_copy=${ac_cv_va_copy=yes}
+dpkg_cv___va_copy=${ac_cv___va_copy=yes}
+
+# eds-dbus
+ac_cv_libiconv_utf8=${ac_cv_libiconv_utf8=yes}
+ac_cv_func_getpgrp_void=yes
+ac_cv_func_setpgrp_void=yes
+ac_cv_func_setgrent_void=yes
+ac_cv_func_malloc_0_nonnull=yes
+ac_cv_func_malloc_works=yes
+ac_cv_func_posix_getpwuid_r=${ac_cv_func_posix_getpwuid_r=yes}
+ac_cv_func_posix_getgrgid_r=${ac_cv_func_posix_getgrgid_r=yes}
+ac_cv_func_setvbuf_reversed=no
+ac_cv_sizeof___int64=${ac_cv_sizeof___int64=0}
+ac_cv_sizeof_char=${ac_cv_sizeof_char=1}
+ac_cv_sizeof_wchar_t=${ac_cv_sizeof_wchar_t=1}
+ac_cv_sizeof_unsigned_char=${ac_cv_sizeof_unsigned_char=1}
+ac_cv_sizeof_bool=${ac_cv_sizeof_bool=1}
+ac_cv_sizeof_char_p=${ac_cv_sizeof_int_p=4}
+ac_cv_sizeof_int=${ac_cv_sizeof_int=4}
+ac_cv_sizeof_int_p=${ac_cv_sizeof_int_p=4}
+ac_cv_sizeof_long=${ac_cv_sizeof_long=4}
+ac_cv_sizeof_long_int=${ac_cv_sizeof_long_int=4}
+ac_cv_sizeof_long_long=${ac_cv_sizeof_long_long=8}
+ac_cv_sizeof_off_t=${ac_cv_sizeof_off_t=4}
+ac_cv_sizeof_short=${ac_cv_sizeof_short=2}
+ac_cv_sizeof_short_int=${ac_cv_sizeof_short_int=2}
+ac_cv_sizeof_size_t=${ac_cv_sizeof_size_t=4}
+ac_cv_sizeof_void_p=${ac_cv_sizeof_void_p=4}
+ac_cv_sizeof_long_p=${ac_cv_sizeof_long_p=4}
+ac_cv_sizeof_float=${ac_cv_sizeof_float=4}
+ac_cv_sizeof_double=${ac_cv_sizeof_double=8}
+ac_cv_sizeof_long_double=${ac_cv_sizeof_long_double=8}
+ac_cv_sizeof_ptrdiff_t=${glib_cv_sizeof_ptrdiff_t=4}
+ac_cv_sizeof_unsigned_short=${ac_cv_sizeof_unsigned_short=2}
+ac_cv_sizeof_unsigned=${ac_cv_sizeof_unsigned=4}
+ac_cv_sizeof_unsigned_int=${ac_cv_sizeof_unsigned_int=4}
+ac_cv_sizeof_unsigned_long=${ac_cv_sizeof_unsigned_long=4}
+ac_cv_sizeof_unsigned_long_long=${ac_cv_sizeof_unsigned_long_long=8}
+ac_cv_sizeof_signed_char=${ac_cv_sizeof_signed_char=1}
+
+ac_cv_uchar=${ac_cv_uchar=no}
+ac_cv_uint=${ac_cv_uint=yes}
+ac_cv_ulong=${ac_cv_ulong=yes}
+ac_cv_ushort=${ac_cv_ushort=yes}
+ac_cv_time_r_type=${ac_cv_time_r_type=POSIX}
+
+# samba
+samba_cv_BROKEN_NISPLUS_INCLUDE_FILES=${samba_cv_BROKEN_NISPLUS_INCLUDE_FILES=yes}
+samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=${samba_cv_BROKEN_REDHAT_7_SYSTEM_HEADERS=no}
+samba_cv_HAVE_BROKEN_FCNTL64_LOCKS=${samba_cv_HAVE_BROKEN_FCNTL64_LOCKS=no}
+samba_cv_HAVE_BROKEN_GETGROUPS=${samba_cv_HAVE_BROKEN_GETGROUPS=no}
+samba_cv_HAVE_BROKEN_LINUX_SENDFILE=${samba_cv_HAVE_BROKEN_LINUX_SENDFILE=yes}
+samba_cv_HAVE_BROKEN_READDIR=${samba_cv_HAVE_BROKEN_READDIR=yes}
+samba_cv_HAVE_BROKEN_READDIR_NAME=${samba_cv_HAVE_BROKEN_READDIR_NAME=no}
+samba_cv_HAVE_C99_VSNPRINTF=${samba_cv_HAVE_C99_VSNPRINTF=yes}
+samba_cv_HAVE_DEV64_T=${samba_cv_HAVE_DEV64_T=no}
+samba_cv_HAVE_DEVICE_MAJOR_FN=${samba_cv_HAVE_DEVICE_MAJOR_FN=yes}
+samba_cv_HAVE_DEVICE_MINOR_FN=${samba_cv_HAVE_DEVICE_MINOR_FN=yes}
+samba_cv_HAVE_DQB_FSOFTLIMIT=${samba_cv_HAVE_DQB_FSOFTLIMIT=no}
+samba_cv_HAVE_EXPLICIT_LARGEFILE_SUPPORT=${samba_cv_HAVE_EXPLICIT_LARGEFILE_SUPPORT=yes}
+samba_cv_HAVE_FAM_H=${samba_cv_HAVE_FAM_H=no}
+samba_cv_HAVE_FCNTL_LOCK=${samba_cv_HAVE_FCNTL_LOCK=yes}
+samba_cv_HAVE_FTRUNCATE_EXTEND=${samba_cv_HAVE_FTRUNCATE_EXTEND=yes}
+samba_cv_HAVE_FUNCTION_MACRO=${samba_cv_HAVE_FUNCTION_MACRO=yes}
+samba_cv_HAVE_GETTIMEOFDAY_TZ=${samba_cv_HAVE_GETTIMEOFDAY_TZ=yes}
+samba_cv_HAVE_INO64_T=${samba_cv_HAVE_INO64_T=no}
+samba_cv_HAVE_INT16_FROM_RPC_RPC_H=${samba_cv_HAVE_INT16_FROM_RPC_RPC_H=no}
+samba_cv_HAVE_INT32_FROM_RPC_RPC_H=${samba_cv_HAVE_INT32_FROM_RPC_RPC_H=no}
+samba_cv_HAVE_KERNEL_CHANGE_NOTIFY=${samba_cv_HAVE_KERNEL_CHANGE_NOTIFY=yes}
+samba_cv_HAVE_KERNEL_OPLOCKS_IRIX=${samba_cv_HAVE_KERNEL_OPLOCKS_IRIX=no}
+samba_cv_HAVE_KERNEL_OPLOCKS_LINUX=${samba_cv_HAVE_KERNEL_OPLOCKS_LINUX=yes}
+samba_cv_HAVE_KERNEL_SHARE_MODES=${samba_cv_HAVE_KERNEL_SHARE_MODES=yes}
+samba_cv_HAVE_MAKEDEV=${samba_cv_HAVE_MAKEDEV=yes}
+samba_cv_HAVE_MMAP=${samba_cv_HAVE_MMAP=yes}
+samba_cv_HAVE_NATIVE_ICONV=${samba_cv_HAVE_NATIVE_ICONV=yes}
+samba_cv_HAVE_OFF64_T=${samba_cv_HAVE_OFF64_T=no}
+samba_cv_HAVE_ROOT=${samba_cv_HAVE_ROOT=yes}
+samba_cv_HAVE_RPC_AUTH_ERROR_CONFLICT=${samba_cv_HAVE_RPC_AUTH_ERROR_CONFLICT=no}
+samba_cv_HAVE_SECURE_MKSTEMP=${samba_cv_HAVE_SECURE_MKSTEMP=yes}
+samba_cv_HAVE_SENDFILE=${samba_cv_HAVE_SENDFILE=yes}
+samba_cv_HAVE_SENDFILE64=${samba_cv_HAVE_SENDFILE64=yes}
+samba_cv_HAVE_SOCK_SIN_LEN=${samba_cv_HAVE_SOCK_SIN_LEN=no}
+samba_cv_HAVE_STAT_ST_BLKSIZE=${samba_cv_HAVE_STAT_ST_BLKSIZE=yes}
+samba_cv_HAVE_STAT_ST_BLOCKS=${samba_cv_HAVE_STAT_ST_BLOCKS=yes}
+samba_cv_HAVE_STRUCT_DIR64=${samba_cv_HAVE_STRUCT_DIR64=no}
+samba_cv_HAVE_STRUCT_DIRENT64=${samba_cv_HAVE_STRUCT_DIRENT64=yes}
+samba_cv_HAVE_STRUCT_FLOCK64=${samba_cv_HAVE_STRUCT_FLOCK64=yes}
+samba_cv_HAVE_TRUNCATED_SALT=${samba_cv_HAVE_TRUNCATED_SALT=no}
+samba_cv_HAVE_UINT16_FROM_RPC_RPC_H=${samba_cv_HAVE_UINT16_FROM_RPC_RPC_H=no}
+samba_cv_HAVE_UINT32_FROM_RPC_RPC_H=${samba_cv_HAVE_UINT32_FROM_RPC_RPC_H=no}
+samba_cv_HAVE_UNSIGNED_CHAR=${samba_cv_HAVE_UNSIGNED_CHAR=yes}
+samba_cv_HAVE_UTIMBUF=${samba_cv_HAVE_UTIMBUF=yes}
+samba_cv_HAVE_UT_UT_ADDR=${samba_cv_HAVE_UT_UT_ADDR=yes}
+samba_cv_HAVE_UT_UT_EXIT=${samba_cv_HAVE_UT_UT_EXIT=yes}
+samba_cv_HAVE_UT_UT_HOST=${samba_cv_HAVE_UT_UT_HOST=yes}
+samba_cv_HAVE_UT_UT_ID=${samba_cv_HAVE_UT_UT_ID=yes}
+samba_cv_HAVE_UT_UT_NAME=${samba_cv_HAVE_UT_UT_NAME=yes}
+samba_cv_HAVE_UT_UT_PID=${samba_cv_HAVE_UT_UT_PID=yes}
+samba_cv_HAVE_UT_UT_TIME=${samba_cv_HAVE_UT_UT_TIME=yes}
+samba_cv_HAVE_UT_UT_TV=${samba_cv_HAVE_UT_UT_TV=yes}
+samba_cv_HAVE_UT_UT_TYPE=${samba_cv_HAVE_UT_UT_TYPE=yes}
+samba_cv_HAVE_UT_UT_USER=${samba_cv_HAVE_UT_UT_USER=yes}
+samba_cv_HAVE_UX_UT_SYSLEN=${samba_cv_HAVE_UX_UT_SYSLEN=no}
+samba_cv_HAVE_VA_COPY=${samba_cv_HAVE_VA_COPY=yes}
+samba_cv_HAVE_WORKING_AF_LOCAL=${samba_cv_HAVE_WORKING_AF_LOCAL=yes}
+samba_cv_HAVE_Werror=${samba_cv_HAVE_Werror=yes}
+samba_cv_PUTUTLINE_RETURNS_UTMP=${samba_cv_PUTUTLINE_RETURNS_UTMP=yes}
+samba_cv_QUOTA_WORKS=${samba_cv_QUOTA_WORKS=yes}
+samba_cv_REALPATH_TAKES_NULL=${samba_cv_REALPATH_TAKES_NULL=yes}
+samba_cv_REPLACE_GETPASS=${samba_cv_REPLACE_GETPASS=yes}
+samba_cv_REPLACE_INET_NTOA=${samba_cv_REPLACE_INET_NTOA=no}
+samba_cv_REPLACE_READDIR=${samba_cv_REPLACE_READDIR=no}
+samba_cv_RUN_QUOTA_TESTS=${samba_cv_RUN_QUOTA_TESTS=yes}
+samba_cv_SEEKDIR_RETURNS_VOID=${samba_cv_SEEKDIR_RETURNS_VOID=yes}
+samba_cv_SIZEOF_DEV_T=${samba_cv_SIZEOF_DEV_T=yes}
+samba_cv_SIZEOF_INO_T=${samba_cv_SIZEOF_INO_T=yes}
+samba_cv_SIZEOF_OFF_T=${samba_cv_SIZEOF_OFF_T=yes}
+samba_cv_SYSCONF_SC_NGROUPS_MAX=${samba_cv_SYSCONF_SC_NGROUPS_MAX=yes}
+samba_cv_SYSCONF_SC_NPROCESSORS_ONLN=${samba_cv_SYSCONF_SC_NPROCESSORS_ONLN=yes}
+samba_cv_SYSCONF_SC_NPROC_ONLN=${samba_cv_SYSCONF_SC_NPROC_ONLN=no}
+samba_cv_SYSCONF_SC_PAGESIZE=${samba_cv_SYSCONF_SC_PAGESIZE=yes}
+samba_cv_SYSQUOTA_FOUND=${samba_cv_SYSQUOTA_FOUND=yes}
+samba_cv_SYSQUOTA_WORKS=${samba_cv_SYSQUOTA_WORKS=yes}
+samba_cv_SYSQUOTA_WORKS_XFS=${samba_cv_SYSQUOTA_WORKS_XFS=yes}
+samba_cv_TRY_QUOTAS=${samba_cv_TRY_QUOTAS=no}
+samba_cv_TRY_SYS_QUOTAS=${samba_cv_TRY_SYS_QUOTAS=yes}
+samba_cv_USE_SETRESUID=${samba_cv_USE_SETRESUID=yes}
+samba_cv_WE_USE_SYS_QUOTAS=${samba_cv_WE_USE_SYS_QUOTAS=yes}
+samba_cv_WITH_AFS=${samba_cv_WITH_AFS=no}
+samba_cv_WITH_FAKE_KASERVER=${samba_cv_WITH_FAKE_KASERVER=no}
+samba_cv_WITH_QUOTAS=${samba_cv_WITH_QUOTAS=auto}
+samba_cv_WITH_SYS_QUOTAS=${samba_cv_WITH_SYS_QUOTAS=auto}
+samba_cv_WITH_VFS_AFSACL=${samba_cv_WITH_VFS_AFSACL=no}
+samba_cv_compiler_supports_ll=${samba_cv_compiler_supports_ll=yes}
+samba_cv_found_xfs_header=${samba_cv_found_xfs_header=yes}
+samba_cv_have_longlong=${samba_cv_have_longlong=yes}
+samba_cv_have_setresgid=${samba_cv_have_setresgid=yes}
+samba_cv_have_setresuid=${samba_cv_have_setresuid=yes}
+samba_cv_immediate_structures=${samba_cv_immediate_structures=yes}
+samba_cv_optimize_out_funcation_calls=${samba_cv_optimize_out_funcation_calls=yes}
+samba_cv_sig_atomic_t=${samba_cv_sig_atomic_t=yes}
+samba_cv_socklen_t=${samba_cv_socklen_t=yes}
+samba_cv_struct_timespec=${samba_cv_struct_timespec=yes}
+samba_cv_sysquotas_file=${samba_cv_sysquotas_file=lib/sysquotas_linux.c}
+samba_cv_unixsocket=${samba_cv_unixsocket=yes}
+samba_cv_volatile=${samba_cv_volatile=yes}
+
+#older sambe defines
+samba_cv_USE_SETEUID=${samba_cv_USE_SETEUID=yes}
+samba_cv_USE_SETREUID=${samba_cv_USE_SETREUID=yes}
+samba_cv_USE_SETUIDX=${samba_cv_USE_SETUIDX=yes}
+samba_cv_LINUX_LFS_SUPPORT=${samba_cv_LINUX_LFS_SUPPORT=yes}
+
+# clamav
+clamav_av_func_working_snprintf_long=${clamav_av_func_working_snprintf_long=yes}
+clamav_av_have_in_port_t=${clamav_av_have_in_port_t=yes}
+clamav_av_have_in_addr_t=${clamav_av_have_in_addr_t=yes}
+ac_cv_func_mmap_fixed_mapped=${ac_cv_func_mmap_fixed_mapped=yes}
+
+#dbus
+ac_cv_have_abstract_sockets=${ac_cv_have_abstract_sockets=yes}
+
+# lftp
+ac_cv_file___dev_ptc_=yes
+
+# guile
+ac_cv_func_pthread_attr_getstack=${ac_cv_func_pthread_attr_getstack=yes}
+
+# gnet
+ac_cv_member_struct_sockaddr_sa_len=${ac_cv_member_struct_sockaddr_sa_len=no}
+ac_cv_gnet_have_abstract_sockets=${ac_cv_gnet_have_abstract_sockets=no}
+gnet_sockaddr_family_field_name=${gnet_sockaddr_family_field_name=ss_family}
diff --git a/scripts/contrib/devtool-stress.py b/scripts/contrib/devtool-stress.py
new file mode 100755
index 0000000..4b35fc9
--- /dev/null
+++ b/scripts/contrib/devtool-stress.py
@@ -0,0 +1,241 @@
+#!/usr/bin/env python
+
+# devtool stress tester
+#
+# Written by: Paul Eggleton <paul.eggleton at linux.intel.com>
+#
+# Copyright 2015 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+#
+
+import sys
+import os
+import os.path
+import subprocess
+import re
+import argparse
+import logging
+import tempfile
+import shutil
+import signal
+import fnmatch
+
+scripts_lib_path = os.path.abspath(os.path.join(os.path.dirname(os.path.realpath(__file__)), '..', 'lib'))
+sys.path.insert(0, scripts_lib_path)
+import scriptutils
+logger = scriptutils.logger_create('devtool-stress')
+
+def select_recipes(args):
+ import bb.tinfoil
+ tinfoil = bb.tinfoil.Tinfoil()
+ tinfoil.prepare(False)
+
+ pkg_pn = tinfoil.cooker.recipecache.pkg_pn
+ (latest_versions, preferred_versions) = bb.providers.findProviders(tinfoil.config_data, tinfoil.cooker.recipecache, pkg_pn)
+
+ skip_classes = args.skip_classes.split(',')
+
+ recipelist = []
+ for pn in sorted(pkg_pn):
+ pref = preferred_versions[pn]
+ inherits = [os.path.splitext(os.path.basename(f))[0] for f in tinfoil.cooker.recipecache.inherits[pref[1]]]
+ for cls in skip_classes:
+ if cls in inherits:
+ break
+ else:
+ recipelist.append(pn)
+
+ tinfoil.shutdown()
+
+ resume_from = args.resume_from
+ if resume_from:
+ if not resume_from in recipelist:
+ print('%s is not a testable recipe' % resume_from)
+ return 1
+ if args.only:
+ only = args.only.split(',')
+ for onlyitem in only:
+ for pn in recipelist:
+ if fnmatch.fnmatch(pn, onlyitem):
+ break
+ else:
+ print('%s does not match any testable recipe' % onlyitem)
+ return 1
+ else:
+ only = None
+ if args.skip:
+ skip = args.skip.split(',')
+ else:
+ skip = []
+
+ recipes = []
+ for pn in recipelist:
+ if resume_from:
+ if pn == resume_from:
+ resume_from = None
+ else:
+ continue
+
+ if args.only:
+ for item in only:
+ if fnmatch.fnmatch(pn, item):
+ break
+ else:
+ continue
+
+ skipit = False
+ for item in skip:
+ if fnmatch.fnmatch(pn, item):
+ skipit = True
+ if skipit:
+ continue
+
+ recipes.append(pn)
+
+ return recipes
+
+
+def stress_extract(args):
+ import bb.process
+
+ recipes = select_recipes(args)
+
+ failures = 0
+ tmpdir = tempfile.mkdtemp()
+ os.setpgrp()
+ try:
+ for pn in recipes:
+ sys.stdout.write('Testing %s ' % (pn + ' ').ljust(40, '.'))
+ sys.stdout.flush()
+ failed = False
+
+ srctree = os.path.join(tmpdir, pn)
+ try:
+ bb.process.run('devtool extract %s %s' % (pn, srctree))
+ except bb.process.CmdError as exc:
+ failed = True
+ with open('stress_%s_extract.log' % pn, 'w') as f:
+ f.write(str(exc))
+
+ if os.path.exists(srctree):
+ shutil.rmtree(srctree)
+
+ if failed:
+ print('failed')
+ failures += 1
+ else:
+ print('ok')
+ except KeyboardInterrupt:
+ # We want any child processes killed. This is crude, but effective.
+ os.killpg(0, signal.SIGTERM)
+
+ if failures:
+ return 1
+ else:
+ return 0
+
+
+def stress_modify(args):
+ import bb.process
+
+ recipes = select_recipes(args)
+
+ failures = 0
+ tmpdir = tempfile.mkdtemp()
+ os.setpgrp()
+ try:
+ for pn in recipes:
+ sys.stdout.write('Testing %s ' % (pn + ' ').ljust(40, '.'))
+ sys.stdout.flush()
+ failed = False
+ reset = True
+
+ srctree = os.path.join(tmpdir, pn)
+ try:
+ bb.process.run('devtool modify -x %s %s' % (pn, srctree))
+ except bb.process.CmdError as exc:
+ with open('stress_%s_modify.log' % pn, 'w') as f:
+ f.write(str(exc))
+ failed = 'modify'
+ reset = False
+
+ if not failed:
+ try:
+ bb.process.run('bitbake -c install %s' % pn)
+ except bb.process.CmdError as exc:
+ with open('stress_%s_install.log' % pn, 'w') as f:
+ f.write(str(exc))
+ failed = 'build'
+ if reset:
+ try:
+ bb.process.run('devtool reset %s' % pn)
+ except bb.process.CmdError as exc:
+ print('devtool reset failed: %s' % str(exc))
+ break
+
+ if os.path.exists(srctree):
+ shutil.rmtree(srctree)
+
+ if failed:
+ print('failed (%s)' % failed)
+ failures += 1
+ else:
+ print('ok')
+ except KeyboardInterrupt:
+ # We want any child processes killed. This is crude, but effective.
+ os.killpg(0, signal.SIGTERM)
+
+ if failures:
+ return 1
+ else:
+ return 0
+
+
+def main():
+ parser = argparse.ArgumentParser(description="devtool stress tester",
+ epilog="Use %(prog)s <subcommand> --help to get help on a specific command")
+ parser.add_argument('-d', '--debug', help='Enable debug output', action='store_true')
+ parser.add_argument('-r', '--resume-from', help='Resume from specified recipe', metavar='PN')
+ parser.add_argument('-o', '--only', help='Only test specified recipes (comma-separated without spaces, wildcards allowed)', metavar='PNLIST')
+ parser.add_argument('-s', '--skip', help='Skip specified recipes (comma-separated without spaces, wildcards allowed)', metavar='PNLIST')
+ parser.add_argument('-c', '--skip-classes', help='Skip recipes inheriting specified classes (comma-separated) - default %(default)s', metavar='CLASSLIST', default='native,nativesdk,cross,cross-canadian,image,populate_sdk,meta,packagegroup')
+ subparsers = parser.add_subparsers(title='subcommands', metavar='<subcommand>')
+
+ parser_modify = subparsers.add_parser('modify',
+ help='Run "devtool modify" followed by a build with bitbake on matching recipes',
+ description='Runs "devtool modify" followed by a build with bitbake on matching recipes')
+ parser_modify.set_defaults(func=stress_modify)
+
+ parser_extract = subparsers.add_parser('extract',
+ help='Run "devtool extract" on matching recipes',
+ description='Runs "devtool extract" on matching recipes')
+ parser_extract.set_defaults(func=stress_extract)
+
+ args = parser.parse_args()
+
+ if args.debug:
+ logger.setLevel(logging.DEBUG)
+
+ import scriptpath
+ bitbakepath = scriptpath.add_bitbake_lib_path()
+ if not bitbakepath:
+ logger.error("Unable to find bitbake by searching parent directory of this script or PATH")
+ return 1
+ logger.debug('Found bitbake path: %s' % bitbakepath)
+
+ ret = args.func(args)
+
+if __name__ == "__main__":
+ main()
diff --git a/scripts/contrib/python/generate-manifest-3.4.py b/scripts/contrib/python/generate-manifest-3.4.py
index 06eecdc..ca2fa61 100755
--- a/scripts/contrib/python/generate-manifest-3.4.py
+++ b/scripts/contrib/python/generate-manifest-3.4.py
@@ -238,7 +238,7 @@ if __name__ == "__main__":
m.addPackage( "${PN}-db", "Python file-based database support", "${PN}-core",
"anydbm.* dumbdbm.* whichdb.* dbm lib-dynload/_dbm.*.so" )
- m.addPackage( "${PN}-debugger", "Python debugger", "${PN}-core ${PN}-io ${PN}-lang ${PN}-re ${PN}-stringold ${PN}-shell ${PN}-pprint",
+ m.addPackage( "${PN}-debugger", "Python debugger", "${PN}-core ${PN}-io ${PN}-lang ${PN}-re ${PN}-stringold ${PN}-shell ${PN}-pprint ${PN}-importlib ${PN}-pkgutil",
"bdb.* pdb.*" )
m.addPackage( "${PN}-difflib", "Python helpers for computing deltas between objects", "${PN}-lang ${PN}-re",
diff --git a/scripts/devtool b/scripts/devtool
index 87df951..e4d9db3 100755
--- a/scripts/devtool
+++ b/scripts/devtool
@@ -221,9 +221,6 @@ def main():
if not config.read():
return -1
- # We need to be in this directory or we won't be able to initialise tinfoil
- os.chdir(basepath)
-
bitbake_subdir = config.get('General', 'bitbake_subdir', '')
if bitbake_subdir:
# Normally set for use within the SDK
@@ -244,7 +241,7 @@ def main():
scriptutils.logger_setup_color(logger, global_args.color)
if global_args.bbpath is None:
- tinfoil = setup_tinfoil(config_only=True)
+ tinfoil = setup_tinfoil(config_only=True, basepath=basepath)
global_args.bbpath = tinfoil.config_data.getVar('BBPATH', True)
else:
tinfoil = None
diff --git a/scripts/gen-lockedsig-cache b/scripts/gen-lockedsig-cache
index c93b2c0..6aa3614 100755
--- a/scripts/gen-lockedsig-cache
+++ b/scripts/gen-lockedsig-cache
@@ -1,7 +1,4 @@
#!/usr/bin/env python
-#
-# gen-lockedsig-cache <locked-sigs.inc> <input-cachedir> <output-cachedir>
-#
import os
import sys
@@ -18,14 +15,17 @@ def mkdir(d):
if len(sys.argv) < 3:
print("Incorrect number of arguments specified")
+ print("syntax: gen-lockedsig-cache <locked-sigs.inc> <input-cachedir> <output-cachedir>")
sys.exit(1)
+print('Reading %s' % sys.argv[1])
sigs = []
with open(sys.argv[1]) as f:
for l in f.readlines():
if ":" in l:
sigs.append(l.split(":")[2].split()[0])
+print('Gathering file list')
files = set()
for s in sigs:
p = sys.argv[2] + "/" + s[:2] + "/*" + s + "*"
@@ -33,14 +33,25 @@ for s in sigs:
p = sys.argv[2] + "/*/" + s[:2] + "/*" + s + "*"
files |= set(glob.glob(p))
+print('Processing files')
for f in files:
- dst = f.replace(sys.argv[2], sys.argv[3])
+ sys.stdout.write('Processing %s... ' % f)
+ _, ext = os.path.splitext(f)
+ if not ext in ['.tgz', '.siginfo', '.sig']:
+ # Most likely a temp file, skip it
+ print('skipping')
+ continue
+ dst = os.path.join(sys.argv[3], os.path.relpath(f, sys.argv[2]))
destdir = os.path.dirname(dst)
mkdir(destdir)
if os.path.exists(dst):
os.remove(dst)
if (os.stat(f).st_dev == os.stat(destdir).st_dev):
+ print('linking')
os.link(f, dst)
else:
+ print('copying')
shutil.copyfile(f, dst)
+
+print('Done!')
diff --git a/scripts/lib/bsp/engine.py b/scripts/lib/bsp/engine.py
index 7d6be23..d0d5d72 100644
--- a/scripts/lib/bsp/engine.py
+++ b/scripts/lib/bsp/engine.py
@@ -1684,9 +1684,9 @@ def yocto_layer_list_properties(arch, scripts_path, properties_file, expand_comm
print "Couldn't open properties file %s for writing, exiting" % properties_file
sys.exit(1)
- json.dump(properties, of)
-
- print_dict(properties)
+ json.dump(properties, of, indent=1)
+ else:
+ print_dict(properties)
def split_nested_property(property):
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-preempt-rt.scc b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-preempt-rt.scc
index ca5f3b5..ea6966c 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-preempt-rt.scc
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-preempt-rt.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-preempt-rt.scc
define KMACHINE {{=machine}}
-define KTYPE preempt-rt
+
define KARCH arm
include {{=map_preempt_rt_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-standard.scc b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-standard.scc
index 9014c2c..405972d 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-standard.scc
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-standard.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-standard.scc
define KMACHINE {{=machine}}
-define KTYPE standard
+
define KARCH arm
include {{=map_standard_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-tiny.scc b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-tiny.scc
index 3f1c252..921b7e7 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-tiny.scc
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/files/machine-tiny.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-tiny.scc
define KMACHINE {{=machine}}
-define KTYPE tiny
+
define KARCH arm
include {{=map_tiny_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/kernel-list.noinstall b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/kernel-list.noinstall
index 811d695..7676ca8 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/kernel-list.noinstall
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/kernel-list.noinstall
@@ -1,5 +1,5 @@
{{ if kernel_choice != "custom": }}
-{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (3.19) kernel? (y/n)" default:"y"}}
+{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (4.1) kernel? (y/n)" default:"y"}}
{{ if kernel_choice != "custom" and use_default_kernel == "n": }}
-{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_3.19"}}
+{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_4.1"}}
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-dev.bbappend b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-dev.bbappend
index 2fa6231..c336007 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-dev.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-dev.bbappend
@@ -21,6 +21,5 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
index 5f8db03..c56e9e5 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-preempt-rt.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "f35992f80c81dc5fa1a97165dfd5cbb84661f7cb"
-#SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "1b534b2f8bbe9b8a773268cfa30a4850346f6f5f"
+SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
index 471ccbc..15b9b1b 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
index 4de82fa..caefcfc 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
new file mode 100644
index 0000000..0a47a4e
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
@@ -0,0 +1,33 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto-tiny_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-tiny.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-patches.scc \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_3.14.bbappend
index 1e1cc51..5af490d 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_3.19.bbappend
index 97e1bb8..c327d16 100644
--- a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_3.19.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_4.1.bbappend
new file mode 100644
index 0000000..2d3d073
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/arm/recipes-kernel/linux/linux-yocto_4.1.bbappend
@@ -0,0 +1,32 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-standard.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/conf/machine/machine.conf b/scripts/lib/bsp/substrate/target/arch/i386/conf/machine/machine.conf
index 7189341..1739ab3 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/conf/machine/machine.conf
+++ b/scripts/lib/bsp/substrate/target/arch/i386/conf/machine/machine.conf
@@ -33,7 +33,7 @@ MACHINE_FEATURES += "wifi efi pcbios"
{{ input type:"boolean" name:"xserver" prio:"50" msg:"Do you need support for X? (y/n)" default:"y" }}
-{{ if xserver == "y" and (kernel_choice == "linux-yocto_3.19" or kernel_choice == "linux-yocto_3.14"): }}
+{{ if xserver == "y" and (kernel_choice == "linux-yocto_4.1" or kernel_choice == "linux-yocto_3.19" or kernel_choice == "linux-yocto_3.14"): }}
{{ input type:"choicelist" name:"xserver_choice" prio:"50" msg:"Please select an xserver for this machine:" default:"xserver_vesa" }}
{{ input type:"choice" val:"xserver_vesa" msg:"VESA xserver support" }}
{{ input type:"choice" val:"xserver_i915" msg:"i915 xserver support" }}
@@ -49,7 +49,7 @@ MACHINE_FEATURES += "wifi efi pcbios"
{{ input type:"choice" val:"xserver_fbdev" msg:"fbdev xserver support" }}
{{ input type:"choice" val:"xserver_modesetting" msg:"modesetting xserver support" }}
-{{ if xserver == "y" and kernel_choice != "linux-yocto_3.19" and kernel_choice != "linux-yocto_3.14" and kernel_choice != "custom": xserver_choice = "xserver_i915" }}
+{{ if xserver == "y" and kernel_choice != "linux-yocto_4.1" and kernel_choice != "linux-yocto_3.19" and kernel_choice != "linux-yocto_3.14" and kernel_choice != "custom": xserver_choice = "xserver_i915" }}
{{ if xserver == "y": }}
XSERVER ?= "${XSERVER_X86_BASE} \
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-preempt-rt.scc b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-preempt-rt.scc
index 619ee3f..7146e23 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-preempt-rt.scc
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-preempt-rt.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-preempt-rt.scc
define KMACHINE {{=machine}}
-define KTYPE preempt-rt
+
define KARCH i386
include {{=map_preempt_rt_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-standard.scc b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-standard.scc
index 682012f..67a54be 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-standard.scc
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-standard.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-standard.scc
define KMACHINE {{=machine}}
-define KTYPE standard
+
define KARCH i386
include {{=map_standard_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-tiny.scc b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-tiny.scc
index cc75196..91373b3 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-tiny.scc
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/files/machine-tiny.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-tiny.scc
define KMACHINE {{=machine}}
-define KTYPE tiny
+
define KARCH i386
include {{=map_tiny_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/kernel-list.noinstall b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/kernel-list.noinstall
index 811d695..7676ca8 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/kernel-list.noinstall
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/kernel-list.noinstall
@@ -1,5 +1,5 @@
{{ if kernel_choice != "custom": }}
-{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (3.19) kernel? (y/n)" default:"y"}}
+{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (4.1) kernel? (y/n)" default:"y"}}
{{ if kernel_choice != "custom" and use_default_kernel == "n": }}
-{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_3.19"}}
+{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_4.1"}}
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-dev.bbappend b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-dev.bbappend
index 2fa6231..c336007 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-dev.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-dev.bbappend
@@ -21,6 +21,5 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
index 5f8db03..c56e9e5 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-preempt-rt.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "f35992f80c81dc5fa1a97165dfd5cbb84661f7cb"
-#SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "1b534b2f8bbe9b8a773268cfa30a4850346f6f5f"
+SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
index 471ccbc..15b9b1b 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
index 4de82fa..caefcfc 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
new file mode 100644
index 0000000..0a47a4e
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
@@ -0,0 +1,33 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto-tiny_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-tiny.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-patches.scc \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_3.14.bbappend
index fbb49ed..41325ca 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_3.19.bbappend
index 0c2cb5a..b471742 100644
--- a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_3.19.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_4.1.bbappend
new file mode 100644
index 0000000..761b9c6
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/i386/recipes-kernel/linux/linux-yocto_4.1.bbappend
@@ -0,0 +1,32 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard:standard/common-pc" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard:standard/common-pc" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-standard.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-preempt-rt.scc b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-preempt-rt.scc
index 176190c..a128255 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-preempt-rt.scc
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-preempt-rt.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-preempt-rt.scc
define KMACHINE {{=machine}}
-define KTYPE preempt-rt
+
define KARCH mips
include {{=map_preempt_rt_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-standard.scc b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-standard.scc
index f05dd85..7c9dc52 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-standard.scc
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-standard.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-standard.scc
define KMACHINE {{=machine}}
-define KTYPE standard
+
define KARCH mips
include {{=map_standard_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-tiny.scc b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-tiny.scc
index f71c775..64f395b 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-tiny.scc
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/files/machine-tiny.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-tiny.scc
define KMACHINE {{=machine}}
-define KTYPE tiny
+
define KARCH mips
include {{=map_tiny_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/kernel-list.noinstall b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/kernel-list.noinstall
index 811d695..7676ca8 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/kernel-list.noinstall
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/kernel-list.noinstall
@@ -1,5 +1,5 @@
{{ if kernel_choice != "custom": }}
-{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (3.19) kernel? (y/n)" default:"y"}}
+{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (4.1) kernel? (y/n)" default:"y"}}
{{ if kernel_choice != "custom" and use_default_kernel == "n": }}
-{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_3.19"}}
+{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_4.1"}}
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-dev.bbappend b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-dev.bbappend
index 2fa6231..c336007 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-dev.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-dev.bbappend
@@ -21,6 +21,5 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
index 5f8db03..c56e9e5 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-preempt-rt.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "f35992f80c81dc5fa1a97165dfd5cbb84661f7cb"
-#SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "1b534b2f8bbe9b8a773268cfa30a4850346f6f5f"
+SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
index c7e7989..7c6bc7f 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
index a9ba0ae..7f20379 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
new file mode 100644
index 0000000..0a47a4e
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
@@ -0,0 +1,33 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto-tiny_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-tiny.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-patches.scc \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_3.14.bbappend
index 1e1cc51..5af490d 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_3.19.bbappend
index 97e1bb8..c327d16 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_3.19.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_4.1.bbappend
new file mode 100644
index 0000000..1e99a04
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/mips/recipes-kernel/linux/linux-yocto_4.1.bbappend
@@ -0,0 +1,32 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-standard.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-preempt-rt.scc b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-preempt-rt.scc
index 176190c..a128255 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-preempt-rt.scc
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-preempt-rt.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-preempt-rt.scc
define KMACHINE {{=machine}}
-define KTYPE preempt-rt
+
define KARCH mips
include {{=map_preempt_rt_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-standard.scc b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-standard.scc
index f05dd85..7c9dc52 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-standard.scc
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-standard.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-standard.scc
define KMACHINE {{=machine}}
-define KTYPE standard
+
define KARCH mips
include {{=map_standard_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-tiny.scc b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-tiny.scc
index f71c775..64f395b 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-tiny.scc
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/files/machine-tiny.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-tiny.scc
define KMACHINE {{=machine}}
-define KTYPE tiny
+
define KARCH mips
include {{=map_tiny_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/kernel-list.noinstall b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/kernel-list.noinstall
index a04e6c7..7676ca8 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/kernel-list.noinstall
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/kernel-list.noinstall
@@ -1,5 +1,5 @@
{{ if kernel_choice != "custom": }}
-{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (3.14) kernel? (y/n)" default:"y"}}
+{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (4.1) kernel? (y/n)" default:"y"}}
{{ if kernel_choice != "custom" and use_default_kernel == "n": }}
-{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_3.14"}}
+{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_4.1"}}
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-dev.bbappend b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-dev.bbappend
index 2fa6231..c336007 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-dev.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-dev.bbappend
@@ -21,6 +21,5 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
index 5f8db03..c56e9e5 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-preempt-rt.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "f35992f80c81dc5fa1a97165dfd5cbb84661f7cb"
-#SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "1b534b2f8bbe9b8a773268cfa30a4850346f6f5f"
+SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
index c7e7989..7c6bc7f 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
index a9ba0ae..7f20379 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
new file mode 100644
index 0000000..0a47a4e
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
@@ -0,0 +1,33 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto-tiny_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-tiny.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-patches.scc \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_3.14.bbappend
index fb6cdef..858d5fc 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "dbe5b52e93ff114b2c0f5da6f6af91f52c18f2b8"
SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "6eddbf47875ef48ddc5864957a7b63363100782b"
-#LINUX_VERSION = "3.14"
\ No newline at end of file
+#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_3.19.bbappend
index 134aeec..f084531 100644
--- a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_3.19.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_4.1.bbappend
new file mode 100644
index 0000000..01a046c
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/mips64/recipes-kernel/linux/linux-yocto_4.1.bbappend
@@ -0,0 +1,32 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/edgerouter" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/edgerouter" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-standard.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/conf/machine/machine.conf b/scripts/lib/bsp/substrate/target/arch/powerpc/conf/machine/machine.conf
index c94f7f9..018146f 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/conf/machine/machine.conf
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/conf/machine/machine.conf
@@ -74,7 +74,7 @@ XSERVER ?= "xserver-xorg \
xf86-input-evdev \
xf86-video-fbdev"
-PREFERRED_VERSION_u-boot ?= "v2015.01%"
+PREFERRED_VERSION_u-boot ?= "v2015.07%"
{{ input type:"edit" name:"uboot_entrypoint" prio:"40" msg:"Please specify a value for UBOOT_ENTRYPOINT:" default:"0x00000000" }}
UBOOT_ENTRYPOINT = "{{=uboot_entrypoint}}"
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-preempt-rt.scc b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-preempt-rt.scc
index 40c9267..91ccfb8 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-preempt-rt.scc
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-preempt-rt.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-preempt-rt.scc
define KMACHINE {{=machine}}
-define KTYPE preempt-rt
+
define KARCH powerpc
include {{=map_preempt_rt_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-standard.scc b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-standard.scc
index 7a1d35b..89b344f 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-standard.scc
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-standard.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-standard.scc
define KMACHINE {{=machine}}
-define KTYPE standard
+
define KARCH powerpc
include {{=map_standard_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-tiny.scc b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-tiny.scc
index 1bf94b2..2701fd8 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-tiny.scc
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/files/machine-tiny.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-tiny.scc
define KMACHINE {{=machine}}
-define KTYPE tiny
+
define KARCH powerpc
include {{=map_tiny_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/kernel-list.noinstall b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/kernel-list.noinstall
index 811d695..7676ca8 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/kernel-list.noinstall
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/kernel-list.noinstall
@@ -1,5 +1,5 @@
{{ if kernel_choice != "custom": }}
-{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (3.19) kernel? (y/n)" default:"y"}}
+{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (4.1) kernel? (y/n)" default:"y"}}
{{ if kernel_choice != "custom" and use_default_kernel == "n": }}
-{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_3.19"}}
+{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_4.1"}}
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-dev.bbappend b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-dev.bbappend
index 2fa6231..c336007 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-dev.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-dev.bbappend
@@ -21,6 +21,5 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
index 7a25446..4700d98 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-preempt-rt.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "f35992f80c81dc5fa1a97165dfd5cbb84661f7cb"
-#SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "1b534b2f8bbe9b8a773268cfa30a4850346f6f5f"
+SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
index 471ccbc..15b9b1b 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
index 4de82fa..caefcfc 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
new file mode 100644
index 0000000..0a47a4e
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
@@ -0,0 +1,33 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto-tiny_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-tiny.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-patches.scc \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_3.14.bbappend
index e688384..6f1e7b0 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_3.19.bbappend
index ded9e85..44086af 100644
--- a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_3.19.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
diff --git a/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_4.1.bbappend
new file mode 100644
index 0000000..1e99a04
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/powerpc/recipes-kernel/linux/linux-yocto_4.1.bbappend
@@ -0,0 +1,32 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-standard.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-preempt-rt.scc b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-preempt-rt.scc
index 6aaffb8..a81b858 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-preempt-rt.scc
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-preempt-rt.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-preempt-rt.scc
define KMACHINE {{=machine}}
-define KTYPE preempt-rt
+
define KARCH {{=qemuarch}}
include {{=map_preempt_rt_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-standard.scc b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-standard.scc
index d2a03ec..14554da 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-standard.scc
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-standard.scc
@@ -1,6 +1,6 @@
# yocto-bsp-filename {{=machine}}-standard.scc
define KMACHINE {{=machine}}
-define KTYPE standard
+
define KARCH {{=qemuarch}}
{{ if qemuarch == "i386" or qemuarch == "x86_64": }}
@@ -14,6 +14,7 @@ include bsp/mti-malta32/mti-malta32-be-standard
{{ if qemuarch == "mips64": }}
include bsp/mti-malta64/mti-malta64-be-standard
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-tiny.scc b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-tiny.scc
index 6c098fe..41d4c6f 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-tiny.scc
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/files/machine-tiny.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-tiny.scc
define KMACHINE {{=machine}}
-define KTYPE tiny
+
define KARCH {{=qemuarch}}
include {{=map_tiny_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/kernel-list.noinstall b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/kernel-list.noinstall
index 811d695..7676ca8 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/kernel-list.noinstall
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/kernel-list.noinstall
@@ -1,5 +1,5 @@
{{ if kernel_choice != "custom": }}
-{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (3.19) kernel? (y/n)" default:"y"}}
+{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (4.1) kernel? (y/n)" default:"y"}}
{{ if kernel_choice != "custom" and use_default_kernel == "n": }}
-{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_3.19"}}
+{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_4.1"}}
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-dev.bbappend b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-dev.bbappend
index be479be..3555285 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-dev.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-dev.bbappend
@@ -51,6 +51,5 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
index ce5e1a0..9e5aa97 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
@@ -55,8 +55,8 @@ SRC_URI += "file://{{=machine}}-preempt-rt.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "f35992f80c81dc5fa1a97165dfd5cbb84661f7cb"
-#SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "1b534b2f8bbe9b8a773268cfa30a4850346f6f5f"
+SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
index 7879ce2..1faac44 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
@@ -55,8 +55,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "0143c6ebb4a2d63b241df5f608b19f483f7eb9e0"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "8f55bee2403176a50cc0dd41811aa60fcf07243c"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
index f7ef4bb..51fc7d0 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
@@ -55,8 +55,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "0143c6ebb4a2d63b241df5f608b19f483f7eb9e0"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "8f55bee2403176a50cc0dd41811aa60fcf07243c"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
new file mode 100644
index 0000000..14ee16f
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
@@ -0,0 +1,62 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto-tiny_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "arm": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"arm" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "arm": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"arm" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "powerpc": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"powerpc" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "powerpc": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"powerpc" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "i386": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"i386" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "i386": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"i386" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/common-pc" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "x86_64": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"x86_64" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "x86_64": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"x86_64" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "mips": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"mips" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "mips": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"mips" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "mips64": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"mips64" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "mips64": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"mips64" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-tiny.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-patches.scc \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_3.14.bbappend
index 626019c..fbaed33 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -51,12 +51,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "0143c6ebb4a2d63b241df5f608b19f483f7eb9e0"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "8f55bee2403176a50cc0dd41811aa60fcf07243c"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_3.19.bbappend
index b4798b7..7b590ad 100644
--- a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_3.19.bbappend
@@ -51,12 +51,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "0143c6ebb4a2d63b241df5f608b19f483f7eb9e0"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "8f55bee2403176a50cc0dd41811aa60fcf07243c"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
diff --git a/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_4.1.bbappend
new file mode 100644
index 0000000..82bb970
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/qemu/recipes-kernel/linux/linux-yocto_4.1.bbappend
@@ -0,0 +1,61 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "arm": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base your new BSP branch on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "arm": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose an existing machine branch to use for this BSP:" default:"standard/arm-versatile-926ejs" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "powerpc": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"powerpc" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "powerpc": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"powerpc" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/qemuppc" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "i386": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"i386" gen:"bsp.kernel.all_branches" branches_base:"standard:standard/common-pc" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/common-pc" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "i386": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"i386" gen:"bsp.kernel.all_branches" branches_base:"standard:standard/common-pc" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/common-pc" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "x86_64": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"x86_64" gen:"bsp.kernel.all_branches" branches_base:"standard:standard/common-pc-64" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/common-pc-64/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "x86_64": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"x86_64" gen:"bsp.kernel.all_branches" branches_base:"standard:standard/common-pc-64" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/common-pc-64/base" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "mips": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"mips" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/mti-malta32" }}
+
+{{ if need_new_kbranch == "n" and qemuarch == "mips64": }}
+{{ input type:"choicelist" name:"existing_kbranch" nameappend:"mips64" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/mti-malta64" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "mips": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"mips" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "y" and qemuarch == "mips64": }}
+{{ input type:"choicelist" name:"new_kbranch" nameappend:"mips64" gen:"bsp.kernel.all_branches" branches_base:"standard" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Would you like SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-standard.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-preempt-rt.scc b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-preempt-rt.scc
index fd5320b..bbeeecd 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-preempt-rt.scc
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-preempt-rt.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-preempt-rt.scc
define KMACHINE {{=machine}}
-define KTYPE preempt-rt
+
define KARCH x86_64
include {{=map_preempt_rt_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-standard.scc b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-standard.scc
index 569f967..9c9cc90 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-standard.scc
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-standard.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-standard.scc
define KMACHINE {{=machine}}
-define KTYPE standard
+
define KARCH x86_64
include {{=map_standard_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-tiny.scc b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-tiny.scc
index fb21432..b53706f 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-tiny.scc
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/files/machine-tiny.scc
@@ -1,10 +1,11 @@
# yocto-bsp-filename {{=machine}}-tiny.scc
define KMACHINE {{=machine}}
-define KTYPE tiny
+
define KARCH x86_64
include {{=map_tiny_kbranch(need_new_kbranch, new_kbranch, existing_kbranch)}}
{{ if need_new_kbranch == "y": }}
+define KTYPE {{=new_kbranch}}
branch {{=machine}}
include {{=machine}}.scc
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/kernel-list.noinstall b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/kernel-list.noinstall
index 811d695..dbbe934 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/kernel-list.noinstall
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/kernel-list.noinstall
@@ -1,5 +1,5 @@
{{ if kernel_choice != "custom": }}
-{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (3.19) kernel? (y/n)" default:"y"}}
+{{ input type:"boolean" name:"use_default_kernel" prio:"10" msg:"Would you like to use the default (4.1) kernel? (y/n)" default:"y"}}
{{ if kernel_choice != "custom" and use_default_kernel == "n": }}
{{ input type:"choicelist" name:"kernel_choice" gen:"bsp.kernel.kernels" prio:"10" msg:"Please choose the kernel to use in this BSP:" default:"linux-yocto_3.19"}}
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-dev.bbappend b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-dev.bbappend
index 2fa6231..c336007 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-dev.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-dev.bbappend
@@ -21,6 +21,5 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
index 7a25446..4700d98 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-rt_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-preempt-rt.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "f35992f80c81dc5fa1a97165dfd5cbb84661f7cb"
-#SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "1b534b2f8bbe9b8a773268cfa30a4850346f6f5f"
+SRCREV_machine_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-rt_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
\ No newline at end of file
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
index 471ccbc..15b9b1b 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_3.14.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
index 4de82fa..caefcfc 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_3.19.bbappend
@@ -26,8 +26,8 @@ SRC_URI += "file://{{=machine}}-tiny.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
new file mode 100644
index 0000000..0a47a4e
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto-tiny_4.1.bbappend
@@ -0,0 +1,33 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto-tiny_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard/tiny" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/tiny/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-tiny.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-patches.scc \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto-tiny_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_3.14.bbappend b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_3.14.bbappend
index ca0b497..62a99d5 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_3.14.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_3.14.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.14"
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_3.19.bbappend b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_3.19.bbappend
index dba63c3..a5dd37d 100644
--- a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_3.19.bbappend
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_3.19.bbappend
@@ -22,12 +22,11 @@ KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
SRC_URI += "file://{{=machine}}-standard.scc \
file://{{=machine}}-user-config.cfg \
- file://{{=machine}}-user-patches.scc \
file://{{=machine}}-user-features.scc \
"
-# uncomment and replace these SRCREVs with the real commit ids once you've had
+# replace these SRCREVs with the real commit ids once you've had
# the appropriate changes committed to the upstream linux-yocto repo
-#SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "840bb8c059418c4753415df56c9aff1c0d5354c8"
-#SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "4fd76cc4f33e0afd8f906b1e8f231b6d13b6c993"
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
#LINUX_VERSION = "3.19"
diff --git a/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_4.1.bbappend b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_4.1.bbappend
new file mode 100644
index 0000000..8d0bc97
--- /dev/null
+++ b/scripts/lib/bsp/substrate/target/arch/x86_64/recipes-kernel/linux/linux-yocto_4.1.bbappend
@@ -0,0 +1,32 @@
+# yocto-bsp-filename {{ if kernel_choice == "linux-yocto_4.1": }} this
+FILESEXTRAPATHS_prepend := "${THISDIR}/files:"
+
+PR := "${PR}.1"
+
+COMPATIBLE_MACHINE_{{=machine}} = "{{=machine}}"
+
+{{ input type:"boolean" name:"need_new_kbranch" prio:"20" msg:"Do you need a new machine branch for this BSP (the alternative is to re-use an existing branch)? [y/n]" default:"y" }}
+
+{{ if need_new_kbranch == "y": }}
+{{ input type:"choicelist" name:"new_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard:standard/common-pc-64" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/common-pc-64/base" }}
+
+{{ if need_new_kbranch == "n": }}
+{{ input type:"choicelist" name:"existing_kbranch" gen:"bsp.kernel.all_branches" branches_base:"standard:standard/common-pc-64" prio:"20" msg:"Please choose a machine branch to base this BSP on:" default:"standard/common-pc-64/base" }}
+
+{{ if need_new_kbranch == "n": }}
+KBRANCH_{{=machine}} = "{{=existing_kbranch}}"
+
+{{ input type:"boolean" name:"smp" prio:"30" msg:"Do you need SMP support? (y/n)" default:"y"}}
+{{ if smp == "y": }}
+KERNEL_FEATURES_append_{{=machine}} += " cfg/smp.scc"
+
+SRC_URI += "file://{{=machine}}-standard.scc \
+ file://{{=machine}}-user-config.cfg \
+ file://{{=machine}}-user-features.scc \
+ "
+
+# replace these SRCREVs with the real commit ids once you've had
+# the appropriate changes committed to the upstream linux-yocto repo
+SRCREV_machine_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+SRCREV_meta_pn-linux-yocto_{{=machine}} ?= "${AUTOREV}"
+#LINUX_VERSION = "4.1"
diff --git a/scripts/lib/devtool/__init__.py b/scripts/lib/devtool/__init__.py
index 404d3e6..50604e6 100644
--- a/scripts/lib/devtool/__init__.py
+++ b/scripts/lib/devtool/__init__.py
@@ -96,18 +96,22 @@ def exec_fakeroot(d, cmd, **kwargs):
newenv[splitval[0]] = splitval[1]
return subprocess.call("%s %s" % (fakerootcmd, cmd), env=newenv, **kwargs)
-def setup_tinfoil(config_only=False):
+def setup_tinfoil(config_only=False, basepath=None, tracking=False):
"""Initialize tinfoil api from bitbake"""
import scriptpath
+ orig_cwd = os.path.abspath(os.curdir)
+ if basepath:
+ os.chdir(basepath)
bitbakepath = scriptpath.add_bitbake_lib_path()
if not bitbakepath:
logger.error("Unable to find bitbake by searching parent directory of this script or PATH")
sys.exit(1)
import bb.tinfoil
- tinfoil = bb.tinfoil.Tinfoil()
+ tinfoil = bb.tinfoil.Tinfoil(tracking=tracking)
tinfoil.prepare(config_only)
tinfoil.logger.setLevel(logger.getEffectiveLevel())
+ os.chdir(orig_cwd)
return tinfoil
def get_recipe_file(cooker, pn):
@@ -134,5 +138,62 @@ def parse_recipe(config, tinfoil, pn, appends):
# Filter out appends from the workspace
append_files = [path for path in append_files if
not path.startswith(config.workspace_path)]
+ else:
+ append_files = None
return oe.recipeutils.parse_recipe(recipefile, append_files,
tinfoil.config_data)
+
+def check_workspace_recipe(workspace, pn, checksrc=True):
+ """
+ Check that a recipe is in the workspace and (optionally) that source
+ is present.
+ """
+ if not pn in workspace:
+ raise DevtoolError("No recipe named '%s' in your workspace" % pn)
+ if checksrc:
+ srctree = workspace[pn]['srctree']
+ if not os.path.exists(srctree):
+ raise DevtoolError("Source tree %s for recipe %s does not exist" % (srctree, pn))
+ if not os.listdir(srctree):
+ raise DevtoolError("Source tree %s for recipe %s is empty" % (srctree, pn))
+
+def use_external_build(same_dir, no_same_dir, d):
+ """
+ Determine if we should use B!=S (separate build and source directories) or not
+ """
+ b_is_s = True
+ if no_same_dir:
+ logger.info('Using separate build directory since --no-same-dir specified')
+ b_is_s = False
+ elif same_dir:
+ logger.info('Using source tree as build directory since --same-dir specified')
+ elif bb.data.inherits_class('autotools-brokensep', d):
+ logger.info('Using source tree as build directory since recipe inherits autotools-brokensep')
+ elif d.getVar('B', True) == os.path.abspath(d.getVar('S', True)):
+ logger.info('Using source tree as build directory since that would be the default for this recipe')
+ else:
+ b_is_s = False
+ return b_is_s
+
+def setup_git_repo(repodir, version, devbranch, basetag='devtool-base'):
+ """
+ Set up the git repository for the source tree
+ """
+ import bb.process
+ if not os.path.exists(os.path.join(repodir, '.git')):
+ bb.process.run('git init', cwd=repodir)
+ bb.process.run('git add .', cwd=repodir)
+ commit_cmd = ['git', 'commit', '-q']
+ stdout, _ = bb.process.run('git status --porcelain', cwd=repodir)
+ if not stdout:
+ commit_cmd.append('--allow-empty')
+ commitmsg = "Initial empty commit with no upstream sources"
+ elif version:
+ commitmsg = "Initial commit from upstream at version %s" % version
+ else:
+ commitmsg = "Initial commit from upstream"
+ commit_cmd += ['-m', commitmsg]
+ bb.process.run(commit_cmd, cwd=repodir)
+
+ bb.process.run('git checkout -b %s' % devbranch, cwd=repodir)
+ bb.process.run('git tag -f %s' % basetag, cwd=repodir)
diff --git a/scripts/lib/devtool/build-image.py b/scripts/lib/devtool/build-image.py
index 2c01428..e53239d 100644
--- a/scripts/lib/devtool/build-image.py
+++ b/scripts/lib/devtool/build-image.py
@@ -21,65 +21,85 @@ import os
import logging
from bb.process import ExecutionError
-from devtool import exec_build_env_command, setup_tinfoil, parse_recipe
+from devtool import exec_build_env_command, setup_tinfoil, parse_recipe, DevtoolError
logger = logging.getLogger('devtool')
-def _get_recipes(workspace, config):
- """Get list of target recipes from the workspace."""
+def _get_packages(tinfoil, workspace, config):
+ """Get list of packages from recipes in the workspace."""
result = []
- tinfoil = setup_tinfoil()
for recipe in workspace:
data = parse_recipe(config, tinfoil, recipe, True)
if 'class-target' in data.getVar('OVERRIDES', True).split(':'):
if recipe in data.getVar('PACKAGES', True):
result.append(recipe)
else:
- logger.warning("Skipping recipe %s as it doesn't produce "
+ logger.warning("Skipping recipe %s as it doesn't produce a "
"package with the same name", recipe)
- tinfoil.shutdown()
return result
def build_image(args, config, basepath, workspace):
"""Entry point for the devtool 'build-image' subcommand."""
- image = args.recipe
+
+ image = args.imagename
+ auto_image = False
+ if not image:
+ sdk_targets = config.get('SDK', 'sdk_targets', '').split()
+ if sdk_targets:
+ image = sdk_targets[0]
+ auto_image = True
+ if not image:
+ raise DevtoolError('Unable to determine image to build, please specify one')
+
appendfile = os.path.join(config.workspace_path, 'appends',
'%s.bbappend' % image)
- # remove <image>.bbapend to make sure setup_tinfoil doesn't
- # breake because of it
+ # remove <image>.bbappend to make sure setup_tinfoil doesn't
+ # break because of it
if os.path.isfile(appendfile):
os.unlink(appendfile)
- recipes = _get_recipes(workspace, config)
- if recipes:
- with open(appendfile, 'w') as afile:
- # include selected recipes into the image
- afile.write('IMAGE_INSTALL_append = " %s"\n' % ' '.join(recipes))
-
- # Generate notification callback devtool_warn_image_extended
- afile.write('do_rootfs[prefuncs] += "devtool_warn_image_extended"\n\n')
- afile.write("python devtool_warn_image_extended() {\n")
- afile.write(" bb.plain('NOTE: %%s: building with additional '\n"
- " 'packages due to \"devtool build-image\"'"
- " %% d.getVar('PN', True))\n"
- " bb.plain('NOTE: delete %%s to clear this' %% \\\n"
- " '%s')\n" % os.path.relpath(appendfile, basepath))
- afile.write("}\n")
-
- logger.info('Building image %s with the following '
- 'additional packages: %s', image, ' '.join(recipes))
- else:
- logger.warning('No recipes in workspace, building image %s unmodified', image)
-
- # run bitbake to build image
+ tinfoil = setup_tinfoil(basepath=basepath)
+ rd = parse_recipe(config, tinfoil, image, True)
+ if not rd:
+ # Error already shown
+ return 1
+ if not bb.data.inherits_class('image', rd):
+ if auto_image:
+ raise DevtoolError('Unable to determine image to build, please specify one')
+ else:
+ raise DevtoolError('Specified recipe %s is not an image recipe' % image)
+
try:
- exec_build_env_command(config.init_path, basepath,
- 'bitbake %s' % image, watch=True)
- except ExecutionError as err:
- return err.exitcode
+ if workspace:
+ packages = _get_packages(tinfoil, workspace, config)
+ if packages:
+ with open(appendfile, 'w') as afile:
+ # include packages from workspace recipes into the image
+ afile.write('IMAGE_INSTALL_append = " %s"\n' % ' '.join(packages))
+ logger.info('Building image %s with the following '
+ 'additional packages: %s', image, ' '.join(packages))
+ else:
+ logger.warning('No packages to add, building image %s unmodified', image)
+ else:
+ logger.warning('No recipes in workspace, building image %s unmodified', image)
+
+ deploy_dir_image = tinfoil.config_data.getVar('DEPLOY_DIR_IMAGE', True)
+
+ tinfoil.shutdown()
+
+ # run bitbake to build image
+ try:
+ exec_build_env_command(config.init_path, basepath,
+ 'bitbake %s' % image, watch=True)
+ except ExecutionError as err:
+ return err.exitcode
+ finally:
+ if os.path.isfile(appendfile):
+ os.unlink(appendfile)
- logger.info('Successfully built %s', image)
+ logger.info('Successfully built %s. You can find output files in %s'
+ % (image, deploy_dir_image))
def register_commands(subparsers, context):
"""Register devtool subcommands from the build-image plugin"""
@@ -87,5 +107,5 @@ def register_commands(subparsers, context):
help='Build image including workspace recipe packages',
description='Builds an image, extending it to include '
'packages from recipes in the workspace')
- parser.add_argument('recipe', help='Image recipe to build')
+ parser.add_argument('imagename', help='Image recipe to build', nargs='?')
parser.set_defaults(func=build_image)
diff --git a/scripts/lib/devtool/build.py b/scripts/lib/devtool/build.py
index 335aff5..9b58858 100644
--- a/scripts/lib/devtool/build.py
+++ b/scripts/lib/devtool/build.py
@@ -21,7 +21,7 @@ import bb
import logging
import argparse
import tempfile
-from devtool import exec_build_env_command, DevtoolError
+from devtool import exec_build_env_command, check_workspace_recipe, DevtoolError
logger = logging.getLogger('devtool')
@@ -42,9 +42,7 @@ def _create_conf_file(values, conf_file=None):
def build(args, config, basepath, workspace):
"""Entry point for the devtool 'build' subcommand"""
- if not args.recipename in workspace:
- raise DevtoolError("no recipe named %s in your workspace" %
- args.recipename)
+ check_workspace_recipe(workspace, args.recipename)
build_task = config.get('Build', 'build_task', 'populate_sysroot')
diff --git a/scripts/lib/devtool/deploy.py b/scripts/lib/devtool/deploy.py
index fa93adf..c90c6b1 100644
--- a/scripts/lib/devtool/deploy.py
+++ b/scripts/lib/devtool/deploy.py
@@ -19,7 +19,7 @@
import os
import subprocess
import logging
-from devtool import exec_fakeroot, setup_tinfoil, DevtoolError
+from devtool import exec_fakeroot, setup_tinfoil, check_workspace_recipe, DevtoolError
logger = logging.getLogger('devtool')
@@ -28,9 +28,8 @@ def deploy(args, config, basepath, workspace):
import re
import oe.recipeutils
- if not args.recipename in workspace:
- raise DevtoolError("no recipe named %s in your workspace" %
- args.recipename)
+ check_workspace_recipe(workspace, args.recipename, checksrc=False)
+
try:
host, destdir = args.target.split(':')
except ValueError:
@@ -41,7 +40,7 @@ def deploy(args, config, basepath, workspace):
deploy_dir = os.path.join(basepath, 'target_deploy', args.target)
deploy_file = os.path.join(deploy_dir, args.recipename + '.list')
- tinfoil = setup_tinfoil()
+ tinfoil = setup_tinfoil(basepath=basepath)
try:
rd = oe.recipeutils.parse_recipe_simple(tinfoil.cooker, args.recipename, tinfoil.config_data)
except Exception as e:
diff --git a/scripts/lib/devtool/package.py b/scripts/lib/devtool/package.py
index 3a7a36b..b8d8423 100644
--- a/scripts/lib/devtool/package.py
+++ b/scripts/lib/devtool/package.py
@@ -20,7 +20,7 @@ import os
import subprocess
import logging
from bb.process import ExecutionError
-from devtool import exec_build_env_command, setup_tinfoil, DevtoolError
+from devtool import exec_build_env_command, setup_tinfoil, check_workspace_recipe, DevtoolError
logger = logging.getLogger('devtool')
@@ -30,13 +30,11 @@ def plugin_init(pluginlist):
def package(args, config, basepath, workspace):
"""Entry point for the devtool 'package' subcommand"""
- if not args.recipename in workspace:
- raise DevtoolError("no recipe named %s in your workspace" %
- args.recipename)
+ check_workspace_recipe(workspace, args.recipename)
image_pkgtype = config.get('Package', 'image_pkgtype', '')
if not image_pkgtype:
- tinfoil = setup_tinfoil()
+ tinfoil = setup_tinfoil(basepath=basepath)
try:
tinfoil.prepare(config_only=True)
image_pkgtype = tinfoil.config_data.getVar('IMAGE_PKGTYPE', True)
diff --git a/scripts/lib/devtool/runqemu.py b/scripts/lib/devtool/runqemu.py
new file mode 100644
index 0000000..5282afb
--- /dev/null
+++ b/scripts/lib/devtool/runqemu.py
@@ -0,0 +1,64 @@
+# Development tool - runqemu command plugin
+#
+# Copyright (C) 2015 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+"""Devtool runqemu plugin"""
+
+import os
+import bb
+import logging
+import argparse
+import glob
+from devtool import exec_build_env_command, setup_tinfoil, DevtoolError
+
+logger = logging.getLogger('devtool')
+
+def runqemu(args, config, basepath, workspace):
+ """Entry point for the devtool 'runqemu' subcommand"""
+
+ tinfoil = setup_tinfoil(config_only=True, basepath=basepath)
+ machine = tinfoil.config_data.getVar('MACHINE', True)
+ bindir_native = tinfoil.config_data.getVar('STAGING_BINDIR_NATIVE', True)
+ tinfoil.shutdown()
+
+ if not glob.glob(os.path.join(bindir_native, 'qemu-system-*')):
+ raise DevtoolError('QEMU is not available within this SDK')
+
+ imagename = args.imagename
+ if not imagename:
+ sdk_targets = config.get('SDK', 'sdk_targets', '').split()
+ if sdk_targets:
+ imagename = sdk_targets[0]
+ if not imagename:
+ raise DevtoolError('Unable to determine image name to run, please specify one')
+
+ try:
+ exec_build_env_command(config.init_path, basepath, 'runqemu %s %s %s' % (machine, imagename, " ".join(args.args)), watch=True)
+ except bb.process.ExecutionError as e:
+ # We've already seen the output since watch=True, so just ensure we return something to the user
+ return e.exitcode
+
+ return 0
+
+def register_commands(subparsers, context):
+ """Register devtool subcommands from this plugin"""
+ if context.fixed_setup:
+ parser_runqemu = subparsers.add_parser('runqemu', help='Run QEMU on the specified image',
+ description='Runs QEMU to boot the specified image')
+ parser_runqemu.add_argument('imagename', help='Name of built image to boot within QEMU', nargs='?')
+ parser_runqemu.add_argument('args', help='Any remaining arguments are passed to the runqemu script (pass --help after imagename to see what these are)',
+ nargs=argparse.REMAINDER)
+ parser_runqemu.set_defaults(func=runqemu)
diff --git a/scripts/lib/devtool/sdk.py b/scripts/lib/devtool/sdk.py
index 2f416b3..f15a6a9 100644
--- a/scripts/lib/devtool/sdk.py
+++ b/scripts/lib/devtool/sdk.py
@@ -40,14 +40,9 @@ def generate_update_dict(sigfile_new, sigfile_old):
continue
return update_dict
-def get_sstate_objects(update_dict, newsdk_path):
+def get_sstate_objects(update_dict, sstate_dir):
"""Return a list containing sstate objects which are to be installed"""
sstate_objects = []
- # Ensure newsdk_path points to an extensible SDK
- sstate_dir = os.path.join(newsdk_path, 'sstate-cache')
- if not os.path.exists(sstate_dir):
- logger.error("sstate-cache directory not found under %s" % newsdk_path)
- raise
for k in update_dict:
files = set()
hashval = update_dict[k]
@@ -85,16 +80,12 @@ def install_sstate_objects(sstate_objects, src_sdk, dest_sdk):
def sdk_update(args, config, basepath, workspace):
# Fetch locked-sigs.inc file from remote/local destination
- from ConfigParser import NoSectionError
updateserver = args.updateserver
if not updateserver:
- try:
- updateserver = config.get('SDK', 'updateserver', None)
- except NoSectionError:
- pass
+ updateserver = config.get('SDK', 'updateserver', '')
if not updateserver:
raise DevtoolError("Update server not specified in config file, you must specify it on the command line")
- logger.debug("updateserver: %s" % args.updateserver)
+ logger.debug("updateserver: %s" % updateserver)
# Make sure we are using sdk-update from within SDK
logger.debug("basepath = %s" % basepath)
@@ -105,38 +96,45 @@ def sdk_update(args, config, basepath, workspace):
else:
logger.debug("Found conf/locked-sigs.inc in %s" % basepath)
- if ':' in args.updateserver:
+ if ':' in updateserver:
is_remote = True
else:
is_remote = False
if not is_remote:
# devtool sdk-update /local/path/to/latest/sdk
- new_locked_sig_file_path = os.path.join(args.updateserver, 'conf/locked-sigs.inc')
+ new_locked_sig_file_path = os.path.join(updateserver, 'conf/locked-sigs.inc')
if not os.path.exists(new_locked_sig_file_path):
- logger.error("%s doesn't exist or is not an extensible SDK" % args.updateserver)
+ logger.error("%s doesn't exist or is not an extensible SDK" % updateserver)
return -1
else:
- logger.debug("Found conf/locked-sigs.inc in %s" % args.updateserver)
+ logger.debug("Found conf/locked-sigs.inc in %s" % updateserver)
update_dict = generate_update_dict(new_locked_sig_file_path, old_locked_sig_file_path)
logger.debug("update_dict = %s" % update_dict)
- sstate_objects = get_sstate_objects(update_dict, args.updateserver)
+ sstate_dir = os.path.join(newsdk_path, 'sstate-cache')
+ if not os.path.exists(sstate_dir):
+ logger.error("sstate-cache directory not found under %s" % newsdk_path)
+ return 1
+ sstate_objects = get_sstate_objects(update_dict, sstate_dir)
logger.debug("sstate_objects = %s" % sstate_objects)
if len(sstate_objects) == 0:
logger.info("No need to update.")
return 0
logger.info("Installing sstate objects into %s", basepath)
- install_sstate_objects(sstate_objects, args.updateserver.rstrip('/'), basepath)
+ install_sstate_objects(sstate_objects, updateserver.rstrip('/'), basepath)
logger.info("Updating configuration files")
- new_conf_dir = os.path.join(args.updateserver, 'conf')
+ new_conf_dir = os.path.join(updateserver, 'conf')
old_conf_dir = os.path.join(basepath, 'conf')
shutil.rmtree(old_conf_dir)
shutil.copytree(new_conf_dir, old_conf_dir)
logger.info("Updating layers")
- new_layers_dir = os.path.join(args.updateserver, 'layers')
+ new_layers_dir = os.path.join(updateserver, 'layers')
old_layers_dir = os.path.join(basepath, 'layers')
shutil.rmtree(old_layers_dir)
- shutil.copytree(new_layers_dir, old_layers_dir)
+ ret = subprocess.call("cp -a %s %s" % (new_layers_dir, old_layers_dir), shell=True)
+ if ret != 0:
+ logger.error("Copying %s to %s failed" % (new_layers_dir, old_layers_dir))
+ return ret
else:
# devtool sdk-update http://myhost/sdk
tmpsdk_dir = '/tmp/sdk-ext'
@@ -145,12 +143,12 @@ def sdk_update(args, config, basepath, workspace):
os.makedirs(tmpsdk_dir)
os.makedirs(os.path.join(tmpsdk_dir, 'conf'))
# Fetch locked-sigs.inc from update server
- ret = subprocess.call("wget -q -O - %s/conf/locked-sigs.inc > %s/locked-sigs.inc" % (args.updateserver, os.path.join(tmpsdk_dir, 'conf')), shell=True)
+ ret = subprocess.call("wget -q -O - %s/conf/locked-sigs.inc > %s/locked-sigs.inc" % (updateserver, os.path.join(tmpsdk_dir, 'conf')), shell=True)
if ret != 0:
- logger.error("Fetching conf/locked-sigs.inc from %s to %s/locked-sigs.inc failed" % (args.updateserver, os.path.join(tmpsdk_dir, 'conf')))
+ logger.error("Fetching conf/locked-sigs.inc from %s to %s/locked-sigs.inc failed" % (updateserver, os.path.join(tmpsdk_dir, 'conf')))
return ret
else:
- logger.info("Fetching conf/locked-sigs.inc from %s to %s/locked-sigs.inc succeeded" % (args.updateserver, os.path.join(tmpsdk_dir, 'conf')))
+ logger.info("Fetching conf/locked-sigs.inc from %s to %s/locked-sigs.inc succeeded" % (updateserver, os.path.join(tmpsdk_dir, 'conf')))
new_locked_sig_file_path = os.path.join(tmpsdk_dir, 'conf/locked-sigs.inc')
update_dict = generate_update_dict(new_locked_sig_file_path, old_locked_sig_file_path)
logger.debug("update_dict = %s" % update_dict)
@@ -161,23 +159,23 @@ def sdk_update(args, config, basepath, workspace):
logger.debug("Updating meta data via git ...")
# Try using 'git pull', if failed, use 'git clone'
if os.path.exists(os.path.join(basepath, 'layers/.git')):
- ret = subprocess.call("cd layers && git pull", shell=True)
+ ret = subprocess.call("cd layers && git pull %s/layers/.git" % updateserver, shell=True)
else:
ret = -1
if ret != 0:
- ret = subprocess.call("rm -rf layers && git clone %s/layers" % args.updateserver, shell=True)
+ ret = subprocess.call("rm -rf layers && git clone %s/layers/.git" % updateserver, shell=True)
if ret != 0:
logger.error("Updating meta data via git failed")
return ret
logger.debug("Updating conf files ...")
- conf_files = ['local.conf', 'bblayers.conf', 'devtool.conf', 'work-config.inc', 'locked-sigs.inc']
+ conf_files = ['local.conf', 'bblayers.conf', 'devtool.conf', 'locked-sigs.inc']
for conf in conf_files:
- ret = subprocess.call("wget -q -O - %s/conf/%s > conf/%s" % (args.updateserver, conf, conf), shell=True)
+ ret = subprocess.call("wget -q -O - %s/conf/%s > conf/%s" % (updateserver, conf, conf), shell=True)
if ret != 0:
logger.error("Update %s failed" % conf)
return ret
with open(os.path.join(basepath, 'conf/local.conf'), 'a') as f:
- f.write('SSTATE_MIRRORS_append = " file://.* %s/sstate-cache/PATH \\n "\n' % args.updateserver)
+ f.write('SSTATE_MIRRORS_append = " file://.* %s/sstate-cache/PATH \\n "\n' % updateserver)
# Run bitbake command for the whole SDK
sdk_targets = config.get('SDK', 'sdk_targets')
diff --git a/scripts/lib/devtool/search.py b/scripts/lib/devtool/search.py
new file mode 100644
index 0000000..c2f420c
--- /dev/null
+++ b/scripts/lib/devtool/search.py
@@ -0,0 +1,80 @@
+# Development tool - search command plugin
+#
+# Copyright (C) 2015 Intel Corporation
+#
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License version 2 as
+# published by the Free Software Foundation.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License along
+# with this program; if not, write to the Free Software Foundation, Inc.,
+# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
+
+"""Devtool search plugin"""
+
+import os
+import bb
+import logging
+import argparse
+import re
+from devtool import setup_tinfoil, DevtoolError
+
+logger = logging.getLogger('devtool')
+
+def search(args, config, basepath, workspace):
+ """Entry point for the devtool 'search' subcommand"""
+
+ tinfoil = setup_tinfoil(config_only=True, basepath=basepath)
+ pkgdata_dir = tinfoil.config_data.getVar('PKGDATA_DIR', True)
+ tinfoil.shutdown()
+
+ keyword_rc = re.compile(args.keyword)
+
+ for fn in os.listdir(pkgdata_dir):
+ pfn = os.path.join(pkgdata_dir, fn)
+ if not os.path.isfile(pfn):
+ continue
+
+ packages = []
+ match = False
+ if keyword_rc.search(fn):
+ match = True
+
+ if not match:
+ with open(pfn, 'r') as f:
+ for line in f:
+ if line.startswith('PACKAGES:'):
+ packages = line.split(':', 1)[1].strip().split()
+
+ for pkg in packages:
+ if keyword_rc.search(pkg):
+ match = True
+ break
+ if os.path.exists(os.path.join(pkgdata_dir, 'runtime', pkg + '.packaged')):
+ with open(os.path.join(pkgdata_dir, 'runtime', pkg), 'r') as f:
+ for line in f:
+ if ': ' in line:
+ splitline = line.split(':', 1)
+ key = splitline[0]
+ value = splitline[1].strip()
+ if key in ['PKG_%s' % pkg, 'DESCRIPTION', 'FILES_INFO'] or key.startswith('FILERPROVIDES_'):
+ if keyword_rc.search(value):
+ match = True
+ break
+
+ if match:
+ print(fn)
+
+ return 0
+
+def register_commands(subparsers, context):
+ """Register devtool subcommands from this plugin"""
+ parser_search = subparsers.add_parser('search', help='Search available recipes',
+ description='Searches for available target recipes. Matches on recipe name, package name, description and installed files, and prints the recipe name on match.')
+ parser_search.add_argument('keyword', help='Keyword to search for (regular expression syntax allowed)')
+ parser_search.set_defaults(func=search)
diff --git a/scripts/lib/devtool/standard.py b/scripts/lib/devtool/standard.py
index d5900b4..5464d7b 100644
--- a/scripts/lib/devtool/standard.py
+++ b/scripts/lib/devtool/standard.py
@@ -25,7 +25,8 @@ import logging
import argparse
import scriptutils
import errno
-from devtool import exec_build_env_command, setup_tinfoil, DevtoolError
+from collections import OrderedDict
+from devtool import exec_build_env_command, setup_tinfoil, check_workspace_recipe, use_external_build, setup_git_repo, DevtoolError
from devtool import parse_recipe
logger = logging.getLogger('devtool')
@@ -44,6 +45,10 @@ def add(args, config, basepath, workspace):
if reason:
raise DevtoolError(reason)
+ # FIXME this ought to be in validate_pn but we're using that in other contexts
+ if '/' in args.recipename:
+ raise DevtoolError('"/" is not a valid character in recipe names')
+
srctree = os.path.abspath(args.srctree)
if os.path.exists(srctree):
if args.fetch:
@@ -82,7 +87,7 @@ def add(args, config, basepath, workspace):
else:
bp = args.recipename
recipefile = os.path.join(recipedir, "%s.bb" % bp)
- if sys.stdout.isatty():
+ if args.color == 'auto' and sys.stdout.isatty():
color = 'always'
else:
color = args.color
@@ -94,30 +99,51 @@ def add(args, config, basepath, workspace):
source = srctree
if args.version:
extracmdopts += ' -V %s' % args.version
+ if args.binary:
+ extracmdopts += ' -b'
try:
stdout, _ = exec_build_env_command(config.init_path, basepath, 'recipetool --color=%s create -o %s "%s" %s' % (color, recipefile, source, extracmdopts))
- logger.info('Recipe %s has been automatically created; further editing may be required to make it fully functional' % recipefile)
except bb.process.ExecutionError as e:
raise DevtoolError('Command \'%s\' failed:\n%s' % (e.command, e.stdout))
_add_md5(config, args.recipename, recipefile)
+ if args.fetch and not args.no_git:
+ setup_git_repo(srctree, args.version, 'devtool')
+
initial_rev = None
if os.path.exists(os.path.join(srctree, '.git')):
(stdout, _) = bb.process.run('git rev-parse HEAD', cwd=srctree)
initial_rev = stdout.rstrip()
+ tinfoil = setup_tinfoil(config_only=True, basepath=basepath)
+ rd = oe.recipeutils.parse_recipe(recipefile, None, tinfoil.config_data)
+ if not rd:
+ return 1
+
appendfile = os.path.join(appendpath, '%s.bbappend' % bp)
with open(appendfile, 'w') as f:
f.write('inherit externalsrc\n')
f.write('EXTERNALSRC = "%s"\n' % srctree)
- if args.same_dir:
+
+ b_is_s = use_external_build(args.same_dir, args.no_same_dir, rd)
+ if b_is_s:
f.write('EXTERNALSRC_BUILD = "%s"\n' % srctree)
if initial_rev:
f.write('\n# initial_rev: %s\n' % initial_rev)
+ if args.binary:
+ f.write('do_install_append() {\n')
+ f.write(' rm -rf ${D}/.git\n')
+ f.write(' rm -f ${D}/singletask.lock\n')
+ f.write('}\n')
+
_add_md5(config, args.recipename, appendfile)
+ logger.info('Recipe %s has been automatically created; further editing may be required to make it fully functional' % recipefile)
+
+ tinfoil.shutdown()
+
return 0
@@ -152,6 +178,43 @@ def _check_compatible_recipe(pn, d):
"from working. You will need to disable this "
"first." % pn)
+def _move_file(src, dst):
+ """Move a file. Creates all the directory components of destination path."""
+ dst_d = os.path.dirname(dst)
+ if dst_d:
+ bb.utils.mkdirhier(dst_d)
+ shutil.move(src, dst)
+
+def _git_ls_tree(repodir, treeish='HEAD', recursive=False):
+ """List contents of a git treeish"""
+ import bb
+ cmd = ['git', 'ls-tree', '-z', treeish]
+ if recursive:
+ cmd.append('-r')
+ out, _ = bb.process.run(cmd, cwd=repodir)
+ ret = {}
+ for line in out.split('\0'):
+ if line:
+ split = line.split(None, 4)
+ ret[split[3]] = split[0:3]
+ return ret
+
+def _git_exclude_path(srctree, path):
+ """Return pathspec (list of paths) that excludes certain path"""
+ # NOTE: "Filtering out" files/paths in this way is not entirely reliable -
+ # we don't catch files that are deleted, for example. A more reliable way
+ # to implement this would be to use "negative pathspecs" which were
+ # introduced in Git v1.9.0. Revisit this when/if the required Git version
+ # becomes greater than that.
+ path = os.path.normpath(path)
+ recurse = True if len(path.split(os.path.sep)) > 1 else False
+ git_files = _git_ls_tree(srctree, 'HEAD', recurse).keys()
+ if path in git_files:
+ git_files.remove(path)
+ return git_files
+ else:
+ return ['.']
+
def _ls_tree(directory):
"""Recursive listing of files in a directory"""
ret = []
@@ -166,6 +229,9 @@ def extract(args, config, basepath, workspace):
import bb
tinfoil = _prep_extract_operation(config, basepath, args.recipename)
+ if not tinfoil:
+ # Error already shown
+ return 1
rd = parse_recipe(config, tinfoil, args.recipename, True)
if not rd:
@@ -210,15 +276,17 @@ class BbTaskExecutor(object):
def _prep_extract_operation(config, basepath, recipename):
"""HACK: Ugly workaround for making sure that requirements are met when
trying to extract a package. Returns the tinfoil instance to be used."""
- tinfoil = setup_tinfoil()
+ tinfoil = setup_tinfoil(basepath=basepath)
rd = parse_recipe(config, tinfoil, recipename, True)
+ if not rd:
+ return None
if bb.data.inherits_class('kernel-yocto', rd):
tinfoil.shutdown()
try:
stdout, _ = exec_build_env_command(config.init_path, basepath,
'bitbake kern-tools-native')
- tinfoil = setup_tinfoil()
+ tinfoil = setup_tinfoil(basepath=basepath)
except bb.process.ExecutionError as err:
raise DevtoolError("Failed to build kern-tools-native:\n%s" %
err.stdout)
@@ -252,6 +320,10 @@ def _extract_source(srctree, keep_temp, devbranch, d):
raise DevtoolError("output path %s already exists and is "
"non-empty" % srctree)
+ if 'noexec' in (d.getVarFlags('do_unpack', False) or []):
+ raise DevtoolError("The %s recipe has do_unpack disabled, unable to "
+ "extract source" % pn)
+
# Prepare for shutil.move later on
bb.utils.mkdirhier(srctree)
os.rmdir(srctree)
@@ -275,7 +347,7 @@ def _extract_source(srctree, keep_temp, devbranch, d):
if bb.data.inherits_class('kernel', d):
crd.setVar('S', '${WORKDIR}/source')
else:
- crd.setVar('S', '${WORKDIR}/${BP}')
+ crd.setVar('S', '${WORKDIR}/%s' % os.path.basename(d.getVar('S', True)))
if bb.data.inherits_class('kernel', d):
# We don't want to move the source to STAGING_KERNEL_DIR here
crd.setVar('STAGING_KERNEL_DIR', '${S}')
@@ -293,10 +365,25 @@ def _extract_source(srctree, keep_temp, devbranch, d):
logger.info('Doing kernel checkout...')
task_executor.exec_func('do_kernel_checkout', False)
srcsubdir = crd.getVar('S', True)
+
+ # Move local source files into separate subdir
+ recipe_patches = [os.path.basename(patch) for patch in
+ oe.recipeutils.get_recipe_patches(crd)]
+ local_files = oe.recipeutils.get_recipe_local_files(crd)
+ local_files = [fname for fname in local_files if
+ os.path.exists(os.path.join(workdir, fname))]
+ if local_files:
+ for fname in local_files:
+ _move_file(os.path.join(workdir, fname),
+ os.path.join(tempdir, 'oe-local-files', fname))
+ with open(os.path.join(tempdir, 'oe-local-files', '.gitignore'),
+ 'w') as f:
+ f.write('# Ignore local files, by default. Remove this file '
+ 'if you want to commit the directory to Git\n*\n')
+
if srcsubdir == workdir:
- # Find non-patch sources that were "unpacked" to srctree directory
- recipe_patches = [os.path.basename(patch) for patch in
- oe.recipeutils.get_recipe_patches(crd)]
+ # Find non-patch non-local sources that were "unpacked" to srctree
+ # directory
src_files = [fname for fname in _ls_tree(workdir) if
os.path.basename(fname) not in recipe_patches]
# Force separate S so that patch files can be left out from srctree
@@ -304,9 +391,8 @@ def _extract_source(srctree, keep_temp, devbranch, d):
crd.setVar('S', srcsubdir)
# Move source files to S
for path in src_files:
- tgt_dir = os.path.join(srcsubdir, os.path.dirname(path))
- bb.utils.mkdirhier(tgt_dir)
- shutil.move(os.path.join(workdir, path), tgt_dir)
+ _move_file(os.path.join(workdir, path),
+ os.path.join(srcsubdir, path))
elif os.path.dirname(srcsubdir) != workdir:
# Handle if S is set to a subdirectory of the source
srcsubdir = os.path.join(workdir, os.path.relpath(srcsubdir, workdir).split(os.sep)[0])
@@ -320,21 +406,18 @@ def _extract_source(srctree, keep_temp, devbranch, d):
haspatches = True
else:
os.rmdir(patchdir)
+ # Make sure that srcsubdir exists
+ bb.utils.mkdirhier(srcsubdir)
+ if not os.path.exists(srcsubdir) or not os.listdir(srcsubdir):
+ logger.warning("no source unpacked to S, either the %s recipe "
+ "doesn't use any source or the correct source "
+ "directory could not be determined" % pn)
- if not os.listdir(srcsubdir):
- raise DevtoolError("no source unpacked to S, perhaps the %s "
- "recipe doesn't use any source?" % pn)
-
- if not os.path.exists(os.path.join(srcsubdir, '.git')):
- bb.process.run('git init', cwd=srcsubdir)
- bb.process.run('git add .', cwd=srcsubdir)
- bb.process.run('git commit -q -m "Initial commit from upstream at version %s"' % crd.getVar('PV', True), cwd=srcsubdir)
+ setup_git_repo(srcsubdir, crd.getVar('PV', True), devbranch)
(stdout, _) = bb.process.run('git rev-parse HEAD', cwd=srcsubdir)
initial_rev = stdout.rstrip()
- bb.process.run('git checkout -b %s' % devbranch, cwd=srcsubdir)
- bb.process.run('git tag -f devtool-base', cwd=srcsubdir)
crd.setVar('PATCHTOOL', 'git')
logger.info('Patching...')
@@ -347,6 +430,12 @@ def _extract_source(srctree, keep_temp, devbranch, d):
if haspatches:
bb.process.run('git checkout patches', cwd=srcsubdir)
+ # Move oe-local-files directory to srctree
+ if os.path.exists(os.path.join(tempdir, 'oe-local-files')):
+ logger.info('Adding local source files to srctree...')
+ shutil.move(os.path.join(tempdir, 'oe-local-files'), srcsubdir)
+
+
shutil.move(srcsubdir, srctree)
finally:
bb.logger.setLevel(origlevel)
@@ -367,7 +456,7 @@ def _add_md5(config, recipename, filename):
f.write('%s|%s|%s\n' % (recipename, os.path.relpath(fn, config.workspace_path), md5))
if os.path.isdir(filename):
- for root, _, files in os.walk(os.path.dirname(filename)):
+ for root, _, files in os.walk(filename):
for f in files:
addfile(os.path.join(root, f))
else:
@@ -420,12 +509,23 @@ def modify(args, config, basepath, workspace):
args.srctree)
if args.extract:
tinfoil = _prep_extract_operation(config, basepath, args.recipename)
+ if not tinfoil:
+ # Error already shown
+ return 1
else:
- tinfoil = setup_tinfoil()
+ tinfoil = setup_tinfoil(basepath=basepath)
rd = parse_recipe(config, tinfoil, args.recipename, True)
if not rd:
return 1
+
+ pn = rd.getVar('PN', True)
+ if pn != args.recipename:
+ logger.info('Mapping %s to %s' % (args.recipename, pn))
+ if pn in workspace:
+ raise DevtoolError("recipe %s is already in your workspace" %
+ pn)
+
recipefile = rd.getVar('FILE', True)
appendname = os.path.splitext(os.path.basename(recipefile))[0]
if args.wildcard:
@@ -436,9 +536,9 @@ def modify(args, config, basepath, workspace):
raise DevtoolError("Another variant of recipe %s is already in your "
"workspace (only one variant of a recipe can "
"currently be worked on at once)"
- % args.recipename)
+ % pn)
- _check_compatible_recipe(args.recipename, rd)
+ _check_compatible_recipe(pn, rd)
initial_rev = None
commits = []
@@ -478,36 +578,30 @@ def modify(args, config, basepath, workspace):
if not os.path.exists(appendpath):
os.makedirs(appendpath)
with open(appendfile, 'w') as f:
- f.write('FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n\n')
- f.write('inherit externalsrc\n')
+ f.write('FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:"\n')
+ # Local files can be modified/tracked in separate subdir under srctree
+ # Mostly useful for packages with S != WORKDIR
+ f.write('FILESPATH_prepend := "%s:"\n' %
+ os.path.join(srctree, 'oe-local-files'))
+
+ f.write('\ninherit externalsrc\n')
f.write('# NOTE: We use pn- overrides here to avoid affecting multiple variants in the case where the recipe uses BBCLASSEXTEND\n')
- f.write('EXTERNALSRC_pn-%s = "%s"\n' % (args.recipename, srctree))
-
- b_is_s = True
- if args.no_same_dir:
- logger.info('using separate build directory since --no-same-dir specified')
- b_is_s = False
- elif args.same_dir:
- logger.info('using source tree as build directory since --same-dir specified')
- elif bb.data.inherits_class('autotools-brokensep', rd):
- logger.info('using source tree as build directory since original recipe inherits autotools-brokensep')
- elif rd.getVar('B', True) == s:
- logger.info('using source tree as build directory since that is the default for this recipe')
- else:
- b_is_s = False
+ f.write('EXTERNALSRC_pn-%s = "%s"\n' % (pn, srctree))
+
+ b_is_s = use_external_build(args.same_dir, args.no_same_dir, rd)
if b_is_s:
- f.write('EXTERNALSRC_BUILD_pn-%s = "%s"\n' % (args.recipename, srctree))
+ f.write('EXTERNALSRC_BUILD_pn-%s = "%s"\n' % (pn, srctree))
if bb.data.inherits_class('kernel', rd):
- f.write('SRCTREECOVEREDTASKS = "do_validate_branches do_kernel_checkout do_fetch do_unpack"\n')
+ f.write('SRCTREECOVEREDTASKS = "do_validate_branches do_kernel_checkout do_fetch do_unpack do_patch"\n')
if initial_rev:
f.write('\n# initial_rev: %s\n' % initial_rev)
for commit in commits:
f.write('# commit: %s\n' % commit)
- _add_md5(config, args.recipename, appendfile)
+ _add_md5(config, pn, appendfile)
- logger.info('Recipe %s now set up to build from %s' % (args.recipename, srctree))
+ logger.info('Recipe %s now set up to build from %s' % (pn, srctree))
return 0
@@ -531,6 +625,7 @@ def _get_patchset_revs(args, srctree, recipe_path):
commits.append(line.split(':')[-1].strip())
update_rev = initial_rev
+ changed_revs = None
if initial_rev:
# Find first actually changed revision
stdout, _ = bb.process.run('git rev-list --reverse %s..HEAD' %
@@ -540,50 +635,156 @@ def _get_patchset_revs(args, srctree, recipe_path):
if newcommits[i] == commits[i]:
update_rev = commits[i]
- return initial_rev, update_rev
+ try:
+ stdout, _ = bb.process.run('git cherry devtool-patched',
+ cwd=srctree)
+ except bb.process.ExecutionError as err:
+ stdout = None
+
+ if stdout is not None:
+ changed_revs = []
+ for line in stdout.splitlines():
+ if line.startswith('+ '):
+ rev = line.split()[1]
+ if rev in newcommits:
+ changed_revs.append(rev)
+
+ return initial_rev, update_rev, changed_revs
-def _remove_patch_entries(srcuri, patchlist):
- """Remove patch entries from SRC_URI"""
- remaining = patchlist[:]
+def _remove_file_entries(srcuri, filelist):
+ """Remove file:// entries from SRC_URI"""
+ remaining = filelist[:]
entries = []
- for patch in patchlist:
- patchfile = os.path.basename(patch)
+ for fname in filelist:
+ basename = os.path.basename(fname)
for i in xrange(len(srcuri)):
- if srcuri[i].startswith('file://') and os.path.basename(srcuri[i].split(';')[0]) == patchfile:
+ if (srcuri[i].startswith('file://') and
+ os.path.basename(srcuri[i].split(';')[0]) == basename):
entries.append(srcuri[i])
- remaining.remove(patch)
+ remaining.remove(fname)
srcuri.pop(i)
break
return entries, remaining
-def _remove_patch_files(args, patches, destpath):
+def _remove_source_files(args, files, destpath):
"""Unlink existing patch files"""
- for patchfile in patches:
+ for path in files:
if args.append:
if not destpath:
raise Exception('destpath should be set here')
- patchfile = os.path.join(destpath, os.path.basename(patchfile))
+ path = os.path.join(destpath, os.path.basename(path))
- if os.path.exists(patchfile):
- logger.info('Removing patch %s' % patchfile)
+ if os.path.exists(path):
+ logger.info('Removing file %s' % path)
# FIXME "git rm" here would be nice if the file in question is
# tracked
# FIXME there's a chance that this file is referred to by
# another recipe, in which case deleting wouldn't be the
# right thing to do
- os.remove(patchfile)
+ os.remove(path)
# Remove directory if empty
try:
- os.rmdir(os.path.dirname(patchfile))
+ os.rmdir(os.path.dirname(path))
except OSError as ose:
if ose.errno != errno.ENOTEMPTY:
raise
+
+def _export_patches(srctree, rd, start_rev, destdir):
+ """Export patches from srctree to given location.
+ Returns three-tuple of dicts:
+ 1. updated - patches that already exist in SRCURI
+ 2. added - new patches that don't exist in SRCURI
+ 3 removed - patches that exist in SRCURI but not in exported patches
+ In each dict the key is the 'basepath' of the URI and value is the
+ absolute path to the existing file in recipe space (if any).
+ """
+ import oe.recipeutils
+ from oe.patch import GitApplyTree
+ updated = OrderedDict()
+ added = OrderedDict()
+ seqpatch_re = re.compile('^([0-9]{4}-)?(.+)')
+
+ existing_patches = dict((os.path.basename(path), path) for path in
+ oe.recipeutils.get_recipe_patches(rd))
+
+ # Generate patches from Git, exclude local files directory
+ patch_pathspec = _git_exclude_path(srctree, 'oe-local-files')
+ GitApplyTree.extractPatches(srctree, start_rev, destdir, patch_pathspec)
+
+ new_patches = sorted(os.listdir(destdir))
+ for new_patch in new_patches:
+ # Strip numbering from patch names. If it's a git sequence named patch,
+ # the numbers might not match up since we are starting from a different
+ # revision This does assume that people are using unique shortlog
+ # values, but they ought to be anyway...
+ new_basename = seqpatch_re.match(new_patch).group(2)
+ found = False
+ for old_patch in existing_patches:
+ old_basename = seqpatch_re.match(old_patch).group(2)
+ if new_basename == old_basename:
+ updated[new_patch] = existing_patches.pop(old_patch)
+ found = True
+ # Rename patch files
+ if new_patch != old_patch:
+ os.rename(os.path.join(destdir, new_patch),
+ os.path.join(destdir, old_patch))
+ break
+ if not found:
+ added[new_patch] = None
+ return (updated, added, existing_patches)
+
+
+def _export_local_files(srctree, rd, destdir):
+ """Copy local files from srctree to given location.
+ Returns three-tuple of dicts:
+ 1. updated - files that already exist in SRCURI
+ 2. added - new files files that don't exist in SRCURI
+ 3 removed - files that exist in SRCURI but not in exported files
+ In each dict the key is the 'basepath' of the URI and value is the
+ absolute path to the existing file in recipe space (if any).
+ """
+ import oe.recipeutils
+
+ # Find out local files (SRC_URI files that exist in the "recipe space").
+ # Local files that reside in srctree are not included in patch generation.
+ # Instead they are directly copied over the original source files (in
+ # recipe space).
+ existing_files = oe.recipeutils.get_recipe_local_files(rd)
+ new_set = None
+ updated = OrderedDict()
+ added = OrderedDict()
+ removed = OrderedDict()
+ git_files = _git_ls_tree(srctree)
+ if 'oe-local-files' in git_files:
+ # If tracked by Git, take the files from srctree HEAD. First get
+ # the tree object of the directory
+ tmp_index = os.path.join(srctree, '.git', 'index.tmp.devtool')
+ tree = git_files['oe-local-files'][2]
+ bb.process.run(['git', 'checkout', tree, '--', '.'], cwd=srctree,
+ env=dict(os.environ, GIT_WORK_TREE=destdir,
+ GIT_INDEX_FILE=tmp_index))
+ new_set = _git_ls_tree(srctree, tree, True).keys()
+ elif os.path.isdir(os.path.join(srctree, 'oe-local-files')):
+ # If not tracked by Git, just copy from working copy
+ new_set = _ls_tree(os.path.join(srctree, 'oe-local-files'))
+ bb.process.run(['cp', '-ax',
+ os.path.join(srctree, 'oe-local-files', '.'), destdir])
+ if new_set is not None:
+ for fname in new_set:
+ if fname in existing_files:
+ updated[fname] = existing_files.pop(fname)
+ elif fname != '.gitignore':
+ added[fname] = None
+
+ removed = existing_files
+ return (updated, added, removed)
+
+
def _update_recipe_srcrev(args, srctree, rd, config_data):
"""Implement the 'srcrev' mode of update-recipe"""
import bb
import oe.recipeutils
- from oe.patch import GitApplyTree
recipefile = rd.getVar('FILE', True)
logger.info('Updating SRCREV in recipe %s' % os.path.basename(recipefile))
@@ -599,51 +800,68 @@ def _update_recipe_srcrev(args, srctree, rd, config_data):
raise DevtoolError('Invalid hash returned by git: %s' % stdout)
destpath = None
- removepatches = []
+ remove_files = []
patchfields = {}
patchfields['SRCREV'] = srcrev
orig_src_uri = rd.getVar('SRC_URI', False) or ''
- if not args.no_remove:
- # Find list of existing patches in recipe file
- existing_patches = oe.recipeutils.get_recipe_patches(rd)
-
- old_srcrev = (rd.getVar('SRCREV', False) or '')
- tempdir = tempfile.mkdtemp(prefix='devtool')
- try:
- GitApplyTree.extractPatches(srctree, old_srcrev, tempdir)
- newpatches = os.listdir(tempdir)
- for patch in existing_patches:
- patchfile = os.path.basename(patch)
- if patchfile in newpatches:
- removepatches.append(patch)
- finally:
- shutil.rmtree(tempdir)
+ srcuri = orig_src_uri.split()
+ tempdir = tempfile.mkdtemp(prefix='devtool')
+ update_srcuri = False
+ try:
+ local_files_dir = tempfile.mkdtemp(dir=tempdir)
+ upd_f, new_f, del_f = _export_local_files(srctree, rd, local_files_dir)
+ if not args.no_remove:
+ # Find list of existing patches in recipe file
+ patches_dir = tempfile.mkdtemp(dir=tempdir)
+ old_srcrev = (rd.getVar('SRCREV', False) or '')
+ upd_p, new_p, del_p = _export_patches(srctree, rd, old_srcrev,
+ patches_dir)
+
+ # Remove deleted local files and "overlapping" patches
+ remove_files = del_f.values() + upd_p.values()
+ if remove_files:
+ removedentries = _remove_file_entries(srcuri, remove_files)[0]
+ update_srcuri = True
- if removepatches:
- srcuri = orig_src_uri.split()
- removedentries, _ = _remove_patch_entries(srcuri, removepatches)
- if removedentries:
+ if args.append:
+ files = dict((os.path.join(local_files_dir, key), val) for
+ key, val in upd_f.items() + new_f.items())
+ removevalues = {}
+ if update_srcuri:
+ removevalues = {'SRC_URI': removedentries}
+ patchfields['SRC_URI'] = '\\\n '.join(srcuri)
+ _, destpath = oe.recipeutils.bbappend_recipe(
+ rd, args.append, files, wildcardver=args.wildcard_version,
+ extralines=patchfields, removevalues=removevalues)
+ else:
+ files_dir = os.path.join(os.path.dirname(recipefile),
+ rd.getVar('BPN', True))
+ for basepath, path in upd_f.iteritems():
+ logger.info('Updating file %s' % basepath)
+ _move_file(os.path.join(local_files_dir, basepath), path)
+ update_srcuri= True
+ for basepath, path in new_f.iteritems():
+ logger.info('Adding new file %s' % basepath)
+ _move_file(os.path.join(local_files_dir, basepath),
+ os.path.join(files_dir, basepath))
+ srcuri.append('file://%s' % basepath)
+ update_srcuri = True
+ if update_srcuri:
patchfields['SRC_URI'] = ' '.join(srcuri)
-
- if args.append:
- _, destpath = oe.recipeutils.bbappend_recipe(
- rd, args.append, None, wildcardver=args.wildcard_version,
- extralines=patchfields)
- else:
- oe.recipeutils.patch_recipe(rd, recipefile, patchfields)
-
+ oe.recipeutils.patch_recipe(rd, recipefile, patchfields)
+ finally:
+ shutil.rmtree(tempdir)
if not 'git://' in orig_src_uri:
logger.info('You will need to update SRC_URI within the recipe to '
'point to a git repository where you have pushed your '
'changes')
- _remove_patch_files(args, removepatches, destpath)
+ _remove_source_files(args, remove_files, destpath)
def _update_recipe_patch(args, config, srctree, rd, config_data):
"""Implement the 'patch' mode of update-recipe"""
import bb
import oe.recipeutils
- from oe.patch import GitApplyTree
recipefile = rd.getVar('FILE', True)
append = os.path.join(config.workspace_path, 'appends', '%s.bbappend' %
@@ -652,105 +870,99 @@ def _update_recipe_patch(args, config, srctree, rd, config_data):
raise DevtoolError('unable to find workspace bbappend for recipe %s' %
args.recipename)
- initial_rev, update_rev = _get_patchset_revs(args, srctree, append)
+ initial_rev, update_rev, changed_revs = _get_patchset_revs(args, srctree, append)
if not initial_rev:
raise DevtoolError('Unable to find initial revision - please specify '
'it with --initial-rev')
- # Find list of existing patches in recipe file
- existing_patches = oe.recipeutils.get_recipe_patches(rd)
-
- removepatches = []
- seqpatch_re = re.compile('^([0-9]{4}-)?(.+)')
- if not args.no_remove:
- # Get all patches from source tree and check if any should be removed
- tempdir = tempfile.mkdtemp(prefix='devtool')
- try:
- GitApplyTree.extractPatches(srctree, initial_rev, tempdir)
- # Strip numbering from patch names. If it's a git sequence named
- # patch, the numbers might not match up since we are starting from
- # a different revision This does assume that people are using
- # unique shortlog values, but they ought to be anyway...
- newpatches = [seqpatch_re.match(fname).group(2) for fname in
- os.listdir(tempdir)]
- for patch in existing_patches:
- basename = seqpatch_re.match(
- os.path.basename(patch)).group(2)
- if basename not in newpatches:
- removepatches.append(patch)
- finally:
- shutil.rmtree(tempdir)
-
- # Get updated patches from source tree
tempdir = tempfile.mkdtemp(prefix='devtool')
try:
- GitApplyTree.extractPatches(srctree, update_rev, tempdir)
-
- # Match up and replace existing patches with corresponding new patches
- updatepatches = False
+ local_files_dir = tempfile.mkdtemp(dir=tempdir)
+ upd_f, new_f, del_f = _export_local_files(srctree, rd, local_files_dir)
+
+ remove_files = []
+ if not args.no_remove:
+ # Get all patches from source tree and check if any should be removed
+ all_patches_dir = tempfile.mkdtemp(dir=tempdir)
+ upd_p, new_p, del_p = _export_patches(srctree, rd, initial_rev,
+ all_patches_dir)
+ # Remove deleted local files and patches
+ remove_files = del_f.values() + del_p.values()
+
+ # Get updated patches from source tree
+ patches_dir = tempfile.mkdtemp(dir=tempdir)
+ upd_p, new_p, del_p = _export_patches(srctree, rd, update_rev,
+ patches_dir)
+ updatefiles = False
updaterecipe = False
destpath = None
- newpatches = os.listdir(tempdir)
+ srcuri = (rd.getVar('SRC_URI', False) or '').split()
if args.append:
- patchfiles = {}
- for patch in existing_patches:
- patchfile = os.path.basename(patch)
- if patchfile in newpatches:
- patchfiles[os.path.join(tempdir, patchfile)] = patchfile
- newpatches.remove(patchfile)
- for patchfile in newpatches:
- patchfiles[os.path.join(tempdir, patchfile)] = None
-
- if patchfiles or removepatches:
+ files = dict((os.path.join(local_files_dir, key), val) for
+ key, val in upd_f.items() + new_f.items())
+ files.update(dict((os.path.join(patches_dir, key), val) for
+ key, val in upd_p.items() + new_p.items()))
+ if files or remove_files:
removevalues = None
- if removepatches:
- srcuri = (rd.getVar('SRC_URI', False) or '').split()
- removedentries, remaining = _remove_patch_entries(
- srcuri, removepatches)
+ if remove_files:
+ removedentries, remaining = _remove_file_entries(
+ srcuri, remove_files)
if removedentries or remaining:
remaining = ['file://' + os.path.basename(item) for
item in remaining]
removevalues = {'SRC_URI': removedentries + remaining}
_, destpath = oe.recipeutils.bbappend_recipe(
- rd, args.append, patchfiles,
+ rd, args.append, files,
removevalues=removevalues)
else:
- logger.info('No patches needed updating')
+ logger.info('No patches or local source files needed updating')
else:
- for patch in existing_patches:
- patchfile = os.path.basename(patch)
- if patchfile in newpatches:
- logger.info('Updating patch %s' % patchfile)
- shutil.move(os.path.join(tempdir, patchfile), patch)
- newpatches.remove(patchfile)
- updatepatches = True
- srcuri = (rd.getVar('SRC_URI', False) or '').split()
- if newpatches:
- # Add any patches left over
- patchdir = os.path.join(os.path.dirname(recipefile),
- rd.getVar('BPN', True))
- bb.utils.mkdirhier(patchdir)
- for patchfile in newpatches:
- logger.info('Adding new patch %s' % patchfile)
- shutil.move(os.path.join(tempdir, patchfile),
- os.path.join(patchdir, patchfile))
- srcuri.append('file://%s' % patchfile)
- updaterecipe = True
- if removepatches:
- removedentries, _ = _remove_patch_entries(srcuri, removepatches)
- if removedentries:
- updaterecipe = True
+ # Update existing files
+ for basepath, path in upd_f.iteritems():
+ logger.info('Updating file %s' % basepath)
+ _move_file(os.path.join(local_files_dir, basepath), path)
+ updatefiles = True
+ for basepath, path in upd_p.iteritems():
+ patchfn = os.path.join(patches_dir, basepath)
+ if changed_revs is not None:
+ # Avoid updating patches that have not actually changed
+ with open(patchfn, 'r') as f:
+ firstlineitems = f.readline().split()
+ if len(firstlineitems) > 1 and len(firstlineitems[1]) == 40:
+ if not firstlineitems[1] in changed_revs:
+ continue
+ logger.info('Updating patch %s' % basepath)
+ _move_file(patchfn, path)
+ updatefiles = True
+ # Add any new files
+ files_dir = os.path.join(os.path.dirname(recipefile),
+ rd.getVar('BPN', True))
+ for basepath, path in new_f.iteritems():
+ logger.info('Adding new file %s' % basepath)
+ _move_file(os.path.join(local_files_dir, basepath),
+ os.path.join(files_dir, basepath))
+ srcuri.append('file://%s' % basepath)
+ updaterecipe = True
+ for basepath, path in new_p.iteritems():
+ logger.info('Adding new patch %s' % basepath)
+ _move_file(os.path.join(patches_dir, basepath),
+ os.path.join(files_dir, basepath))
+ srcuri.append('file://%s' % basepath)
+ updaterecipe = True
+ # Update recipe, if needed
+ if _remove_file_entries(srcuri, remove_files)[0]:
+ updaterecipe = True
if updaterecipe:
logger.info('Updating recipe %s' % os.path.basename(recipefile))
oe.recipeutils.patch_recipe(rd, recipefile,
{'SRC_URI': ' '.join(srcuri)})
- elif not updatepatches:
+ elif not updatefiles:
# Neither patches nor recipe were updated
- logger.info('No patches need updating')
+ logger.info('No patches or files need updating')
finally:
shutil.rmtree(tempdir)
- _remove_patch_files(args, removepatches, destpath)
+ _remove_source_files(args, remove_files, destpath)
def _guess_recipe_update_mode(srctree, rdata):
"""Guess the recipe update mode to use"""
@@ -776,9 +988,7 @@ def _guess_recipe_update_mode(srctree, rdata):
def update_recipe(args, config, basepath, workspace):
"""Entry point for the devtool 'update-recipe' subcommand"""
- if not args.recipename in workspace:
- raise DevtoolError("no recipe named %s in your workspace" %
- args.recipename)
+ check_workspace_recipe(workspace, args.recipename)
if args.append:
if not os.path.exists(args.append):
@@ -788,7 +998,7 @@ def update_recipe(args, config, basepath, workspace):
raise DevtoolError('conf/layer.conf not found in bbappend '
'destination layer "%s"' % args.append)
- tinfoil = setup_tinfoil()
+ tinfoil = setup_tinfoil(basepath=basepath, tracking=True)
rd = parse_recipe(config, tinfoil, args.recipename, True)
if not rd:
@@ -830,28 +1040,30 @@ def reset(args, config, basepath, workspace):
if args.recipename:
if args.all:
raise DevtoolError("Recipe cannot be specified if -a/--all is used")
- elif not args.recipename in workspace:
- raise DevtoolError("no recipe named %s in your workspace" %
- args.recipename)
+ else:
+ check_workspace_recipe(workspace, args.recipename, checksrc=False)
elif not args.all:
raise DevtoolError("Recipe must be specified, or specify -a/--all to "
"reset all recipes")
if args.all:
- recipes = workspace
+ recipes = workspace.keys()
else:
recipes = [args.recipename]
- for pn in recipes:
- if not args.no_clean:
- logger.info('Cleaning sysroot for recipe %s...' % pn)
- try:
- exec_build_env_command(config.init_path, basepath, 'bitbake -c clean %s' % pn)
- except bb.process.ExecutionError as e:
- raise DevtoolError('Command \'%s\' failed, output:\n%s\nIf you '
- 'wish, you may specify -n/--no-clean to '
- 'skip running this command when resetting' %
- (e.command, e.stdout))
+ if recipes and not args.no_clean:
+ if len(recipes) == 1:
+ logger.info('Cleaning sysroot for recipe %s...' % recipes[0])
+ else:
+ logger.info('Cleaning sysroot for recipes %s...' % ', '.join(recipes))
+ try:
+ exec_build_env_command(config.init_path, basepath, 'bitbake -c clean %s' % ' '.join(recipes))
+ except bb.process.ExecutionError as e:
+ raise DevtoolError('Command \'%s\' failed, output:\n%s\nIf you '
+ 'wish, you may specify -n/--no-clean to '
+ 'skip running this command when resetting' %
+ (e.command, e.stdout))
+ for pn in recipes:
_check_preserve(config, pn)
preservepath = os.path.join(config.workspace_path, 'attic', pn)
@@ -860,8 +1072,8 @@ def reset(args, config, basepath, workspace):
for root, dirs, files in os.walk(origdir):
for fn in files:
logger.warn('Preserving %s in %s' % (fn, preservepath))
- bb.utils.mkdirhier(preservepath)
- shutil.move(os.path.join(origdir, fn), os.path.join(preservepath, fn))
+ _move_file(os.path.join(origdir, fn),
+ os.path.join(preservepath, fn))
for dn in dirs:
os.rmdir(os.path.join(root, dn))
os.rmdir(origdir)
@@ -879,9 +1091,13 @@ def register_commands(subparsers, context):
description='Adds a new recipe')
parser_add.add_argument('recipename', help='Name for new recipe to add')
parser_add.add_argument('srctree', help='Path to external source tree')
- parser_add.add_argument('--same-dir', '-s', help='Build in same directory as source', action="store_true")
+ group = parser_add.add_mutually_exclusive_group()
+ group.add_argument('--same-dir', '-s', help='Build in same directory as source', action="store_true")
+ group.add_argument('--no-same-dir', help='Force build in a separate build directory', action="store_true")
parser_add.add_argument('--fetch', '-f', help='Fetch the specified URI and extract it to create the source tree', metavar='URI')
parser_add.add_argument('--version', '-V', help='Version to use within recipe (PV)')
+ parser_add.add_argument('--no-git', '-g', help='If -f/--fetch is specified, do not set up source tree as a git repository', action="store_true")
+ parser_add.add_argument('--binary', '-b', help='Treat the source tree as something that should be installed verbatim (no compilation, same directory structure)', action='store_true')
parser_add.set_defaults(func=add)
parser_modify = subparsers.add_parser('modify', help='Modify the source for an existing recipe',
diff --git a/scripts/lib/devtool/upgrade.py b/scripts/lib/devtool/upgrade.py
index 86443b0..6bac44b 100644
--- a/scripts/lib/devtool/upgrade.py
+++ b/scripts/lib/devtool/upgrade.py
@@ -29,7 +29,7 @@ import errno
import bb
import oe.recipeutils
from devtool import standard
-from devtool import exec_build_env_command, setup_tinfoil, DevtoolError, parse_recipe
+from devtool import exec_build_env_command, setup_tinfoil, DevtoolError, parse_recipe, use_external_build
logger = logging.getLogger('devtool')
@@ -53,7 +53,7 @@ def _copy_source_code(orig, dest):
dest_dir = os.path.join(dest, os.path.dirname(path))
bb.utils.mkdirhier(dest_dir)
dest_path = os.path.join(dest, path)
- os.rename(os.path.join(orig, path), dest_path)
+ shutil.move(os.path.join(orig, path), dest_path)
def _get_checksums(rf):
import re
@@ -91,15 +91,13 @@ def _remove_patch_dirs(recipefolder):
for d in dirs:
shutil.rmtree(os.path.join(root,d))
-def _recipe_contains(rf, var):
- import re
- found = False
- with open(rf) as f:
- for line in f:
- if re.match("^%s.*=.*" % var, line):
- found = True
- break
- return found
+def _recipe_contains(rd, var):
+ rf = rd.getVar('FILE', True)
+ varfiles = oe.recipeutils.get_var_files(rf, [var], rd)
+ for var, fn in varfiles.iteritems():
+ if fn and fn.startswith(os.path.dirname(rf) + os.sep):
+ return True
+ return False
def _rename_recipe_dirs(oldpv, newpv, path):
for root, dirs, files in os.walk(path):
@@ -119,28 +117,12 @@ def _rename_recipe_file(bpn, oldpv, newpv, path):
recipe = "%s_git.bb" % bpn
if os.path.isfile(os.path.join(path, recipe)):
newrecipe = recipe
- raise DevtoolError("Original recipe not found on workspace")
return os.path.join(path, newrecipe)
def _rename_recipe_files(bpn, oldpv, newpv, path):
_rename_recipe_dirs(oldpv, newpv, path)
return _rename_recipe_file(bpn, oldpv, newpv, path)
-def _use_external_build(same_dir, no_same_dir, d):
- b_is_s = True
- if no_same_dir:
- logger.info('using separate build directory since --no-same-dir specified')
- b_is_s = False
- elif same_dir:
- logger.info('using source tree as build directory since --same-dir specified')
- elif bb.data.inherits_class('autotools-brokensep', d):
- logger.info('using source tree as build directory since original recipe inherits autotools-brokensep')
- elif d.getVar('B', True) == os.path.abspath(d.getVar('S', True)):
- logger.info('using source tree as build directory since that is the default for this recipe')
- else:
- b_is_s = False
- return b_is_s
-
def _write_append(rc, srctree, same_dir, no_same_dir, rev, workspace, d):
"""Writes an append file"""
if not os.path.exists(rc):
@@ -161,7 +143,8 @@ def _write_append(rc, srctree, same_dir, no_same_dir, rev, workspace, d):
f.write(('# NOTE: We use pn- overrides here to avoid affecting'
'multiple variants in the case where the recipe uses BBCLASSEXTEND\n'))
f.write('EXTERNALSRC_pn-%s = "%s"\n' % (pn, srctree))
- if _use_external_build(same_dir, no_same_dir, d):
+ b_is_s = use_external_build(same_dir, no_same_dir, d)
+ if b_is_s:
f.write('EXTERNALSRC_BUILD_pn-%s = "%s"\n' % (pn, srctree))
if rev:
f.write('\n# initial_rev: %s\n' % rev)
@@ -216,6 +199,7 @@ def _extract_new_source(newpv, srctree, no_patch, srcrev, branch, keep_temp, tin
if srcrev:
rev = srcrev
if uri.startswith('git://'):
+ __run('git fetch')
__run('git checkout %s' % rev)
__run('git tag -f devtool-base-new')
md5 = None
@@ -271,7 +255,7 @@ def _extract_new_source(newpv, srctree, no_patch, srcrev, branch, keep_temp, tin
return (rev, md5, sha256)
-def _create_new_recipe(newpv, md5, sha256, workspace, rd):
+def _create_new_recipe(newpv, md5, sha256, srcrev, workspace, tinfoil, rd):
"""Creates the new recipe under workspace"""
crd = rd.createCopy()
@@ -285,8 +269,16 @@ def _create_new_recipe(newpv, md5, sha256, workspace, rd):
newpv = oldpv
fullpath = _rename_recipe_files(bpn, oldpv, newpv, path)
- if _recipe_contains(fullpath, 'PV') and newpv != oldpv:
- oe.recipeutils.patch_recipe(d, fullpath, {'PV':newpv})
+ newvalues = {}
+ if _recipe_contains(rd, 'PV') and newpv != oldpv:
+ newvalues['PV'] = newpv
+
+ if srcrev:
+ newvalues['SRCREV'] = srcrev
+
+ if newvalues:
+ rd = oe.recipeutils.parse_recipe(fullpath, None, tinfoil.config_data)
+ oe.recipeutils.patch_recipe(rd, fullpath, newvalues)
if md5 and sha256:
# Unfortunately, oe.recipeutils.patch_recipe cannot update flags.
@@ -308,13 +300,19 @@ def upgrade(args, config, basepath, workspace):
if reason:
raise DevtoolError(reason)
- tinfoil = setup_tinfoil()
+ tinfoil = setup_tinfoil(basepath=basepath, tracking=True)
rd = parse_recipe(config, tinfoil, args.recipename, True)
if not rd:
return 1
- standard._check_compatible_recipe(args.recipename, rd)
+ pn = rd.getVar('PN', True)
+ if pn != args.recipename:
+ logger.info('Mapping %s to %s' % (args.recipename, pn))
+ if pn in workspace:
+ raise DevtoolError("recipe %s is already in your workspace" % pn)
+
+ standard._check_compatible_recipe(pn, rd)
if rd.getVar('PV', True) == args.version and rd.getVar('SRCREV', True) == args.srcrev:
raise DevtoolError("Current and upgrade versions are the same version" % version)
@@ -324,16 +322,16 @@ def upgrade(args, config, basepath, workspace):
rev2, md5, sha256 = _extract_new_source(args.version, args.srctree, args.no_patch,
args.srcrev, args.branch, args.keep_temp,
tinfoil, rd)
- rf = _create_new_recipe(args.version, md5, sha256, config.workspace_path, rd)
+ rf = _create_new_recipe(args.version, md5, sha256, args.srcrev, config.workspace_path, tinfoil, rd)
except bb.process.CmdError as e:
_upgrade_error(e, rf, args.srctree)
except DevtoolError as e:
_upgrade_error(e, rf, args.srctree)
- standard._add_md5(config, args.recipename, os.path.dirname(rf))
+ standard._add_md5(config, pn, os.path.dirname(rf))
af = _write_append(rf, args.srctree, args.same_dir, args.no_same_dir, rev2,
config.workspace_path, rd)
- standard._add_md5(config, args.recipename, af)
+ standard._add_md5(config, pn, af)
logger.info('Upgraded source extracted to %s' % args.srctree)
return 0
diff --git a/scripts/lib/recipetool/create.py b/scripts/lib/recipetool/create.py
index c4754db..8305e43 100644
--- a/scripts/lib/recipetool/create.py
+++ b/scripts/lib/recipetool/create.py
@@ -23,6 +23,7 @@ import fnmatch
import re
import logging
import scriptutils
+import urlparse
logger = logging.getLogger('recipetool')
@@ -46,10 +47,26 @@ class RecipeHandler():
results.extend(glob.glob(os.path.join(path, spec)))
return results
- def genfunction(self, outlines, funcname, content):
- outlines.append('%s () {' % funcname)
+ def genfunction(self, outlines, funcname, content, python=False, forcespace=False):
+ if python:
+ prefix = 'python '
+ else:
+ prefix = ''
+ outlines.append('%s%s () {' % (prefix, funcname))
+ if python or forcespace:
+ indent = ' '
+ else:
+ indent = '\t'
+ addnoop = not python
for line in content:
- outlines.append('\t%s' % line)
+ outlines.append('%s%s' % (indent, line))
+ if addnoop:
+ strippedline = line.lstrip()
+ if strippedline and not strippedline.startswith('#'):
+ addnoop = False
+ if addnoop:
+ # Without this there'll be a syntax error
+ outlines.append('%s:' % indent)
outlines.append('}')
outlines.append('')
@@ -86,7 +103,17 @@ def create_recipe(args):
srcrev = '${AUTOREV}'
if '://' in args.source:
# Fetch a URL
- srcuri = args.source
+ fetchuri = urlparse.urldefrag(args.source)[0]
+ if args.binary:
+ # Assume the archive contains the directory structure verbatim
+ # so we need to extract to a subdirectory
+ fetchuri += ';subdir=%s' % os.path.splitext(os.path.basename(urlparse.urlsplit(fetchuri).path))[0]
+ git_re = re.compile('(https?)://([^;]+\.git)(;.*)?')
+ res = git_re.match(fetchuri)
+ if res:
+ # Need to switch the URI around so that the git fetcher is used
+ fetchuri = 'git://%s;protocol=%s%s' % (res.group(2), res.group(1), res.group(3) or '')
+ srcuri = fetchuri
rev_re = re.compile(';rev=([^;]+)')
res = rev_re.search(srcuri)
if res:
@@ -95,14 +122,25 @@ def create_recipe(args):
tempsrc = tempfile.mkdtemp(prefix='recipetool-')
srctree = tempsrc
logger.info('Fetching %s...' % srcuri)
- checksums = scriptutils.fetch_uri(tinfoil.config_data, args.source, srctree, srcrev)
+ try:
+ checksums = scriptutils.fetch_uri(tinfoil.config_data, fetchuri, srctree, srcrev)
+ except bb.fetch2.FetchError:
+ # Error already printed
+ sys.exit(1)
dirlist = os.listdir(srctree)
if 'git.indirectionsymlink' in dirlist:
dirlist.remove('git.indirectionsymlink')
- if len(dirlist) == 1 and os.path.isdir(os.path.join(srctree, dirlist[0])):
- # We unpacked a single directory, so we should use that
- srcsubdir = dirlist[0]
- srctree = os.path.join(srctree, srcsubdir)
+ if len(dirlist) == 1:
+ singleitem = os.path.join(srctree, dirlist[0])
+ if os.path.isdir(singleitem):
+ # We unpacked a single directory, so we should use that
+ srcsubdir = dirlist[0]
+ srctree = os.path.join(srctree, srcsubdir)
+ else:
+ with open(singleitem, 'r') as f:
+ if '<html' in f.read(100).lower():
+ logger.error('Fetching "%s" returned a single HTML page - check the URL is correct and functional' % fetchuri)
+ sys.exit(1)
else:
# Assume we're pointing to an existing source tree
if args.extract_to:
@@ -208,6 +246,10 @@ def create_recipe(args):
lines_after.append('PACKAGE_ARCH = "%s"' % pkgarch)
lines_after.append('')
+ if args.binary:
+ lines_after.append('INSANE_SKIP_${PN} += "already-stripped"')
+ lines_after.append('')
+
# Find all plugins that want to register handlers
handlers = []
for plugin in plugins:
@@ -217,6 +259,11 @@ def create_recipe(args):
# Apply the handlers
classes = []
handled = []
+
+ if args.binary:
+ classes.append('bin_package')
+ handled.append('buildsystem')
+
for handler in handlers:
handler.process(srctree, classes, lines_before, lines_after, handled)
@@ -229,7 +276,15 @@ def create_recipe(args):
if args.extract_to:
scriptutils.git_convert_standalone_clone(srctree)
+ if os.path.isdir(args.extract_to):
+ # If the directory exists we'll move the temp dir into it instead of
+ # its contents - of course, we could try to always move its contents
+ # but that is a pain if there are symlinks; the simplest solution is
+ # to just remove it first
+ os.rmdir(args.extract_to)
shutil.move(srctree, args.extract_to)
+ if tempsrc == srctree:
+ tempsrc = None
logger.info('Source extracted to %s' % args.extract_to)
if outfile == '-':
@@ -408,5 +463,6 @@ def register_command(subparsers):
parser_create.add_argument('-m', '--machine', help='Make recipe machine-specific as opposed to architecture-specific', action='store_true')
parser_create.add_argument('-x', '--extract-to', metavar='EXTRACTPATH', help='Assuming source is a URL, fetch it and extract it to the directory specified as %(metavar)s')
parser_create.add_argument('-V', '--version', help='Version to use within recipe (PV)')
+ parser_create.add_argument('-b', '--binary', help='Treat the source tree as something that should be installed verbatim (no compilation, same directory structure)', action='store_true')
parser_create.set_defaults(func=create_recipe)
diff --git a/scripts/lib/recipetool/create_buildsys.py b/scripts/lib/recipetool/create_buildsys.py
index ed14a53..931ef3b 100644
--- a/scripts/lib/recipetool/create_buildsys.py
+++ b/scripts/lib/recipetool/create_buildsys.py
@@ -279,7 +279,7 @@ class MakefileRecipeHandler(RecipeHandler):
installtarget = True
try:
- stdout, stderr = bb.process.run('make -qn install', cwd=srctree, shell=True)
+ stdout, stderr = bb.process.run('make -n install', cwd=srctree, shell=True)
except bb.process.ExecutionError as e:
if e.exitcode != 1:
installtarget = False
diff --git a/scripts/lib/scriptutils.py b/scripts/lib/scriptutils.py
index 3366882..e79a195 100644
--- a/scripts/lib/scriptutils.py
+++ b/scripts/lib/scriptutils.py
@@ -85,6 +85,10 @@ def fetch_uri(d, uri, destdir, srcrev=None):
ud = fetcher.ud[u]
ud.ignore_checksums = True
fetcher.download()
+ for u in fetcher.ud:
+ ud = fetcher.ud[u]
+ if ud.localpath.rstrip(os.sep) == localdata.getVar('DL_DIR', True).rstrip(os.sep):
+ raise Exception('Local path is download directory - please check that the URI "%s" is correct' % uri)
fetcher.unpack(destdir)
for u in fetcher.ud:
ud = fetcher.ud[u]
diff --git a/scripts/lib/wic/imager/direct.py b/scripts/lib/wic/imager/direct.py
index 146a0d1..d5603fa 100644
--- a/scripts/lib/wic/imager/direct.py
+++ b/scripts/lib/wic/imager/direct.py
@@ -241,8 +241,7 @@ class DirectImageCreator(BaseImageCreator):
# IMAGE_OVERHEAD_FACTOR and IMAGE_ROOTFS_EXTRA_SPACE
rsize_bb = get_bitbake_var('ROOTFS_SIZE', image_name)
if rsize_bb:
- # convert from Kb to Mb
- part.size = int(round(float(rsize_bb) / 1024.))
+ part.size = int(round(float(rsize_bb)))
# need to create the filesystems in order to get their
# sizes before we can add them and do the layout.
# Image.create() actually calls __format_disks() to create
diff --git a/scripts/lib/wic/utils/oe/misc.py b/scripts/lib/wic/utils/oe/misc.py
index 7370d93..c6d2e5f 100644
--- a/scripts/lib/wic/utils/oe/misc.py
+++ b/scripts/lib/wic/utils/oe/misc.py
@@ -82,6 +82,12 @@ def exec_cmd(cmd_and_args, as_shell=False, catch=3):
return out
+def cmd_in_path(cmd, path):
+ import scriptpath
+
+ scriptpath.add_bitbake_lib_path()
+
+ return bb.utils.which(path, cmd) != "" or False
def exec_native_cmd(cmd_and_args, native_sysroot, catch=3):
"""
@@ -92,15 +98,21 @@ def exec_native_cmd(cmd_and_args, native_sysroot, catch=3):
Always need to execute native commands as_shell
"""
native_paths = \
- "export PATH=%s/sbin:%s/usr/sbin:%s/usr/bin" % \
+ "%s/sbin:%s/usr/sbin:%s/usr/bin" % \
(native_sysroot, native_sysroot, native_sysroot)
- native_cmd_and_args = "%s;%s" % (native_paths, cmd_and_args)
+ native_cmd_and_args = "export PATH=%s:$PATH;%s" % \
+ (native_paths, cmd_and_args)
msger.debug("exec_native_cmd: %s" % cmd_and_args)
- args = cmd_and_args.split()
+ # The reason -1 is used is because there may be "export" commands.
+ args = cmd_and_args.split(';')[-1].split()
msger.debug(args)
- ret, out = _exec_cmd(native_cmd_and_args, True, catch)
+ # If the command isn't in the native sysroot say we failed.
+ if cmd_in_path(args[0], native_paths):
+ ret, out = _exec_cmd(native_cmd_and_args, True, catch)
+ else:
+ ret = 127
if ret == 127: # shell command-not-found
prog = args[0]
diff --git a/scripts/oe-git-proxy b/scripts/oe-git-proxy
index 4873455..d2e9f92 100755
--- a/scripts/oe-git-proxy
+++ b/scripts/oe-git-proxy
@@ -53,6 +53,7 @@ match_ipv4() {
# Determine the mask bitlength
BITS=${CIDR##*/}
+ [ "$BITS" != "$CIDR" ] || BITS=32
if [ -z "$BITS" ]; then
return 1
fi
@@ -112,16 +113,23 @@ done
# Proxy is necessary, determine protocol, server, and port
PROTO=$(echo $ALL_PROXY | sed -e 's/\([^:]*\):\/\/.*/\1/')
PROXY=$(echo $ALL_PROXY | sed -e 's/.*:\/\/\([^:]*\).*/\1/')
-PORT=$(echo $ALL_PROXY | sed -e 's/.*:\([0-9]*\)\/?$/\1/')
+# For backwards compatibility, this allows the port number to be followed by /?
+# in addition to the customary optional /
+PORT=$(echo $ALL_PROXY | sed -e 's/.*:\([0-9]*\)\(\/?\?\)\?$/\1/')
if [ "$PORT" = "$ALL_PROXY" ]; then
PORT=""
fi
-if [ "$PROTO" = "socks" ]; then
+if [ "$PROTO" = "socks" ] || [ "$PROTO" = "socks4a" ]; then
if [ -z "$PORT" ]; then
PORT="1080"
fi
METHOD="SOCKS4A:$PROXY:$1:$2,socksport=$PORT"
+elif [ "$PROTO" = "socks4" ]; then
+ if [ -z "$PORT" ]; then
+ PORT="1080"
+ fi
+ METHOD="SOCKS4:$PROXY:$1:$2,socksport=$PORT"
else
# Assume PROXY (http, https, etc)
if [ -z "$PORT" ]; then
diff --git a/scripts/oe-pkgdata-util b/scripts/oe-pkgdata-util
index b075775..cb19cc4 100755
--- a/scripts/oe-pkgdata-util
+++ b/scripts/oe-pkgdata-util
@@ -60,6 +60,7 @@ def glob(args):
skipval += "|" + args.exclude
skipregex = re.compile(skipval)
+ skippedpkgs = set()
mappedpkgs = set()
with open(args.pkglistfile, 'r') as f:
for line in f:
@@ -73,6 +74,7 @@ def glob(args):
# Skip packages for which there is no point applying globs
if skipregex.search(pkg):
logger.debug("%s -> !!" % pkg)
+ skippedpkgs.add(pkg)
continue
# Skip packages that already match the globs, so if e.g. a dev package
@@ -84,6 +86,7 @@ def glob(args):
already = True
break
if already:
+ skippedpkgs.add(pkg)
logger.debug("%s -> !" % pkg)
continue
@@ -152,7 +155,7 @@ def glob(args):
logger.debug("------")
- print("\n".join(mappedpkgs))
+ print("\n".join(mappedpkgs - skippedpkgs))
def read_value(args):
# Handle both multiple arguments and multiple values within an arg (old syntax)
@@ -493,7 +496,7 @@ def main():
sys.exit(1)
if not os.path.exists(args.pkgdata_dir):
- logger.error('Unable to find pkgdata directory %s' % pkgdata_dir)
+ logger.error('Unable to find pkgdata directory %s' % args.pkgdata_dir)
sys.exit(1)
ret = args.func(args)
diff --git a/scripts/oe-publish-sdk b/scripts/oe-publish-sdk
index 1737c9f..ee4169a 100755
--- a/scripts/oe-publish-sdk
+++ b/scripts/oe-publish-sdk
@@ -101,9 +101,9 @@ def publish(args):
# Setting up the git repo
if not is_remote:
- cmd = 'set -e; cd %s/layers; if [ ! -e .git ]; then git init .; mv .git/hooks/post-update.sample .git/hooks/post-update; fi; git add -A .; git commit -q -m "init repo" || true;' % destination
+ cmd = 'set -e; mkdir -p %s/layers; cd %s/layers; if [ ! -e .git ]; then git init .; mv .git/hooks/post-update.sample .git/hooks/post-update; fi; git add -A .; git commit -q -m "init repo" || true; git update-server-info' % (destination, destination)
else:
- cmd = "ssh %s 'set -e; cd %s/layers; if [ ! -e .git ]; then git init .; mv .git/hooks/post-update.sample .git/hooks/post-update; fi; git add -A .; git commit -q -m \"init repo\" || true;'" % (host, destdir)
+ cmd = "ssh %s 'set -e; mkdir-p %s/layers; cd %s/layers; if [ ! -e .git ]; then git init .; mv .git/hooks/post-update.sample .git/hooks/post-update; fi; git add -A .; git commit -q -m \"init repo\" || true; git update-server-info'" % (host, destdir, destdir)
ret = subprocess.call(cmd, shell=True)
if ret == 0:
logger.info('SDK published successfully')
diff --git a/scripts/postinst-intercepts/update_font_cache b/scripts/postinst-intercepts/update_font_cache
index c8c6018..0deab3c 100644
--- a/scripts/postinst-intercepts/update_font_cache
+++ b/scripts/postinst-intercepts/update_font_cache
@@ -1,5 +1,5 @@
#!/bin/sh
-PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir}\
- $D${bindir}/fc-cache --sysroot=$D
+PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir} \
+ -E ${fontconfigcacheenv} $D${bindir}/fc-cache --sysroot=$D ${fontconfigcacheparams}
chown -R root:root $D${fontconfigcachedir}
diff --git a/scripts/postinst-intercepts/update_icon_cache b/scripts/postinst-intercepts/update_icon_cache
index 8e17a6a..9cf2a72 100644
--- a/scripts/postinst-intercepts/update_icon_cache
+++ b/scripts/postinst-intercepts/update_icon_cache
@@ -1,8 +1,9 @@
#!/bin/sh
set -e
+
# update native pixbuf loaders
-gdk-pixbuf-query-loaders --update-cache
+$STAGING_DIR_NATIVE/${libdir_native}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders --update-cache
for icondir in $D/usr/share/icons/*/ ; do
if [ -d $icondir ] ; then
diff --git a/scripts/postinst-intercepts/update_pixbuf_cache b/scripts/postinst-intercepts/update_pixbuf_cache
index 95bf4f9..a8b4001 100644
--- a/scripts/postinst-intercepts/update_pixbuf_cache
+++ b/scripts/postinst-intercepts/update_pixbuf_cache
@@ -4,8 +4,6 @@ export GDK_PIXBUF_MODULEDIR=$D${libdir}/gdk-pixbuf-2.0/2.10.0/loaders
export GDK_PIXBUF_FATAL_LOADER=1
PSEUDO_UNLOAD=1 qemuwrapper -L $D -E LD_LIBRARY_PATH=$D/${libdir}:$D/${base_libdir}\
- $D${bindir}/gdk-pixbuf-query-loaders \
+ $D${libdir}/gdk-pixbuf-2.0/gdk-pixbuf-query-loaders \
>$GDK_PIXBUF_MODULEDIR/../loaders.cache && \
sed -i -e "s:$D::g" $GDK_PIXBUF_MODULEDIR/../loaders.cache
-
-
diff --git a/scripts/runqemu b/scripts/runqemu
index 23cf5be..e01d276 100755
--- a/scripts/runqemu
+++ b/scripts/runqemu
@@ -33,6 +33,7 @@ usage() {
echo " nographic - disables video console"
echo " serial - enables a serial console on /dev/ttyS0"
echo " kvm - enables KVM when running qemux86/qemux86-64 (VT-capable CPU required)"
+ echo " kvm-vhost - enables KVM with vhost support when running qemux86/qemux86-64 (VT-capable CPU required)"
echo " publicvnc - enable a VNC server open to all hosts"
echo " qemuparams=\"xyz\" - specify custom parameters to QEMU"
echo " bootparams=\"xyz\" - specify custom kernel parameters during boot"
@@ -71,6 +72,8 @@ SERIALSTDIO=""
TCPSERIAL_PORTNUM=""
KVM_ENABLED="no"
KVM_ACTIVE="no"
+VHOST_ENABLED="no"
+VHOST_ACTIVE="no"
# Determine whether the file is a kernel or QEMU image, and set the
# appropriate variables
@@ -111,7 +114,7 @@ while true; do
case "$arg" in
"qemux86" | "qemux86-64" | "qemuarm" | "qemuarm64" | "qemumips" | "qemumipsel" | \
"qemumips64" | "qemush4" | "qemuppc" | "qemumicroblaze" | "qemuzynq")
- [ -z "$MACHINE" ] && MACHINE=$arg || \
+ [ -z "$MACHINE" -o "$MACHINE" = "$arg" ] && MACHINE=$arg || \
error "conflicting MACHINE types [$MACHINE] and [$arg]"
;;
"ext2" | "ext3" | "ext4" | "jffs2" | "nfs" | "btrfs" | "hddimg" | "hdddirect" )
@@ -170,6 +173,11 @@ while true; do
KVM_ENABLED="yes"
KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
;;
+ "kvm-vhost")
+ KVM_ENABLED="yes"
+ KVM_CAPABLE=`grep -q 'vmx\|svm' /proc/cpuinfo && echo 1`
+ VHOST_ENABLED="yes"
+ ;;
"slirp")
SLIRP_ENABLED="yes"
;;
@@ -270,12 +278,6 @@ if [ "x$KVM_ENABLED" = "xyes" ]; then
echo "$YOCTO_KVM_WIKI";
exit 1;
fi
- if [ ! -e /dev/vhost-net ]; then
- echo "Missing virtio net device. Have you inserted vhost-net module?"
- echo "For further help see:"
- echo "$YOCTO_PARAVIRT_KVM_WIKI";
- exit 1;
- fi
if [ -w /dev/kvm -a -r /dev/kvm ]; then
SCRIPT_QEMU_OPT="$SCRIPT_QEMU_OPT -enable-kvm"
KVM_ACTIVE="yes"
@@ -285,13 +287,22 @@ if [ "x$KVM_ENABLED" = "xyes" ]; then
echo "$YOCTO_KVM_WIKI";
exit 1;
fi
- if [ ! -w /dev/vhost-net -o ! -r /dev/vhost-net ]; then
- if [ "$SLIRP_ENABLED" != "yes" ] ; then
+ if [ "x$VHOST_ENABLED" = "xyes" ]; then
+ if [ ! -e /dev/vhost-net ]; then
+ echo "Missing virtio net device. Have you inserted vhost-net module?"
+ echo "For further help see:"
+ echo "$YOCTO_PARAVIRT_KVM_WIKI";
+ exit 1;
+ fi
+
+ if [ -w /dev/vhost-net -a -r /dev/vhost-net ]; then
+ VHOST_ACTIVE="yes"
+ else
echo "You have no rights on /dev/vhost-net."
echo "Please change the ownership of this file as described at:"
- echo "$YOCTO_PARAVIRT_KVM_WIKI";
+ echo "$YOCTO_KVM_WIKI";
exit 1;
- fi
+ fi
fi
fi
diff --git a/scripts/runqemu-export-rootfs b/scripts/runqemu-export-rootfs
index 40ab201..3dee131 100755
--- a/scripts/runqemu-export-rootfs
+++ b/scripts/runqemu-export-rootfs
@@ -46,8 +46,8 @@ if [ -z "$SYSROOT_SETUP_SCRIPT" ]; then
fi
. $SYSROOT_SETUP_SCRIPT
-if [ ! -e "$OECORE_NATIVE_SYSROOT/usr/sbin/unfsd" ]; then
- echo "Error: Unable to find unfsd binary in $OECORE_NATIVE_SYSROOT/usr/sbin/"
+if [ ! -e "$OECORE_NATIVE_SYSROOT/usr/bin/unfsd" ]; then
+ echo "Error: Unable to find unfsd binary in $OECORE_NATIVE_SYSROOT/usr/bin/"
if [ "x$OECORE_DISTRO_VERSION" = "x" ]; then
echo "Have you run 'bitbake meta-ide-support'?"
@@ -115,8 +115,8 @@ case "$1" in
fi
echo "Starting User Mode nfsd"
- echo " $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/sbin/unfsd $UNFSD_OPTS"
- $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/sbin/unfsd $UNFSD_OPTS
+ echo " $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/bin/unfsd $UNFSD_OPTS"
+ $PSEUDO $PSEUDO_OPTS $OECORE_NATIVE_SYSROOT/usr/bin/unfsd $UNFSD_OPTS
if [ ! $? = 0 ]; then
echo "Error starting nfsd"
exit 1
diff --git a/scripts/runqemu-ifup b/scripts/runqemu-ifup
index b5a3db9..d9bd894 100755
--- a/scripts/runqemu-ifup
+++ b/scripts/runqemu-ifup
@@ -91,10 +91,25 @@ fi
n=$[ (`echo $TAP | sed 's/tap//'` * 2) + 1 ]
$IFCONFIG addr add 192.168.7.$n/32 broadcast 192.168.7.255 dev $TAP
+STATUS=$?
+if [ $STATUS -ne 0 ]; then
+ echo "Failed to set up IP addressing on $TAP"
+ exit 1
+fi
$IFCONFIG link set dev $TAP up
+STATUS=$?
+if [ $STATUS -ne 0 ]; then
+ echo "Failed to bring up $TAP"
+ exit 1
+fi
dest=$[ (`echo $TAP | sed 's/tap//'` * 2) + 2 ]
$IFCONFIG route add to 192.168.7.$dest dev $TAP
+STATUS=$?
+if [ $STATUS -ne 0 ]; then
+ echo "Failed to add route to 192.168.7.$dest using $TAP"
+ exit 1
+fi
# setup NAT for tap0 interface to have internet access in QEMU
$IPTABLES -A POSTROUTING -t nat -j MASQUERADE -s 192.168.7.$n/32
diff --git a/scripts/runqemu-internal b/scripts/runqemu-internal
index 1527268..3b0e54c 100755
--- a/scripts/runqemu-internal
+++ b/scripts/runqemu-internal
@@ -54,7 +54,7 @@ else
mem_size=512
;;
"qemumicroblaze")
- mem_size=64
+ mem_size=256
;;
"qemumips"|"qemumips64")
mem_size=256
@@ -120,16 +120,9 @@ if [ "$SLIRP_ENABLED" = "yes" ]; then
KERNEL_NETWORK_CMD="ip=dhcp"
QEMU_TAP_CMD=""
QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
- if [ "$KVM_ACTIVE" = "yes" ]; then
- QEMU_NETWORK_CMD=""
- DROOT="/dev/vda"
- ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
- else
- QEMU_NETWORK_CMD=""
- DROOT="/dev/hda"
- ROOTFS_OPTIONS="-drive file=$ROOTFS,if=ide,format=raw"
- fi
-
+ QEMU_NETWORK_CMD=""
+ DROOT="/dev/vda"
+ ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
else
acquire_lock() {
lockfile=$1
@@ -266,20 +259,13 @@ else
KERNEL_NETWORK_CMD="ip=192.168.7.$n2::192.168.7.$n1:255.255.255.0"
QEMU_TAP_CMD="-net tap,vlan=0,ifname=$TAP,script=no,downscript=no"
- if [ "$KVM_ACTIVE" = "yes" ]; then
+ if [ "$VHOST_ACTIVE" = "yes" ]; then
QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD,vhost=on"
- DROOT="/dev/vda"
- ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
else
- QEMU_NETWORK_CMD="-net nic,vlan=0 $QEMU_TAP_CMD"
- DROOT="/dev/hda"
- ROOTFS_OPTIONS="-drive file=$ROOTFS,if=ide,format=raw"
- fi
- if [ "$MACHINE" = "qemuarm64" ]; then
- QEMU_NETWORK_CMD="-netdev tap,id=net0,ifname=$TAP,script=no,downscript=no -device virtio-net-device,netdev=net0 "
- DROOT="/dev/vda"
- ROOTFS_OPTIONS="-drive id=disk0,file=$ROOTFS,if=none,format=raw -device virtio-blk-device,drive=disk0"
+ QEMU_NETWORK_CMD="-net nic,model=virtio $QEMU_TAP_CMD"
fi
+ DROOT="/dev/vda"
+ ROOTFS_OPTIONS="-drive file=$ROOTFS,if=virtio,format=raw"
KERNCMDLINE="mem=$QEMU_MEMORY"
QEMU_UI_OPTIONS="-show-cursor -usb -usbdevice wacom-tablet"
@@ -364,8 +350,8 @@ if [ "$MACHINE" = "qemuarm" -o "$MACHINE" = "qemuarmv6" -o "$MACHINE" = "qemuarm
QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS"
# QEMU_UI_OPTIONS="$QEMU_UI_OPTIONS -force-pointer"
if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
- KERNCMDLINE="root=/dev/sda rw console=ttyAMA0,115200 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY highres=off"
- QEMUOPTIONS="$QEMU_NETWORK_CMD -M ${MACHINE_SUBTYPE} -drive file=$ROOTFS,format=raw -no-reboot $QEMU_UI_OPTIONS"
+ KERNCMDLINE="root=$DROOT rw console=ttyAMA0,115200 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY highres=off"
+ QEMUOPTIONS="$QEMU_NETWORK_CMD -M ${MACHINE_SUBTYPE} $ROOTFS_OPTIONS -no-reboot $QEMU_UI_OPTIONS"
fi
if [ "$FSTYPE" = "nfs" ]; then
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
@@ -387,6 +373,10 @@ fi
if [ "$MACHINE" = "qemuarm64" ]; then
QEMU=qemu-system-aarch64
+ QEMU_NETWORK_CMD="-netdev tap,id=net0,ifname=$TAP,script=no,downscript=no -device virtio-net-device,netdev=net0 "
+ DROOT="/dev/vda"
+ ROOTFS_OPTIONS="-drive id=disk0,file=$ROOTFS,if=none,format=raw -device virtio-blk-device,drive=disk0"
+
export QEMU_AUDIO_DRV="none"
if [ "x$SERIALSTDIO" = "x" ] ; then
QEMU_UI_OPTIONS="-nographic"
@@ -394,7 +384,7 @@ if [ "$MACHINE" = "qemuarm64" ]; then
QEMU_UI_OPTIONS=""
fi
if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
- KERNCMDLINE="root=/dev/vda rw console=ttyAMA0,38400 mem=$QEMU_MEMORY highres=off $KERNEL_NETWORK_CMD"
+ KERNCMDLINE="root=$DROOT rw console=ttyAMA0,38400 mem=$QEMU_MEMORY highres=off $KERNEL_NETWORK_CMD"
# qemu-system-aarch64 only support '-machine virt -cpu cortex-a57' for now
QEMUOPTIONS="$QEMU_NETWORK_CMD -machine virt -cpu cortex-a57 $ROOTFS_OPTIONS $QEMU_UI_OPTIONS"
fi
@@ -409,7 +399,6 @@ if [ "$MACHINE" = "qemuarm64" ]; then
fi
fi
-
if [ "$MACHINE" = "qemux86" ]; then
QEMU=qemu-system-i386
if [ "$KVM_ACTIVE" = "yes" ]; then
@@ -508,8 +497,8 @@ if [ "$MACHINE" = "qemumips" -o "$MACHINE" = "qemumipsel" -o "$MACHINE" = "qemum
QEMU_UI_OPTIONS="-vga cirrus $QEMU_UI_OPTIONS"
if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
#KERNCMDLINE="root=/dev/hda console=ttyS0 console=tty0 $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
- KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
- QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE -drive file=$ROOTFS,format=raw -no-reboot $QEMU_UI_OPTIONS"
+ KERNCMDLINE="root=$DROOT rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
+ QEMUOPTIONS="$QEMU_NETWORK_CMD -M $MACHINE_SUBTYPE $ROOTFS_OPTIONS -no-reboot $QEMU_UI_OPTIONS"
fi
if [ "$FSTYPE" = "nfs" ]; then
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
@@ -533,8 +522,8 @@ if [ "$MACHINE" = "qemuppc" ]; then
QEMU_NETWORK_CMD="-net nic,model=pcnet $QEMU_TAP_CMD"
fi
if [ "${FSTYPE:0:3}" = "ext" -o "$FSTYPE" = "btrfs" ]; then
- KERNCMDLINE="root=/dev/hda rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
- QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE -drive file=$ROOTFS,format=raw -no-reboot $QEMU_UI_OPTIONS"
+ KERNCMDLINE="root=$DROOT rw console=ttyS0 console=tty $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
+ QEMUOPTIONS="$QEMU_NETWORK_CMD -cpu $CPU_SUBTYPE -M $MACHINE_SUBTYPE $ROOTFS_OPTIONS -no-reboot $QEMU_UI_OPTIONS"
fi
if [ "$FSTYPE" = "nfs" ]; then
if [ "$NFS_SERVER" = "192.168.7.1" -a ! -d "$NFS_DIR" ]; then
@@ -587,20 +576,20 @@ fi
if [ "$MACHINE" = "qemumicroblaze" ]; then
QEMU=qemu-system-microblazeel
- QEMU_SYSTEM_OPTIONS="-M petalogix-ml605 -serial mon:stdio -dtb $KERNEL-$MACHINE.dtb"
+ QEMU_SYSTEM_OPTIONS="$QEMU_NETWORK_CMD -M petalogix-ml605 -serial mon:stdio"
if [ "${FSTYPE:0:3}" = "ext" -o "${FSTYPE:0:4}" = "cpio" ]; then
- KERNCMDLINE="earlyprintk root=/dev/ram rw"
+ KERNCMDLINE="earlyprintk root=/dev/ram rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
QEMUOPTIONS="$QEMU_SYSTEM_OPTIONS -initrd $ROOTFS"
fi
fi
if [ "$MACHINE" = "qemuzynq" ]; then
QEMU=qemu-system-arm
- QEMU_SYSTEM_OPTIONS="-M xilinx-zynq-a9 -serial null -serial mon:stdio -dtb $KERNEL-$MACHINE.dtb"
+ QEMU_SYSTEM_OPTIONS="$QEMU_NETWORK_CMD -M xilinx-zynq-a9 -serial null -serial mon:stdio -dtb $KERNEL-$MACHINE.dtb"
# zynq serial ports are named 'ttyPS0' and 'ttyPS1', fixup the default values
SCRIPT_KERNEL_OPT=$(echo "$SCRIPT_KERNEL_OPT" | sed 's/console=ttyS/console=ttyPS/g')
if [ "${FSTYPE:0:3}" = "ext" -o "${FSTYPE:0:4}" = "cpio" ]; then
- KERNCMDLINE="earlyprintk root=/dev/ram rw"
+ KERNCMDLINE="earlyprintk root=/dev/ram rw $KERNEL_NETWORK_CMD mem=$QEMU_MEMORY"
QEMUOPTIONS="$QEMU_SYSTEM_OPTIONS -initrd $ROOTFS"
fi
fi
@@ -700,6 +689,38 @@ if [ "x$SERIALSTDIO" = "x1" ]; then
stty intr ^]
fi
+
+# Preserve the multiplexing behavior for the monitor that would be there based
+# on whether nographic is used.
+if echo "$QEMUOPTIONS $SERIALOPTS $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT" | grep -- "-nographic"; then
+ FIRST_SERIAL_OPT="-serial mon:stdio"
+else
+ FIRST_SERIAL_OPT="-serial mon:vc"
+fi
+
+# qemuarm64 uses virtio for any additional serial ports so the normal mechanism
+# of using -serial will not work
+if [ "$MACHINE" = "qemuarm64" ]; then
+ SECOND_SERIAL_OPT="$SCRIPT_QEMU_EXTRA_OPT -device virtio-serial-device -chardev null,id=virtcon -device virtconsole,chardev=virtcon"
+else
+ SECOND_SERIAL_OPT="-serial null"
+fi
+
+# We always want a ttyS1. Since qemu by default adds a serial port when
+# nodefaults is not specified, it seems that all that would be needed is to
+# make sure a "-serial" is there. However, it appears that when "-serial" is
+# specified, it ignores the default serial port that is normally added.
+# So here we make sure to add two -serial if there are none. And only one
+# if there is one -serial already.
+NUM_SERIAL_OPTS=`echo $QEMUOPTIONS $SERIALOPTS $SCRIPT_QEMU_OPT $SCRIPT_QEMU_EXTRA_OPT | sed -e 's/ /\n/g' | grep --count -- -serial`
+
+if [ "$NUM_SERIAL_OPTS" = "0" ]; then
+ SCRIPT_QEMU_EXTRA_OPT="$SCRIPT_QEMU_EXTRA_OPT $FIRST_SERIAL_OPT $SECOND_SERIAL_OPT"
+elif [ "$NUM_SERIAL_OPTS" = "1" ]; then
+ SCRIPT_QEMU_EXTRA_OPT="$SCRIPT_QEMU_EXTRA_OPT $SECOND_SERIAL_OPT"
+fi
+
+
echo "Running $QEMU..."
# -no-reboot is a mandatory option - see bug #100
if [ "$FSTYPE" = "vmdk" -o "$FSTYPE" = "hddimg" -o "$FSTYPE" = "hdddirect" ]; then
diff --git a/scripts/yocto-bsp b/scripts/yocto-bsp
index d269861..2d9453f 100755
--- a/scripts/yocto-bsp
+++ b/scripts/yocto-bsp
@@ -140,7 +140,7 @@ def main():
if args[0] == "help":
if len(args) == 1:
parser.print_help()
- sys.exit(1)
+ sys.exit()
invoke_subcommand(args, parser, yocto_bsp_help_usage, subcommands)
--
2.7.1
More information about the openbmc
mailing list